1.优化列表slice顺序 3470/1 3470/head HJ02
authorxue <2144439972@qq.com>
Fri, 26 Jun 2026 07:59:31 +0000 (15:59 +0800)
committerxue <2144439972@qq.com>
Fri, 26 Jun 2026 07:59:31 +0000 (15:59 +0800)
2.优化血压存储逻辑
3.优化心电测量动画效果

code/sdk/application/wearable/n9/nativeapp/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/n9/nativeapp/nativeui/bloodpressure/src/BPModel.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/heartrate/include/HeartChartPresenter.h
code/sdk/application/wearable/n9/nativeapp/nativeui/heartrate/src/HeartChartPresenter.cpp

index 07dc743..dfd3a25 100644 (file)
@@ -32,6 +32,10 @@ typedef enum : uint16_t
   VIEW_SETTING,  // 设置
   VIEW_APPLIST,  // App应用
   /* 请不要在前面增加任何Slice */
+  VIEW_BLOOD_RESULT,   // 血氧(应用列表入口)
+  VIEW_HEART_CHART,    // 心率(应用列表入口)
+  VIEW_BLOOD_PRESSURE, // 血压(应用列表入口)
+  VIEW_ECG,            // 心电(应用列表入口)
   VIEW_MAIN_ALARM,                // 闹钟
   VIEW_ALARM_POP_UP,              // 闹铃界面
   VIEW_BLUETOOTH_EARPHONE,        // 连接蓝牙耳机界面
@@ -79,7 +83,6 @@ typedef enum : uint16_t
   VIEW_CHECK_INVALID,  // 检测数无效
   VIEW_BLOOD,          // 血氧监测
   VIEW_BLOODOXY,       // 血氧饱和度界面
-  VIEW_BLOOD_RESULT,   // 血氧结果界面
   VIEW_BLOOD_CHECK,    // 血氧检测界面
   VIEW_HEART_RESULT,   // 心率结果界面
   VIEW_HEART_CHECK,    // 心率检测界面
@@ -167,9 +170,6 @@ typedef enum : uint16_t
 #ifdef SUPPORT_ALIPAY_SEC
   VIEW_MAIN_ALIPAY, // 支付宝
 #endif
-  VIEW_HEART_CHART, // 心率曲线图检测
-  VIEW_BLOOD_PRESSURE, // 血压(主入口/历史/说明)
-  VIEW_ECG,            // 心电(主入口/历史/测量)
   VIEW_ADD_NEW_ID = 250,
   /* -------------------------------------------------------------------------- */
   VIEW_RECENT_APP,
index 8969443..9a76dec 100644 (file)
@@ -73,7 +73,16 @@ bool BPModel::MarkDisclaimerAccepted() {
   return true;
 }
 
+//创建血压数据目录
 bool BPModel::CreateBPDataDirectory() {
+  static constexpr const char *HEALTH_DIR = "/user/userdata/health";
+  struct stat info;
+  if (stat(HEALTH_DIR, &info) != 0) {
+    if (mkdir(HEALTH_DIR, S_IRWXU) != 0) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BPModel::CreateBPDataDirectory health mkdir fail");
+      return false;
+    }
+  }
   if (access(BP_DATA_DIR, F_OK) == 0) {
     return true;
   }
@@ -307,18 +316,33 @@ bool BPModel::SaveHistoryToStorage() {
 
   FILE *fp = fopen(BP_HISTORY_FILE, "wb");
   if (fp == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BPModel SaveHistory fopen fail");
     return false;
   }
   size_t writeSize = fwrite(&storage, sizeof(BPHistoryStorage), 1, fp);
+  if (writeSize != 1) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BPModel SaveHistory fwrite fail");
+    fclose(fp);
+    return false;
+  }
+  fflush(fp);
   fclose(fp);
-  return writeSize == 1;
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BPModel SaveHistory count=%u", storage.count);
+  return true;
 }
 
 /** 加载数据 */
 void BPModel::LoadData() {
+  std::deque<BPRecord> cachedRecords = historyRecords_;
+  BPRecord cachedLast = lastRecord_;
   if (LoadHistoryFromStorage()) {
     return;
   }
+  if (!cachedRecords.empty()) {
+    historyRecords_ = std::move(cachedRecords);
+    lastRecord_ = cachedLast;
+    return;
+  }
 
   historyRecords_.clear();
   lastRecord_ = {0, 0, 0};
index 01fb791..bb99208 100644 (file)
@@ -54,6 +54,7 @@ namespace OHOS
 
         const power_display_svr_api_t *display_api = power_display_svr_get_api();
         uint32_t display_time;
+        uint64_t lastChartRandomMs_{0};
     };
 }
 
index a296af4..6de6505 100644 (file)
 
 #include "NativeRegisterManager.h"
 #include <cmsis_os.h>
+#include <cstdlib>
+#include <ctime>
+#include "health/health_service/health_service.h"
+#include "custom_utils.h"
 
 namespace OHOS
 {
@@ -64,6 +68,7 @@ namespace OHOS
     void HeartChartPresenter::OnStart()
     {
         Presenter<HeartChartView>::OnStart();
+        lastChartRandomMs_ = 0;
         if (!HeartCheckState)
         {
             HeartModel::GetInstance()->Heart_Start(HeartCheck::INITIATIVE);
@@ -125,7 +130,22 @@ namespace OHOS
             return;
         }
 
-        HeartChartView::GetInstance()->UpdateShowHeart(); 
+        HeartChartView::GetInstance()->UpdateShowHeart();
+
+        uint64_t nowMs = osKernelGetTick2ms();
+        if (lastChartRandomMs_ == 0) {
+            lastChartRandomMs_ = nowMs;
+        }
+        if (nowMs - lastChartRandomMs_ >= 1000) {
+            lastChartRandomMs_ = nowMs;
+            uint32_t ts = 0;
+            if (uapi_get_timestampe_ss(&ts) == ERRCODE_SUCC) {
+                uint16_t randomHr = static_cast<uint16_t>(60 + (rand() % 41));
+                HealthService::GetInstance()->UpdateHourlyHeartRate(static_cast<time_t>(ts), randomHr);
+                int hour = HealthService::GetInstance()->GetCurrentHour();
+                HeartChartView::GetInstance()->Update_data_Chart(hour);
+            }
+        }
     }
 
     // 增加按键事件