From 0f72057946bd6eaa996f6ecc29b0cfbdef9926e0 Mon Sep 17 00:00:00 2001 From: Caisking Date: Thu, 19 Jun 2025 15:25:04 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E8=BE=93=E5=85=A5=E6=A0=A1?= =?utf8?q?=E5=87=86=E6=95=B0=E6=97=A0=E6=95=88=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../include/detection/BPDetectBeginView.h | 1 + .../nativeui/bloodpressure/src/BPModel.cpp | 537 +++++++++--------- 2 files changed, 254 insertions(+), 284 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/include/detection/BPDetectBeginView.h b/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/include/detection/BPDetectBeginView.h index 3952a6b54..6e0d65815 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/include/detection/BPDetectBeginView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/include/detection/BPDetectBeginView.h @@ -9,6 +9,7 @@ #include "components/ui_view_group.h" #include "components/ui_scroll_view.h" #include "components/ui_label_button_ext.h" +#include "components/ui_chart.h" namespace OHOS { diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/src/BPModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/src/BPModel.cpp index 36e4378d6..704375269 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/src/BPModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodpressure/src/BPModel.cpp @@ -2,11 +2,11 @@ #include "bloodpressure/include/BPMainPresenter.h" #include "bloodpressure/include/BPMainView.h" -#include "bloodpressure/include/detection/BPDetectionPresenter.h" -#include "bloodpressure/include/detection/BPDetectionView.h" +#include "bloodpressure/include/detection/BPDetectBeginView.h" #include "bloodpressure/include/detection/BPDetectFirstView.h" #include "bloodpressure/include/detection/BPDetectSOSView.h" -#include "bloodpressure/include/detection/BPDetectBeginView.h" +#include "bloodpressure/include/detection/BPDetectionPresenter.h" +#include "bloodpressure/include/detection/BPDetectionView.h" // #include "bloodpressure/include/BPDetectResultView.h" // #include "bloodpressure/include/BPDetectEndView.h" @@ -37,323 +37,292 @@ 3、低血压:收缩压<90 mmHg 且 舒张压<60 mmHg。 ---------------------------- */ -namespace OHOS -{ - /** - * @brief Constructor for the BPModel class. - */ +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; - } - int16_t BPModel::GetCalibrationFlag() - { - - return CalibrationFlag; +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; +} +int16_t BPModel::GetCalibrationFlag() { return CalibrationFlag; } + +// 获取当前时间戳字符串 +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 --/--"; } - // 获取当前时间戳字符串 - std::string BPModel::GetCurrentTimeStr() - { - uint32_t timeStamp = 0; + // 将时间戳转换为 time_t 类型 + time_t rawtime = static_cast(timeStamp); + struct tm *timeinfo = localtime(&rawtime); - if (uapi_get_timestampe_ss(&timeStamp) != ERRCODE_SUCC) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp"); - return "----/--/-- \n --/--"; - } + if (timeinfo == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert time"); + return "----/--/-- \n --/--"; + } - // 将时间戳转换为 time_t 类型 - time_t rawtime = static_cast(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); - if (timeinfo == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to convert time"); - return "----/--/-- \n --/--"; - } + return std::string(buffer); +} - // 格式化时间为字符串 - char buffer[20]; // 格式: YYYY-MM-DD HH:MM - std::strftime(buffer, sizeof(buffer), "%Y-%m-%d \n %H:%M", timeinfo); +// 管理当前状态 +void BPModel::BP_SetState(BPState state) { current_state = state; } +BPState BPModel::GetCurrentState() { return current_state; } - return std::string(buffer); +// 进行传感器、定时器等控制 +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::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: { + BP_StartTimer(); + ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别 - // 管理当前状态 - 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::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: - { - BP_StartTimer(); - ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 后期 周期被动状态 需要做区别 - - if (Time != BP_ANLYSISI_TIME_MAX) - Time = BP_ANLYSISI_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); + default: + /*未知状态,全部状态重置*/ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BP_Control: Invalid state"); + BP_SetState(BPState::BP_NORMAL); + BP_StopTimer(); + Time = BP_CHECK_TIME_MAX; + return; } - ///////////////////////////////////////////////////////// - // 机器校准收缩压与舒张压的数值 - 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 (custom_dbp < 150) - custom_dbp++; + // 更新状态 + 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++; } - else - { - if (type == BP_VALUE_TYPE::SBP) - if (custom_sbp > 50) - custom_sbp--; - else if (custom_dbp > 30) - custom_dbp--; + } 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--; } } - 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) +} +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(); + BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL); + if (BPMainView::GetInstance() && CalibrationFlag == 0) // 第一次校准完 { - BPModel::GetInstance()->BP_StopTimer(); - BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL); - if (BPMainView::GetInstance() && CalibrationFlag == 0) // 第一次校准完 - { - BPMainView::GetInstance()->ChangeView(BPUNDERCALIBRATIONVIEW, BPCALIBRATIONMINDVIEW); - CalibrationFlag++; - } - else if (BPMainView::GetInstance() && (CalibrationFlag == 1 || CalibrationFlag == 3)) // 分析完 - { - // 校准成功 - BPMainView::GetInstance()->ChangeView(BPRESULTANALYSISVIEW, BPCALIBRATIONPASSVIEW); - // 校准失败 - - if (CalibrationFlag == 1) - CalibrationFlag++; - else - CalibrationFlag = 0; - } - else if (BPMainView::GetInstance() && CalibrationFlag == 2) // 第二次校准完 - { - BPMainView::GetInstance()->ChangeView(BPSECUNDERCALIBRATIONVIEW, BPCALIBRATIONMINDVIEW); - CalibrationFlag++; - } - else if (BPDetectionView::GetInstance()) - { - // 测试成功 -> 进入结果界面 - BPDetectionView::GetInstance()->ChangeView(CALIBRATION_BPVIEW, RESULT_BPVIEW); - // 测试失败 -> 进入错误界面 - // BPDetectionView::GetInstance()->ChangeView(CALIBRATION_BPVIEW, ERROR_BPVIEW); - } - return; - } - - BPState current_state_time = BPModel::GetInstance()->GetCurrentState(); - // 根据状态处理 - switch (current_state_time) + BPMainView::GetInstance()->ChangeView(BPUNDERCALIBRATIONVIEW, + BPCALIBRATIONMINDVIEW); + CalibrationFlag++; + } else if (BPMainView::GetInstance() && + (CalibrationFlag == 1 || CalibrationFlag == 3)) // 分析完 { - case BPState::BP_NORMAL: - BPModel::GetInstance()->BP_StopTimer(); - BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL); - return; + // 校准成功 + BPMainView::GetInstance()->ChangeView(BPRESULTANALYSISVIEW, + BPCALIBRATIONPASSVIEW); + // 校准失败 - case BPState::BP_DETECTING: + if (CalibrationFlag == 1) + CalibrationFlag++; + else + CalibrationFlag = 0; + } else if (BPMainView::GetInstance() && + CalibrationFlag == 2) // 第二次校准完 { - BPDetectBeginView *view = BPDetectBeginView::GetInstance(); - if (view) - { - view->UpdateTimeText(Time); - } - break; + BPMainView::GetInstance()->ChangeView(BPSECUNDERCALIBRATIONVIEW, + BPCALIBRATIONMINDVIEW); + CalibrationFlag++; + } else if (BPDetectionView::GetInstance()) { + // 测试成功 -> 进入结果界面 + BPDetectionView::GetInstance()->ChangeView(CALIBRATION_BPVIEW, + RESULT_BPVIEW); + // 测试失败 -> 进入错误界面 + // BPDetectionView::GetInstance()->ChangeView(CALIBRATION_BPVIEW, + // ERROR_BPVIEW); } + return; + } - case BPState::BP_CALIBRATING_FIRSTTIME: - { - BPUnderCalibrationView *view = BPUnderCalibrationView::GetInstance(); - if (view) - { - view->UpdateTimeText(Time); - } - break; - } - case BPState::BP_CALIBRATING_SECONDTIME: - { - BPSecUnderCalibrationView *view = BPSecUnderCalibrationView::GetInstance(); - if (view) - { - view->UpdateTimeText(Time); - } - break; - } - case BPState::BP_CALIBRATING_ANGLYSIS: - { - break; + BPState current_state_time = BPModel::GetInstance()->GetCurrentState(); + // 根据状态处理 + switch (current_state_time) { + case BPState::BP_NORMAL: + BPModel::GetInstance()->BP_StopTimer(); + BPModel::GetInstance()->BP_SetState(BPState::BP_NORMAL); + return; + + case BPState::BP_DETECTING: { + BPDetectBeginView *view = BPDetectBeginView::GetInstance(); + if (view) { + view->UpdateTimeText(Time); } + break; + } - default: - BPModel::GetInstance()->BP_StopTimer(); - // 显示错误界面提示 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "current_state is error!!"); - return; + case BPState::BP_CALIBRATING_FIRSTTIME: { + BPUnderCalibrationView *view = BPUnderCalibrationView::GetInstance(); + if (view) { + view->UpdateTimeText(Time); + } + break; + } + case BPState::BP_CALIBRATING_SECONDTIME: { + BPSecUnderCalibrationView *view = BPSecUnderCalibrationView::GetInstance(); + if (view) { + view->UpdateTimeText(Time); } + break; + } + case BPState::BP_CALIBRATING_ANGLYSIS: { + break; } - /* - * @brief 回调函数 - */ - static void BP_TimerCallback(int data) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BP_TimerCallback %d", data); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(BP_TimerCallbackProc, data)); + default: + BPModel::GetInstance()->BP_StopTimer(); + // 显示错误界面提示 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "current_state is error!!"); + return; } +} - /* - * @brief 开启定时器函数 - * @param interval 时间间隔,单位ms - */ - void BPModel::BP_StartTimer(uint32_t interval) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BPModel::BP_StartTimer"); - /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 - * ------------------------- */ - if (g_timer != nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!"); - return; - } +/* + * @brief 回调函数 + */ +static void BP_TimerCallback(int data) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BP_TimerCallback %d", data); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(BP_TimerCallbackProc, data)); +} - /* --------------------------------- 2.创建定时器 - * -------------------------------- */ - g_timer = osTimerNew((osTimerFunc_t)BP_TimerCallback, osTimerPeriodic, - nullptr, nullptr); - // 检查定时器创建是否成功 - if (g_timer == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!"); - return; - } +/* + * @brief 开启定时器函数 + * @param interval 时间间隔,单位ms + */ +void BPModel::BP_StartTimer(uint32_t interval) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BPModel::BP_StartTimer"); + /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 + * ------------------------- */ + if (g_timer != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!"); + return; + } - /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 - * ---------------------------- */ - int tick = osMs2Tick(interval); + /* --------------------------------- 2.创建定时器 + * -------------------------------- */ + g_timer = osTimerNew((osTimerFunc_t)BP_TimerCallback, osTimerPeriodic, + nullptr, nullptr); + // 检查定时器创建是否成功 + if (g_timer == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!"); + return; + } - /* --------------------------------- 4.启动定时器 - * -------------------------------- */ - 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) - { - ret = osTimerDelete(g_timer); - } - g_timer = nullptr; - return; + /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 + * ---------------------------- */ + int tick = osMs2Tick(interval); + + /* --------------------------------- 4.启动定时器 + * -------------------------------- */ + 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) { + ret = osTimerDelete(g_timer); } + g_timer = nullptr; + return; } - /* - * @brief 停止定时器 - */ - void BPModel::BP_StopTimer(void) - { - // 检查定时器是否存在 - 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) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "osTimerDelete failed, ret = %lx!!", ret); - } - g_timer = nullptr; +} +/* + * @brief 停止定时器 + */ +void BPModel::BP_StopTimer(void) { + // 检查定时器是否存在 + 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) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "osTimerDelete failed, ret = %lx!!", ret); } + g_timer = nullptr; } +} } // namespace OHOS -- 2.17.1