Merge #1173 into sdk602patch0911 from refs/changes/1173/head 1175/target/1
author袁清梦 <3449750381@qq.com>
Sat, 12 Oct 2024 13:34:28 +0000 (13:34 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Sat, 12 Oct 2024 13:34:28 +0000 (13:34 +0000)
Code review from 袁清梦

* refs/changes/1173/head: (8 commits squashed)

  - 优化训练文件存储。增加错误存储提醒

  - #986 手表在点击拍照界面,APP端退出相机界面时手表端不会同步退出

  - #799长按表盘,进入表盘预览界面,手表息屏后不管多久亮屏,手表还是表盘预览界面。

  - #942 心率出值后,过一会又会显示--

  - #840 卡片界面心率也需要有活体检测弹窗提醒

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

  - 表盘:取消开机对电量获取的注册

  - 心率:优化心率数据的存储以及更新

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/1173
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStandby.h
code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPower.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPowerStandby.cpp
code/sdk/application/wearable/fd230app/nativeui/screennotify/include/ui_screennotify.h
code/sdk/application/wearable/fd230app/nativeui/screennotify/src/ui_screennotify.cpp
code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp

index f6bb63b..ea1cf63 100644 (file)
@@ -150,6 +150,11 @@ public:
   uint16_t *GetArrayData();\r
   void SetArrayData();\r
 \r
+  void handleHeartResult();\r
+  void logAndChangeSlice(HeartResult result);\r
+  void handleLowHeartRate();\r
+  void handleHighHeartRate();\r
+\r
 private:\r
   HealthAllDatas healthDatas;\r
   uint16_t pretime{0};\r
@@ -164,8 +169,8 @@ private:
   bool wearStatus{true};\r
   uint16_t index_ = 0;\r
 \r
-  uint16_t displayheart;     // 显示心率\r
-  uint16_t currentheart;     // 保存心率\r
+  uint16_t displayheart = 0;         // 显示心率\r
+  uint16_t currentheart = 0;         // 保存心率\r
   uint16_t displayheart_max = 0; // 显示最大心率\r
   uint16_t displayheart_min = 0; // 显示最小心率\r
 \r
@@ -186,6 +191,10 @@ private:
   HeartCheck checkstate = HeartCheck::RESTSTSTE;      // 目前检测状态\r
 \r
   uint16_t dynamic_heartrate[5]; //动态心率配置项\r
+\r
+  uint8_t heartRemindState{0};\r
+  uint16_t thresholdValue{160};\r
+  uint16_t thresholdState{1};\r
 };\r
 } // namespace OHOS\r
 \r
index 7f0f087..73d443a 100644 (file)
@@ -29,9 +29,9 @@ extern "C" {
 #endif\r
 \r
 #define MAX_UNWEAR_COUNT 2\r
-#define MAX_VALID_HRS_COUNT 60\r
-#define MAX_DISVALID_HRS_COUNT 70\r
-#define MIN_DISPLAY_HEART 60\r
+#define MAX_VALID_HRS_COUNT 10    //最大有效数\r
+#define MAX_DISVALID_HRS_COUNT 10 //最大无效数\r
+#define MIN_DISPLAY_HEART 50      //最新心率\r
 #define DISPLAY_COUNT 0\r
 #define HEARTTEST 1 //[0 开启测试 1 关闭]\r
 \r
@@ -401,7 +401,8 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
     checkstate = HeartCheck::RESTSTSTE;\r
     LOS_Msleep(500);\r
     uapi_dev_runtime_set_hrs_passivity(0);\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(0)");\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                  "uapi_dev_runtime_set_hrs_passivity(0)");\r
   } else if (state == HeartState::Start && heartstate == false) {\r
     /*充电状态下不进行检测*/\r
     bool isCharging = get_charge_stat(); // 获取充电状态\r
@@ -415,25 +416,22 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
     heartstate = true;\r
     checkstate = check;\r
     //被动\r
-    if(checkstate==HeartCheck::PASSIVITY)\r
-    {\r
-        uapi_dev_runtime_set_hrs_passivity(1);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(1)");\r
+    if (checkstate == HeartCheck::PASSIVITY) {\r
+      uapi_dev_runtime_set_hrs_passivity(1);\r
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                    "uapi_dev_runtime_set_hrs_passivity(1)");\r
     }\r
-  \r
   }\r
 }\r
 // 开始检测\r
 void HeartModel::Heart_Start() {\r
-  displayheart = 0;\r
-  // displayheart_max=0;// 显示最大心率 [每次检测进行清除]\r
-  // displayheart_min=0;// 显示最小心率 [每次检测进行清除]\r
-\r
-  SetResult(HeartResult::NOT_TESTED); // 重置检测\r
-                                      // 进行初始化操作\r
   if (!sensorstate) {\r
+    displayheart = 0;\r
+    SetResult(HeartResult::NOT_TESTED); // 重置检测\r
     Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
+    // ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭\r
     sensorstate = true;\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测");\r
   }\r
 }\r
 \r
@@ -442,11 +440,13 @@ void HeartModel::Heart_Stop() {
   valid_counter_ = 0;\r
   disvalid_counter_ = 0;\r
   unwear_counter_ = 0;\r
-  display_counter_ = 0;\r
-  displayheart = 0;\r
+  // display_counter_ = 0; 取消再次检测的--操作\r
+  // displayheart = 0;\r
+\r
+  // ScreenTurnOff(); //恢复正常亮屏\r
 \r
   /*主界面卡片检测 或者 被动检测*/\r
-  if ( checkstate == HeartCheck::PASSIVITY) {\r
+  if (checkstate == HeartCheck::PASSIVITY) {\r
     if (heartresult_ == HeartResult::SUCCESS) {\r
       Heart_Save();\r
       /*更新曲线*/\r
@@ -458,12 +458,9 @@ void HeartModel::Heart_Stop() {
     return;\r
   }\r
 \r
-  if (sensorstate) {\r
-    // Heart_Control(HeartState::End,HeartCheck::INITIATIVE);主动检测心率\r
-    // 不需要关闭\r
-    sensorstate = false;\r
-    Heart_Result(); // 处理结果\r
-  }\r
+  sensorstate = false;\r
+  Heart_Result(); // 处理结果\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");\r
 }\r
 // 保存检测数据\r
 void HeartModel::Heart_Save() {\r
@@ -477,76 +474,61 @@ void HeartModel::Heart_Save() {
                 data.timestamp);\r
 }\r
 \r
-// 显示检测结果// 显示检测结果\r
 void HeartModel::Heart_Result() {\r
-  // 心率提醒(0开 1关)\r
-  uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
+  // 获取心率提醒状态和阈值\r
+  heartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
       ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
-  uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
+  thresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
       ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
 \r
-  if (HeartRemindState) {\r
-    // 检查当前心率是否高于或低于阈值\r
-    uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(\r
+  if (heartRemindState) {\r
+    // 获取当前心率状态\r
+    thresholdState = ConfigModel::GetInstance()->get_configData_int(\r
         ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
 \r
-    if (ThresholdState == 0 && currentheart < ThresholdValue &&\r
-        currentheart != 0) {\r
-      // 当前心率低于阈值\r
-      heartresult_ = HeartResult::LOW_RESULT;\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                    "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d",\r
-                    currentheart, ThresholdValue);\r
-    } else if (ThresholdState == 1 && currentheart > ThresholdValue) {\r
-      // 当前心率高于阈值\r
-      heartresult_ = HeartResult::HIGH_RESULT;\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                    "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d",\r
-                    currentheart, ThresholdValue);\r
+    if (currentheart != 0) {\r
+      if (thresholdState == 0 && currentheart < thresholdValue) {\r
+        // 当前心率低于阈值\r
+        heartresult_ = HeartResult::LOW_RESULT;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d",\r
+                      currentheart, thresholdValue);\r
+      } else if (thresholdState == 1 && currentheart > thresholdValue) {\r
+        // 当前心率高于阈值\r
+        heartresult_ = HeartResult::HIGH_RESULT;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d",\r
+                      currentheart, thresholdValue);\r
+      }\r
     }\r
   }\r
 \r
   // 根据结果进行处理\r
+  handleHeartResult();\r
+}\r
+// 处理检测结果\r
+void HeartModel::handleHeartResult() {\r
   switch (heartresult_) {\r
   case HeartResult::SUCCESS:\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:成功");\r
     Heart_Save();\r
-    /*更新曲线*/\r
+    // 更新曲线\r
     GraphicService::GetInstance()->PostGraphicEvent(\r
         std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
     break;\r
 \r
-  case HeartResult::NOT_WORN:     // 未佩戴状态\r
-  case HeartResult::TIMEOUT:      // 超时情况\r
-  case HeartResult::INVALID_DATA: // 无效数据情况\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况",\r
-                  heartresult_ == HeartResult::NOT_WORN\r
-                      ? "未佩戴状态"\r
-                      : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
-                                                             : "无效数据");\r
-    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+  case HeartResult::NOT_WORN:\r
+  case HeartResult::TIMEOUT:\r
+  case HeartResult::INVALID_DATA:\r
+    logAndChangeSlice(heartresult_);\r
     break;\r
 \r
   case HeartResult::LOW_RESULT:\r
-    // 低心率结果处理\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况");\r
-    HealthState lowHealthState;\r
-    lowHealthState.checkType = BLOOD_CHECK;\r
-    lowHealthState.resultStatus = LOW;\r
-    lowHealthState.checkResult = ThresholdValue;\r
-    HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
-    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+    handleLowHeartRate();\r
     break;\r
 \r
   case HeartResult::HIGH_RESULT:\r
-    // 高心率结果处理\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况");\r
-    HealthState highHealthState;\r
-    highHealthState.checkType = BLOOD_CHECK;\r
-    highHealthState.resultStatus = HIGH;\r
-    highHealthState.checkResult = ThresholdValue;\r
-    HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
-    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+    handleHighHeartRate();\r
     break;\r
 \r
   default:\r
@@ -554,15 +536,38 @@ void HeartModel::Heart_Result() {
     break;\r
   }\r
 }\r
- void HeartModel::SetWearStatus()\r
-  {\r
-    // 如果处于训练模式,提前返回\r
-    if (uapi_dev_runtime_get_train_status() == 1)\r
-      return;\r
-    // 设置佩戴状态\r
-    SetResult(HeartResult::NOT_WORN);\r
-    Heart_Stop();\r
-  } \r
+//进行日志打印与界面切换\r
+void HeartModel::logAndChangeSlice(HeartResult result) {\r
+  const char *resultMsg =\r
+      (result == HeartResult::NOT_WORN)\r
+          ? "未佩戴状态"\r
+          : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据";\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg);\r
+  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+}\r
+// 处理低心率情况\r
+void HeartModel::handleLowHeartRate() {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况");\r
+  HealthState lowHealthState = {BLOOD_CHECK, LOW, thresholdValue};\r
+  HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
+  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+}\r
+// 处理高心率情况\r
+void HeartModel::handleHighHeartRate() {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况");\r
+  HealthState highHealthState = {BLOOD_CHECK, HIGH, thresholdValue};\r
+  HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
+  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+}\r
+// 设置佩戴状态\r
+void HeartModel::SetWearStatus() {\r
+  // 如果处于训练模式,提前返回\r
+  if (uapi_dev_runtime_get_train_status() == 1)\r
+    return;\r
+  // 设置佩戴状态\r
+  SetResult(HeartResult::NOT_WORN);\r
+  Heart_Stop();\r
+}\r
 \r
 void HeartModel::UpHeartdata(uint16_t heart) {\r
   // 如果处于训练模式,提前返回\r
@@ -576,13 +581,10 @@ void HeartModel::UpHeartdata(uint16_t heart) {
       displayheart = 0;\r
     }\r
     display_counter_++;\r
-  }\r
-  else\r
-  {\r
+  } else {\r
     displayheart = 0;\r
   }\r
 \r
-\r
   // 更新心率和计数器\r
   if (displayheart != 0) {\r
     currentheart = displayheart; // 更新当前心率\r
index 247f6f4..2837b4d 100644 (file)
@@ -1,21 +1,3 @@
-/*** 
- * @Date: 2024-05-30 15:59:37
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-19 11:44:23
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h
- */
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-04-27 10:01:25
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h
- */
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: DialModelPower
- * Author:
- * Create: 2023-12
- */
 
 #ifndef DIAL_MODEL_POWER_H
 #define DIAL_MODEL_POWER_H
index 334bb26..6a52879 100644 (file)
@@ -1,27 +1,4 @@
-/*** 
- * @Date: 2024-04-27 11:55:14
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-24 18:34:02
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStandby.h
- */
-/***
- * @Date: 2024-04-27 11:55:14
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-04-27 11:56:11
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStanbyStandby.h
- */
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-04-27 10:01:25
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStanby.h
- */
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: DialModelPowerStanby
- * Author:
- * Create: 2023-12
- */
+
 
 #ifndef DIAL_MODEL_POWER_STANDBY_H
 #define DIAL_MODEL_POWER_STANDBY_H
index de0be7c..21ec2c8 100644 (file)
@@ -42,6 +42,8 @@
 #include "ui_service.h"
 #include "time.h"
 #define TESTCHECK 0
+//心率弹窗
+#define HEART_RATE_CHECK_TIMEOUT 0
 namespace OHOS
 {
 
@@ -69,7 +71,13 @@ namespace OHOS
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "~MainPresenterSample");
         g_pMainPresenterSample = nullptr;
         /*从主界面退出,关闭心率检测*/
-        HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE);
+#if HEART_RATE_CHECK_TIMEOUT
+      HeartModel::GetInstance()->Heart_Control(HeartState::End,
+                                               HeartCheck::CARDCHECK);
+#else
+      HeartModel::GetInstance()->Heart_Control(HeartState::End,
+                                               HeartCheck::INITIATIVE);
+#endif
     }
 
     MainPresenterSample *MainPresenterSample::GetInstance(void)
@@ -470,9 +478,11 @@ namespace OHOS
     {
       // HeartModel::GetInstance()->Heart_Control(HeartState::End,
       // HeartCheck::PASSIVITY);
-      // HeartModel::GetInstance()->Heart_Control(HeartState::Start,
-      // HeartCheck::CARDCHECK);
-      HeartModel::GetInstance()->Heart_Start();
+#if HEART_RATE_CHECK_TIMEOUT
+    HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::CARDCHECK);
+#else
+    HeartModel::GetInstance()->Heart_Start();
+#endif
     }
     /*主表盘*/
     void MainPresenterSample::UpdateWatchFace()
index dc8f4f8..95bdf3c 100644 (file)
@@ -34,12 +34,12 @@ namespace OHOS
     bool DialModelPower::GetDialFloatData(DialDataType &type, float &out)
     {
         (void)type;
-        if (!powerUpdated_)
-        {
-            UpdatePower();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", power_);
-            return true;
-        }
+        // if (!powerUpdated_)
+        // {
+        //     UpdatePower();
+        //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", power_);
+        //     return true;
+        // }
         float voltage = 0.0F;
         power_ = battery_get_voltage(&voltage);
         out = static_cast<float>(power_);
index 6fdcfe2..5e86d71 100644 (file)
@@ -1,9 +1,4 @@
-/***
- * @Date: 2024-07-06 16:27:31
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-24 18:31:39
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPowerStandby.cpp
- */
+
 
 #include "RegisterDialModel.h"
 #include "DialModelPowerStandby.h"
@@ -21,12 +16,12 @@ namespace OHOS
     bool DialModelPowerStanby::GetDialFloatData(DialDataType &type, float &out)
     {
         (void)type;
-        if (!PowerStanbyUpdated_)
-        {
-            UpdatePowerStanby();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", PowerStanby_);
-            return true;
-        }
+        // if (!PowerStanbyUpdated_)
+        // {
+        //     UpdatePowerStanby();
+        //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", PowerStanby_);
+        //     return true;
+        // }
 
         float voltage = 0.0F;
         PowerStanby_ = battery_get_voltage(&voltage);
index 4d20275..6a6d6aa 100644 (file)
@@ -1,9 +1,4 @@
-/**
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.
- * Description: Power display action header file.
- * Author:
- * Create:
- */
+
 #ifndef OHOS_UI_SCREENNOTIFY_H
 #define OHOS_UI_SCREENNOTIFY_H
 #include "ohos_types.h"
@@ -34,11 +29,14 @@ void set_back_to_home_interval(uint32_t time_sec);
 
 /**
  * @brief 获取灭屏后slice的存活期,需要在slice对应的Presentor的OnStart方法中调用
- * 默认存活期是5秒,灭屏超过5秒后再次亮屏会跳回主界面
+ * 默认存活期是5秒,灭屏超过10秒后再次亮屏会跳回主界面
  * @param time_sec 获取的slice灭屏后的存活期时间
  */
 uint32_t get_back_to_home_interval(void);
 
+void handleLockEnabled(uint16_t current_slice_id);
+void handleLockDisabled(uint16_t current_slice_id);
+
 #ifdef __cplusplus
 }
 #endif
index e100581..c238397 100644 (file)
-#include <list>  
-#include <cstdio>  
-#include "ability_state.h"  
-#include "cmsis_os2.h"  
-#include "common_def.h"  
-#include "Ability.h"  
-#include "wearable_log.h"  
-#include "graphic_service.h"  
-#include "power_display_service.h"  
-#include "NativeAbility.h"  
-#include "AppViewIDs.h"  
-#include "MainViewSample.h"  
-#include "ui_screennotify.h"  
-#include "components/root_view.h"  
-#include "ConfigModel.h"  
-
-#include "ui_service.h"  
-extern "C" void uapi_dev_runtime_set_lock_status(uint8_t status);  
-extern "C" uint8_t uapi_dev_runtime_get_lock_status(void);  
-
-#ifdef __cplusplus  
-extern "C"  
-{  
-#endif  
-    static uint32_t g_back_to_home_interval = 3; // 超时时间 秒  
-    uint16_t ignore_slice_ids[] = {  
-        VIEW_INVALID,  
-        VIEW_SAVEBAT,      // 省电模式  
-        VIEW_TRAININGCRAD, // 训练卡片  
-    };  
-    static std::list<ScreenStatusNotifyCallback> g_callback;  
-    
-    static void ChangeToHomeView(void)  
-    {  
-        screen_context_t *sc = power_display_get_screen_context();  
-        uint16_t current_slice_id = OHOS::NativeAbility::GetInstance().GetCurSliceId();  
-
-        for (uint16_t i = 0; i < sizeof(ignore_slice_ids) / sizeof(uint16_t); i++)  
-        {  
-            if (ignore_slice_ids[i] == current_slice_id)  
-            {  
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current slice ID %u is ignored.", current_slice_id);  
-                return;  // 如果当前slice在忽略列表中,返回  
-            }  
-        }  
-
-        // 打印屏幕关机时间  
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off time interval = %u", sc->screen_off_time_interval);  
-        
-        if (sc->screen_off_time_interval > g_back_to_home_interval)  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off timeout exceeded g_back_to_home_interval.");  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetNativeAbilityState = %u", OHOS::NativeAbility::GetInstance().GetNativeAbilityState());  
-    
-            int lockstate = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_PASSWORD_SWITCH);  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lockstate = %d", lockstate);  
-
-            // 打印锁定状态判断  
-            if (lockstate == 1)  
-            {  
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Lock state is enabled (lockstate == 1).");  
-
-                if (OHOS::NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE)  
-                {  
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Native ability state is active.");  
-
-                    if (uapi_dev_runtime_get_lock_status() == 0)  
-                    {  
-                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device is unlocked (lock status == 0).");  
-                        OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);  
-                        uapi_dev_runtime_set_lock_status(1); // 上锁  
-                        OHOS::MainModel::GetInstance().setDialState(OHOS::DialState::LOCK, true);  
-                    }  
-                    else if (uapi_dev_runtime_get_lock_status() == 1 && (current_slice_id == VIEW_CODED_LOCK))  
-                    {  
-                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device is locked (lock status == 1) and current slice is VIEW_CODED_LOCK.");  
-                        OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);  
-                    }  
-                    else   
-                    {  
-                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device is in an inactive lock state or current slice is not VIEW_CODED_LOCK.");  
-                    }  
-                }  
-                else  
-                {  
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Native ability state is not active.");  
-                }  
-            }  
-            else  
-            {  
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Lock state is not enabled (lockstate != 1).");  
-            }  
-        }  
-        else  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off time interval is within limits.");  
-        }  
-    }  
-
-    void notify_screen_on_event(void)  
-    {  
-        for (auto callback : g_callback)  
-        {  
-            callback(SCREEN_STATUS_ON);  
-        }  
-        ChangeToHomeView();  
-    }  
-
-    void notify_screen_off_event(void)  
-    {  
-        for (auto callback : g_callback)  
-        {  
-            callback(SCREEN_STATUS_OFF);  
-        }  
-    }  
-
-    void set_back_to_home_interval(uint32_t time_sec)  
-    {  
-        g_back_to_home_interval = time_sec;  
-    }  
-
-    uint32_t get_back_to_home_interval(void)  
-    {  
-        return g_back_to_home_interval;  
-    }  
-
-    void registerNotifyScreenStatus(ScreenStatusNotifyCallback callback)  
-    {  
-        if (callback != nullptr)  
-        {  
-            g_callback.push_back(callback);  
-        }  
-    }  
-
-    void deregisterNotifyScreenStatus(ScreenStatusNotifyCallback callback)  
-    {  
-        if (callback != nullptr)  
-        {  
-            g_callback.remove(callback);  
-        }  
-    }  
-
-#ifdef __cplusplus  
-}  
+#include "ui_screennotify.h"
+#include "Ability.h"
+#include "AppViewIDs.h"
+#include "ConfigModel.h"
+#include "MainViewSample.h"
+#include "NativeAbility.h"
+#include "ability_state.h"
+#include "cmsis_os2.h"
+#include "common_def.h"
+#include "components/root_view.h"
+#include "graphic_service.h"
+#include "power_display_service.h"
+#include "wearable_log.h"
+#include <cstdio>
+#include <unordered_set>
+
+extern "C" void uapi_dev_runtime_set_lock_status(uint8_t status);
+extern "C" uint8_t uapi_dev_runtime_get_lock_status(void);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static uint32_t g_back_to_home_interval = 3;         // 超时时间 3秒
+static const uint32_t screen_off_time_interval = 10; // 超时时间 10秒
+//息屏不上锁
+const uint16_t ignore_slice_ids[] = {
+    VIEW_INVALID,
+    VIEW_SAVEBAT,      // 省电模式
+    VIEW_TRAININGCRAD, // 训练卡片
+};
+//息屏10秒回到主界面
+const uint16_t special_slice_ids[] = {
+    VIEW_ADD_CARD,   //卡片管理
+    VIEW_SET_DIAL,   //表盘管理
+    VIEW_HEART_CHART //心率检测
+};
+
+static std::unordered_set<ScreenStatusNotifyCallback> g_callbacks;
+
+static bool isSliceIgnored(uint16_t slice_id) {
+  for (uint16_t id : ignore_slice_ids) {
+    if (id == slice_id) {
+      return true;
+    }
+  }
+  return false;
+}
+
+static void ChangeToHomeView(void) {
+  screen_context_t *sc = power_display_get_screen_context();
+  uint16_t current_slice_id =
+      OHOS::NativeAbility::GetInstance().GetCurSliceId();
+
+  if (isSliceIgnored(current_slice_id)) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current slice ID %u is ignored.",
+                  current_slice_id);
+    return;
+  }
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off time interval = %u",
+                sc->screen_off_time_interval);
+
+  if (sc->screen_off_time_interval > g_back_to_home_interval) {
+    int lockstate = OHOS::ConfigModel::GetInstance()->get_configData_int(
+        OHOS::ConfigModel::CONFIGMODEL_ITEM_PASSWORD_SWITCH);
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lockstate = %d", lockstate);
+
+    if (lockstate == 1) {
+      handleLockEnabled(current_slice_id);
+    } else {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "Lock state is not enabled (lockstate != 1).");
+    }
+  }
+  if (sc->screen_off_time_interval > g_back_to_home_interval) {
+    handleLockDisabled(current_slice_id);
+  }
+}
+
+void handleLockEnabled(uint16_t current_slice_id) {
+  if (OHOS::NativeAbility::GetInstance().GetNativeAbilityState() ==
+      STATE_ACTIVE) {
+    if (uapi_dev_runtime_get_lock_status() == 0) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "Device is unlocked (lock status == 0).");
+      OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+      uapi_dev_runtime_set_lock_status(1); // 上锁
+      OHOS::MainModel::GetInstance().setDialState(OHOS::DialState::LOCK, true);
+    } else if (current_slice_id == VIEW_CODED_LOCK) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "Device is locked (lock status == 1) and current slice is "
+                    "VIEW_CODED_LOCK.");
+      OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+    } else {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "Device is in an inactive lock state or current slice is "
+                    "not VIEW_CODED_LOCK.");
+    }
+  } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Native ability state is not active.");
+  }
+}
+
+void handleLockDisabled(uint16_t current_slice_id) {
+  int lockstate = OHOS::ConfigModel::GetInstance()->get_configData_int(
+      OHOS::ConfigModel::CONFIGMODEL_ITEM_PASSWORD_SWITCH);
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lockstate = %d", lockstate);
+
+  if (lockstate == 0) {
+    for (uint16_t id : special_slice_ids) {
+      if (id == current_slice_id) {
+        OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+        return;
+      }
+    }
+  }
+}
+
+void notify_screen_on_event(void) {
+  for (auto callback : g_callbacks) {
+    callback(SCREEN_STATUS_ON);
+  }
+  ChangeToHomeView();
+}
+
+void notify_screen_off_event(void) {
+  for (auto callback : g_callbacks) {
+    callback(SCREEN_STATUS_OFF);
+  }
+}
+
+void set_back_to_home_interval(uint32_t time_sec) {
+  g_back_to_home_interval = time_sec;
+}
+
+uint32_t get_back_to_home_interval(void) { return g_back_to_home_interval; }
+
+void registerNotifyScreenStatus(ScreenStatusNotifyCallback callback) {
+  if (callback != nullptr) {
+    g_callbacks.insert(callback);
+  }
+}
+
+void deregisterNotifyScreenStatus(ScreenStatusNotifyCallback callback) {
+  if (callback != nullptr) {
+    g_callbacks.erase(callback);
+  }
+}
+
+#ifdef __cplusplus
+}
 #endif
\ No newline at end of file
index a999520..3837db0 100644 (file)
@@ -93,7 +93,15 @@ extern "C"
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " 遥控拍照 \r\n");
             uapi_set_screen_on_api(); // 亮屏
             TakephotosModel::GetInstance()->SetPopStaust(PopupPhoto::TakePopup);
-            NativeAbility::GetInstance().EnterSlice(VIEW_TAKEPHOTOS);
+            //获取当前界面Id
+            int16_t curviewid =  OHOS::NativeAbility::GetInstance().GetCurSliceId();
+            //已经处于遥控拍照界面
+            if (curviewid == VIEW_TAKEPHOTOS) {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_TAKEPHOTOS);
+            }
+            else {
+                NativeAbility::GetInstance().EnterSlice(VIEW_TAKEPHOTOS);
+            }
         }
         // 退出拍照
         if (request->msgId == TOPIC_EVENT_CANCEL_CMAERA)
index 921cb2c..98abd86 100644 (file)
@@ -129,9 +129,6 @@ static void Training_Notify(void *args, const Topic topic, Request *request) {
   }
   //增加训练runtime控制
   if (uapi_dev_runtime_get_train_status() == 0) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "uapi_dev_runtime_get_train_status %d",
-                  uapi_dev_runtime_get_train_status());
     return;
   }
   //训练基本信息更新
@@ -1063,6 +1060,9 @@ bool TraingModel::SaveSportData() {
   data.std = static_cast<uint32_t>(sportdata->std);
   data.cdc = static_cast<uint32_t>(sportdata->cdc);
 
+  // 创建sport文件夹
+  CreateDirectoryIfNotExists(TRAINING_DATA_DIRECTORY);
+
   // 保存数据到 bin
   if (write_Trainingdata_data(data) != 1) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "write_Trainingdata_data is error!");
@@ -1623,38 +1623,53 @@ static std::vector<Trainingdata> LoadTrainingDataFromTodayFile() {
 #ifdef __cplusplus
 extern "C" {
 #endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
 // 获得数据个数
 static int get_Trainingdata_data_num(FILE *fp) {
-  long size = 0;
-  if (fp != NULL) {
-    fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
-    size = ftell(fp);       // 获取当前文件指针位置,即文件大小
-    fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+  if (fp == NULL) {
+    return 0; // 如果文件指针为空,返回0
   }
-  int num = size / sizeof(Trainingdata);
-  return num;
+
+  fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+  long size = ftell(fp);  // 获取当前文件指针位置,即文件大小
+  fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+  return (size / sizeof(Trainingdata));
 }
+
+// 写训练bin文件
 int write_Trainingdata_data(Trainingdata data) {
   char file_path[MAX_FILE_PATH_LENGTH] = {0};
   char timeday[12] = {0};
   uapi_get_YYMMDD_Time(timeday, '_');
-  sprintf_s(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH,
-            timeday); // 防止越界
+  snprintf(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH, timeday);
 
-  // Check if the directory exists, if not, create it
+  // 检查目录是否存在,如果不存在则创建
   struct stat st = {0};
   if (stat(TRAINING_PATH, &st) == -1) {
-    mkdir(TRAINING_PATH, 0700);
+    if (mkdir(TRAINING_PATH, 0700) != 0) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create directory: %s",
+                    strerror(errno));
+      return -1; // 返回错误码
+    }
   }
 
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s", file_path);
   FILE *fp = fopen(file_path, "ab+");
   if (fp == NULL) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for append");
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for append: %s",
+                  strerror(errno));
     fp = fopen(file_path, "wb+");
     if (fp == NULL) {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for write");
-      return -1; // Return an error code to indicate file open failure
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "Failed to open file for write: %s", strerror(errno));
+      return -1; // 返回错误码
     }
   }
 
@@ -1662,46 +1677,52 @@ int write_Trainingdata_data(Trainingdata data) {
   if (ret != 1) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fwrite_data error! %d", ret);
     fclose(fp);
-    return -1; // Return an error code on write failure
+    return -1; // 返回错误码
   }
 
-  fclose(fp); // Close the file after writing data
-  return 1;   // Return success code
+  fclose(fp); // 关闭文件
+  return 1;   // 返回成功码
 }
+
 // 读数据
 Trainingdata *read_Trainingdata_data(char *timedata, uint16_t offset) {
   char file_path[128] = {0};
-  sprintf_s(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH,
-            timedata); // 防止越界
+  snprintf(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH, timedata);
 
-  FILE *fp = fopen(file_path, "rb+");
+  FILE *fp = fopen(file_path, "rb");
   if (fp == NULL) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "file is NULL");
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for read: %s",
+                  strerror(errno));
     return NULL;
   }
+
   Trainingdata *data = (Trainingdata *)malloc(sizeof(Trainingdata));
   if (data == NULL) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Trainingdata malloc is error");
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Failed to allocate memory for Trainingdata");
     fclose(fp);
     return NULL;
   }
-  if (get_Trainingdata_data_num(fp) <= offset) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "file is NULL %d",
-                  get_Trainingdata_data_num(fp));
-    free(data); // 修复内存泄漏
+
+  int num_data = get_Trainingdata_data_num(fp);
+  if (num_data <= offset) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Offset %d exceeds number of data %d", offset, num_data);
+    free(data); // 释放内存
     fclose(fp);
     return NULL;
   }
+
   fseek(fp, sizeof(Trainingdata) * offset, SEEK_SET);
-  fread((void *)data, sizeof(Trainingdata), 1, fp);
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d", data->src);
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d %d ", offset,
+  fread(data, sizeof(Trainingdata), 1, fp);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Data src: %d", data->src);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Offset: %d, Size: %zu", offset,
                 sizeof(Trainingdata));
-  fseek(fp, 0, SEEK_SET);
 
-  fclose(fp);
-  return data;
+  fclose(fp);  // 关闭文件
+  return data; // 返回读取的数据
 }
+
 #ifdef __cplusplus
 }
 #endif
@@ -1743,8 +1764,6 @@ bool TraingModel::CheckDataJson() {
 bool TraingModel::SaveDataToJson(SportData *data) {
   FILE *fp;
   char *jsonStr = NULL;
-  // 创建sport文件夹
-  CreateDirectoryIfNotExists(TRAINING_DATA_DIRECTORY);
 
   // 读取现有的 JSON 数据
   fp = fopen(TRAINING_RECORD_FILE, "r");