呼吸训练优化,差获取心率值接口,界面也还需要部分优化
authorluozheng <1732036298@qq.com>
Tue, 11 Jun 2024 10:39:05 +0000 (18:39 +0800)
committerluozheng <1732036298@qq.com>
Tue, 11 Jun 2024 10:39:05 +0000 (18:39 +0800)
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp

index f63e93f..ed13545 100644 (file)
@@ -373,6 +373,7 @@ set(SOURCES
     ${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 
diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h
new file mode 100644 (file)
index 0000000..481788d
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * @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
index b2496de..f1e34f0 100644 (file)
@@ -2,7 +2,7 @@
  * @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
  */
 
@@ -75,6 +75,7 @@ namespace OHOS
         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;
index 78e03e3..c878824 100644 (file)
@@ -2,7 +2,7 @@
  * @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
  */
 
@@ -11,6 +11,7 @@
 #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
 {
@@ -195,7 +196,9 @@ 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),
diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
new file mode 100644 (file)
index 0000000..8021550
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * @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;
+        }
+    }
+}
index b3db356..bd43990 100644 (file)
@@ -2,7 +2,7 @@
  * @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
  */
 
@@ -15,6 +15,7 @@
 #include "UiConfig.h"
 #include <iostream>
 #include <string>
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
 namespace OHOS
 {
 
@@ -56,6 +57,7 @@ namespace OHOS
     {
         Presenter<RespiratoryTrainingView>::OnStop();
         ScreenAlwaysOnCtr(0);
+        RespiratoryTrainingModel::GetInstance().RT_StopTimer();
     }
 
     bool RespiratoryTrainingPresenter::OnClick(UIView &view, const ClickEvent &event)
index 3fa4c5a..5fbf86d 100644 (file)
@@ -2,7 +2,7 @@
  * @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
  */
 
@@ -12,6 +12,8 @@
 #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
 {
 
@@ -106,9 +108,15 @@ 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);
     }
@@ -311,7 +319,7 @@ namespace OHOS
             animateStart_ = false;
             if (RespiratoryTrainingStart_ != nullptr)
             {
-                container_->Remove(RespiratoryTrainingStart_);
+                RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Remove(RespiratoryTrainingStart_);
                 delete RespiratoryTrainingStart_;
                 RespiratoryTrainingStart_ = nullptr;
             }
@@ -333,7 +341,8 @@ namespace OHOS
             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;
     }