Merge #877 into sdk602patch0626 from refs/changes/877/head 879/target/1
author袁清梦 <3449750381@qq.com>
Thu, 5 Sep 2024 08:03:11 +0000 (08:03 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Thu, 5 Sep 2024 08:03:11 +0000 (08:03 +0000)
Code review from 袁清梦

* refs/changes/877/head: (15 commits squashed)

  - #455运动准备界面,运动名称往上移一点,所有的运动界面都这样

  - #475设置-跟换表盘 开关按钮太大,全是黑色背景没有区分框

  - #414手表,睡眠,作息时间,时间字体颜色需要变更为一致

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - 修复nextday的消息发送

  - 修改心率周期检测频率为30min

  - 取消多余的遥控拍照的资源释放

  - 修复省电模式的电池框资源路径

  - 增加血氧数据的nextday清空以及UI更新

  - 增加心率血氧 健康数据的nextday清空接口

  - 删除applist的心率值的notify 统一由model管理

  - 增加心率数据的nextday清空以及UI更新

  - nextday进行睡眠数据,心率数据,血氧数据管理更新

  - 心率增加0数据传递,报0显示“--“

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

Signed-off-by: Caisking <3449750381@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/877
20 files changed:
code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp
code/sdk/application/wearable/fd230app/nativeui/heart_blood/BloodCardView.cpp
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp
code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp
code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp
code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosView.cpp
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/drivers/peripheral/config/include/ConfigModel.h
code/sdk/drivers/peripheral/ppg/hx3695/hx3695.c

index d1cd281..73056b0 100644 (file)
@@ -305,6 +305,7 @@ extern "C"
     static void AlarmCallBackProcA(void)\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
+\r
         AlarmClockEventData unuse;\r
         AlarmTimerEventPublish(TOPIC_EVENT_ALARM_RING, unuse);\r
     }\r
@@ -313,20 +314,31 @@ extern "C"
     static void AlarmCallBackProcB(void)\r
     {\r
         AlarmClockEventData unuse;\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\r
-        GraphicService::GetInstance()->PostGraphicEvent(\r
-            std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB invoked");\r
+#if 0\r
+        // 记录当前时间\r
+        time_t now = time(nullptr);\r
+        struct tm *localTime = localtime(&now);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current time - Hour: %d, Minute: %d", localTime->tm_hour, localTime->tm_min);\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Posting next day update event");\r
+\r
+        // GraphicService::GetInstance()->PostGraphicEvent(\r
+        //     std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
+#endif\r
+        AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
 \r
-        // AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
-        SetZeroAlarm();\r
+        SetZeroAlarm(); // 重置闹钟\r
     }\r
 \r
     static void on_time_CallBackProc(void)\r
     {\r
         AlarmClockEventData unuse;\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked");\r
+\r
         GraphicService::GetInstance()->PostGraphicEvent(\r
             std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse));\r
+\r
+        // AlarmTimerEventPublish(TOPIC_EVENT_ON_TIME, unuse);\r
     }\r
 \r
     void AlarmScan(void *arg)\r
@@ -335,15 +347,21 @@ extern "C"
         int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
         if (ret != ERRCODE_SUCC)\r
         {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get current time info, error code: %d", ret);\r
             return;\r
         }\r
 \r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Scanning alarms - Current time: %02d:%02d:%02d",\r
+                      curTime.tm_hour, curTime.tm_min, curTime.tm_sec);\r
+\r
         if (g_alarmCtrA.state == ALARM_STATUS_RUNNING)\r
         {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm A");\r
             if ((g_alarmCtrA.callback != nullptr) &&\r
                 (g_alarmCtrA.info.hour == curTime.tm_hour) &&\r
                 (g_alarmCtrA.info.minute == curTime.tm_min))\r
             {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm A triggered");\r
                 g_alarmCtrA.callback();\r
                 g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
             }\r
@@ -351,19 +369,23 @@ extern "C"
 \r
         if (g_alarmCtrB.state == ALARM_STATUS_RUNNING)\r
         {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm B");\r
             if ((g_alarmCtrB.callback != NULL) &&\r
-                (g_alarmCtrB.info.week == curTime.tm_wday) &&\r
+                // (g_alarmCtrB.info.week == curTime.tm_wday) &&\r
                 (g_alarmCtrB.info.hour == curTime.tm_hour) &&\r
                 (g_alarmCtrB.info.minute == curTime.tm_min) &&\r
                 (g_alarmCtrB.info.second == curTime.tm_sec))\r
             {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm B triggered");\r
                 g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
-                g_alarmCtrB.callback(); // 由于只有callback中SetZeroAlarm会设置state为ALARM_STATUS_RUNNING , 所以必须把state=ALARM_STATUS_CREATED提前,或者干脆删除。\r
+                g_alarmCtrB.callback();\r
             }\r
         }\r
+\r
         // 未绑定状态下,以下操作不进行\r
         if (OHOS::ConfigModel::GetInstance()->get_configData_bool(OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART))\r
             return;\r
+\r
         // 整点回调\r
         if (curTime.tm_min == 0 && curTime.tm_sec == 0)\r
         {\r
index e43dcd1..339f0c0 100644 (file)
@@ -1,4 +1,10 @@
 /*** 
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-05 14:58:21
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h
+ */
+/***
  * @Date: 2024-04-15 10:55:58
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-07-31 10:38:26
@@ -52,10 +58,10 @@ namespace OHOS
         void Blood_Result(void);
 
         void Blood_Control(BloodState state);
-        void ReInit();
+        void ClearDisplayData();
+        void CleanAllData();
 
     private:
-
         uint16_t displayspo2;
         uint16_t currentspo2;
         uint32_t timestamp_ms;
index 14b7171..1f7cc56 100644 (file)
@@ -13,6 +13,8 @@ extern "C" errcode_t uapi_get_timestamp_ms(uint32_t *tm);
 #include "AppViewIDs.h"
 #include "NativeAbility.h"
 #include "battery_hal.h"
+#include "heart_blood/BloodCardView.h"
+#include "MainViewSample.h"
 
 #define MAX_UNWARE_COUNT 10
 #define MAX_VALID_SPO2_COUNT 30
@@ -46,8 +48,8 @@ namespace OHOS
         return &instance;
     }
     /* ---------------------------------- 状态检测 ---------------------------------- */
-    // 重新初始化
-    void BloodOxygenModel::ReInit()
+
+    void BloodOxygenModel::ClearDisplayData()
     {
         currentspo2 = 0;
         timestamp_ms = 0;
@@ -232,7 +234,6 @@ namespace OHOS
     }
 
     // 更新SPO2数据
-
     void BloodOxygenModel::UpSPO2data(uint8_t spo2)
     {
         displayspo2 = spo2;
@@ -266,4 +267,20 @@ namespace OHOS
             Blood_Stop();
         }
     }
+
+    // 更新血氧数据
+    void BloodOxygenModel::CleanAllData(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");
+        if (MainViewSample::GetInstance() != nullptr && BloodCardView::GetInstance() != nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面血氧卡片");
+            BloodCardView::GetInstance()->UpSPO2Text();
+        }
+        if (BloodResultView::GetInstance() != nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量血氧卡片");
+            BloodResultView::GetInstance()->UpSPO2Text();
+        }
+    }
 }
index e59bdab..97fe087 100644 (file)
@@ -1,11 +1,10 @@
-/*** 
+/***
  * @Date: 2024-04-15 10:55:58
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-07-31 14:36:25
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp
  */
 
-
 #include "common/image_cache_manager.h"
 #include "ui_resource_image.h"
 #include <ui_scroll_view.h>
@@ -48,6 +47,9 @@ namespace OHOS
     /* -------------------------------------------------------------------------- */
     void BloodResultView::UpSPO2Text()
     {
+        if (bloodLabel == nullptr || timeLabel == nullptr)
+            return;
+            
         // 更新血氧数据
         uint16_t spo2 = BloodOxygenModel::GetInstance()->GetSPO2data();
         if (spo2 != 0) // 判断是否为默认数据
index 8959d10..d10167b 100644 (file)
@@ -42,6 +42,9 @@ namespace OHOS
     /* -------------------------------------------------------------------------- */\r
     void BloodCardView::UpSPO2Text()\r
     {\r
+        if (bloodLabel == nullptr || timeLabel == nullptr)\r
+            return;\r
+            \r
         // 更新血氧数据\r
         uint16_t spo2 = BloodOxygenModel::GetInstance()->GetSPO2data();\r
         if (spo2 != 0) // 判断是否为默认数据\r
index c8760f7..6d9550e 100644 (file)
@@ -368,24 +368,10 @@ namespace OHOS
     // 清空健康数据
     bool HealthService::CleanHealthData()
     {
-        HeartRateData heartdata;
-        heartdata.Heart = 0;
-        heartdata.timestamp = 0;
-        BloodOxygenData blooddata;
-        blooddata.SPO2 = 0;
-        blooddata.timestamp = 0;
-        if (!UpdateHealthData(heartdata))
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData heartdata is error");
-            return false;
-        }
-        if (!UpdateHealthData(blooddata))
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData blooddata is error");
-            return false;
-        }
-        HeartModel::GetInstance()->ReInit();
-        BloodOxygenModel::GetInstance()->ReInit();
+        ClearHourlyHeartRates();
+        HeartModel::GetInstance()->ClearDisplayData();
+        BloodOxygenModel::GetInstance()->ClearDisplayData();
+
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanHealthData  is ok");
         return true;
     }
@@ -449,9 +435,8 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "************************************************");
         }
 
-        // 如果不是同一天,清空文件内容
+        // 如果不是同一天,关闭文件
         file.close();
-        SaveDailyHeartRate();
 
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Not same-day data");
         return false; // 不是同一天
@@ -503,13 +488,13 @@ namespace OHOS
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updating heart rate: 小时 %d, 心率值 %d", hour, heartRate);
 
         // 确保 hour 在有效范围内,并且心率不是异常值(例如负值)
-        if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负
+        if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负 并且 小时不能为24
         {
             dailyHeartRates[hour] = heartRate;
-        }
 
-        // 记录目前更新时间点
-        currenthour = hour;
+            // 记录目前更新时间点
+            currenthour = hour;
+        }
     }
 
     uint16_t HealthService::GetHourlyHeartRate(uint16_t hour)
index 876166b..06e5c18 100644 (file)
@@ -23,7 +23,6 @@ namespace OHOS
 
     class HeartChartView;
     class HeartChartPresenter : public Presenter<HeartChartView>,
-                                    public ModelListenerSample,
                                     public UIView::OnClickListener,
                                     public UIView::OnDragListener,
                                     public RootView::OnKeyActListener,
@@ -37,8 +36,6 @@ namespace OHOS
         void OnStart() override;
         void OnResume() override;
         void OnStop() override;
-        void OnTickEvent() override;
-        void Notify() override {}
         bool OnClick(UIView &view, const ClickEvent &event) override;
         bool OnDrag(UIView &view, const DragEvent &event) override;
         bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
index 2cd4a2d..b2e7676 100644 (file)
@@ -1,4 +1,4 @@
-/*** 
+/***
  * @Date: 2024-08-15 18:38:49
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-08-26 15:17:07
@@ -60,6 +60,7 @@ namespace OHOS
 
         void UpdateShowHeart(void);
         void Update_data_Chart(int serialIndex);
+        void CleanAllDataView();
 
     private:
         UILabelExt *CurrentHeartText{nullptr};
index 6f1ba90..491904d 100644 (file)
@@ -152,9 +152,9 @@ extern "C"
             void Heart_Result(void);\r
 \r
             void Heart_Control(HeartState state, HeartCheck check);\r
-            void ReInit();\r
-\r
+            void ClearDisplayData();\r
             void Heart_Update_View(void);\r
+            void CleanAllData(void);\r
 \r
         private:\r
             HealthAllDatas healthDatas;\r
index 23f1239..e5b6efb 100644 (file)
@@ -57,6 +57,7 @@ namespace OHOS
         void Init_data_Chart();\r
         void Update_data_Chart(int serialIndex);\r
         void UpdataChart();\r
+        void CleanAllDataView();\r
 \r
     private:\r
         typedef struct\r
@@ -79,6 +80,7 @@ namespace OHOS
         void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
         int32_t HeartRateDataProc(void);\r
         void HeartbeatImageAnimator(void);\r
+        void SetDataTopAndBottom();\r
 \r
     private:\r
         Point heartRateData[HEART_AVE_NUM];\r
index 6606338..5643d35 100644 (file)
@@ -1,3 +1,9 @@
+/*** 
+ * @Date: 2024-08-15 18:39:25
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-03 21:04:56
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp
+ */
 /*
  * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
  * Description: HeartChartPresenter.cpp
@@ -28,7 +34,6 @@ namespace OHOS
         g_pHeartChartPresenter = this;
         display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
         display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
-        ResetTickTimer();
 #ifdef MEM_CHECK
         MemCheck::GetInstance()->EnableLeakCheck(true);
 #endif
@@ -94,28 +99,6 @@ namespace OHOS
         return true;
     }
 
-    void HeartChartPresenter::OnTickEvent()
-    {
-        // 更新显示心率数据
-        HeartChartView::GetInstance()->UpdateShowHeart();
-#if 0
-        /*该界面一直在检测 不需要做超时 具有无效数标志*/
-        uint64_t current_time = osKernelGetTick2ms();
-        if ((startTime != 0) && (current_time - startTime > HEART_KEEP_TIME))
-        {
-            // 超时处理
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时处理 HEART_KEEP_TIME: %lld", current_time - startTime);
-            HeartModel::GetInstance()->SetResult(HeartResult::TIMEOUT);
-            HeartModel::GetInstance()->Heart_Stop();
-            startTime = 0; // 重置
-        
-        }
-#endif
-    }
-    void HeartChartPresenter::ResetTickTimer(void)
-    {
-        startTime = osKernelGetTick2ms();
-    }
     // 增加按键事件
     bool HeartChartPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
     {
index 21c199a..cb9a40f 100644 (file)
@@ -1,3 +1,9 @@
+/***
+ * @Date: 2024-08-15 18:39:02
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-05 14:36:17
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
+ */
 /***
  * @Date: 2024-04-15 10:55:58
  * @LastEditors: Caisking 3449750381@qq.com
@@ -114,30 +120,30 @@ namespace OHOS
     {
         // 获取当前心率
         uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
-        std::string heartrateStr = std::to_string(heart_);
+        std::string heartrateStr = (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_));
 
         // 更新当前心率显示
-        if (CurrentHeartText != nullptr && heart_ != 0)
+        if (CurrentHeartText != nullptr)
         {
             CurrentHeartText->SetText(heartrateStr.c_str());
         }
 
         // 获取最大心率
         uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
-        std::string heartmaxStr = std::to_string(heartmax_);
+        std::string heartmaxStr = (heartmax_ == 0) ? "--" : (heartmax_ < 50 ? "--" : std::to_string(heartmax_));
 
         // 更新最大心率显示
-        if (MaxHeartText != nullptr && heartmax_ != 0)
+        if (MaxHeartText != nullptr)
         {
             MaxHeartText->SetText(heartmaxStr.c_str());
         }
 
         // 获取最小心率
         uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
-        std::string heartminStr = std::to_string(heartmin_);
+        std::string heartminStr = (heartmin_ == 0) ? "--" : (heartmin_ < 50 ? "--" : std::to_string(heartmin_));
 
         // 更新最小心率显示
-        if (MinHeartText != nullptr && heartmin_ != 0)
+        if (MinHeartText != nullptr)
         {
             MinHeartText->SetText(heartminStr.c_str());
         }
@@ -165,6 +171,32 @@ namespace OHOS
         heartchart->AddDataSerial(heartSerial);
         heartchart->Invalidate();
     }
+    void HeartChartView::CleanAllDataView()
+    {
+        if (heartchart == nullptr || MaxHeartText == nullptr || MinHeartText == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " CleanAllDataView fail");
+            return;
+        }
+        for (int serialIndex = 0; serialIndex < 24; serialIndex++)
+        {
+            heartdata[serialIndex].x = serialIndex;
+            heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+        }
+
+        /*清空原数据*/
+        heartSerial->ClearData();
+        heartSerial->AddPoints(heartdata, 24);
+        heartSerial->SetLineColor(Color::Red());
+        heartSerial->SetFillColor(Color::Red());
+        heartSerial->EnableGradient(true);
+
+        heartchart->AddDataSerial(heartSerial);
+        heartchart->RefreshChart();
+
+        /*更新最大最小值*/
+        SetDataTopAndBottom();
+    }
     /*设置最大最小数据*/
     void HeartChartView::SetDataTopAndBottom()
     {
index 09528ef..e87e4b6 100644 (file)
@@ -20,6 +20,7 @@
 #include "custom_runtime.h"\r
 #include <iostream>\r
 #include <memory>\r
+#include <algorithm>\r
 \r
 #include "ui_service.h"\r
 #include "battery_hal.h"\r
@@ -32,6 +33,7 @@ extern "C"
 #define MAX_UNWEAR_COUNT 30\r
 #define MAX_VALID_HRS_COUNT 40\r
 #define MAX_DISVALID_HRS_COUNT 70\r
+#define MIN_DISPLAY_HEART 60\r
 #define HEARTTEST 1 //[0 开启测试 1 关闭]\r
 \r
     /* 佩戴检测结果 */\r
@@ -53,7 +55,8 @@ extern "C"
         .args = nullptr,\r
         .Notify = Notify,\r
     };\r
-\r
+    static void ProcessHeartRateUpdate(Request *request);\r
+    static void RefreshHeartData();\r
     void HeartDataSubscribeTopic(Topic topic)\r
     {\r
         BroadcastApi *broadcastApi = nullptr;\r
@@ -94,78 +97,64 @@ extern "C"
         UNUSED(args);\r
         UNUSED(topic);\r
 \r
-        /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
-        if (uapi_dev_runtime_get_train_status() == 1)\r
-            return;\r
-\r
-        if (request == nullptr)\r
+        // 训练过程中不需要判断数据准确性,不需要存储心率数据\r
+        if (uapi_dev_runtime_get_train_status() == 1 || request == NULL)\r
         {\r
             return;\r
         }\r
-        if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA)\r
-        {\r
-#if 0\r
-            int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo *)request->data, request->len);\r
-            if (rets != EOK)\r
-            {\r
-                free(heartInfo);\r
-                heartInfo = nullptr;\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s heartRateData fail! ret = %d", rets);\r
-                return;\r
-            }\r
-#endif\r
-            uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
-            // 筛选出正常数据\r
-            if (preheart > HEART_RATE_LIMIT_LOWER && preheart <= HEART_RATE_LIMIT_UPPER)\r
-            {\r
-                uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
-                HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
-                if (heartInfo == nullptr)\r
-                {\r
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
-                    return;\r
-                }\r
-                heartInfo->index = index_;\r
-                heartInfo->maxX = index_;\r
-                heartInfo->minX = index_;\r
-                heartInfo->perSec = preheart;\r
-                heartInfo->rest = preheart;\r
-                heartInfo->maxValue = preheart;\r
-                heartInfo->minValue = preheart;\r
-                /*\r
-                暂时屏蔽主界面动态曲线\r
-                heartInfo->value[index_].x = index_;\r
-                heartInfo->value[index_].y = preheart;\r
-                index_++;\r
-                if (index_ == HEART_ALL_POINTS)\r
-                {\r
-                    index_ = 0;\r
-                }\r
-                HeartModel::GetInstance()->SetIndex(index_);\r
-                */\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
-                OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
-                free(heartInfo);\r
-                heartInfo = nullptr;\r
-            }\r
-        }\r
-        /* Nextday 刷新*/\r
-        if (request->msgId == TOPIC_EVENT_NEXTDAY_UPDATE)\r
-        {\r
-            OHOS::HeartModel::GetInstance()->ClearHeartData();\r
-            GraphicService::GetInstance()->PostGraphicEvent(\r
-                std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
-        }\r
-        /* UTCTIME 刷新*/\r
-        if (request->msgId == TOPIC_EVENT_UTCTIME_UPDATE)\r
+\r
+        switch (request->msgId)\r
         {\r
-            OHOS::HeartModel::GetInstance()->ClearHeartData();\r
-            GraphicService::GetInstance()->PostGraphicEvent(\r
-                std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
+        case TOPIC_EVENT_HEARTRATE_UPDATA:\r
+            // ProcessHeartRateUpdate(request);\r
+            break;\r
+\r
+        case TOPIC_EVENT_NEXTDAY_UPDATE:\r
+        case TOPIC_EVENT_UTCTIME_UPDATE:\r
+            RefreshHeartData();\r
+            break;\r
+\r
+        case TOPIC_EVENT_WEARSTATE_UPDATE:\r
+            break;\r
+\r
+        default:\r
+            break;\r
         }\r
-        if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE)\r
+    }\r
+\r
+    static void ProcessHeartRateUpdate(Request *request)\r
+    {\r
+        uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
+\r
+        // 直接处理心率数据,不进行筛选\r
+        uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
+        HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
+        if (heartInfo == NULL)\r
         {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
+            return;\r
         }\r
+\r
+        heartInfo->index = index_;\r
+        heartInfo->maxX = index_;\r
+        heartInfo->minX = index_;\r
+        heartInfo->perSec = preheart;\r
+        heartInfo->rest = preheart;\r
+        /*最大最小值不为0*/\r
+        heartInfo->maxValue = preheart;\r
+        heartInfo->minValue = preheart;\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
+        OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
+\r
+        free(heartInfo); // 释放内存\r
+        heartInfo = nullptr;\r
+    }\r
+\r
+    static void RefreshHeartData()\r
+    {\r
+        OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+        GraphicService::GetInstance()->PostGraphicEvent(\r
+            std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
     }\r
 \r
 #ifdef __cplusplus\r
@@ -351,78 +340,14 @@ namespace OHOS
     {\r
         uint16_t perSecHeartRate = 0;\r
         uint16_t restHeartRate = 0;\r
-#if 0\r
-        // 使用随机数生成模拟数据\r
-        std::random_device rd;\r
-        std::mt19937 gen(rd());\r
-        std::uniform_int_distribution<> heartRateDist(50, 100);\r
-\r
-        heartInfo->perSec = heartRateDist(gen);\r
-        heartInfo->rest = heartRateDist(gen);\r
-        heartInfo->maxValue = heartRateDist(gen);\r
-        heartInfo->minValue = heartRateDist(gen);\r
-        heartInfo->minX = 1;\r
-        heartInfo->maxX = 10;\r
-        // heartInfo->index = 0;\r
-        heartInfo->value[heartInfo->index].x = 0;\r
-        heartInfo->value[heartInfo->index].y = heartRateDist(gen);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " heartRateData: %d %d %d %d %d %d %d %d ",\r
-                      heartInfo->perSec, heartInfo->rest, heartInfo->maxValue, heartInfo->minValue, heartInfo->minX, heartInfo->index, heartInfo->value[0].x, heartInfo->value[0].y);\r
 \r
-#endif\r
         // 每秒心率\r
         perSecHeartRate = heartInfo->perSec;\r
-        if (perSecHeartRate > HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
+        if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
         {\r
             healthDatas.heartRatePerSec = perSecHeartRate;\r
         }\r
 \r
-        // 静息心率\r
-        restHeartRate = heartInfo->rest;\r
-        if (restHeartRate > HEART_RATE_LIMIT_LOWER && restHeartRate <= HEART_RATE_LIMIT_UPPER)\r
-        {\r
-            healthDatas.heartRateRest = restHeartRate;\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateRest:%d ", healthDatas.heartRateRest);\r
-        }\r
-        HandleMinHeart(heartInfo->minX, heartInfo->minValue);\r
-        HandleMaxHeart(heartInfo->maxX, heartInfo->maxValue);\r
-        // 平均心率\r
-        uint16_t count = aveCount + heartInfo->index;\r
-        if (aveCount < HEART_AVE_NUM)\r
-        {\r
-            for (int i = aveCount; i < count; i++)\r
-            {\r
-                if (healthDatas.heartRateMin.x != heartInfo->value[i - aveCount].x && healthDatas.heartRateMax.x != heartInfo->value[i - aveCount].x)\r
-                {\r
-                    healthDatas.heartRateAvg[aveCount].x = heartInfo->value[i - aveCount].x;\r
-                    healthDatas.heartRateAvg[aveCount].y = heartInfo->value[i - aveCount].y;\r
-                    aveCount++;\r
-                }\r
-            }\r
-        }\r
-\r
-        for (int i = 0; i < aveCount - 1; i++)\r
-        {\r
-            if (healthDatas.heartRateAvg[i].x == healthDatas.heartRateAvg[i + 1].x)\r
-            {\r
-                if (healthDatas.heartRateAvg[i].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i].y != healthDatas.heartRateMax.y)\r
-                {\r
-                    for (int j = i; j < aveCount - 1; j++)\r
-                    {\r
-                        healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1];\r
-                    }\r
-                    aveCount--;\r
-                }\r
-                else if (healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMax.y)\r
-                {\r
-                    for (int j = i + 1; j < aveCount - 1; j++)\r
-                    {\r
-                        healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1];\r
-                    }\r
-                    aveCount--;\r
-                }\r
-            }\r
-        }\r
         GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
                                                                   healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
     }\r
@@ -459,46 +384,39 @@ namespace OHOS
 \r
     void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate)\r
     {\r
-        UNUSED(rest);\r
-        Point *rateData;\r
-        int len = GetAveHeartRateCount();\r
-        rateData = GetAveHeartRate();\r
-\r
         uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();\r
+        /*主界面刷新心率*/\r
         if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr)\r
         {\r
             MainClockView::GetInstance()->RefreshHeartRate(perSec);\r
         }\r
-\r
-        if (IndoorWalkPreparedView::GetInstance() != nullptr)\r
-        {\r
-            IndoorWalkPreparedView::GetInstance()->RefreshHeartbeatData(perSec);\r
-        }\r
-        if (IndoorWalkPresenter::GetInstance() != nullptr)\r
-        {\r
-            IndoorWalkPresenter::GetInstance()->ModifiesHeartRate(perSec);\r
-        }\r
-\r
+        /*心率卡片刷新心率数据*/\r
         if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
         {\r
             if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
             {\r
-                HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len);\r
-                // HeartRateView::GetInstance()->RefreshElectrocardiogram();\r
                 HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
                 HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
                 HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
-                HeartRateView::GetInstance()->RefreshRestHeartRate(rest);\r
             }\r
         }\r
+        /*applist心率刷新心率数据*/\r
+        if (HeartChartView::GetInstance() != nullptr)\r
+        {\r
+            HeartChartView::GetInstance()->UpdateShowHeart();\r
+        }\r
     }\r
     /* ---------------------------------- 状态检测 ---------------------------------- */\r
 \r
     // 重新初始化\r
-    void HeartModel::ReInit()\r
+    void HeartModel::ClearDisplayData()\r
     {\r
+        /*显示的心率数据清空*/\r
         currentheart = 0;\r
         timestamp_ms = 0;\r
+        displayheart = 0;\r
+        displayheart_max = 0; // 显示最大心率\r
+        displayheart_min = 0; // 显示最小心率\r
     }\r
     // 获取心率数据\r
     uint16_t HeartModel::GetHeartdata()\r
@@ -573,8 +491,8 @@ namespace OHOS
     void HeartModel::Heart_Start()\r
     {\r
         displayheart = 0;\r
-        displayheart_max = 0; // 显示最大心率\r
-        displayheart_min = 0; // 显示最小心率\r
+        // displayheart_max = 0; // 显示最大心率 [每次检测进行清除]\r
+        // displayheart_min = 0; // 显示最小心率 [每次检测进行清除]\r
 \r
         SetResult(HeartResult::NOT_TESTED); // 重置检测\r
         // 进行初始化操作\r
@@ -598,11 +516,12 @@ namespace OHOS
             if (heartresult_ == HeartResult::SUCCESS)\r
             {\r
                 Heart_Save();\r
-                /*通知进行UI更新*/\r
-                SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
+                /*更新曲线*/\r
+                GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
             }\r
             /*关闭被动检测*/\r
             Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
+            return;\r
         }\r
 \r
         if (sensorstate)\r
@@ -656,8 +575,8 @@ namespace OHOS
         case HeartResult::SUCCESS:\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
             Heart_Save();\r
-            /*通知进行UI更新*/\r
-            SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
+            /*更新曲线*/\r
+            GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
             break;\r
 \r
         case HeartResult::NOT_WORN:     // 未佩戴状态\r
@@ -722,26 +641,33 @@ namespace OHOS
 \r
     void HeartModel::UpHeartdata(uint16_t heart)\r
     {\r
-        /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
+        // 如果处于训练模式,提前返回\r
         if (uapi_dev_runtime_get_train_status() == 1)\r
             return;\r
 \r
         displayheart = heart;\r
 \r
-        // 处理有效与无效计数\r
+        // 更新心率和计数器\r
         if (displayheart != 0)\r
         {\r
-            currentheart = displayheart; // 更新 currentheart\r
+            currentheart = displayheart; // 更新当前心率\r
             valid_counter_++;            // 增加有效计数器\r
             disvalid_counter_ = 0;       // 清空无效计数器\r
-            if (displayheart_max == 0 || displayheart_min == 0)\r
+\r
+            // 更新最大和最小心率\r
+            displayheart_max = (displayheart_max < displayheart ? displayheart : displayheart_max);\r
+\r
+            // 确保最小心率的第一次赋值大于50\r
+            if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART)\r
+            {\r
+                displayheart_min = displayheart; // 初始化最小心率\r
+            }\r
+            else\r
             {\r
-                displayheart_min = displayheart_max = displayheart;\r
+                displayheart_min = (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART)\r
+                                       ? displayheart\r
+                                       : displayheart_min;\r
             }\r
-            if (displayheart_max < displayheart)\r
-                displayheart_max = displayheart;\r
-            if (displayheart_min > displayheart)\r
-                displayheart_min = displayheart;\r
         }\r
         else\r
         {\r
@@ -753,17 +679,25 @@ namespace OHOS
         if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
-            SetResult(HeartResult::INVALID_DATA); // æ\97 æ\95\88æ\95°è¾¾æ \87\r
+            SetResult(HeartResult::INVALID_DATA); // æ \87记为æ\97 æ\95\88æ\95°æ\8d®\r
             Heart_Stop();\r
+            return;\r
         }\r
 \r
         // 检查有效计数器是否达标\r
         if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
-            SetResult(HeartResult::SUCCESS); // 成功检测\r
+            SetResult(HeartResult::SUCCESS); // æ \87记为æ\88\90å\8a\9fæ£\80æµ\8b\r
             Heart_Stop();\r
+            return;\r
         }\r
+\r
+        // 刷新心率显示\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[heart data update displayheart %d displayheart_max %d displayheart_min %d]", displayheart,\r
+                      displayheart_max, displayheart_min);\r
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+                                                                  displayheart, 0, displayheart_max, displayheart_min));\r
     }\r
 \r
     void HeartModel::Heart_Update_View(void)\r
@@ -781,4 +715,19 @@ namespace OHOS
             HeartChartView::GetInstance()->Update_data_Chart(hour);\r
         }\r
     }\r
+\r
+    void HeartModel::CleanAllData(void)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");\r
+        if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");\r
+            HeartRateView::GetInstance()->CleanAllDataView();\r
+        }\r
+        if (HeartChartView::GetInstance() != nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+            HeartChartView::GetInstance()->CleanAllDataView();\r
+        }\r
+    }\r
 }\r
index 4dce87c..2a4757c 100644 (file)
@@ -13,6 +13,7 @@
 #include "ui_resource_image.h"\r
 #include "common/image_cache_manager.h"\r
 #include "heart_blood/health_service/health_service.h"\r
+#include "string.h"\r
 #define HEART_DATA_TEST 0\r
 namespace OHOS\r
 {\r
@@ -234,27 +235,6 @@ namespace OHOS
 \r
         return OHOS_SUCCESS;\r
     }\r
-#if 0\r
-    std::vector<Point> HeartRateView::simulateHeartRateData()\r
-    {\r
-        std::vector<Point> heartRateData;\r
-        const int HEART_RATE_MIN = 60;  // 心率下限\r
-        const int HEART_RATE_MAX = 100; // 心率上限\r
-\r
-        // 用于生成随机数的种子\r
-        std::srand(std::time(0));\r
-\r
-        for (int i = 0; i < 24; ++i)\r
-        { // 模拟24小时\r
-            Point dataPoint;\r
-            dataPoint.x = i;                                                                      // 小时数\r
-            dataPoint.y = HEART_RATE_MIN + (std::rand() % (HEART_RATE_MAX - HEART_RATE_MIN + 1)); // 随机生成心率值\r
-            heartRateData.push_back(dataPoint);\r
-        }\r
-\r
-        return heartRateData;\r
-    }\r
-#endif\r
     int32_t HeartRateView::HeartRateDataProc(void)\r
     {\r
         int32_t i, ret;\r
@@ -392,7 +372,7 @@ namespace OHOS
         heartYAxis.SetDataRange(0, 220);\r
         heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
 \r
-        //heartchart->SetGradientOpacity(60, 0);\r
+        // heartchart->SetGradientOpacity(60, 0);\r
         heartchart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
         Add(heartchart);\r
     }\r
@@ -431,32 +411,69 @@ namespace OHOS
     }\r
     void HeartRateView::Update_data_Chart(int serialIndex)\r
     {\r
-        if (heartchart == nullptr)\r
+        if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);\r
             return;\r
         }\r
 \r
         /*清空原数据*/\r
-        // heartchart->DeleteDataSerial(heartSerial);\r
         heartSerial->ClearData();\r
 \r
         heartdata[serialIndex].x = serialIndex;\r
         heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
 \r
-        for (int i = 0; i < 24; i++)\r
+        heartSerial->AddPoints(heartdata, 24);\r
+        heartSerial->SetLineColor(Color::Red());\r
+        heartSerial->SetFillColor(Color::Red());\r
+        heartSerial->EnableGradient(true);\r
+\r
+        heartchart->AddDataSerial(heartSerial);\r
+        heartchart->RefreshChart();\r
+    }\r
+    void HeartRateView::CleanAllDataView()\r
+    {\r
+        if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanAllDataView fail");\r
+            return;\r
+        }\r
+        for (int serialIndex = 0; serialIndex < 24; serialIndex++)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d %d", i, heartdata[i].y);\r
+            heartdata[serialIndex].x = serialIndex;\r
+            heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
         }\r
 \r
+        /*清空原数据*/\r
+        heartSerial->ClearData();\r
         heartSerial->AddPoints(heartdata, 24);\r
         heartSerial->SetLineColor(Color::Red());\r
         heartSerial->SetFillColor(Color::Red());\r
         heartSerial->EnableGradient(true);\r
 \r
         heartchart->AddDataSerial(heartSerial);\r
-        // heartchart->Invalidate();\r
         heartchart->RefreshChart();\r
+\r
+        /*更新最大最小值*/\r
+        SetDataTopAndBottom();\r
+    }\r
+    /*设置最大最小数据*/\r
+    void HeartRateView::SetDataTopAndBottom()\r
+    {\r
+        int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax();\r
+        int MinHeart = HeartModel::GetInstance()->GetHeartRateMin();\r
+\r
+        if (topRate != nullptr)\r
+        {\r
+            topRate->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str() : "--");\r
+        }\r
+\r
+        if (bottomRate != nullptr)\r
+        {\r
+            bottomRate->SetText(MinHeart > 0 ? (std::to_string(MinHeart)).c_str() : "--");\r
+        }\r
+\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MaxHeart: %d, MinHeart: %d", MaxHeart, MinHeart);\r
     }\r
     void HeartRateView::InsertTopAndBottomRateImage(void)\r
     {\r
@@ -758,22 +775,13 @@ namespace OHOS
         uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount();\r
         SetHeartRateData(rateData, sizeof(Point) * len);\r
         // 展示最大,最小,最近一次心率\r
-        uint16_t maxRate = HeartModel::GetInstance()->GetHeartRateMax();\r
-        uint16_t minRate = HeartModel::GetInstance()->GetHeartRateMin();\r
-        uint16_t perRate = HeartModel::GetInstance()->GetHeartdata();\r
-        RefreshElectrocardiogram();\r
-        if (maxRate > 0 && maxRate < HEART_RATE_LIMIT_UPPER)\r
-        {\r
-            RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax());\r
-        }\r
-        if (minRate > 0 && minRate < HEART_RATE_LIMIT_UPPER)\r
-        {\r
-            RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin());\r
-        }\r
-        if (perRate > 0 && perRate < HEART_RATE_LIMIT_UPPER)\r
-        {\r
-            HeartModel::GetInstance()->SetHeartRatePerSec(perRate);\r
-        }\r
+        uint16_t maxRate = HeartModel::GetInstance()->GetShowMaxHeartdata();\r
+        uint16_t minRate = HeartModel::GetInstance()->GetShowMinHeartdata();\r
+        uint16_t perRate = HeartModel::GetInstance()->GetShowHeartdata();\r
+\r
+        RefreshHeartRateMax(maxRate);\r
+        RefreshHeartRateMin(minRate);\r
+        HeartModel::GetInstance()->SetHeartRatePerSec(perRate);\r
     }\r
 \r
     // 刷新心率曲线\r
@@ -874,80 +882,62 @@ namespace OHOS
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView %d", value);\r
 \r
-        char heartRate[NUM_4] = "--";\r
-        int32_t ret = 0;\r
-\r
         if (ratePerSec == nullptr)\r
         {\r
             return;\r
         }\r
-        HeartbeatImageAnimatorStart(); // 界面创建实现动画跳动\r
-        if (value == 0)\r
+\r
+        // 判断心率值,并设置文本\r
+        if (value == 0 || value < 50)\r
         {\r
             ratePerSec->SetText("--");\r
-            // HeartbeatImageAnimatorStop();\r
-            return;\r
-        }\r
-        // HeartbeatImageAnimatorStart();\r
-        if (value > NUM_99)\r
-        {\r
-            ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
         }\r
         else\r
         {\r
-            ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
-        }\r
-        if (ret > EOK)\r
-        {\r
-            ratePerSec->SetText(heartRate);\r
+            std::string ratePerSecStr = std::to_string(value);\r
+            ratePerSec->SetText(ratePerSecStr.c_str());\r
         }\r
     }\r
 \r
     // 刷新最大心率\r
     void HeartRateView::RefreshHeartRateMax(uint16_t max)\r
     {\r
-        char top[NUM_4] = "--";\r
-        int32_t ret = 0;\r
-        maxRate = (maxRate >= max) ? maxRate : max;\r
         if (topRate == nullptr)\r
         {\r
             return;\r
         }\r
-        if (maxRate <= HEART_RATE_LIMIT_LOWER)\r
+\r
+        // 设置刷新文本\r
+        if (max >= HEART_RATE_LIMIT_UPPER || max < 60)\r
         {\r
             topRate->SetText("--");\r
-            return;\r
         }\r
-        ret = sprintf_s(top, sizeof(top), "%u", maxRate);\r
-        if (ret > EOK)\r
+        else\r
         {\r
-            topRate->SetText(top);\r
+            std::string topRateStr = std::to_string(max);\r
+            topRate->SetText(topRateStr.c_str());\r
         }\r
     }\r
 \r
     // 刷新最小心率\r
     void HeartRateView::RefreshHeartRateMin(uint16_t min)\r
     {\r
-        char bottom[NUM_4] = "--";\r
-        int32_t ret = 0;\r
-\r
-        minRate = (minRate <= min) ? minRate : min;\r
         if (bottomRate == nullptr)\r
         {\r
             return;\r
         }\r
-        if (minRate >= HEART_RATE_LIMIT_UPPER)\r
+\r
+        // 设置刷新文本\r
+        if (min >= HEART_RATE_LIMIT_UPPER || min < 60)\r
         {\r
             bottomRate->SetText("--");\r
-            return;\r
         }\r
-        ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate);\r
-        if (ret > EOK)\r
+        else\r
         {\r
-            bottomRate->SetText(bottom);\r
+            std::string bottomRateStr = std::to_string(min);\r
+            bottomRate->SetText(bottomRateStr.c_str());\r
         }\r
     }\r
-\r
     // 刷新静息心率\r
     void HeartRateView::RefreshRestHeartRate(uint16_t value)\r
     {\r
index 579f7de..8649db8 100644 (file)
@@ -23,7 +23,7 @@ extern "C"
 \r
 std::string Cnweekday[] = {"周天", "周一", "周二", "周三", "周四", "周五", "周六"};\r
 \r
-static constexpr const char *WHITE_BATTERY = "/user/res/Battery/Battery-E.bin";\r
+static constexpr const char *WHITE_BATTERY = "/user/res/Battery/Battery_White.bin";\r
 static constexpr const char *SAVE_BUTTON = "/user/res/Save_Ele/finger.bin";\r
 static constexpr const char *BACK_BUTTON = "/user/res/Save_Ele/finger2.bin";\r
 static constexpr const char *SAVE_WATHCH = "/user/res/Save_Ele/wathch.bin";\r
index 38fa102..d8e6d54 100644 (file)
@@ -378,6 +378,7 @@ namespace OHOS
 
     void SleepModel::UpdateSleepView()
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "睡眠数据更新");
         SleepControlView *p_SleepControlView = SleepControlView::GetInstance();
         if (p_SleepControlView != nullptr)
         {
index e998433..79eea09 100644 (file)
@@ -29,13 +29,19 @@ namespace OHOS
     TakephotosView::~TakephotosView()
     {
         // DeInit();
-        creamAnimator->Stop();
-        smileAnimator->Stop();
-        FreeImageInfoArray(creamimageInfos, creambasePath.c_str(), 50);
-        FreeImageInfoArray(smileimageInfos, smilebasePath.c_str(), 50);
-        ReleaseImageAnimatorSource(creamimageAnimatorInfo, 50);
+        PopupPhoto staust = TakephotosModel::GetInstance()->GetPopStaust();
+        if (staust == PopupPhoto::CreamPopup)
+        {
+            creamAnimator->Stop();
+            FreeImageInfoArray(creamimageInfos, creambasePath.c_str(), 50);
+        }
+        else
+        {
+            smileAnimator->Stop();
+            FreeImageInfoArray(smileimageInfos, smilebasePath.c_str(), 50);
+        }
         ReleaseImageAnimatorSource(smileimageAnimatorInfo, 50);
-
+        ReleaseImageAnimatorSource(creamimageAnimatorInfo, 50);
         UIViewGroup *tmpGroup = dynamic_cast<UIViewGroup *>(container_);
         UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup);
 
index ac5d031..552fdfb 100644 (file)
@@ -493,27 +493,35 @@ static uint8_t fall_asleep_state_num = 0;
 #endif
 
 /*NextDay*/
-void MsgCenterNotifyNextDayProc(const Topic topic, Request* req)
+void MsgCenterNotifyNextDayProc(const Topic topic, Request *req)
 {
     unused(topic);
-    unused(req);   
-
+    unused(req);
     AlarmClockModel::GetInstance()->NextDayNotify();
-#ifdef FD230
     day_timestamp = 0;
-
-    if(!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))
+#ifdef FD230
+    printf("******nextday is begin******\r\n");
+    /* ----------------------------------- 睡眠相关 ----------------------------------- */
+    if (!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))
     {
-        //未设置睡眠监控 nextday进行清除睡眠数据。
+        // 未设置睡眠监控 nextday进行清除睡眠数据。
         SleepModel::GetInstance().DeleteSleepData();
+        // 通知UI更新
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance()));
     }
-
-    //  清空当日的心率曲线数据
-    HealthService::GetInstance()->ClearHourlyHeartRates();
-    HealthService::GetInstance()->SaveDailyHeartRate();
-
-    //午夜清除运动数据
-    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA,NULL);
+    /* ---------------------------------- 健康数据相关 ---------------------------------- */
+    // 清空当日的心率血氧数据
+    HealthService::GetInstance()->CleanHealthData();
+    // 通知UI更新
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::HeartModel::CleanAllData, OHOS::HeartModel::GetInstance()));
+    GraphicService::GetInstance()->PostGraphicEvent(
+        std::bind(&OHOS::BloodOxygenModel::CleanAllData, OHOS::BloodOxygenModel::GetInstance()));
+    /* --------------------------------- 每日目标相关 --------------------------------- */
+    // 午夜清除运动数据
+    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA, NULL);
+    printf("******nextday is end******\r\n");
 #endif
 }
 
index fae6fa0..162c261 100644 (file)
@@ -327,7 +327,7 @@ namespace OHOS
             {ConfigDataType::DATATYPE_INT,    "traningauto",              "0"      },//CONFIGMODEL_ITEM_TRANING_AUTO,//开启关闭自动获取实时数据
             {ConfigDataType::DATATYPE_INT,     "traningheart",             "190"  },//CONFIGMODEL_ITEM_TRAINING_HEART_MAX//训练最高心率
              //心率相关
-            {ConfigDataType::DATATYPE_INT,     "heartrate_freq",        "15"     },// CONFIGMODEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率
+            {ConfigDataType::DATATYPE_INT,     "heartrate_freq",        "30"     },// CONFIGMODEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率
             {ConfigDataType::DATATYPE_INT,     "heartrate_remind",             "0"},// CONFIGMODEL_ITEM_HEARTRATE_REMIND//提醒开关
 
             {ConfigDataType::DATATYPE_INT,     "heartrate_threshold_value",  "0"},// CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE//心率值
index ef80e51..67484b9 100644 (file)
@@ -2708,16 +2708,7 @@ static void get_avg_hrs(int32_t hrs)
         }\r
         avg_hrs = (sum_hrs - max_hrs - min_hrs) / (hrs_num - 2);\r
         //PRINT("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs);\r
-        hx3695_msg_callback_t func =  hx3695_get_send_msg_callback_func();\r
-        if(func != NULL)\r
-        {\r
-          hrsresult.lastesthrs = avg_hrs;\r
-          func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
-          if(uapi_get_cywee_static_state())\r
-          {\r
-              func(HX3695_MSG_TYPE_STATIC_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
-          }\r
-        }\r
+        hrsresult.lastesthrs = avg_hrs;\r
         if(hrs_mode_state)\r
         {\r
             cywee_data = hrsresult.lastesthrs;\r
@@ -2894,20 +2885,28 @@ void hx3695_hrs_ppg_Int_handle(void)
 \r
     if(hrs_wear_status == MSG_HRS_WEAR && hrsresult.hr_living == MSG_LIVING_TRUE)\r
     {\r
-        if(hrsresult.lastesthrs > 50)\r
+        if(hrsresult.lastesthrs > 60 || hrsresult.lastesthrs == 0)\r
                      get_avg_hrs(hrsresult.lastesthrs);\r
         hrsresult.wearstatus = MSG_HRS_WEAR;\r
     }\r
     else\r
     {\r
         hrsresult.wearstatus = MSG_HRS_NO_WEAR;\r
+        hrsresult.lastesthrs = 0;\r
     }\r
     hx3695_msg_callback_t func =  hx3695_get_send_msg_callback_func();\r
     if(func != NULL)\r
     {\r
-        func(HX3695_MSG_TYPE_WEARSTAT_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
+      PRINT("hrsresult.lastesthrs : %d \n",hrsresult.lastesthrs);\r
+      func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
+      if(uapi_get_cywee_static_state())\r
+      {\r
+          func(HX3695_MSG_TYPE_STATIC_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
+      }\r
+      func(HX3695_MSG_TYPE_WEARSTAT_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
     }\r
 \r
+\r
     //PRINT("hx3695 data_cnt: %d,  hr_living: %d, hr_living_qu: %d, hr_living_std: %d, hr_result:%d \r\n",\r
                //alg_results.data_cnt,  hrsresult.hr_living, hrsresult.hr_living_qu, hrsresult.hr_living_std, hrsresult.lastesthrs);\r
 \r