${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingPresenter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
#声音与震动
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-11 16:26:13
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-11 17:53:42
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h
+ */
+#ifndef RESPIRATORY_TRAINING_MODEL_H
+#define RESPIRATORY_TRAINING_MODEL_H
+
+#include <cstdint>
+#include <iostream>
+#include "string"
+namespace OHOS
+{
+ class RespiratoryTrainingModel
+ {
+ public:
+ static RespiratoryTrainingModel &GetInstance(void);
+ void AddRespiratoryTrainingTimes(void);
+ std::string GetRespiratoryTrainingTotalTime(void) ;
+ std::string GetHeartRateValue(void) ;
+
+ void RT_StartTimer(uint32_t interval);
+ void RT_StopTimer(void);
+
+ private:
+ RespiratoryTrainingModel();
+ ~RespiratoryTrainingModel();
+ RespiratoryTrainingModel(const RespiratoryTrainingModel &) = delete;
+ RespiratoryTrainingModel &operator=(const RespiratoryTrainingModel &) = delete;
+
+ int RespiratoryTrainingTimes{0}; // 呼吸训练次数
+ std::string RespiratoryTrainingTime{nullptr};
+ std::string HeartRateValue{nullptr};
+ };
+}
+
+#endif
\ No newline at end of file
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-06-08 09:36:01
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-11 15:23:03
+ * @LastEditTime: 2024-06-11 18:22:40
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h
*/
void ChangeView(int16_t hideView, int16_t showView);
bool ChangeRespiratoryTrainingView(int16_t thisView);
bool ChangeRespiratoryTrainingCompletedView(int16_t thisView);
+ Animator *GetRespiratoryTrainingAnimator_();
void OnStart() override;
void OnSetUpView() override;
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-05-07 11:25:58
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-11 16:11:03
+ * @LastEditTime: 2024-06-11 18:03:58
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTrainingCompleted/src/RespiratoryTrainingCompletedView.cpp
*/
#include "language/font/ui_resource_string.h"
#include "respiratorytraining/include/RespiratoryTrainingPresenter.h"
#include "common/image_cache_manager.h"
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
namespace OHOS
{
/* -------------------------------------------------------------------------- */
int y1 = 248, y2 = 286;
const int textId[MAX_NUM] = {STR_THIS_BREATH, STR_MEAN_HEART_RATE_MIN, STR_TODAYS_BREATHING_TRAINING};
- const char *text[MAX_NUM] = {"01:00", "144", "10分钟"};
+ std::string heartRateValue = RespiratoryTrainingModel::GetInstance().GetHeartRateValue();
+ std::string trainingTotalTime = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingTotalTime();
+ const char *text[MAX_NUM] = {"01:00", heartRateValue.c_str(), trainingTotalTime.c_str()};
OHOS::ColorType RTCDynamicLabelTextColor[MAX_NUM] = {
Color::GetColorFromRGBA(0x1d, 0xda, 0xc4, 0xff),
Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff),
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-11 16:26:20
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-11 18:25:07
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
+ */
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
+#include "wearable_log.h"
+#include <cmsis_os2.h>
+#include <cmsis_os.h>
+#include <ohos_types.h>
+#include <service/graphic_service.h>
+#include <iostream>
+#include "respiratorytraining/include/RespiratoryTrainingView.h"
+namespace OHOS
+{
+ RespiratoryTrainingModel::RespiratoryTrainingModel() {}
+
+ RespiratoryTrainingModel::~RespiratoryTrainingModel() {}
+
+ RespiratoryTrainingModel &RespiratoryTrainingModel::GetInstance()
+ {
+ static RespiratoryTrainingModel instance;
+ return instance;
+ }
+
+ // 每进行一次呼吸训练,呼吸训练次数自加1
+ void RespiratoryTrainingModel::AddRespiratoryTrainingTimes()
+ {
+ RespiratoryTrainingTimes += 1;
+ }
+
+ // 获取呼吸训练总时间
+ std::string RespiratoryTrainingModel::GetRespiratoryTrainingTotalTime(void)
+ {
+ RespiratoryTrainingTime = std::to_string(RespiratoryTrainingTimes) + "min";
+ return RespiratoryTrainingTime;
+ }
+
+ // 获取心率值
+ std::string RespiratoryTrainingModel::GetHeartRateValue(void)
+ {
+ HeartRateValue = "144";
+ return HeartRateValue;
+ }
+
+ /* -------------------------------------------------------------------------- */
+
+ // 声明定时器变量
+ static osTimerId_t g_timer = NULL;
+ /*定时器到期时的处理*/
+ static void RT_TimerCallbackProc(int data)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RT_TimerCallbackProc");
+ RespiratoryTrainingModel::GetInstance().RT_StopTimer();
+ RespiratoryTrainingModel::GetInstance().AddRespiratoryTrainingTimes();
+
+ RespiratoryTrainingView *p_RespiratoryTrainingView = RespiratoryTrainingView::GetInstance();
+ if (p_RespiratoryTrainingView == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_RespiratoryTrainingView is nullptr!!");
+ return;
+ }
+ if (p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_() == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingAnimator_ is nullptr!!");
+ return;
+ }
+ p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_()->Stop();
+ p_RespiratoryTrainingView->ChangeView(RESPIRATORYTRAINING, RESPIRATORYTRAININGCOMPLETED);
+
+ return;
+ }
+
+ /*
+ * @brief 回调函数
+ */
+ static void RT_TimerCallback(int data)
+ {
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(RT_TimerCallbackProc, data));
+ }
+
+ /*
+ * @brief 开启定时器函数
+ * @param interval 时间间隔,单位ms
+ */
+ void RespiratoryTrainingModel::RT_StartTimer(uint32_t interval)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingModel::RT_StartTimer");
+ /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */
+ if (g_timer != NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
+ return;
+ }
+
+ /* --------------------------------- 2.创建定时器 -------------------------------- */
+ g_timer = osTimerNew((osTimerFunc_t)RT_TimerCallbackProc, osTimerOnce, NULL, NULL);
+ // 检查定时器创建是否成功
+ if (g_timer == NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
+ return;
+ }
+
+ /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */
+ int tick = osMs2Tick(interval);
+
+ /* --------------------------------- 4.启动定时器 -------------------------------- */
+ osStatus_t ret = osTimerStart(g_timer, tick);
+ /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 NULL -------------------- */
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
+ if (g_timer != NULL)
+ {
+ ret = osTimerDelete(g_timer);
+ }
+ g_timer = NULL;
+ return;
+ }
+ }
+
+ /*
+ * @brief 停止定时器
+ */
+ void RespiratoryTrainingModel::RT_StopTimer(void)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingModel::RT_StopTimer");
+ // 检查定时器是否存在
+ if (g_timer != NULL)
+ {
+ // 删除定时器并置为 NULL
+ osStatus_t ret = osTimerDelete(g_timer);
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
+ }
+ g_timer = NULL;
+ }
+ }
+}
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-05-07 11:26:06
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-11 15:40:29
+ * @LastEditTime: 2024-06-11 17:16:42
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTraining/src/RespiratoryTrainingPresenter.cpp
*/
#include "UiConfig.h"
#include <iostream>
#include <string>
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
namespace OHOS
{
{
Presenter<RespiratoryTrainingView>::OnStop();
ScreenAlwaysOnCtr(0);
+ RespiratoryTrainingModel::GetInstance().RT_StopTimer();
}
bool RespiratoryTrainingPresenter::OnClick(UIView &view, const ClickEvent &event)
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-05-07 11:25:58
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-11 16:20:01
+ * @LastEditTime: 2024-06-11 18:36:37
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTraining/src/RespiratoryTrainingView.cpp
*/
#include "common/image_cache_manager.h"
#include "animator/easing_equation.h"
#include "language/font/ui_resource_string.h"
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
+
namespace OHOS
{
Draw();
}
+ Animator *RespiratoryTrainingView::GetRespiratoryTrainingAnimator_()
+ {
+ return RespiratoryTrainingAnimator_;
+ }
+
// 设置按键监听
static void SetKeyActListener()
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetKeyActListener");
RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::RespiratoryTrainingPresenter::GetInstance();
RootView::GetInstance()->SetOnKeyActListener(keyactListener);
}
animateStart_ = false;
if (RespiratoryTrainingStart_ != nullptr)
{
- container_->Remove(RespiratoryTrainingStart_);
+ RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Remove(RespiratoryTrainingStart_);
delete RespiratoryTrainingStart_;
RespiratoryTrainingStart_ = nullptr;
}
RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingLabel_);
RespiratoryTrainingCallBack_->SetTextView(RespiratoryTrainingLabel_);
RespiratoryTrainingCallBack_->startTimestamp = HALTick::GetInstance().GetTime();
- container_->Invalidate();
+ RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Invalidate();
+ RespiratoryTrainingModel::GetInstance().RT_StartTimer(60 * 1000); // 呼吸训练每一分钟一次
}
return true;
}