From: Caisking <3449750381@qq.com> Date: Tue, 19 Mar 2024 09:10:27 +0000 (+0800) Subject: 修复血氧的检测逻辑 X-Git-Tag: release_V1.2.70_20241020_135402~1293^2~6 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=8ed1cf60a42ab895fd7ca96a0c2b934ca8f4518f;p=mirrors%2FFD230.git 修复血氧的检测逻辑 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodCheckView.h b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodCheckView.h index d5826bcd7..0cbc7e662 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodCheckView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodCheckView.h @@ -35,7 +35,7 @@ namespace OHOS UIScrollView *BloodCheckViewInit(); UIImageAnimatorView *GetImageAnimator(); UILabelButton *CreateAndSetUIButton(const char *title); - void UpSpo2Text(); + void UpShowBloodText(); private: BloodBandoffView *bloodbandoff{nullptr}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h index 24f3f49ee..10522899e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h @@ -1,59 +1,63 @@ -/* - * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. - * Description: bloodOxygen view - * Author: - * Create: 2021-08-01 - */ - #ifndef BLOOD_OXYGEN_MODEL_H #define BLOOD_OXYGEN_MODEL_H -#include "stdio.h" -#include "gfx_utils/list.h" -#include "los_mux.h" +#include #include + namespace OHOS { class BloodOxygenModel { public: - ~BloodOxygenModel(){}; - static BloodOxygenModel *GetInstance(void); - bool GetBloodOxygenViewStatus(void); - bool GetBloodBandoffViewStatus(void); - bool GetBloodCheckViewStatus(void); + BloodOxygenModel(); + ~BloodOxygenModel(); + static BloodOxygenModel *GetInstance(); + + // Getters and setters for various statuses + bool GetBloodOxygenViewStatus(); + bool GetBloodBandoffViewStatus(); + bool GetBloodCheckViewStatus(); void SetBloodOxygenViewStatus(bool oxygenViewStatus); void SetBloodBandoffViewStatus(bool bandoffViewStatus); void SetBloodCheckViewStatus(bool checkViewStatus); + void SetBloodResultViewStatus(bool resultViewStatus); + bool GetBloodResultViewStatus(); bool GetCheckStatus(); void SetCheckStatus(bool checkstatus); - void UpSPO2data(uint16_t spo2); - uint16_t GetSPO2data(); - uint16_t GetShowSPO2data(); - uint16_t GetCheckTime(); // 获取距离上传测试时间 - void SetCheckTime(uint16_t time); // 设置本次测试完的时间 - void StartTest(); // 开始检测 - void SetWearStatus(int32_t wear); // 佩戴检测 - bool GetWearStatus(void); - bool StopTest(); // 结束检测 + // Methods for handling SPO2 data + void UpSPO2data(uint8_t spo2); + uint8_t GetSPO2data(); + uint8_t GetShowSPO2data(); + + // Methods for handling check time + uint64_t GetCheckTime(); + void SetCheckTime(uint64_t time); + + // Methods for wear status + void SetWearStatus(int32_t wear); + bool GetWearStatus(); + + // Blood oxygen test control methods + void Blood_Stop(); + void Blood_Start(); + private: - BloodOxygenModel(); bool OxygenView; bool BandoffView; bool CheckView; bool ResultView; - bool CheckStatus; // 检测状态标志 - bool WearStatus; // 佩戴状态 - uint16_t Show_SPO2_; // 显示血氧 - uint16_t SPO2_; // 保存血氧 - uint64_t timestamp_ms; // 时间戳 - int32_t wear_; // 佩戴状态 - - uint8_t wear_error = 0; // 佩戴错误计数器 - uint8_t spo2_count = 0; // 有效血氧结果计数器 - bool initstatus = true; + bool CheckStatus; + bool wearStatus; + uint16_t Show_SPO2_; + uint16_t SPO2_; + uint64_t timestamp_ms; + int32_t wear_; + + uint8_t unwear_counter_; + uint8_t valid_counter_; + bool initstatus; }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenPresenter.h index 4a88c2ded..e23bf5bce 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenPresenter.h @@ -57,9 +57,7 @@ namespace OHOS bool CheckPointersValue(void); void ReturnInterface(void); void ProgressNotify(void); - int count; bool startspo2 = true; - KeyInputListener *keyActListenr{nullptr}; }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenView.h b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenView.h index d452b08ab..dc0eda2fc 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenView.h @@ -51,7 +51,7 @@ namespace OHOS bool ClickFunc(int16_t interface); void ChangeView(int16_t hideView, int16_t showView); UIScrollView *GetBloodScrollView(int ViewId); - void Upspo2data(); + void UpBloodText(); private: // 增加图片 bool InitImageDisplay(void); diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp index 10c3051e9..8fc7537ee 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp @@ -1,5 +1,3 @@ - - #include "UiConfig.h" #include "wearable_log.h" #include "BloodCheckView.h" @@ -75,10 +73,10 @@ namespace OHOS Spo2Text = nullptr; g_pMainView = this; } - void BloodCheckView::UpSpo2Text() + void BloodCheckView::UpShowBloodText() { uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetShowSPO2data(); - //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", spo2_); + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", spo2_); std::string bloodoxygenStr = std::to_string(spo2_); Spo2Text->SetText(bloodoxygenStr.c_str()); } @@ -119,8 +117,8 @@ namespace OHOS return nullptr; } imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, CHECKIMAGEANIMATORVIEW_SIZE, CHECKIMAGEANIMATORVIEW_SPEED); - imageAnimator->SetRepeatTimes(20); - imageAnimator->SetRepeat(false); + // imageAnimator->SetRepeatTimes(20); + imageAnimator->SetRepeat(true); imageAnimator->Start(); BloodCheckScrollView->Add(imageAnimator); /* -------------------------------------------------------------------------- */ diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp index f426c36ea..5194cfefd 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp @@ -1,171 +1,176 @@ -#include "BloodOxygenModel.h" +#include "bloodoxygen/include/BloodOxygenModel.h" #include "DialModelSPO2.h" #include "wearable_log.h" -#include "BloodOxygenPresenter.h" +#include "bloodoxygen/include/BloodOxygenPresenter.h" #include "wearable_log.h" -#include "health_service.h" +#include "heart_blood/health_service/health_service.h" #include "custom_utils.h" extern "C" errcode_t uapi_get_timestamp_ms(uint64_t *tm); + #define MAX_UNWARE_COUNT 30 +#define MAX_VALID_HRS_COUNT 30 + namespace OHOS { /** * @brief Constructor for the BloodOxygenModel class. */ - BloodOxygenModel::BloodOxygenModel() : OxygenView(false), BandoffView(false), CheckView(false), ResultView(false), CheckStatus(false), WearStatus(true) + BloodOxygenModel::BloodOxygenModel() : OxygenView(false), BandoffView(false), CheckView(false), ResultView(false), CheckStatus(false), wearStatus(true) { BloodOxygenData *data = new BloodOxygenData; - data = HeartService::GetInstance()->ReadBloodOxygenData(); + data = HealthService::GetInstance()->ReadBloodOxygenData(); SPO2_ = data->SPO2; timestamp_ms = data->timestamp; + delete data; } + BloodOxygenModel::~BloodOxygenModel() {} + BloodOxygenModel *BloodOxygenModel::GetInstance(void) + { + static BloodOxygenModel instance; + return &instance; + } + /* ---------------------------------- 状态检测 ---------------------------------- */ - /** - * @brief Get the status of the BloodOxygenView. - * @return The status of the BloodOxygenView. - */ - bool BloodOxygenModel::GetBloodOxygenViewStatus() { return OxygenView; } + void BloodOxygenModel::Blood_Start() + { + // 进行初始化操作 + SetCheckStatus(true); + } - /** - * @brief Get the status of the BandoffView. - * @return The status of the BandoffView. - */ - bool BloodOxygenModel::GetBloodBandoffViewStatus() { return BandoffView; } + void BloodOxygenModel::Blood_Stop() + { + valid_counter_ = 0; + unwear_counter_ = 0; + SetCheckStatus(false); + SetWearStatus(1); + } - /** - * @brief Get the status of the CheckView. - * @return The status of the CheckView. - */ - bool BloodOxygenModel::GetBloodCheckViewStatus() { return CheckView; } + void BloodOxygenModel::SetWearStatus(int32_t wear) + { + // 设置佩戴状态 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenModel Weartest::%d", wear); + if (wear_ != 1 && wear != 1) + { + unwear_counter_++; // 佩戴错误计时器计数 + } + else + { + unwear_counter_ = 0; + } - /** - * @brief Set the status of the BandoffView. - * @param bandoffViewStatus The status to set. - */ - void BloodOxygenModel::SetBloodBandoffViewStatus(bool bandoffViewStatus) { BandoffView = bandoffViewStatus; } + wear_ = wear; - /** - * @brief Set the status of the BloodOxygenView. - * @param oxygenViewStatus The status to set. - */ - void BloodOxygenModel::SetBloodOxygenViewStatus(bool oxygenViewStatus) { OxygenView = oxygenViewStatus; } + if (unwear_counter_ >= MAX_UNWARE_COUNT) + { + wearStatus = false; // 计数达到10次,停止检测 + } + else + { + wearStatus = true; + } + } - /** - * @brief Set the status of the CheckView. - * @param checkViewStatus The status to set. - */ - void BloodOxygenModel::SetBloodCheckViewStatus(bool checkViewStatus) { CheckView = checkViewStatus; } + bool BloodOxygenModel::GetWearStatus() + { + return wearStatus; + } - /** - * @brief Get the CheckStatus. - * @return The CheckStatus. - */ - bool BloodOxygenModel::GetCheckStatus() { return CheckStatus; } + void BloodOxygenModel::SetBloodBandoffViewStatus(bool bandoffViewStatus) + { + BandoffView = bandoffViewStatus; + } - /** - * @brief Set the CheckStatus. - * @param checkstatus The status to set. - */ - void BloodOxygenModel::SetCheckStatus(bool checkstatus) { CheckStatus = checkstatus; } + bool BloodOxygenModel::GetBloodBandoffViewStatus() + { + return BandoffView; + } - /** - * @brief Get the SPO2 data. - * @return The SPO2 data. - */ - uint16_t BloodOxygenModel::GetSPO2data() { return SPO2_; } + void BloodOxygenModel::SetBloodOxygenViewStatus(bool oxygenViewStatus) + { + OxygenView = oxygenViewStatus; + } - /** - * @brief Get the Show SPO2 data. - * @return The Show SPO2 data. - */ - uint16_t BloodOxygenModel::GetShowSPO2data() { return Show_SPO2_; } + bool BloodOxygenModel::GetBloodOxygenViewStatus() + { + return OxygenView; + } - /** - * @brief Update the SPO2 data. - * @param spo2 The SPO2 value to update. - */ - void BloodOxygenModel::UpSPO2data(uint16_t spo2) + void BloodOxygenModel::SetBloodCheckViewStatus(bool checkViewStatus) { - Show_SPO2_ = spo2; - if (Show_SPO2_ != 0) - { - SPO2_ = spo2; - } + CheckView = checkViewStatus; } - /** - * @brief Get the timestamp of the last check. - * @return The timestamp of the last check. - */ - uint16_t BloodOxygenModel::GetCheckTime() + bool BloodOxygenModel::GetBloodCheckViewStatus() { - return timestamp_ms; + return CheckView; } - /** - * @brief Set the timestamp of the last check. - * @param time The timestamp to set. - */ - void BloodOxygenModel::SetCheckTime(uint16_t time) + void BloodOxygenModel::SetBloodResultViewStatus(bool resultViewStatus) { - timestamp_ms = time; + ResultView = resultViewStatus; } - /** - * @brief Start the blood oxygen test. - */ - void BloodOxygenModel::StartTest() + bool BloodOxygenModel::GetBloodResultViewStatus() { - wear_error = 0; - spo2_count = 0; + return ResultView; } - /** - * @brief Set the wear status. - * @param wear The wear status to set. - */ - void BloodOxygenModel::SetWearStatus(int32_t wear) + void BloodOxygenModel::SetCheckStatus(bool checkStatus) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenModel Weartest::%d", wear); - - if (wear_ != 1 && wear != 1) - { - wear_error++; - if (wear_error >= MAX_UNWARE_COUNT) - { - WearStatus = false; - } - }else{ - wear_error = 0; - WearStatus = true; - } - wear_ = wear; - + CheckStatus = checkStatus; } - /** - * @brief Get the wear status. - * @return The wear status. - */ - bool BloodOxygenModel::GetWearStatus() { return WearStatus; } + bool BloodOxygenModel::GetCheckStatus() + { + return CheckStatus; + } - /** - * @brief Stop the blood oxygen test. - * @return The status of stopping the test. - */ - bool BloodOxygenModel::StopTest() + uint8_t BloodOxygenModel::GetSPO2data() { - wear_error = 0; - spo2_count = 0; + return SPO2_; } - /** - * @brief Get an instance of the BloodOxygenModel. - * @return An instance of the BloodOxygenModel. - */ - BloodOxygenModel *BloodOxygenModel::GetInstance() + uint8_t BloodOxygenModel::GetShowSPO2data() { - static BloodOxygenModel instance; - return &instance; + return Show_SPO2_; + } + + uint64_t BloodOxygenModel::GetCheckTime() + { + return timestamp_ms; + } + + void BloodOxygenModel::SetCheckTime(uint64_t time) + { + timestamp_ms = time; + } + + void BloodOxygenModel::UpSPO2data(uint8_t spo2) + { + Show_SPO2_ = spo2; + if (Show_SPO2_ != 0) + { + SPO2_ = spo2; + valid_counter_++; // 增加有效计数器 + } + else + { + valid_counter_ = 0; // 清零有效计数器 + } + + if (valid_counter_ >= MAX_VALID_HRS_COUNT) + { + // 结束本次测试,将最后一次有效数作为本次测量结果 + Blood_Stop(); + /* -------------------------------------------------------------------------- */ + BloodOxygenData *data = new BloodOxygenData; + data->SPO2 = spo2; + data->timestamp = BloodOxygenPresenter::GetInstance()->GetCurrentTime(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %lld", spo2, data->timestamp); + SetCheckTime(data->timestamp); + HealthService::GetInstance()->UpdateBloodOxygenData(*data); + delete data; + /* -------------------------------------------------------------------------- */ + } } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp index 3348fe8aa..cf4445218 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp @@ -5,11 +5,11 @@ * Create: 2021-08-01 */ -#include "BloodOxygenPresenter.h" +#include "bloodoxygen/include/BloodOxygenPresenter.h" #include "common/task_manager.h" -#include "BloodOxygenView.h" +#include "bloodoxygen/include/BloodOxygenView.h" #include "BloodOxygenModel.h" -#include "BloodCheckView.h" +#include "bloodoxygen/include/BloodCheckView.h" #include "components/ui_label.h" #include "BloodBandoffView.h" #include "ChangeSliceListener.h" @@ -36,46 +36,46 @@ extern "C" errcode_t uapi_get_timestampe_ms(uint64_t *tm); #define BLOODKEYABLE 0 namespace OHOS { - static BloodOxygenPresenter *g_pMainView = nullptr; - BloodOxygenView *g_pbloodview = BloodOxygenView::GetInstance(); - static constexpr uint16_t PROGRESS_VALUE_MIN = 0; static constexpr uint16_t PROGRESS_VALUE_MAX = 10; + static BloodOxygenPresenter *g_pMainView; /* -------------------------------------------------------------------------- */ // 获取当前的"时间分" uint64_t BloodOxygenPresenter::GetCurrentTime() { - uint64_t timestamp_ms; - errcode_t result = uapi_get_timestampe_ms(×tamp_ms); - return timestamp_ms; + time_t now = time(0); + struct tm *tblock = localtime(&now); + + uint64_t current_time = tblock->tm_hour * 60 + tblock->tm_min; + return current_time; } // 获取时间差,现在传进来的是两个时间戳 std::string BloodOxygenPresenter::GetTDOA(uint64_t new_time, uint64_t old_time) { - if (new_time == old_time) + if (new_time == old_time || old_time > new_time) { return "刚刚"; } int time_diff = new_time - old_time; - int hours = time_diff / 3600000; // 将毫秒转换为小时 - int minutes = (time_diff % 3600000) / 60000; // 将剩余的毫秒转换为分钟 - - std::stringstream ss; - if (hours > 0) + if (time_diff > 60) { + int hours = time_diff / 60; + int minutes = time_diff % 60; + std::stringstream ss; ss << hours << "小时"; + if (minutes > 0) + { + ss << minutes << "分钟"; + } + return ss.str() + "前"; } - if (minutes > 0) - { - ss << minutes << "分钟"; - } - if (hours == 0 && minutes == 0) + else { - ss << "不到1分钟"; + std::stringstream ss; + ss << time_diff << "分钟前"; + return ss.str(); } - ss << "前"; - return ss.str(); } /* -------------------------------------------------------------------------- */ @@ -157,8 +157,23 @@ namespace OHOS return true; } return false; + } // 增加按键事件 + bool BloodOxygenPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { +#if BLOODKEYABLE + WEARABLE_LOGD("", "into the view is: %s\n", typeid(view).name()); + uint16 keyID = event.GetKeyId(); + WEARABLE_LOGD("", "into key! keyID %u\n", keyID); + // 如果是power键就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER)) + { + // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); + NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); + } +#endif + return true; } - + /* ---------------------------------- 状态监听 ---------------------------------- */ bool BloodOxygenPresenter::OnClick(UIView &view, const ClickEvent &event) { UNUSED(view); @@ -166,6 +181,7 @@ namespace OHOS // 主界面点击开始检测 if (strcmp(view.GetViewId(), "checkbegin") == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView->BloodBANDVIEW"); BloodOxygenView::GetInstance()->ChangeView(BLOODVIEW, BLOODBANDVIEW); BloodOxygenModel::GetInstance()->SetBloodBandoffViewStatus(true); BloodBandoffView::GetInstance()->GetImageAnimator()->Start(); @@ -174,83 +190,81 @@ namespace OHOS // 从检测界面回到主界面 if (strcmp(view.GetViewId(), "checkstop") == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodCHECKVIEW->BloodOxygenView"); BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODVIEW); + BloodOxygenView::GetInstance()->UpBloodText(); // 更新主界面数据 BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(false); - BloodOxygenModel::GetInstance()->SetCheckStatus(false); // 关闭检测 - return true; + BloodOxygenModel::GetInstance()->Blood_Stop(); } // 从检测失败界面回到检测界面 if (strcmp(view.GetViewId(), "ReCheck") == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodRESULT->BloodCHECKVIEW"); BloodOxygenView::GetInstance()->ChangeView(BLOODRESULT, BLOODCHECKVIEW); + BloodOxygenModel::GetInstance()->SetBloodResultViewStatus(false); + BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(true); BloodCheckView::GetInstance()->GetImageAnimator()->Start(); // 播放检测界面动画 - BloodOxygenModel::GetInstance()->SetCheckStatus(true); // 开始检测 + BloodOxygenModel::GetInstance()->Blood_Start(); // 开始检测 return true; } // 从检测失败界面回到主界面 if (strcmp(view.GetViewId(), "StCheck") == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodRESULT->BloodOxygenView"); BloodOxygenView::GetInstance()->ChangeView(BLOODRESULT, BLOODVIEW); - BloodOxygenModel::GetInstance()->SetCheckStatus(false); // 关闭检测 + BloodOxygenModel::GetInstance()->SetBloodResultViewStatus(false); + BloodOxygenView::GetInstance()->UpBloodText(); // 更新主界面数据 + BloodOxygenModel::GetInstance()->Blood_Stop(); return true; } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::OnClick"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodPresenter::OnClick"); return false; } - - // 增加按键事件 - bool BloodOxygenPresenter::OnKeyAct(UIView &view, const KeyEvent &event) - { -#if BLOODKEYABLE - WEARABLE_LOGD("", "into the view is: %s\n", typeid(view).name()); - uint16 keyID = event.GetKeyId(); - WEARABLE_LOGD("", "into key! keyID %u\n", keyID); - // 如果是power键就返回上一级 - if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER)) - { - // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); - NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); - } -#endif - return true; - } void BloodOxygenPresenter::ProgressNotify(void) { - - // 当检测状态为结束检测,结束检测 + // 当检测状态为结束检测,结束检测 if (BloodOxygenModel::GetInstance()->GetCheckStatus() == false) { if (startspo2 == false) { + BloodCheckView::GetInstance()->GetImageAnimator()->Stop(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus : false"); uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST; send_ppg_cmd_msg(md); startspo2 = true; - BloodOxygenModel::GetInstance()->StopTest(); } } - if (BloodOxygenModel::GetInstance()->GetBloodCheckViewStatus() == false) - return ; + { + return; + } + // 当检测状态为开始检测,开始检测 if (BloodOxygenModel::GetInstance()->GetCheckStatus() == true) { - BloodCheckView::GetInstance()->UpSpo2Text(); // 更新 + BloodCheckView::GetInstance()->UpShowBloodText(); // 更新检测界面 if (startspo2 == true) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus : true"); uint8_t md = PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST; send_ppg_cmd_msg(md); startspo2 = false; - BloodOxygenModel::GetInstance()->StartTest(); } } - - // 长时间未佩戴,则停止检测 + // 监测佩戴状态 if (BloodOxygenModel::GetInstance()->GetWearStatus() == false) { - BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODRESULT); - BloodOxygenModel::GetInstance()->SetCheckStatus(false); // 关闭检测 - BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(false); + if (BloodOxygenModel::GetInstance()->GetBloodCheckViewStatus() == true) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetWearStatus : false"); + BloodCheckView::GetInstance()->GetImageAnimator()->Stop(); + // 跳转到异常检测界面 + BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODRESULT); + BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(false); + BloodOxygenModel::GetInstance()->SetBloodResultViewStatus(true); + BloodOxygenModel::GetInstance()->Blood_Stop(); + } } } @@ -263,13 +277,13 @@ namespace OHOS { BloodOxygenView::GetInstance()->ChangeView(BLOODBANDVIEW, BLOODCHECKVIEW); BloodOxygenModel::GetInstance()->SetBloodBandoffViewStatus(false); - // 设置检测界面状态 + // 检测界面状态 BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(true); - // 播放检测界面动画 BloodCheckView::GetInstance()->GetImageAnimator()->Start(); - BloodOxygenModel::GetInstance()->SetCheckStatus(true); // 开始检测 + BloodOxygenModel::GetInstance()->Blood_Start(); // 开始检测 } } + // 检测动画播放完毕 if (BloodOxygenModel::GetInstance()->GetBloodCheckViewStatus() == true) { @@ -279,19 +293,22 @@ namespace OHOS if (BloodOxygenModel::GetInstance()->GetShowSPO2data() == 0) { BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODRESULT); + BloodOxygenModel::GetInstance()->SetBloodResultViewStatus(true); } // 测试成功 else { BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODVIEW); - BloodOxygenView::GetInstance()->Upspo2data(); // 更新主界面 + BloodOxygenView::GetInstance()->UpBloodText(); } - BloodOxygenModel::GetInstance()->SetCheckStatus(false); // 关闭检测 BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(false); - uint64_t timestamp_ms = GetCurrentTime(); - BloodOxygenModel::GetInstance()->SetCheckTime(timestamp_ms); // 更新时间 + BloodOxygenModel::GetInstance()->Blood_Stop(); } } + if (BloodOxygenModel::GetInstance()->GetBloodResultViewStatus() == true) + { + BloodOxygenModel::GetInstance()->Blood_Stop(); + } } void BloodOxygenPresenter::Notify(void) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp index bbd3e92a5..9d13e05a7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp @@ -6,7 +6,7 @@ */ #include "bloodoxygen/include/BloodOxygenView.h" -#include "bloodoxygen/include/BloodOxygenModel.h" +#include "BloodOxygenModel.h" #include "bloodoxygen/include/BloodOxygenPresenter.h" #include "displaybrightness/include/DisplayBrightnessModel.h" #include "power_display_service.h" @@ -72,7 +72,7 @@ namespace OHOS { return g_pMainView; } - void BloodOxygenView::Upspo2data() + void BloodOxygenView::UpBloodText() { // 更新血氧数据 uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data(); @@ -98,6 +98,9 @@ namespace OHOS bool BloodOxygenView::InitLabel() { /* -------------------------------------------------------------------------- */ + std::string bloodoxygenStr; + std::string TimeStr; + percent = new UILabel(); if (percent == nullptr) { @@ -109,16 +112,14 @@ namespace OHOS percent->SetViewId("label2"); // Set style percent->SetStyle(STYLE_TEXT_FONT, PERCENT_FONT_SIZE); uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data(); - std::string TimeStr; if (spo2_ != 0) { - std::string bloodoxygenStr = std::to_string(spo2_); - percent->SetText(bloodoxygenStr.c_str()); + bloodoxygenStr = std::to_string(spo2_); // 更新时间 uint64_t time = BloodOxygenPresenter::GetInstance()->GetCurrentTime(); uint64_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "time:%lld check_time:%lld", time, check_time); - TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time); + TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time) + "检测"; } else { @@ -129,6 +130,7 @@ namespace OHOS percent->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); percent->SetRollSpeed(0); percent->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERCENT_FONT_SIZE); + percent->SetText(bloodoxygenStr.c_str()); /* -------------------------------------------------------------------------- */ timeLabel = new UILabel(); if (timeLabel == nullptr) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp index 9ae55a0b1..6fa2f262c 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp @@ -5,26 +5,26 @@ #include "cJSON.h" namespace OHOS { - static HeartService *g_pHeartService = nullptr; + static HealthService *g_pHealthService = nullptr; cJSON *root = NULL; - HeartService::HeartService() + HealthService::HealthService() { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartService::HeartService"); - g_pHeartService = this; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HealthService::HealthService"); + g_pHealthService = this; } - HeartService::~HeartService() + HealthService::~HealthService() { - g_pHeartService = nullptr; + g_pHealthService = nullptr; } - HeartService *HeartService::GetInstance() + HealthService *HealthService::GetInstance() { - static HeartService instance; + static HealthService instance; return &instance; } - bool HeartService::LoadJsonData() + bool HealthService::LoadJsonData() { std::ifstream inFile(HEALTH_JSON_PATH); if (!inFile.is_open()) @@ -37,7 +37,7 @@ namespace OHOS return true; } - BloodOxygenData *HeartService::ReadBloodOxygenData() + BloodOxygenData *HealthService::ReadBloodOxygenData() { LoadJsonData(); BloodOxygenData *data = new BloodOxygenData(); @@ -48,7 +48,7 @@ namespace OHOS return data; } - bool HeartService::UpdateBloodOxygenData(const BloodOxygenData &data) + bool HealthService::UpdateBloodOxygenData(const BloodOxygenData &data) { LoadJsonData(); cJSON *latestData = cJSON_GetObjectItem(root, "spo2_latest_data"); @@ -77,7 +77,7 @@ namespace OHOS cJSON_Delete(root); return true; } - HeartRateData *HeartService::ReadHeartRateData() + HeartRateData *HealthService::ReadHeartRateData() { LoadJsonData(); HeartRateData *data = new HeartRateData(); @@ -88,7 +88,7 @@ namespace OHOS return data; } - bool HeartService::UpdateHeartRateData(const HeartRateData &data) + bool HealthService::UpdateHeartRateData(const HeartRateData &data) { LoadJsonData(); cJSON *latestData = cJSON_GetObjectItem(root, "heart_latest_data"); @@ -118,7 +118,7 @@ namespace OHOS return true; } - bool HeartService::UpdateJsonData() + bool HealthService::UpdateJsonData() { std::ofstream outFile(HEALTH_JSON_PATH); if (!outFile.is_open()) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h index cbbe4a38a..d7808047e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h @@ -37,12 +37,12 @@ namespace OHOS uint64_t timestamp; // 最近一次检测时间 } HeartRateData; - class HeartService + class HealthService { public: - HeartService(); - ~HeartService(); - static HeartService *GetInstance(void); + HealthService(); + ~HealthService(); + static HealthService *GetInstance(void); bool LoadJsonData(); // 加载json BloodOxygenData *ReadBloodOxygenData(); // 读取血氧数据 bool UpdateBloodOxygenData(const BloodOxygenData &data); // 更新血氧数据 diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/include/BloodCardView.h b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/include/BloodCardView.h index 071457aea..f98330e18 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/include/BloodCardView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/include/BloodCardView.h @@ -37,7 +37,7 @@ namespace OHOS void PreLoad(void) override; void UnLoad(void) override; - void UpSPO2data(); + void UpSPO2Text(); private: UIView::OnDragListener *draglistener{nullptr}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp index da0f00223..e73b2b98a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp @@ -37,7 +37,7 @@ namespace OHOS } /* -------------------------------------------------------------------------- */ - void BloodCardView::UpSPO2data() + void BloodCardView::UpSPO2Text() { // 更新血氧数据 uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index d24ef9d2e..4a14b4abc 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -119,7 +119,7 @@ extern "C" bool GetCheckStatus(); void SetCheckStatus(bool checkstatus); - void SetWearStatus(uint8_t wear); + void SetWearStatus(int32_t wear); bool GetWearStatus(void); void Heart_Start(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index 97bda4ef6..c69c9c4bf 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -200,9 +200,10 @@ namespace OHOS wearStatus = true; // 初始化血氧值 HeartRateData *data; - data = HeartService::GetInstance()->ReadHeartRateData(); + data = HealthService::GetInstance()->ReadHeartRateData(); Heart_ = data->Heart; TIME_ = data->timestamp; + delete data; } HeartModel::~HeartModel() @@ -488,7 +489,7 @@ namespace OHOS SetWearStatus(1); } - void HeartModel::SetWearStatus(uint8_t wear) + void HeartModel::SetWearStatus(int32_t wear) { // 设置佩戴状态 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear); @@ -610,8 +611,7 @@ namespace OHOS data->timestamp = HeartPresenter::GetInstance()->GetCurrentTime(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %lld", heart, data->timestamp); SetCheckTime(data->timestamp); - HeartService::GetInstance()->UpdateHeartRateData(*data); - + HealthService::GetInstance()->UpdateHeartRateData(*data); /* -------------------------------------------------------------------------- */ } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp index 727d6eff6..f7b09ea35 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp @@ -210,18 +210,6 @@ namespace OHOS } void HeartPresenter::ProgressNotify(void) { - // 当检测状态为开始检测,开始检测 - if (HeartModel::GetInstance()->GetCheckStatus() == true) - { - HeartCheckView::GetInstance()->UpShowHeartText(); // 更新检测界面 - if (startheart == true) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus : true"); - uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST; - send_ppg_cmd_msg(md); - startheart = false; - } - } // 当检测状态为结束检测,结束检测 if (HeartModel::GetInstance()->GetCheckStatus() == false) @@ -235,6 +223,25 @@ namespace OHOS startheart = true; } } + + if (HeartModel::GetInstance()->GetHeartCheckViewStatus() == false) + { + return; + } + + // 当检测状态为开始检测,开始检测 + if (HeartModel::GetInstance()->GetCheckStatus() == true) + { + HeartCheckView::GetInstance()->UpShowHeartText(); // 更新检测界面 + if (startheart == true) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus : true"); + uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST; + send_ppg_cmd_msg(md); + startheart = false; + } + } + // 监测佩戴状态 if (HeartModel::GetInstance()->GetWearStatus() == false) { @@ -253,7 +260,6 @@ namespace OHOS void HeartPresenter::ReturnInterface() { - // 佩戴动画播放完毕,前往检测界面 if (HeartModel::GetInstance()->GetHeartBandoffViewStatus() == true) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h index d7b579c83..44088c563 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h @@ -23,7 +23,7 @@ namespace OHOS return &instance; } bool GetDialFloatData(DialDataType &type, float &out) override; - void UpdateSPO2(int16_t SPO2); + void UpdateSPO2(uint8_t SPO2); int GetSPO2Data(); private: diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp index a05b1ab7f..2b53a3634 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp @@ -312,8 +312,7 @@ namespace OHOS } else if (view_->GetHorCurrentPage() == BloodOxygen) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodCardView"); - // BloodCardView::GetInstance()->UpSPO2data(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodCardView"); } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp index 1a0821be9..63c314755 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp @@ -20,7 +20,7 @@ namespace OHOS return true; } - void DialModelSPO2::UpdateSPO2(int16_t SPO2) + void DialModelSPO2::UpdateSPO2(uint8_t SPO2) { SPO2_ = static_cast(SPO2); if (onChangeListener_ != nullptr) diff --git a/code/sdk/application/wearable/service/msg_center/CMakeLists.txt b/code/sdk/application/wearable/service/msg_center/CMakeLists.txt index 3373b88f4..c833df4eb 100755 --- a/code/sdk/application/wearable/service/msg_center/CMakeLists.txt +++ b/code/sdk/application/wearable/service/msg_center/CMakeLists.txt @@ -11,9 +11,7 @@ set(PRIVATE_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/alarm/include ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/callerlog/include ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/phoneservice/include - ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/producttest/include - ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/main/include/dial ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/bloodoxygen/include ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/heartrate/include diff --git a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp index a813f3cff..ba3153549 100755 --- a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp @@ -242,20 +242,6 @@ void MsgCenterNotifyHfpWatchProc(const Topic topic, Request* req) } #ifdef SUPPORT_SPO2_NOTIFICATION_TEST uint32_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST; -//血氧 -void MsgCenterNotifySPO2hProc(const Topic topic, Request* req) -{ - unused(topic); - unused(req); - if (topic == TOPIC_EVENT_SPO2_UPDATE && req != nullptr && req->data != nullptr) - { - u_int8_t sp02 = *((u_int8_t*)(req->data)); // 进行类型转换 - DialModelSPO2::GetInstance()->UpdateSPO2(sp02); - BloodOxygenModel::GetInstance()->UpSPO2data(sp02); - } -} - - void MsgCenterNotifyCardhProc(const Topic topic, Request* req) { unused(topic); @@ -280,6 +266,18 @@ void MsgCenterNotifyWearStateProc(const Topic topic, Request* req) HeartModel::GetInstance()->SetWearStatus(wear); } } +//血氧 +void MsgCenterNotifySPO2hProc(const Topic topic, Request* req) +{ + unused(topic); + unused(req); + if (topic == TOPIC_EVENT_SPO2_UPDATE && req != nullptr && req->data != nullptr) + { + uint8_t spo2 = *((uint8_t*)(req->data)); // 进行类型转换 + DialModelSPO2::GetInstance()->UpdateSPO2(spo2); + BloodOxygenModel::GetInstance()->UpSPO2data(spo2); + } +} //心率 void MsgCenterNotifyHeartRateProc(const Topic topic, Request* req) {