优化健康model相关接口
authorCaisking <Casiking@zhihuishixun.com>
Thu, 26 Jun 2025 03:15:26 +0000 (11:15 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Thu, 26 Jun 2025 03:15:26 +0000 (11:15 +0800)
code/sdk/application/wearable/fd230app/nativeui/bloodpressure/include/BPModel.h
code/sdk/application/wearable/fd230app/nativeui/bloodpressure/src/BPModel.cpp
code/sdk/application/wearable/fd230app/nativeui/ecg/src/EcgPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/emotion/src/EmoPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/fatiguelevel/src/FatiguePresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/stress/src/StressPresenter.cpp

index 5b400b0..64132df 100644 (file)
@@ -8,97 +8,94 @@
 #define SBP_VALUE 120
 #define DBP_VALUE 80
 
-namespace OHOS
-{
-  // 检测状态
-  enum class BPState
-  {
-    // 结束检测
-    BP_End = 0,
-    // 第一次校准血压中 30s
-    BP_CALIBRATING_FIRSTTIME,
-    // 第二次校准血压中 30s
-    BP_CALIBRATING_SECONDTIME,
-    // 校准分析中 5s
-    BP_CALIBRATING_ANGLYSIS,
-    // 检测血压中 30s
-    BP_DETECTING,
-    // 压力测量中
-    STRESS_MEASURE,
-    // 疲劳度测量中
-    FATIGUE_MEASURE,
-    // ECG提示中
-    ECG_REMIND,
-    // ECG测量中
-    ECG_MEASURE,
-    // 情绪测量中
-    EMO_MEASURE,
-    // 压力分析中
-    STRESS_ANALYSIS,
-    // 疲劳度分析中
-    FATIGUE_ANALYSIS,
-    // ECG分析中
-    ECG_ANALYSIS,
-    // ECG结果中
-    ECG_RESULT,
-    // 情绪分析中
-    EMO_ANALYSIS,
-    // 普通状态
-    BP_NORMAL,
-    // 暂停检测
-    BP_PAUSE,
+namespace OHOS {
+// 检测状态
+enum class BPState {
+  // 结束检测
+  BP_End = 0,
+  // 第一次校准血压中 30s
+  BP_CALIBRATING_FIRSTTIME,
+  // 第二次校准血压中 30s
+  BP_CALIBRATING_SECONDTIME,
+  // 校准分析中 5s
+  BP_CALIBRATING_ANGLYSIS,
+  // 检测血压中 30s
+  BP_DETECTING,
+  // 压力测量中
+  STRESS_MEASURE,
+  // 疲劳度测量中
+  FATIGUE_MEASURE,
+  // ECG提示中
+  ECG_REMIND,
+  // ECG测量中
+  ECG_MEASURE,
+  // 情绪测量中
+  EMO_MEASURE,
+  // 压力分析中
+  STRESS_ANALYSIS,
+  // 疲劳度分析中
+  FATIGUE_ANALYSIS,
+  // ECG分析中
+  ECG_ANALYSIS,
+  // ECG结果中
+  ECG_RESULT,
+  // 情绪分析中
+  EMO_ANALYSIS,
+  // 普通状态
+  BP_NORMAL,
+  // 暂停检测
+  BP_PAUSE,
 
-    BP_STATE_MAX,
-  };
-  // 血压检测结果
-  enum class BPRESULT
-  {
-    NOT_TESTED = 0, // 未检测
-    SUCCESS,        // 检测成功
-    NOT_WORN,       // 未佩戴检测
-    TIMEOUT,        // 检测超时
-    HIGH_RESULT,    // 检测结果过高
-    LOW_RESULT,     // 检测结果过低
-    INVALID_DATA    // 无效数据
-  };
+  BP_STATE_MAX,
+};
+// 血压检测结果
+enum class BPRESULT {
+  NOT_TESTED = 0, // 未检测
+  SUCCESS,        // 检测成功
+  NOT_WORN,       // 未佩戴检测
+  TIMEOUT,        // 检测超时
+  HIGH_RESULT,    // 检测结果过高
+  LOW_RESULT,     // 检测结果过低
+  INVALID_DATA    // 无效数据
+};
 
-  enum class BP_VALUE_TYPE
-  {
-    SBP = 0,
-    DBP,
-  };
+enum class BP_VALUE_TYPE {
+  SBP = 0,
+  DBP,
+};
 
-#define BP_CHECK_TIME_MAX 30 //测量所需时间
+#define BP_CHECK_TIME_MAX 30   //测量所需时间
 #define BP_ANLYSISI_TIME_MAX 5 //分析所需时间
-#define BP_REMIND_TIME_MAX 5 //提醒所需时间
-  class BPModel
-  {
-  public:
-    BPModel();
-    ~BPModel();
-    static BPModel *GetInstance();
-    // 获取第几次校准
-    int16_t GetCalibrationFlag();
-    void SetCalibrationFlag(int value);
-    // 获取当前时间年月日时分字符串
-    std::string GetCurrentTimeStr();
-    // 当前状态管理
-    void BP_SetState(BPState state);
-    BPState GetCurrentState();
-    // 控制血压检测
-    void BP_Control(BPState state);
-    void BP_SetValue(BP_VALUE_TYPE type, bool set_value);
-    int16_t GetValue(BP_VALUE_TYPE type);
+#define BP_REMIND_TIME_MAX 5   //提醒所需时间
+class BPModel {
+public:
+  BPModel();
+  ~BPModel();
+  static BPModel *GetInstance();
+  // 获取第几次校准
+  int16_t GetCalibrationFlag();
+  void SetCalibrationFlag(int value);
+  // 获取当前时间年月日时分字符串
+  std::string GetCurrentTimeStr();
+  // 当前状态管理
+  void BP_SetState(BPState state);
+  BPState GetCurrentState();
+  // 控制血压检测
+  void BP_Control(BPState state);
+  void BP_SetValue(BP_VALUE_TYPE type, bool set_value);
+  int16_t GetValue(BP_VALUE_TYPE type);
+  void BP_timer_callback_out();
+  void BP_timer_callback_proc(int data);
 
-    ///////////////////////////////////////////////
-    void BP_StartTimer(uint32_t interval = 1 * 1000); // 1s定时器
-    void BP_StopTimer(void);
+  ///////////////////////////////////////////////
+  void BP_StartTimer(uint32_t interval = 1 * 1000); // 1s定时器
+  void BP_StopTimer(void);
 
-  private:
-    BPState current_state = BPState::BP_NORMAL;
-    int16_t custom_sbp = SBP_VALUE;
-    int16_t custom_dbp = DBP_VALUE;
-  };
+private:
+  BPState current_state = BPState::BP_NORMAL;
+  int16_t custom_sbp = SBP_VALUE;
+  int16_t custom_dbp = DBP_VALUE;
+};
 } // namespace OHOS
 
 #endif
index 251a076..bc48513 100644 (file)
 // #include "bloodpressure/include/BPDetectResultView.h"
 // #include "bloodpressure/include/BPDetectEndView.h"
 
-#include "stress/include/StressMainView.h"
-#include "stress/include/StressAnalysisView.h"
-#include "fatiguelevel/include/FatigueMainView.h"
-#include "fatiguelevel/include/FatigueAnalysisView.h"
-#include "emotion/include/EmoView.h"
-#include "emotion/include/EmoPresenter.h"
-#include "ecg/include/EcgView.h"
 #include "ecg/include/EcgPresenter.h"
 #include "ecg/include/EcgTestingView.h"
+#include "ecg/include/EcgView.h"
+#include "emotion/include/EmoPresenter.h"
+#include "emotion/include/EmoView.h"
+#include "fatiguelevel/include/FatigueAnalysisView.h"
+#include "fatiguelevel/include/FatigueMainView.h"
+#include "stress/include/StressAnalysisView.h"
+#include "stress/include/StressMainView.h"
 
 #include "wearable_log.h"
 #include <cmsis_os.h>
 3、低血压:收缩压<90 mmHg 且 舒张压<60 mmHg。
 ----------------------------
 */
-namespace OHOS
-{
+namespace OHOS {
 /**
  * @brief Constructor for the BPModel class.
  */
 #define MAX_UNWARE_COUNT 10
 #define MAX_VALID_SPO2_COUNT 30
 #define MAX_DISVALID_SPO2_COUNT 100
-  static uint16 CalibrationFlag = 0;
-
-  // 声明定时器变量
-  static osTimerId_t g_timer = nullptr;
-  static int Time = 30;
-
-  BPModel::BPModel() {}
-  BPModel::~BPModel() {}
-  BPModel *BPModel::GetInstance(void)
-  {
-    static BPModel instance;
-    return &instance;
+static uint16 CalibrationFlag = 0;
+
+// 声明定时器变量
+static osTimerId_t g_timer = nullptr;
+static int Time = 30;
+
+BPModel::BPModel() {}
+BPModel::~BPModel() {}
+BPModel *BPModel::GetInstance(void) {
+  static BPModel instance;
+  return &instance;
+}
+// 获取当前时间戳字符串
+std::string BPModel::GetCurrentTimeStr() {
+  uint32_t timeStamp = 0;
+
+  if (uapi_get_timestampe_ss(&timeStamp) != ERRCODE_SUCC) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
+    return "----/--/-- \n --/--";
   }
-  int16_t BPModel::GetCalibrationFlag() { return CalibrationFlag; }
-  void BPModel::SetCalibrationFlag(int value) { CalibrationFlag = value; }
-
-  // 获取当前时间戳字符串
-  std::string BPModel::GetCurrentTimeStr()
-  {
-    uint32_t timeStamp = 0;
-
-    if (uapi_get_timestampe_ss(&timeStamp) != ERRCODE_SUCC)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
-      return "----/--/-- \n --/--";
-    }
 
-    // 将时间戳转换为 time_t 类型
-    time_t rawtime = static_cast<time_t>(timeStamp);
-    struct tm *timeinfo = localtime(&rawtime);
-
-    if (timeinfo == NULL)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert time");
-      return "----/--/-- \n --/--";
-    }
+  // 将时间戳转换为 time_t 类型
+  time_t rawtime = static_cast<time_t>(timeStamp);
+  struct tm *timeinfo = localtime(&rawtime);
 
-    // 格式化时间为字符串
-    char buffer[20]; // 格式: YYYY-MM-DD HH:MM
-    std::strftime(buffer, sizeof(buffer), "%Y-%m-%d  \n %H:%M", timeinfo);
-
-    return std::string(buffer);
+  if (timeinfo == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert time");
+    return "----/--/-- \n --/--";
   }
 
-  // 管理当前状态
-  void BPModel::BP_SetState(BPState state) { current_state = state; }
-  BPState BPModel::GetCurrentState() { return current_state; }
-
-  // 进行传感器、定时器等控制
-  void BPModel::BP_Control(BPState state)
-  {
-    if (state == current_state)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                    "BP_Control: Already in current state");
-      return;
-    }
-    switch (state)
-    {
-    case BPState::BP_NORMAL:
-    {
-      /*
-       关闭定时器
-       关闭传感器
-       关闭常亮
-     */
-      BP_StopTimer();
-      ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
-      Time = BP_CHECK_TIME_MAX;
-      break;
-    }
-    case BPState::BP_CALIBRATING_FIRSTTIME:
-    case BPState::BP_CALIBRATING_SECONDTIME:
-    case BPState::STRESS_MEASURE:
-    case BPState::FATIGUE_MEASURE:
-    case BPState::ECG_MEASURE:
-    case BPState::EMO_MEASURE:
-    case BPState::BP_DETECTING:
-    {
-      /*
-        开启定时器
-        开启传感器
-        开启常亮
-      */
-      BP_StartTimer();
-      ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别
-
-      if (Time != BP_CHECK_TIME_MAX)
-        Time = BP_CHECK_TIME_MAX; // 重置时间
-
-      break;
-    }
-    case BPState::BP_CALIBRATING_ANGLYSIS:
-    case BPState::STRESS_ANALYSIS:
-    case BPState::FATIGUE_ANALYSIS:
-    case BPState::ECG_ANALYSIS:
-    case BPState::EMO_ANALYSIS:
-    {
-      BP_StartTimer();
-      ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别
+  // 格式化时间为字符串
+  char buffer[20]; // 格式: YYYY-MM-DD HH:MM
+  std::strftime(buffer, sizeof(buffer), "%Y-%m-%d  \n %H:%M", timeinfo);
+
+  return std::string(buffer);
+}
+/////////////////////////状态管理//////////////////////////////////////////
+int16_t BPModel::GetCalibrationFlag() { return CalibrationFlag; }
+void BPModel::SetCalibrationFlag(int value) { CalibrationFlag = value; }
+
+// 管理当前状态
+void BPModel::BP_SetState(BPState state) { current_state = state; }
+BPState BPModel::GetCurrentState() { return current_state; }
+
+// 进行传感器、定时器等控制
+void BPModel::BP_Control(BPState state) {
+  if (state == current_state) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "BP_Control: Already in current state");
+    return;
+  }
+  switch (state) {
+  case BPState::BP_NORMAL: {
+    /*
+     关闭定时器
+     关闭传感器
+     关闭常亮
+   */
+    BP_StopTimer();
+    ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+    Time = BP_CHECK_TIME_MAX;
+    break;
+  }
+  case BPState::BP_CALIBRATING_FIRSTTIME:
+  case BPState::BP_CALIBRATING_SECONDTIME:
+  case BPState::STRESS_MEASURE:
+  case BPState::FATIGUE_MEASURE:
+  case BPState::ECG_MEASURE:
+  case BPState::EMO_MEASURE:
+  case BPState::BP_DETECTING: {
+    /*
+      开启定时器
+      开启传感器
+      开启常亮
+    */
+    BP_StartTimer();
+    ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别
+
+    if (Time != BP_CHECK_TIME_MAX)
+      Time = BP_CHECK_TIME_MAX; // 重置时间
+
+    break;
+  }
+  case BPState::BP_CALIBRATING_ANGLYSIS:
+  case BPState::STRESS_ANALYSIS:
+  case BPState::FATIGUE_ANALYSIS:
+  case BPState::ECG_ANALYSIS:
+  case BPState::EMO_ANALYSIS: {
+    BP_StartTimer();
+    ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别
+
+    if (Time != BP_ANLYSISI_TIME_MAX)
+      Time = BP_ANLYSISI_TIME_MAX; // 重置时间
+    break;
+  }
+  case BPState::ECG_REMIND:
+  case BPState::ECG_RESULT: {
+    BP_StartTimer();
+    ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别
+
+    if (Time != BP_REMIND_TIME_MAX)
+      Time = BP_REMIND_TIME_MAX; // 重置时间
+    break;
+  }
 
-      if (Time != BP_ANLYSISI_TIME_MAX)
-        Time = BP_ANLYSISI_TIME_MAX; // 重置时间
-      break;
+  default:
+    /*未知状态,全部状态重置*/
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BP_Control: Invalid state");
+    BP_SetState(BPState::BP_NORMAL);
+    BP_StopTimer();
+    Time = BP_CHECK_TIME_MAX;
+    return;
+  }
+  // 更新状态
+  BP_SetState(state);
+}
+/////////////////////////////////////////////////////////
+// 机器校准收缩压与舒张压的数值
+void BPModel::BP_SetValue(BP_VALUE_TYPE type, bool set_value) {
+  if (set_value) {
+    if (type == BP_VALUE_TYPE::SBP) {
+      if (custom_sbp < 250)
+        custom_sbp++;
+    } else if (type == BP_VALUE_TYPE::DBP) {
+      if (custom_dbp < 150)
+        custom_dbp++;
     }
-    case BPState::ECG_REMIND:
-    case BPState::ECG_RESULT:
-    {
-      BP_StartTimer();
-      ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别
-
-      if (Time != BP_REMIND_TIME_MAX)
-        Time = BP_REMIND_TIME_MAX; // 重置时间
-      break;
+  } else {
+    if (type == BP_VALUE_TYPE::SBP) {
+      if (custom_sbp > 50)
+        custom_sbp--;
+    } else if (type == BP_VALUE_TYPE::DBP) {
+      if (custom_dbp > 30)
+        custom_dbp--;
     }
-
-    default:
-      /*未知状态,全部状态重置*/
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BP_Control: Invalid state");
+  }
+}
+int16_t BPModel::GetValue(BP_VALUE_TYPE type) {
+  if (type == BP_VALUE_TYPE::SBP)
+    return custom_sbp;
+  else
+    return custom_dbp;
+}
+//////////////////////////////////time处理////////////////////////////////////
+// time到时的处理
+  void BPModel::BP_timer_callback_out() {
+    
+    BP_StopTimer();
+
+    // 提前获取各视图实例
+    auto *bpMainView = BPMainView::GetInstance();
+    auto *bpDetectionView = BPDetectionView::GetInstance();
+    auto *stressMainView = StressMainView::GetInstance();
+    auto *stressAnalysisView = StressAnalysisView::GetInstance();
+    auto *fatigueMainView = FatigueMainView::GetInstance();
+    auto *fatigueAnalysisView = FatigueAnalysisView::GetInstance();
+    auto *emoView = EmoView::GetInstance();
+    auto *ecgView = EcgView::GetInstance();
+
+    // 处理血压校准相关状态
+    if (current_state == BPState::BP_CALIBRATING_FIRSTTIME ||
+        current_state == BPState::BP_CALIBRATING_SECONDTIME) {
+      if (bpMainView) {
+        bpMainView->ChangeView(current_state == BPState::BP_CALIBRATING_FIRSTTIME
+                                  ? BPUNDERCALIBRATIONVIEW
+                                  : BPSECUNDERCALIBRATIONVIEW,
+                              BPCALIBRATIONMINDVIEW);
+      }
       BP_SetState(BPState::BP_NORMAL);
-      BP_StopTimer();
-      Time = BP_CHECK_TIME_MAX;
+      CalibrationFlag++;
       return;
     }
-    // 更新状态
-    BP_SetState(state);
-  }
-  /////////////////////////////////////////////////////////
-  // 机器校准收缩压与舒张压的数值
-  void BPModel::BP_SetValue(BP_VALUE_TYPE type, bool set_value)
-  {
-    if (set_value)
-    {
-      if (type == BP_VALUE_TYPE::SBP)
-      {
-        if (custom_sbp < 250)
-          custom_sbp++;
-      }
-      else if (type == BP_VALUE_TYPE::DBP)
-      {
-        if (custom_dbp < 150)
-          custom_dbp++;
+    // 处理血压分析状态
+    if (current_state == BPState::BP_CALIBRATING_ANGLYSIS) {
+      if (bpMainView) {
+        bpMainView->ChangeView(BPRESULTANALYSISVIEW, BPCALIBRATIONPASSVIEW);
       }
+      BP_SetState(BPState::BP_NORMAL);
+      if (CalibrationFlag == 1)
+        CalibrationFlag++;
+      else
+        CalibrationFlag = 0;
+      return;
     }
-    else
-    {
-      if (type == BP_VALUE_TYPE::SBP)
-      {
-        if (custom_sbp > 50)
-          custom_sbp--;
-      }
-      else if (type == BP_VALUE_TYPE::DBP)
-      {
-        if (custom_dbp > 30)
-          custom_dbp--;
+    // 处理血压检测状态
+    if (current_state == BPState::BP_DETECTING) {
+      if (bpDetectionView) {
+        bpDetectionView->ChangeView(CALIBRATION_BPVIEW, RESULT_BPVIEW);
       }
+      BP_SetState(BPState::BP_NORMAL);
+      return;
     }
-  }
-  int16_t BPModel::GetValue(BP_VALUE_TYPE type)
-  {
-    if (type == BP_VALUE_TYPE::SBP)
-      return custom_sbp;
-    else
-      return custom_dbp;
-  }
-  ///////////////////////////////////////////////////////////////////////////////////////
 
-  /*定时器到期时的处理*/
-  static void BP_TimerCallbackProc(int data)
-  {
-
-    // 倒计时
-    Time--;
-    // 提前检查无效时间
-    if (Time < 0)
-    {
-      BPModel::GetInstance()->BP_StopTimer();
-      if (BPMainView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::BP_CALIBRATING_FIRSTTIME) // 血压第一次校准完
-      {
-        BPMainView::GetInstance()->ChangeView(BPUNDERCALIBRATIONVIEW, BPCALIBRATIONMINDVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
-        CalibrationFlag++;
-      }
-      else if (BPMainView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::BP_CALIBRATING_ANGLYSIS) // 血压分析完
-      {
-        // 校准成功
-        BPMainView::GetInstance()->ChangeView(BPRESULTANALYSISVIEW, BPCALIBRATIONPASSVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
-        // 校准失败
-
-        if (CalibrationFlag == 1)
-          CalibrationFlag++;
-        else
-          CalibrationFlag = 0;
-      }
-      else if (BPMainView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::BP_CALIBRATING_SECONDTIME) // 血压第二次校准完
-      {
-        BPMainView::GetInstance()->ChangeView(BPSECUNDERCALIBRATIONVIEW, BPCALIBRATIONMINDVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
-        CalibrationFlag++;
-      }
-      else if (BPDetectionView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::BP_DETECTING) // 血压检测完
-      {
-        // 测试成功 -> 进入结果界面
-        BPDetectionView::GetInstance()->ChangeView(CALIBRATION_BPVIEW, RESULT_BPVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
-        // 测试失败 -> 进入错误界面
-        //  BPDetectionView::GetInstance()->ChangeView(CALIBRATION_BPVIEW,
-        //  ERROR_BPVIEW);
+    // 处理压力检测与分析
+    if (current_state == BPState::STRESS_MEASURE) {
+      if (stressMainView) {
+        stressMainView->ChangeView(STRESSUNDERMEASUREVIEW, STRESSANALYSISEVIEW);
       }
-      else if (StressMainView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::STRESS_MEASURE) // 压力检测完
-      {
-        BPModel::GetInstance()->BP_Control(BPState::STRESS_ANALYSIS);
-        StressMainView::GetInstance()->ChangeView(STRESSUNDERMEASUREVIEW, STRESSANALYSISEVIEW);
-        StressAnalysisView::GetInstance()->startorstopAnalysisAni(true);
+      BP_Control(BPState::STRESS_ANALYSIS);
+      if (stressAnalysisView) {
+        stressAnalysisView->startorstopAnalysisAni(true);
       }
-      else if (StressMainView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::STRESS_ANALYSIS) // 压力分析完
-      {
-        StressMainView::GetInstance()->ChangeView(STRESSANALYSISEVIEW, STRESSRESULTVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
-        StressAnalysisView::GetInstance()->startorstopAnalysisAni(false);
+      return;
+    }
+    if (current_state == BPState::STRESS_ANALYSIS) {
+      if (stressMainView) {
+        stressMainView->ChangeView(STRESSANALYSISEVIEW, STRESSRESULTVIEW);
       }
-      else if (FatigueMainView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::FATIGUE_MEASURE) // 疲劳度检测完
-      {
-        BPModel::GetInstance()->BP_Control(BPState::FATIGUE_ANALYSIS);
-        FatigueMainView::GetInstance()->ChangeView(FATIGUEUNDERMEASUREVIEW, FATIGUEANALYSISEVIEW);
-        FatigueAnalysisView::GetInstance()->startorstopAnalysisAni(true);
+      BP_SetState(BPState::BP_NORMAL);
+      if (stressAnalysisView) {
+        stressAnalysisView->startorstopAnalysisAni(false);
       }
-      else if (FatigueMainView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::FATIGUE_ANALYSIS) // 疲劳度分析完
-      {
-        FatigueMainView::GetInstance()->ChangeView(FATIGUEANALYSISEVIEW, FATIGUERESULTVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
-        FatigueAnalysisView::GetInstance()->startorstopAnalysisAni(false);
+      return;
+    }
+
+    // 处理疲劳度检测与分析
+    if (current_state == BPState::FATIGUE_MEASURE) {
+      if (fatigueMainView) {
+        fatigueMainView->ChangeView(FATIGUEUNDERMEASUREVIEW,
+                                    FATIGUEANALYSISEVIEW);
       }
-      else if (EmoView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::EMO_MEASURE) // 情绪检测完
-      {
-        EmoPresenter::GetInstance()->ChangeViewOperator(EMOTIONTESTVIEW, EMOTIONTESTANALYSISVIEW);
+      BP_Control(BPState::FATIGUE_ANALYSIS);
+      if (fatigueAnalysisView) {
+        fatigueAnalysisView->startorstopAnalysisAni(true);
       }
-      else if (EmoView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::EMO_ANALYSIS) // 情绪分析完
-      {
-        EmoPresenter::GetInstance()->ChangeViewOperator(EMOTIONTESTANALYSISVIEW, EMOTIONTESTRESULTVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
+      return;
+    }
+    if (current_state == BPState::FATIGUE_ANALYSIS) {
+      if (fatigueMainView) {
+        fatigueMainView->ChangeView(FATIGUEANALYSISEVIEW, FATIGUERESULTVIEW);
       }
-      else if (EcgView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::ECG_REMIND) // ECG提示完
-      {
-        EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTREMINDERVIEW, ECGTESTINGVIEW);
+      BP_SetState(BPState::BP_NORMAL);
+      if (fatigueAnalysisView) {
+        fatigueAnalysisView->startorstopAnalysisAni(false);
       }
-      else if (EcgView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::ECG_MEASURE) // ECG测量完
-      {
-        EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTINGVIEW, ECGTESTANALYSISVIEW);
+      return;
+    }
+
+    // 处理情绪检测与分析
+    if (current_state == BPState::EMO_MEASURE) {
+      if (emoView) {
+        EmoPresenter::GetInstance()->ChangeViewOperator(EMOTIONTESTVIEW,
+                                                        EMOTIONTESTANALYSISVIEW);
       }
-      else if (EcgView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::ECG_ANALYSIS) // ECG分析完
-      {
-         EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTANALYSISVIEW, ECGTESTRESULTVIEW);
+      return;
+
+      if (current_state == BPState::EMO_ANALYSIS) {
+        if (emoView) {
+          EmoPresenter::GetInstance()->ChangeViewOperator(EMOTIONTESTANALYSISVIEW,
+                                                          EMOTIONTESTRESULTVIEW);
+        }
+        BP_SetState(BPState::BP_NORMAL);
+        return;
       }
-      else if (EcgView::GetInstance() && BPModel::GetInstance()->GetCurrentState() == BPState::ECG_RESULT) // ECG结果显示完
-      {
-        EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTRESULTVIEW, ECGRESETTESTOFSUCCVIEW);
-        BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
+
+      // 处理ECG相关状态
+      if (ecgView) {
+        if (current_state == BPState::ECG_REMIND) {
+          EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTREMINDERVIEW,
+                                                          ECGTESTINGVIEW);
+          return;
+        }
+
+        if (current_state == BPState::ECG_MEASURE) {
+          EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTINGVIEW,
+                                                          ECGTESTANALYSISVIEW);
+          return;
+        }
+
+        if (current_state == BPState::ECG_ANALYSIS) {
+          EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTANALYSISVIEW,
+                                                          ECGTESTRESULTVIEW);
+          return;
+        }
+        if (current_state == BPState::ECG_RESULT) {
+
+          EcgPresenter::GetInstance()->ChangeViewOperator(ECGTESTRESULTVIEW,
+                                                          ECGRESETTESTOFSUCCVIEW);
+          BP_SetState(BPState::BP_NORMAL);
+        }
       }
-      return;
     }
+  }
+  //每秒的处理
+  void BPModel::BP_timer_callback_proc(int data) {
 
-    BPState current_state_time = BPModel::GetInstance()->GetCurrentState();
     // 根据状态处理
-    switch (current_state_time)
-    {
+    switch (current_state) {
     case BPState::BP_NORMAL:
-      BPModel::GetInstance()->BP_StopTimer();
-      BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL);
+      BP_StopTimer();
+      BP_SetState(BPState::BP_NORMAL);
       return;
 
-    case BPState::BP_DETECTING:
-    {
+    case BPState::BP_DETECTING: {
       BPDetectBeginView *view = BPDetectBeginView::GetInstance();
-      if (view)
-      {
-        view->UpdateTimeText(Time);
+      if (view) {
+        view->UpdateTimeText(data);
       }
       break;
     }
 
-    case BPState::BP_CALIBRATING_FIRSTTIME:
-    {
+    case BPState::BP_CALIBRATING_FIRSTTIME: {
       BPUnderCalibrationView *view = BPUnderCalibrationView::GetInstance();
-      if (view)
-      {
-        view->UpdateTimeText(Time);
+      if (view) {
+        view->UpdateTimeText(data);
       }
       break;
     }
-    case BPState::BP_CALIBRATING_SECONDTIME:
-    {
-      BPSecUnderCalibrationView *view = BPSecUnderCalibrationView::GetInstance();
-      if (view)
-      {
-        view->UpdateTimeText(Time);
+    case BPState::BP_CALIBRATING_SECONDTIME: {
+      BPSecUnderCalibrationView *view =
+          BPSecUnderCalibrationView::GetInstance();
+      if (view) {
+        view->UpdateTimeText(data);
       }
       break;
     }
-    case BPState::ECG_MEASURE:
-    {
-      EcgTestingView::GetInstance()->UpdateTimeLabel(Time);
+    case BPState::ECG_MEASURE: {
+      EcgTestingView *view = EcgTestingView::GetInstance();
+      if (view) {
+        view->UpdateTimeLabel(Time);
+      }
+      break;
     }
 
     case BPState::STRESS_MEASURE:
@@ -369,24 +387,34 @@ namespace OHOS
     case BPState::EMO_ANALYSIS:
     case BPState::BP_CALIBRATING_ANGLYSIS:
     case BPState::ECG_REMIND:
-    case BPState::ECG_RESULT:
-    {
+    case BPState::ECG_RESULT: {
       break;
     }
 
     default:
-      BPModel::GetInstance()->BP_StopTimer();
+      BP_StopTimer();
       // 显示错误界面提示
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "current_state is error!!");
       return;
     }
   }
+  /////////////////////////////////////定时器处理 不要修改//////////////////////////////////////////////////
 
+  /*定时器到期时的处理*/
+  static void BP_TimerCallbackProc(int data) {
+    // 倒计时
+    Time--;
+    // 到时的处理
+    if (Time < 0) {
+      BPModel::GetInstance()->BP_timer_callback_out();
+      return;
+    }
+    BPModel::GetInstance()->BP_timer_callback_proc(Time);
+  }
   /*
    * @brief 回调函数
    */
-  static void BP_TimerCallback(int data)
-  {
+  static void BP_TimerCallback(int data) {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BP_TimerCallback %d", data);
     GraphicService::GetInstance()->PostGraphicEvent(
         std::bind(BP_TimerCallbackProc, data));
@@ -396,13 +424,11 @@ namespace OHOS
    *  @brief 开启定时器函数
    *  @param interval 时间间隔,单位ms
    */
-  void BPModel::BP_StartTimer(uint32_t interval)
-  {
+  void BPModel::BP_StartTimer(uint32_t interval) {
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BPModel::BP_StartTimer");
     /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回
      * ------------------------- */
-    if (g_timer != nullptr)
-    {
+    if (g_timer != nullptr) {
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
       return;
     }
@@ -412,8 +438,7 @@ namespace OHOS
     g_timer = osTimerNew((osTimerFunc_t)BP_TimerCallback, osTimerPeriodic,
                          nullptr, nullptr);
     // 检查定时器创建是否成功
-    if (g_timer == nullptr)
-    {
+    if (g_timer == nullptr) {
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
       return;
     }
@@ -427,12 +452,10 @@ namespace OHOS
     osStatus_t ret = osTimerStart(g_timer, tick);
     /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为
      * nullptr -------------------- */
-    if (ret != osOK)
-    {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!",
-                    ret);
-      if (g_timer != nullptr)
-      {
+    if (ret != osOK) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "osTimerDelete failed, ret = %lx!!", ret);
+      if (g_timer != nullptr) {
         ret = osTimerDelete(g_timer);
       }
       g_timer = nullptr;
@@ -442,17 +465,14 @@ namespace OHOS
   /*
    * @brief 停止定时器
    */
-  void BPModel::BP_StopTimer(void)
-  {
+  void BPModel::BP_StopTimer(void) {
     // 检查定时器是否存在
-    if (g_timer != nullptr)
-    {
+    if (g_timer != nullptr) {
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BPModel::BP_StopTimer");
       osTimerStop(g_timer);
       // 删除定时器并置为 nullptr
       osStatus_t ret = osTimerDelete(g_timer);
-      if (ret != osOK)
-      {
+      if (ret != osOK) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
                       "osTimerDelete failed, ret = %lx!!", ret);
       }
index 95829a3..3120540 100644 (file)
@@ -59,7 +59,6 @@ namespace OHOS
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EcgPresenter::OnStop");
         Presenter<EcgView>::OnStop();
         BPModel::GetInstance()->BP_Control(BPState::BP_NORMAL);
-        BPModel::GetInstance()->BP_StopTimer();
     }
 
     void EcgPresenter::ChangeViewOperator(int16_t hideView, int16_t showView)
@@ -108,7 +107,7 @@ namespace OHOS
         }
         else if (hideView == ECGTESTRESULTVIEW)
         {
-          BPModel::GetInstance()->BP_StopTimer();
+          BPModel::GetInstance()->BP_Control(BPState::ECG_RESULT);
         }
     }
 
index 63acc73..8140cec 100644 (file)
@@ -59,7 +59,6 @@ namespace OHOS
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EmoPresenter::OnStop");
         Presenter<EmoView>::OnStop();
         BPModel::GetInstance()->BP_Control(BPState::BP_NORMAL);
-        BPModel::GetInstance()->BP_StopTimer();
     }
 
     void EmoPresenter::ChangeViewOperator(int16_t hideView, int16_t showView)
index 707ac93..405b3a7 100644 (file)
@@ -87,7 +87,6 @@ namespace OHOS
         if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
         {
             BPModel::GetInstance()->BP_Control(BPState::BP_NORMAL);
-            BPModel::GetInstance()->BP_StopTimer();
             NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
             return true;
         }
@@ -102,7 +101,6 @@ namespace OHOS
             keyState == 1 && uapi_get_screen_state() == 0)
         {
             BPModel::GetInstance()->BP_Control(BPState::BP_NORMAL);
-            BPModel::GetInstance()->BP_StopTimer();
             NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
         }
         return true;
index fb68884..f95ad6f 100644 (file)
@@ -87,7 +87,6 @@ namespace OHOS
         if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
         {
             BPModel::GetInstance()->BP_Control(BPState::BP_NORMAL);
-            BPModel::GetInstance()->BP_StopTimer();
             NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
             return true;
         }
@@ -102,7 +101,6 @@ namespace OHOS
             keyState == 1 && uapi_get_screen_state() == 0)
         {
             BPModel::GetInstance()->BP_Control(BPState::BP_NORMAL);
-            BPModel::GetInstance()->BP_StopTimer();
             NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
         }
         return true;