From 1f4bf7098bfc0a37e3d800bad1fdbafb62a29f45 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A2=81=E6=B8=85=E6=A2=A6?= <3449750381@qq.com> Date: Fri, 16 Aug 2024 01:38:14 +0000 Subject: [PATCH] Merge #704 into sdk602patch0626 from refs/changes/704/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 袁清梦 * refs/changes/704/head: (7 commits squashed) - 更新主界面心率卡片UI - 增加当日历史心率数据处理 - 同步心率UI资源文件更新 - 更新多国语言脚本 实现自动copy - ● 修改卡片管理样式与figma保持一致纵向 ● 增加卡片管理表冠控制 ● 增加卡片管理滑动条效果 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 Signed-off-by: Caisking <3449750381@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/704 --- .../include/ui_resource_image.h | 6 +- .../add_card/src/AddCardPresenter.cpp | 5 +- .../nativeui/add_card/src/AddCardView.cpp | 7 +- .../health_service/health_service.cpp | 143 +- .../health_service/health_service.h | 21 + .../nativeui/heartrate/include/HeartModel.h | 2 + .../heartrate/include/HeartRateView.h | 141 +- .../nativeui/heartrate/src/HeartModel.cpp | 24 +- .../nativeui/heartrate/src/HeartRateView.cpp | 168 +- .../screensetting/src/ScreenModels.cpp | 10 +- .../nativeui/uiservice/include/ui_service.h | 3 +- .../nativeui/uiservice/src/ui_service.cpp | 894 ++++----- .../nativeui/heartrate/src/HeartRateView.cpp | 1610 ++++++++++------- .../fd230/fs/user/res/MainCard/heart.bin | 4 +- .../drivers/peripheral/utils/custom_utils.c | 4 +- .../test/hert/heart/BOTTOM.png | Bin 0 -> 275 bytes .../test/hert/heart/COOR.png | Bin 0 -> 5841 bytes .../test/hert/heart/TOP.png | Bin 0 -> 244 bytes tools/language_tool/make_language.sh | 40 +- ...45\345\205\267\350\204\232\346\234\254.md" | 5 +- 20 files changed, 1836 insertions(+), 1251 deletions(-) create mode 100644 tools/image_converter_tool/test/hert/heart/BOTTOM.png create mode 100644 tools/image_converter_tool/test/hert/heart/COOR.png create mode 100644 tools/image_converter_tool/test/hert/heart/TOP.png diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_image.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_image.h index bc18a57ca..778ca3967 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_image.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_image.h @@ -13,9 +13,9 @@ namespace OHOS static const int DIR_MASK = 0xfff00000; static const int PNG_MASK = 0x000fffff; - static const int HEART_HEARTRATECOOR = 0x100001; - static const int HEART_HEARTRATE_BOTTOM = 0x100002; - static const int HEART_HEARTRATE_TOP = 0x100003; + static const int HEART_RATE_BOTTOM = 0x100001; + static const int HEART_RATE_COOR = 0x100002; + static const int HEART_RATE_TOP = 0x100003; /* -------------------------------------------------------------------------- */ static const int PLAYER_BACKGROUND = 0x200001; // 音乐背景 static const int PLAYER_BLUETOOTH_COLOR = 0x200002; // 蓝牙图标蓝色图片 diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp index 893e4ccf2..e2281cff1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp @@ -51,8 +51,9 @@ namespace OHOS { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::OnDrag"); UNUSED(view); - /*从下自上 回退*/ - if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP)) + /*回退*/ + if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) && + (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) { // 回退 NativeAbility::GetInstance().Back(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp index ab0f02ff3..8a51d6211 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp @@ -11,7 +11,7 @@ namespace OHOS { - AddCardView::AddCardView() : contentList_(UIList::HORIZONTAL) + AddCardView::AddCardView() { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::AddCardView"); } @@ -112,7 +112,12 @@ namespace OHOS contentList_.SetMaxScrollDistance(1000); contentList_.SetLoopState(true); contentList_.SetAdapter(addCardAdapter_); + contentList_.SetVisible(true); + contentList_.SetRotateFactor(1.0); + contentList_.RequestFocus(); + contentList_.SetYScrollBarVisible(true); // 设置滑动滚动条 + container_->Add(&contentList_); } 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 415f895ca..530bd00a1 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 @@ -14,6 +14,15 @@ #include "bloodoxygen/include/BloodOxygenModel.h" namespace OHOS { + extern "C" + { + void save_heart_data() + { + printf("save_heart_data\r\n"); + OHOS::HealthService::GetInstance()->SaveDailyHeartRate(); + return; + } + } static HealthService *g_pHealthService = nullptr; /*获取日期*/ @@ -337,6 +346,10 @@ namespace OHOS outFile.close(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok"); + // 写入文件到当天历史数据 + UpdateHourlyHeartRate(data.timestamp, data.Heart); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok"); + /* 存储bin文件[协议使用] */ std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART); FILE *fp = fopen(binFilePath.c_str(), "ab+"); @@ -385,4 +398,132 @@ namespace OHOS { healthState_ = healthState; } -} \ No newline at end of file + /* ------------------------------- 心率当天历史数据处理 ------------------------------ */ + static constexpr const char *HEART_DATA_PATH = "/user/userdata/health/heart_history.bin"; + bool HealthService::LoadDailyHeartRate() + { + // 初始化心率数组为 0 + ClearHourlyHeartRates(); + + // 获取当前时间 + time_t currentTime = time(nullptr); + tm *currentTm = localtime(¤tTime); + + // 检查是否为同一天 + std::ifstream file(HEART_DATA_PATH, std::ios::binary); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Unable to open heart rate data file for reading"); + return false; // 文件打开失败 + } + + // 读取时间戳 + file.read(reinterpret_cast(&lastLoadTime), sizeof(lastLoadTime)); + + // 检查是否为同一天 + if (lastLoadTime != 0) // 确保 lastLoadTime 有效 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "************************************************"); + tm *lastTm = localtime(&lastLoadTime); + if (currentTm->tm_year == lastTm->tm_year && + currentTm->tm_yday == lastTm->tm_yday) + { + // 如果是同一天,直接读取心率数据 + for (int i = 0; i < MAX_HOURS; ++i) + { + uint16_t heartRate; + if (!file.read(reinterpret_cast(&heartRate), sizeof(heartRate))) // 读取心率 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to read heart rate data."); + file.close(); + return false; // 读取失败 + } + dailyHeartRates[i] = heartRate; + + // 打印心率数据 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Hour %d: Heart Rate %d", i, heartRate); + } + file.close(); + return true; // 成功读取 + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "************************************************"); + } + + // 如果不是同一天,清空文件内容 + file.close(); + SaveDailyHeartRate(); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Not same-day data"); + return false; // 不是同一天 + } + + bool HealthService::SaveDailyHeartRate() + { + // 判断文件是否存在 不存在即创建 并打开以输出模式 + std::ofstream outFile(HEART_DATA_PATH, std::ios::trunc); + if (!outFile.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Unable to open heart rate data file for reading"); + return false; // 文件打开失败 + } + + // 存储一个时间戳最前面 + time_t currentTime = time(nullptr); + outFile.write(reinterpret_cast(¤tTime), sizeof(currentTime)); + + for (int i = 0; i < MAX_HOURS; ++i) + { + if (!outFile.write(reinterpret_cast(&dailyHeartRates[i]), sizeof(dailyHeartRates[i]))) // 保存心率值 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to write heart rate data."); + outFile.close(); + return false; // 写入失败 + } + } + outFile.close(); + return true; // 成功保存 + } + void HealthService::ClearHourlyHeartRates() + { + // 清空心率数据,将数组置为 0 + for (int i = 0; i < MAX_HOURS; ++i) + { + dailyHeartRates[i] = 0; + } + } + void HealthService::UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate) + { + // 将时间戳转换为 tm 结构体 + struct tm *timeInfo = localtime(×tamp); // 使用 localtime 获取本地时间 + + // 提取小时 + uint8_t hour = static_cast(timeInfo->tm_hour); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updating heart rate: 小时 %d, 心率值 %d", hour, heartRate); + + // 确保 hour 在有效范围内,并且心率不是异常值(例如负值) + if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负 + { + dailyHeartRates[hour] = heartRate; + } + + // 记录目前更新时间点 + currenthour = hour; + } + + uint8_t HealthService::GetHourlyHeartRate(uint8_t hour) + { + // 返回指定小时的心率 + if (hour < MAX_HOURS) + { + return dailyHeartRates[hour]; // 默认为 0 如果未更新 + } + return 0; // 或者返回一个异常值 + } + + uint8_t HealthService::GetCurrentHour() + { + // 返回目前小时 + return currenthour; + } +} 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 a48df952a..6760b2376 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 @@ -10,6 +10,9 @@ #include "stdio.h" #include "string" +#include +#include +#include #define HEART_MAX_POINTS 360 namespace OHOS @@ -92,11 +95,29 @@ namespace OHOS bool UpdateJsonData(uint8_t type); // 更新json bool CleanHealthData(); + /*健康状态*/ HealthState GetHealthCurrent(); void SetHealthCurrent(HealthState healthState); + /* + 当天24个小时的心率处理 + -心率数组 每个小时存储最新的值 但是没有小时只有一个值 + -开机读取 + -关机存储 + */ + bool SaveDailyHeartRate(); + bool LoadDailyHeartRate(); + void UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate); + uint8_t GetHourlyHeartRate(uint8_t hour); + void ClearHourlyHeartRates(); + uint8_t GetCurrentHour(); + private: + static const int MAX_HOURS = 24; + uint16_t dailyHeartRates[MAX_HOURS]; // 使用数组来存储心率值 HealthState healthState_; + time_t lastLoadTime; // 记录最后加载的时间 + uint8_t currenthour = 0; }; } #endif // HEALTH_MODEL_H \ No newline at end of file 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 5a453a310..66f0359c1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -152,6 +152,8 @@ extern "C" void Heart_Control(HeartState state, HeartCheck check); void ReInit(); + void Heart_Update_View(void); + private: HealthAllDatas healthDatas; uint16_t pretime{0}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h index de7245c73..23f1239ee 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h @@ -17,7 +17,8 @@ #include "components/ui_card_page.h" #include "HeartModel.h" -namespace OHOS { +namespace OHOS +{ #define HEART_AVE_NUM 360 #define HEART_RATE_LIMIT_UPPER 200 #define HEART_RATE_LIMIT_LOWER 0 @@ -32,76 +33,86 @@ namespace OHOS { #define NUM_16 16 #define NUM_99 99 -class HeartRateView : public UICardPage { -public: - HeartRateView(); - ~HeartRateView() override; - static HeartRateView *GetInstance(void); + class HeartRateView : public UICardPage + { + public: + HeartRateView(); + ~HeartRateView() override; + static HeartRateView *GetInstance(void); - bool InitView(void); - void PreLoad(void) override; - void UnLoad(void) override; - int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线 - void RefreshElectrocardiogram(void); // 刷新心率曲线 - void ClearElectrocardiogram(void); // 清空心率曲线 - void RefreshHeartRatePerSec(uint16_t value); // 刷新每秒心率 - void RefreshHeartRateMax(uint16_t max); // 刷新心率最大值 - void RefreshHeartRateMin(uint16_t min); // 刷新心率最小值 - void RefreshRestHeartRate(uint16_t value); // 刷新静息心率 - void HeartbeatImageAnimatorStart(void); // 心形动画启动 - void HeartbeatImageAnimatorStop(void); // 心形动画停止 - void InitRefreshInterface(void); + bool InitView(void); + void PreLoad(void) override; + void UnLoad(void) override; + int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线 + void RefreshElectrocardiogram(void); // 刷新心率曲线 + void ClearElectrocardiogram(void); // 清空心率曲线 + void RefreshHeartRatePerSec(uint16_t value); // 刷新每秒心率 + void RefreshHeartRateMax(uint16_t max); // 刷新心率最大值 + void RefreshHeartRateMin(uint16_t min); // 刷新心率最小值 + void RefreshRestHeartRate(uint16_t value); // 刷新静息心率 + void HeartbeatImageAnimatorStart(void); // 心形动画启动 + void HeartbeatImageAnimatorStop(void); // 心形动画停止 + void InitRefreshInterface(void); + void InitChartTest(void); + void Init_data_Chart(); + void Update_data_Chart(int serialIndex); + void UpdataChart(); -private: - typedef struct { - uint8_t fontSize; - int16 x; - int16 y; - int16 width; - int16 height; - } LabelInfo; + private: + typedef struct + { + uint8_t fontSize; + int16 x; + int16 y; + int16 width; + int16 height; + } LabelInfo; - int32_t InitHeartRateData(void); - void SetLabel(UILabel *label, LabelInfo labelInfo); - void HeartRateLabelDisplay(void); - void HeartRateCoordinate(void); - void HeartRateElectrocardiogram(void); - void InsertTopAndBottomRateImage(void); - void UpdataTopAndBottomRate(void); - void ElectrocardiogramOnePoint(Point *rateData, uint16_t index); - void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume); - int32_t HeartRateDataProc(void); - void HeartbeatImageAnimator(void); + int32_t InitHeartRateData(void); + void SetLabel(UILabel *label, LabelInfo labelInfo); + void HeartRateLabelDisplay(void); + void HeartRateCoordinate(void); + void HeartRateElectrocardiogram(void); + void InsertTopAndBottomRateImage(void); + void UpdataTopAndBottomRate(void); + void ElectrocardiogramOnePoint(Point *rateData, uint16_t index); + void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume); + int32_t HeartRateDataProc(void); + void HeartbeatImageAnimator(void); -private: - Point heartRateData[HEART_AVE_NUM]; - Point rateDataTmp[HEART_AVE_NUM]; + private: + Point heartRateData[HEART_AVE_NUM]; + Point rateDataTmp[HEART_AVE_NUM]; - void PreLoadHeartRateImageRes(void); - void UnLoadHeartRateImageRes(void); - bool viewiInitStatus{false}; - bool resLoadStatus{false}; - UIChartPolyline *chart{nullptr}; - uint16_t dataNume; // 心率曲线记录数据总个数 - uint16_t currIndex; // 当前已显示心率曲线心率个数 - UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr}; - UIChartDataSerial *dataTopAndbottom{nullptr}; - UIImageView *imageViewTop{nullptr}; - UIImageView *imageViewBottom{nullptr}; - uint16_t serialIndex; - UIImageAnimatorView *imageAnimator{nullptr}; - UIImageView *imageViewCoordinate{nullptr}; + void PreLoadHeartRateImageRes(void); + void UnLoadHeartRateImageRes(void); + bool viewiInitStatus{false}; + bool resLoadStatus{false}; + UIChartPolyline *chart{nullptr}; + uint16_t dataNume; // 心率曲线记录数据总个数 + uint16_t currIndex; // 当前已显示心率曲线心率个数 + UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr}; + UIChartDataSerial *dataTopAndbottom{nullptr}; + UIImageView *imageViewTop{nullptr}; + UIImageView *imageViewBottom{nullptr}; + uint16_t serialIndex; + UIImageAnimatorView *imageAnimator{nullptr}; + UIImageView *imageViewCoordinate{nullptr}; - UILabel *topRate{nullptr}; - UILabel *bottomRate{nullptr}; - UILabel *ratePerSec{nullptr}; - UILabel *ratePerSecText{nullptr}; - UILabel *restRate{nullptr}; - UILabel *restRateText1{nullptr}; - UILabel *restRateText2{nullptr}; + UILabel *topRate{nullptr}; + UILabel *bottomRate{nullptr}; + UILabel *ratePerSec{nullptr}; + UILabel *ratePerSecText{nullptr}; + UILabel *restRate{nullptr}; + UILabel *restRateText1{nullptr}; + UILabel *restRateText2{nullptr}; - uint16_t maxRate; - uint16_t minRate; -}; + uint16_t maxRate; + uint16_t minRate; + + Point heartdata[24]; + UIChartDataSerial *heartSerial{nullptr}; + UIChartPolyline *heartchart = nullptr; + }; } // namespace OHOS #endif // HEART_RATE_VIEW_H 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 a9b991c50..42dac0d57 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -20,6 +20,9 @@ #include #include +#include "heartrate/include/HeartRateView.h" +#include "ui_service.h" + #ifdef __cplusplus extern "C" { @@ -198,6 +201,8 @@ namespace OHOS /*初始化读取文件*/ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()"); HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData(); + /*初始化历史文件*/ + HealthService::GetInstance()->LoadDailyHeartRate(); if (data != nullptr) { currentheart = data->Heart; @@ -472,7 +477,7 @@ namespace OHOS if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) { HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len); - HeartRateView::GetInstance()->RefreshElectrocardiogram(); + // HeartRateView::GetInstance()->RefreshElectrocardiogram(); HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec); HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate); HeartRateView::GetInstance()->RefreshHeartRateMin(minRate); @@ -568,6 +573,8 @@ namespace OHOS if (heartresult_ == HeartResult::SUCCESS) { Heart_Save(); + /*通知进行UI更新*/ + SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0); } /*关闭被动检测*/ Heart_Control(HeartState::End, HeartCheck::PASSIVITY); @@ -589,7 +596,7 @@ namespace OHOS SetCheckTime(data.timestamp); HealthService::GetInstance()->UpdateHealthData(data); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %ld", currentheart, data.timestamp); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", currentheart, data.timestamp); } // 显示检测结果// 显示检测结果 @@ -724,4 +731,17 @@ namespace OHOS Heart_Stop(); } } + + void HeartModel::Heart_Update_View(void) + { + if (HeartRateView::GetInstance()) + { + int hour = HealthService::GetInstance()->GetCurrentHour(); + if (HeartRateView::GetInstance() != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片"); + HeartRateView::GetInstance()->Update_data_Chart(hour); + } + } + } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp index a027ab066..083fdcef4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp @@ -12,20 +12,21 @@ #include "ScreenModels.h" #include "ui_resource_image.h" #include "common/image_cache_manager.h" - +#include "heart_blood/health_service/health_service.h" +#define HEART_DATA_TEST 0 namespace OHOS { static HeartRateView *g_pHeartRateView = nullptr; // 背景坐标图形 -#define ACT_IMAGE_X 0 // 图片坐标起点 -#define ACT_IMAGE_Y 115 // 图片坐标起点 -#define ACT_IMAGE_COOR_X 45 // 200刻度线到最左端的像素点 +#define ACT_IMAGE_X 38 // 图片坐标起点 +#define ACT_IMAGE_Y 130 // 图片坐标起点 +#define ACT_IMAGE_COOR_X 80 // 200刻度线到最左端的像素点 #define ACT_IMAGE_COOR_Y 145 // 200刻度线到顶端的像素点 #define ACT_IMAGE_COOR_PIXELS 160 // 实际背景坐标0到200心率值的实际像素点 #define ACT_IMAGE_COOR_VALUE HEART_RATE_LIMIT_UPPER // 图片刻度表示的心率范围 -#define ACT_IMAGE_COOR_WIDTH 454 -#define ACT_IMAGE_COOR_HEIGHT 220 +#define ACT_IMAGE_COOR_WIDTH 390 +#define ACT_IMAGE_COOR_HEIGHT 200 // 心电图坐标适配 #define COORDINATE_VALUE 5 // 余量 @@ -39,8 +40,8 @@ namespace OHOS // 心形心跳 #define HEARTBEAT_IMAGE_WIDTH 92 #define HEARTBEAT_IMAGE_HEIGHT 92 -#define HEARTBEAT_IMAGE_X 130 -#define HEARTBEAT_IMAGE_Y 25 +#define HEARTBEAT_IMAGE_X 105 +#define HEARTBEAT_IMAGE_Y 50 #define HEARTBEAT_IMAGE_NUM 19 #define HEARTBEAT_DELAY 50 @@ -90,10 +91,10 @@ namespace OHOS #define REST_HEART_TEXT_HEIGHT2 (REST_HEART_TEXT_FONT_SIZE + 5) // 每秒心率 -#define PERSEC_HEART_RATE_FONT_SIZE 45 -#define PERSEC_HEART_RATE_X 225 -#define PERSEC_HEART_RATE_Y 55 -#define PERSEC_HEART_RATE_WIDTH 90 +#define PERSEC_HEART_RATE_FONT_SIZE 60 +#define PERSEC_HEART_RATE_X 202 +#define PERSEC_HEART_RATE_Y 62 +#define PERSEC_HEART_RATE_WIDTH 102 #define PERSEC_HEART_RATE_HEIGHT (PERSEC_HEART_RATE_FONT_SIZE + 5) #define PERSEC_HEART_TEXT_FONT_SIZE 30 @@ -157,6 +158,10 @@ namespace OHOS delete dataSerial[i]; dataSerial[i] = nullptr; } + heartchart->ClearDataSerial(); + delete heartSerial; + heartSerial = nullptr; + delete heartchart; delete chart; chart = nullptr; delete imageViewTop; @@ -229,7 +234,27 @@ namespace OHOS return OHOS_SUCCESS; } +#if 0 + std::vector HeartRateView::simulateHeartRateData() + { + std::vector heartRateData; + const int HEART_RATE_MIN = 60; // 心率下限 + const int HEART_RATE_MAX = 100; // 心率上限 + + // 用于生成随机数的种子 + std::srand(std::time(0)); + + for (int i = 0; i < 24; ++i) + { // 模拟24小时 + Point dataPoint; + dataPoint.x = i; // 小时数 + dataPoint.y = HEART_RATE_MIN + (std::rand() % (HEART_RATE_MAX - HEART_RATE_MIN + 1)); // 随机生成心率值 + heartRateData.push_back(dataPoint); + } + return heartRateData; + } +#endif int32_t HeartRateView::HeartRateDataProc(void) { int32_t i, ret; @@ -250,7 +275,7 @@ namespace OHOS } dataNume = 0; - for (i = 0; i < HEART_AVE_NUM; i++) + for (i = 0; i < HEART_AVE_NUM; i += 15) // 每跨过15个点代表一个小时 { if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 && datain[i].y <= HEART_RATE_LIMIT_UPPER) @@ -260,6 +285,7 @@ namespace OHOS dataNume++; } } + return OHOS_SUCCESS; } @@ -308,6 +334,7 @@ namespace OHOS SetLabel(ratePerSec, PerSecLabel); SetLabel(ratePerSecText, PerSecTextLabel); ratePerSec->SetText("--"); + ratePerSec->SetFont(GILROY_BOLD_FONT, PERSEC_HEART_RATE_FONT_SIZE); ratePerSecText->SetText("次/分"); // 最高最低心率 @@ -361,9 +388,105 @@ namespace OHOS xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA); + chart->SetVisible(false); // 设置不可见 Add(chart); } + void HeartRateView::InitChartTest(void) + { + if (heartchart == nullptr) + { + heartchart = new UIChartPolyline(); + } + heartchart->SetPosition(95, 178); + heartchart->Resize(320, 110); + heartchart->SetViewId("uiChart"); + heartchart->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + + UIXAxis &heartXAxis = heartchart->GetXAxis(); + UIYAxis &heartYAxis = heartchart->GetYAxis(); + heartXAxis.SetMarkNum(1); + heartXAxis.SetDataRange(0, 24); + heartXAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); + // heartXAxis.SetLineColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff)); + heartYAxis.SetMarkNum(1); + heartYAxis.SetDataRange(0, 220); + heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); + // heartYAxis.SetLineColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff)); + + heartchart->SetGradientOpacity(0, 0); + + Add(heartchart); + } + void HeartRateView::Init_data_Chart() + { + if (heartchart == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init_data_Chart new chart fail"); + return; + } + heartSerial = new UIChartDataSerial(); + heartSerial->SetMaxDataCount(24); +#if HEART_DATA_TEST + Point temp[] = { + {0, 150}, {1, 250}, {2, 170}, {3, 0}, {4, 140}, {5, 190}, {6, 100}, {7, 40}, {8, 10}, {9, 100}, {10, 60}, {11, 20}, {12, 150}, {13, 250}, {14, 170}, {15, 140}, {16, 78}, {17, 80}, {18, 100}, {19, 20}, {20, 100}, {21, 100}, {22, 100}, {23, 100}}; + std::copy(std::begin(temp), std::end(temp), heartdata); +#else + for (int serialIndex = 0; serialIndex < 24; serialIndex++) + { + heartdata[serialIndex].x = serialIndex; + heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex); + } +#endif + heartSerial->AddPoints(heartdata, 24); + heartSerial->SetLineColor(Color::Red()); + heartSerial->SetFillColor(Color::Red()); + heartSerial->EnableGradient(true); + + heartchart->AddDataSerial(heartSerial); + heartchart->Invalidate(); + } + void HeartRateView::Update_data_Chart(int serialIndex) + { +#if HEART_DATA_TEST + Point tmp[NUM_2]; + if (chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM) + { + return; + } + heartSerial[serialIndex] = new UIChartDataSerial(); + heartdata[serialIndex].x = serialIndex; + heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex); + + tmp[0].x = tmp[1].x = heartdata[serialIndex].x; + tmp[0].y = tmp[1].y = heartdata[serialIndex].y; + + heartSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点 + heartSerial[serialIndex]->AddPoints(tmp, NUM_2); + heartSerial[serialIndex]->SetLineColor(Color::Red()); + heartSerial[serialIndex]->SetFillColor(Color::Red()); + heartSerial[serialIndex]->EnableGradient(true); + + heartchart->AddDataSerial(heartSerial[serialIndex]); + heartchart->Invalidate(); +#else + if (heartchart == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex); + return; + } + + heartdata[serialIndex].x = serialIndex; + heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex); + + heartSerial->AddPoints(heartdata, 24); + heartSerial->SetLineColor(Color::Red()); + heartSerial->SetFillColor(Color::Red()); + heartSerial->EnableGradient(true); + heartchart->AddDataSerial(heartSerial); + heartchart->Invalidate(); +#endif + } void HeartRateView::InsertTopAndBottomRateImage(void) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start"); @@ -449,7 +572,6 @@ namespace OHOS minRate = (minRate <= bottom) ? minRate : bottom; } } - void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index) { Point tmp[NUM_2]; @@ -596,10 +718,12 @@ namespace OHOS HeartRateLabelDisplay(); HeartbeatImageAnimator(); HeartRateCoordinate(); + InitChartTest(); + Init_data_Chart(); InsertTopAndBottomRateImage(); HeartRateElectrocardiogram(); UpdataTopAndBottomRate(); - HeartbeatImageAnimatorStop(); + // HeartbeatImageAnimatorStop(); 进入界面进行 动画播放 InitRefreshInterface(); return true; } @@ -610,9 +734,10 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoadHeartRateImageRes"); if (!resLoadStatus) { - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP); - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM); - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR); + /*心率背景图*/ + ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_RATE_TOP); + ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_RATE_BOTTOM); + ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_RATE_COOR); resLoadStatus = true; } } @@ -628,9 +753,9 @@ namespace OHOS imageViewBottom->SetSrc(img); imageViewCoordinate->SetSrc(img); // ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES); - ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATE_TOP, HEART_IAMGES); - ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATE_BOTTOM, HEART_IAMGES); - ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATECOOR, HEART_IAMGES); + ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_TOP, HEART_IAMGES); + ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_BOTTOM, HEART_IAMGES); + ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_COOR, HEART_IAMGES); resLoadStatus = false; } } @@ -885,6 +1010,7 @@ namespace OHOS } } } + #if 0 #ifdef __cplusplus extern "C" diff --git a/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp b/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp index 33fa873a7..adb019537 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp @@ -1,3 +1,9 @@ +/*** + * @Date: 2024-08-12 10:11:33 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-13 16:58:23 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp + */ /* * @Author: luozheng 1732036298@qq.com * @Date: 2024-08-05 15:20:03 @@ -67,11 +73,11 @@ bool ScreenModels::LoadAppImages(std::string file, UIImageView *view, uint32_t r void ScreenModels::PreLoadAppimages(void) { - LoadAppMultiImages(PLAYER_IAMGES, PLAYER_BACKGROUND, PLAYER_UP_66); //LoadAppMultiImages(CLOCK_IAMGES, CLOCK_CLOCK0, CLOCK_SECOND); + LoadAppMultiImages(PLAYER_IAMGES, PLAYER_BACKGROUND, PLAYER_UP_66); LoadAppMultiImages(COMPASS_IAMGES, COMPASS_COMPASS0, COMPASS_COMPASS2); LoadAppMultiImages(DROPDOWN_IAMGES, DROPDOWN_BLUETOOTHCONNECTED, DROPDOWN_SETTING); - LoadAppMultiImages(HEART_IAMGES, HEART_HEARTRATECOOR, HEART_HEARTRATE_TOP); + LoadAppMultiImages(HEART_IAMGES, HEART_RATE_BOTTOM, HEART_RATE_TOP); LoadAppMultiImages(BLOOD_IAMGES, BLOODOXYGEN_BACKGOUND, BLOODOXYGEN_BACKGOUND); LoadAppMultiImages(TRAINING_IAMGES, TRAINING_BOUTTONGROUND, TRAINING_WALKING_BIG); // LoadAppMultiImages(MESSAGE_IAMGES, MESSAGE_MESSAGE, MESSAGE_WECHAT); diff --git a/code/sdk/application/wearable/fd230app/nativeui/uiservice/include/ui_service.h b/code/sdk/application/wearable/fd230app/nativeui/uiservice/include/ui_service.h index 5abb0e121..1caba98bc 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/uiservice/include/ui_service.h +++ b/code/sdk/application/wearable/fd230app/nativeui/uiservice/include/ui_service.h @@ -1,7 +1,7 @@ /*** * @Date: 2024-07-12 19:25:33 * @LastEditors: Caisking 3449750381@qq.com - * @LastEditTime: 2024-07-25 10:22:03 + * @LastEditTime: 2024-08-15 14:39:51 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/uiservice/include/ui_service.h */ /* @@ -76,6 +76,7 @@ typedef enum { UI_UPDATE_WEATHER_DATA, //天气数据更新 UI_UPDATE_SLEEP_DATA, //更新睡眠数据 UI_UPDATE_MESSAGE_DATA, //更新消息数据 + UI_UPDATE_HEARTRATE_DATA, //更新心率曲线 UI_AI_JUMP_TO_RESULT_VIEW, //跳转到返回结果视图 UI_AI_JUMP_TO_LISTENING_VIEW,//跳转到AI聆听界面 diff --git a/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp b/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp index 72d2dd668..daaf2fe02 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp @@ -24,6 +24,7 @@ #include "player/include/PlayersModel.h" #include "sleep/include/SleepModel.h" #include "message/include/MessageModel.h" +#include "heartrate/include/HeartModel.h" #include "aivoice/include/AiVoiceModel.h" #include "weather/include/WeatherModel.h" #include "uiservice/include/ui_service.h" @@ -50,179 +51,186 @@ extern "C" errcode_t uapi_pm_add_sleep_veto(pm_id_t veto_id); extern "C" errcode_t uapi_pm_remove_sleep_veto(pm_id_t veto_id); #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -static const char *GetServiceName(Service *service); -static BOOL ServiceInitialize(Service *service, Identity identity); -static TaskConfig GetServiceTaskConfig(Service *service); -static BOOL ServiceMessageHandle(Service *service, Request *request); -static void ServiceMsgProcess(Request *request); -static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen); - -static UiService g_uiService = { - .GetName = GetServiceName, - .Initialize = ServiceInitialize, - .MessageHandle = ServiceMessageHandle, - .GetTaskConfig = GetServiceTaskConfig, - DEFAULT_IUNKNOWN_ENTRY_BEGIN, - .SendMsg = SendMsg, - DEFAULT_IUNKNOWN_ENTRY_END, - .identity = { -1, -1, nullptr }, -}; - -const int DATA_DIST_STACK_SIZE = 0xC00; -const int DATA_DIST_MAIL_LENGTH = 10; -const int BYTE_OFFSET = 8; -static uint32_t g_interval = 5; + static const char *GetServiceName(Service *service); + static BOOL ServiceInitialize(Service *service, Identity identity); + static TaskConfig GetServiceTaskConfig(Service *service); + static BOOL ServiceMessageHandle(Service *service, Request *request); + static void ServiceMsgProcess(Request *request); + static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen); + + static UiService g_uiService = { + .GetName = GetServiceName, + .Initialize = ServiceInitialize, + .MessageHandle = ServiceMessageHandle, + .GetTaskConfig = GetServiceTaskConfig, + DEFAULT_IUNKNOWN_ENTRY_BEGIN, + .SendMsg = SendMsg, + DEFAULT_IUNKNOWN_ENTRY_END, + .identity = {-1, -1, nullptr}, + }; + + const int DATA_DIST_STACK_SIZE = 0xC00; + const int DATA_DIST_MAIL_LENGTH = 10; + const int BYTE_OFFSET = 8; + static uint32_t g_interval = 5; + + /* -------------------------------------------------------------------------- */ + // 消息处理程序的函数指针类型 + typedef void (*MsgHandlerFunc)(Request *); + // 定义一个结构来保存消息处理程序 + typedef struct + { + int msgId; + MsgHandlerFunc handler; + } MsgHandlerEntry; + + // 消息处理程序的函数原型 + static void HandleJSInstallSuccess(Request *request); + static void HandleJSUninstallSuccess(Request *request); + static void HandlePhoneConnected(Request *request); + static void HandlePhoneDisconnected(Request *request); + static void HandleEarphoneConnected(Request *request); + static void HandleEarphoneDisconnected(Request *request); + static void HandleBluetoothConnected(Request *request); + static void HandleBluetoothDisconnected(Request *request); + static void HandleAddSleepVeto(Request *request); + static void HandleRemoveSleepVeto(Request *request); + static void HandleUpdateScreenDuration(Request *request); + static void HandleUpdateRaiseToBrightness(Request *request); + static void HandleUpdateBrightnessValue(Request *request); + static void HandleUpdateWeatherData(Request *request); + static void HandleUpdateSystemVolume(Request *request); + static void HandleUpdateCallVolume(Request *request); + static void HandleUpdateVibrationMode(Request *request); + static void HandleUpdateSilentMode(Request *request); + static void HandleUpdateDontDisturbMode(Request *request); + static void HandleUpdateMusicPlayerList(Request *request); + static void HandleAiJumpToResultView(Request *request); + static void HandleAiJumpToListeningMessage(Request *request); + static void HandleUpdateUserQuestionStr(Request *request); + static void HandleUpdateAIAnswerStr(Request *request); + static void HandleWatchFirstPaired(Request *request); + static void HandleUpdateOBUMessage(Request *request); + static void HandleUpdateSleep(Request *request); + static void HandleUpdateMessage(Request *request); + static void HandleUpdateHeartRate(Request *request); + + // 消息处理程序项数组(每个消息类型对应一个处理函数,函数名以 Handle 开头) + MsgHandlerEntry msgHandlers[] = { + {JS_INSTALL_SUCESS_TO_UI, HandleJSInstallSuccess}, + {JS_UNINSTALL_SUCESS_TO_UI, HandleJSUninstallSuccess}, + {PHONE_CONNECTED_TO_UI, HandlePhoneConnected}, + {PHONE_DISCONNECTED_TO_UI, HandlePhoneDisconnected}, + {EARPHONE_CONNECTED_TO_UI, HandleEarphoneConnected}, + {EARPHONE_DISCONNECTED_TO_UI, HandleEarphoneDisconnected}, + {BT_CONNECTED_TO_UI, HandleBluetoothConnected}, + {BT_DISCONNECTED_TO_UI, HandleBluetoothDisconnected}, + {UI_ADD_SLEEP_VETO, HandleAddSleepVeto}, + {UI_RM_SLEEP_VETO, HandleRemoveSleepVeto}, + {UI_UPDATE_SCREEN_DURATION, HandleUpdateScreenDuration}, + {UI_UPDATE_RAISETOBRIGHTNESS, HandleUpdateRaiseToBrightness}, + {UI_UPDATE_BRIGHTNESS_VALUE, HandleUpdateBrightnessValue}, + {UI_UPDATE_WEATHER_DATA, HandleUpdateWeatherData}, + {UI_UPDATE_SYSTEM_VOLUME, HandleUpdateSystemVolume}, + {UI_UPDATE_CALL_VOLUME, HandleUpdateCallVolume}, + {UI_UPDATE_VIBRATION_MODE, HandleUpdateVibrationMode}, + {UI_UPDATE_SILENT_MODE, HandleUpdateSilentMode}, + {UI_UPDATE_DNOTDISTURB_MODE, HandleUpdateDontDisturbMode}, + {UI_UPDATE_MUSIC_PLAYER_LIST, HandleUpdateMusicPlayerList}, + {UI_AI_JUMP_TO_RESULT_VIEW, HandleAiJumpToResultView}, + {UI_UPDATE_USER_QUESTION_STR, HandleUpdateUserQuestionStr}, + {UI_UPDATE_AI_ANSWER_STR, HandleUpdateAIAnswerStr}, + {UI_HAND_WATCH_FIRST_PAIRED, HandleWatchFirstPaired}, + {UI_UPDATE_OBU_MESSAGE, HandleUpdateOBUMessage}, + {UI_AI_JUMP_TO_LISTENING_VIEW, HandleAiJumpToListeningMessage}, + + {UI_UPDATE_SLEEP_DATA, HandleUpdateSleep}, + {UI_UPDATE_MESSAGE_DATA, HandleUpdateMessage}, + {UI_UPDATE_HEARTRATE_DATA, HandleUpdateHeartRate}, -/* -------------------------------------------------------------------------- */ -// 消息处理程序的函数指针类型 -typedef void (*MsgHandlerFunc)(Request *); -// 定义一个结构来保存消息处理程序 -typedef struct -{ - int msgId; - MsgHandlerFunc handler; -} MsgHandlerEntry; - -// 消息处理程序的函数原型 -static void HandleJSInstallSuccess(Request *request); -static void HandleJSUninstallSuccess(Request *request); -static void HandlePhoneConnected(Request *request); -static void HandlePhoneDisconnected(Request *request); -static void HandleEarphoneConnected(Request *request); -static void HandleEarphoneDisconnected(Request *request); -static void HandleBluetoothConnected(Request *request); -static void HandleBluetoothDisconnected(Request *request); -static void HandleAddSleepVeto(Request *request); -static void HandleRemoveSleepVeto(Request *request); -static void HandleUpdateScreenDuration(Request *request); -static void HandleUpdateRaiseToBrightness(Request *request); -static void HandleUpdateBrightnessValue(Request *request); -static void HandleUpdateWeatherData(Request *request); -static void HandleUpdateSystemVolume(Request *request); -static void HandleUpdateCallVolume(Request *request); -static void HandleUpdateVibrationMode(Request *request); -static void HandleUpdateSilentMode(Request *request); -static void HandleUpdateDontDisturbMode(Request *request); -static void HandleUpdateMusicPlayerList(Request *request); -static void HandleAiJumpToResultView(Request *request); -static void HandleAiJumpToListeningMessage(Request *request); -static void HandleUpdateUserQuestionStr(Request *request); -static void HandleUpdateAIAnswerStr(Request *request); -static void HandleWatchFirstPaired(Request *request); -static void HandleUpdateOBUMessage(Request *request); -static void HandleUpdateSleep(Request *request); -static void HandleUpdateMessage(Request *request); - - -// 消息处理程序项数组(每个消息类型对应一个处理函数,函数名以 Handle 开头) -MsgHandlerEntry msgHandlers[] = { - {JS_INSTALL_SUCESS_TO_UI, HandleJSInstallSuccess}, - {JS_UNINSTALL_SUCESS_TO_UI, HandleJSUninstallSuccess}, - {PHONE_CONNECTED_TO_UI, HandlePhoneConnected}, - {PHONE_DISCONNECTED_TO_UI, HandlePhoneDisconnected}, - {EARPHONE_CONNECTED_TO_UI, HandleEarphoneConnected}, - {EARPHONE_DISCONNECTED_TO_UI, HandleEarphoneDisconnected}, - {BT_CONNECTED_TO_UI, HandleBluetoothConnected}, - {BT_DISCONNECTED_TO_UI, HandleBluetoothDisconnected}, - {UI_ADD_SLEEP_VETO, HandleAddSleepVeto}, - {UI_RM_SLEEP_VETO, HandleRemoveSleepVeto}, - {UI_UPDATE_SCREEN_DURATION, HandleUpdateScreenDuration}, - {UI_UPDATE_RAISETOBRIGHTNESS, HandleUpdateRaiseToBrightness}, - {UI_UPDATE_BRIGHTNESS_VALUE, HandleUpdateBrightnessValue}, - {UI_UPDATE_WEATHER_DATA, HandleUpdateWeatherData}, - {UI_UPDATE_SYSTEM_VOLUME, HandleUpdateSystemVolume}, - {UI_UPDATE_CALL_VOLUME, HandleUpdateCallVolume}, - {UI_UPDATE_VIBRATION_MODE, HandleUpdateVibrationMode}, - {UI_UPDATE_SILENT_MODE, HandleUpdateSilentMode}, - {UI_UPDATE_DNOTDISTURB_MODE,HandleUpdateDontDisturbMode}, - {UI_UPDATE_MUSIC_PLAYER_LIST,HandleUpdateMusicPlayerList}, - {UI_AI_JUMP_TO_RESULT_VIEW, HandleAiJumpToResultView}, - {UI_UPDATE_USER_QUESTION_STR,HandleUpdateUserQuestionStr}, - {UI_UPDATE_AI_ANSWER_STR, HandleUpdateAIAnswerStr}, - {UI_HAND_WATCH_FIRST_PAIRED,HandleWatchFirstPaired}, - {UI_UPDATE_OBU_MESSAGE,HandleUpdateOBUMessage}, - {UI_AI_JUMP_TO_LISTENING_VIEW,HandleAiJumpToListeningMessage}, - - {UI_UPDATE_SLEEP_DATA, HandleUpdateSleep}, - {UI_UPDATE_MESSAGE_DATA, HandleUpdateMessage}, }; -/* -------------------------------------------------------------------------- */ -void ScreenTurnOn(int32_t timeout) -{ - if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1) { - return; - } + /* -------------------------------------------------------------------------- */ + void ScreenTurnOn(int32_t timeout) + { + if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1) + { + return; + } #if defined(SUPPORT_POWER_MANAGER) - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] timeout = %d", timeout); - g_interval = get_back_to_home_interval(); - set_back_to_home_interval(0xFFFFFFFF); - const power_display_svr_api_t *display_api = power_display_svr_get_api(); - if (display_api->get_screen_state() != SCREEN_ON) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] turn_on_screen"); - display_api->turn_on_screen(); - } - display_api->set_screen_set_keepon_timeout(timeout); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] timeout = %d", timeout); + g_interval = get_back_to_home_interval(); + set_back_to_home_interval(0xFFFFFFFF); + const power_display_svr_api_t *display_api = power_display_svr_get_api(); + if (display_api->get_screen_state() != SCREEN_ON) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] turn_on_screen"); + display_api->turn_on_screen(); + } + display_api->set_screen_set_keepon_timeout(timeout); #endif - return; -} - -void ScreenTurnOff(void) -{ - if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1) { return; } + + void ScreenTurnOff(void) + { + if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1) + { + return; + } #if defined(SUPPORT_POWER_MANAGER) - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurnOff] timeout auto"); - set_back_to_home_interval(g_interval); - const power_display_svr_api_t *display_api = power_display_svr_get_api(); - display_api->set_screen_set_keepon_timeout(0); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurnOff] timeout auto"); + set_back_to_home_interval(g_interval); + const power_display_svr_api_t *display_api = power_display_svr_get_api(); + display_api->set_screen_set_keepon_timeout(0); #endif - return; -} + return; + } -void ScreenOffEnable(int32_t enable) -{ + void ScreenOffEnable(int32_t enable) + { #if defined(SUPPORT_POWER_MANAGER) - const power_display_svr_api_t *display_api = power_display_svr_get_api(); - display_api->set_auto_timeout_function(enable); + const power_display_svr_api_t *display_api = power_display_svr_get_api(); + display_api->set_auto_timeout_function(enable); #endif -} - -static void Init() -{ - SamgrLite *sm = SAMGR_GetInstance(); - BOOL result = sm->RegisterService((Service *)&g_uiService); - sm->RegisterDefaultFeatureApi(UI_SERVICE, GET_IUNKNOWN(g_uiService)); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService starts %s", result ? "successfully" : "unsuccessfully"); -} + } -SYSEX_SERVICE_INIT_PRI(Init, 2); + static void Init() + { + SamgrLite *sm = SAMGR_GetInstance(); + BOOL result = sm->RegisterService((Service *)&g_uiService); + sm->RegisterDefaultFeatureApi(UI_SERVICE, GET_IUNKNOWN(g_uiService)); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService starts %s", result ? "successfully" : "unsuccessfully"); + } -const char *GetServiceName(Service *service) -{ - (void)service; - return UI_SERVICE; -} + SYSEX_SERVICE_INIT_PRI(Init, 2); -BOOL ServiceInitialize(Service *service, Identity identity) -{ - if (service == nullptr) { - return FALSE; + const char *GetServiceName(Service *service) + { + (void)service; + return UI_SERVICE; } - UiService *uiService = reinterpret_cast(service); - uiService->identity = identity; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService init serviceId = %d, featureId = %d, queueId = %d", - identity.serviceId, identity.featureId, identity.queueId); - return TRUE; -} + BOOL ServiceInitialize(Service *service, Identity identity) + { + if (service == nullptr) + { + return FALSE; + } + UiService *uiService = reinterpret_cast(service); + uiService->identity = identity; -void ServiceMsgProcess(Request *request) -{ - #if 0 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService init serviceId = %d, featureId = %d, queueId = %d", + identity.serviceId, identity.featureId, identity.queueId); + return TRUE; + } + + void ServiceMsgProcess(Request *request) + { +#if 0 WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "UiServiceMsgId = %d",request->msgId); switch (request->msgId) { case JS_INSTALL_SUCESS_TO_UI: @@ -275,331 +283,345 @@ void ServiceMsgProcess(Request *request) std::bind(&OHOS::DisplayBrightnessModel::UpdateBrightnessValueOfSlider, OHOS::DisplayBrightnessModel::GetInstance())); break; } - #endif - /* -------------------------------------------------------------------------- */ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "UiServiceMsgId = %d",request->msgId); - for (int i = 0; i < MAX_NUM_HANDLER; ++i) +#endif + /* -------------------------------------------------------------------------- */ + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "UiServiceMsgId = %d", request->msgId); + for (int i = 0; i < MAX_NUM_HANDLER; ++i) + { + if (msgHandlers[i].msgId == request->msgId) + { + msgHandlers[i].handler(request); + break; + } + } + /* -------------------------------------------------------------------------- */ + } + + BOOL ServiceMessageHandle(Service *service, Request *request) { - if (msgHandlers[i].msgId == request->msgId) + (void)service; + if (request == nullptr) { - msgHandlers[i].handler(request); - break; + return FALSE; } + + ServiceMsgProcess(request); + return TRUE; } - /* -------------------------------------------------------------------------- */ -} -BOOL ServiceMessageHandle(Service *service, Request *request) -{ - (void)service; - if (request == nullptr) { - return FALSE; + TaskConfig GetServiceTaskConfig(Service *service) + { + (void)service; + TaskConfig config = {LEVEL_HIGH, PRI_NORMAL, DATA_DIST_STACK_SIZE, DATA_DIST_MAIL_LENGTH, SINGLE_TASK}; + return config; } - ServiceMsgProcess(request); - return TRUE; -} + // 发送msg + static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen) + { + int32_t ret; + void *sendData = nullptr; + if (dataLen > 0) + { + sendData = malloc(dataLen); + if (sendData == nullptr) + { + return FALSE; + } + ret = memcpy_s(sendData, dataLen, data, dataLen); + if (ret != EOK) + { + free(sendData); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uiservice sendMsg memcpy_s fail! ret = %d", ret); + return FALSE; + } + } -TaskConfig GetServiceTaskConfig(Service *service) -{ - (void)service; - TaskConfig config = {LEVEL_HIGH, PRI_NORMAL, DATA_DIST_STACK_SIZE, DATA_DIST_MAIL_LENGTH, SINGLE_TASK}; - return config; -} + Request request = { + .msgId = msgId, + .len = dataLen, + .msgValue = msgValue, + .data = sendData, + }; -//发送msg -static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen) -{ - int32_t ret; - void *sendData = nullptr; - if (dataLen > 0) { - sendData = malloc(dataLen); - if (sendData == nullptr) { - return FALSE; - } - ret = memcpy_s(sendData, dataLen, data, dataLen); - if (ret != EOK) { - free(sendData); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uiservice sendMsg memcpy_s fail! ret = %d", ret); + ret = SAMGR_SendRequest(IUNKNOWN_GetIdentity(GET_IUNKNOWN(g_uiService)), &request, nullptr); + if (ret != 0) + { + if (sendData != nullptr) + { + free(sendData); + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "SendMsg failed ret = %d ", ret); return FALSE; } - } - Request request = { - .msgId = msgId, - .len = dataLen, - .msgValue = msgValue, - .data = sendData, - }; + return TRUE; + } - ret = SAMGR_SendRequest(IUNKNOWN_GetIdentity(GET_IUNKNOWN(g_uiService)), &request, nullptr); - if (ret != 0) { - if (sendData != nullptr) { - free(sendData); + // 发送msg给ui服务 + void SendMsgToUIService(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen) + { + UiServiceFeatureApi *comApi = nullptr; + IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(UI_SERVICE); + if (iUnknown == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "GetDefaultFeatureApi failed"); + return; } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "SendMsg failed ret = %d ", ret); - return FALSE; + int result = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **)&comApi); + if (result != 0 || comApi == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "QueryInterface comApi failed"); + return; + } + comApi->SendMsg(msgId, msgValue, data, dataLen); + comApi->Release((IUnknown *)comApi); } - return TRUE; -} - -//发送msg给ui服务 -void SendMsgToUIService(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen) -{ - UiServiceFeatureApi *comApi = nullptr; - IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(UI_SERVICE); - if (iUnknown == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "GetDefaultFeatureApi failed"); - return; - } - int result = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **)&comApi); - if (result != 0 || comApi == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "QueryInterface comApi failed"); - return; + /* -------------------------------------------------------------------------- */ + void HandleJSInstallSuccess(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s", + request->msgId, ((BundleData *)request->data)->bundleName); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance())); } - comApi->SendMsg(msgId, msgValue, data, dataLen); - comApi->Release((IUnknown *)comApi); -} - -/* -------------------------------------------------------------------------- */ -void HandleJSInstallSuccess(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s", - request->msgId, ((BundleData *)request->data)->bundleName); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance())); -} -void HandleJSUninstallSuccess(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s", - request->msgId, ((BundleData *)request->data)->bundleName); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance())); -} + void HandleJSUninstallSuccess(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s", + request->msgId, ((BundleData *)request->data)->bundleName); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance())); + } -//处理手机连接成功 -void HandlePhoneConnected(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneConnectStatus"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true)); -} + // 处理手机连接成功 + void HandlePhoneConnected(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneConnectStatus"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true)); + } -//处理手机断开连接 -void HandlePhoneDisconnected(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneDisconnected"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false)); -} + // 处理手机断开连接 + void HandlePhoneDisconnected(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneDisconnected"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false)); + } -//处理耳机连接成功 -void HandleEarphoneConnected(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true)); -} + // 处理耳机连接成功 + void HandleEarphoneConnected(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true)); + } -//处理耳机断开连接 -void HandleEarphoneDisconnected(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false)); -} + // 处理耳机断开连接 + void HandleEarphoneDisconnected(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false)); + } -//处理蓝牙连接成功 -void HandleBluetoothConnected(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothConnected"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), true)); -} + // 处理蓝牙连接成功 + void HandleBluetoothConnected(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothConnected"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), true)); + } -//处理蓝牙断开连接 -void HandleBluetoothDisconnected(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothDisconnected"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), false)); -} + // 处理蓝牙断开连接 + void HandleBluetoothDisconnected(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothDisconnected"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), false)); + } -// void HandleScreenTurnOn(Request *request) -// { -// WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOn"); -// ScreenTurnOn(request); -// } - -// void HandleScreenTurnOff(Request *request) -// { -// WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOff"); -// ScreenTurnOff(request); -// } - -// void HandleScreenOffEnable(Request *request) -// { -// WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenOffEnable"); -// ScreenOffEnable(request); -// } - -void HandleAddSleepVeto(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAddSleepVeto"); - uapi_pm_add_sleep_veto(PM_ID_SCREEN); -} + // void HandleScreenTurnOn(Request *request) + // { + // WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOn"); + // ScreenTurnOn(request); + // } + + // void HandleScreenTurnOff(Request *request) + // { + // WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOff"); + // ScreenTurnOff(request); + // } + + // void HandleScreenOffEnable(Request *request) + // { + // WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenOffEnable"); + // ScreenOffEnable(request); + // } + + void HandleAddSleepVeto(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAddSleepVeto"); + uapi_pm_add_sleep_veto(PM_ID_SCREEN); + } -void HandleRemoveSleepVeto(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleRemoveSleepVeto"); - uapi_pm_remove_sleep_veto(PM_ID_SCREEN); -} + void HandleRemoveSleepVeto(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleRemoveSleepVeto"); + uapi_pm_remove_sleep_veto(PM_ID_SCREEN); + } -//处理更新选择的亮屏时长标签内容 -void HandleUpdateScreenDuration(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateScreenDuration"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::DisplayBrightnessModel::UpdateSelectScreenDurationLabel, OHOS::DisplayBrightnessModel::GetInstance())); -} + // 处理更新选择的亮屏时长标签内容 + void HandleUpdateScreenDuration(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateScreenDuration"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::DisplayBrightnessModel::UpdateSelectScreenDurationLabel, OHOS::DisplayBrightnessModel::GetInstance())); + } -//处理更新抬腕亮屏按钮状态 -void HandleUpdateRaiseToBrightness(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateRaiseToBrightness"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::DisplayBrightnessModel::UpdateRaiseToBrightnessCheckBoxButtonStatus, OHOS::DisplayBrightnessModel::GetInstance())); -} + // 处理更新抬腕亮屏按钮状态 + void HandleUpdateRaiseToBrightness(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateRaiseToBrightness"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::DisplayBrightnessModel::UpdateRaiseToBrightnessCheckBoxButtonStatus, OHOS::DisplayBrightnessModel::GetInstance())); + } -//处理更新亮度条的亮度值值 -void HandleUpdateBrightnessValue(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateBrightnessValue"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::DisplayBrightnessModel::UpdateBrightnessValueOfSlider, OHOS::DisplayBrightnessModel::GetInstance())); -} + // 处理更新亮度条的亮度值值 + void HandleUpdateBrightnessValue(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateBrightnessValue"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::DisplayBrightnessModel::UpdateBrightnessValueOfSlider, OHOS::DisplayBrightnessModel::GetInstance())); + } -//处理更新天气数据 -static void HandleUpdateWeatherData(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateWeatherData"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::WeatherModel::UpdateMainWeatherData, &OHOS::WeatherModel::GetInstance())); -} + // 处理更新天气数据 + static void HandleUpdateWeatherData(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateWeatherData"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::WeatherModel::UpdateMainWeatherData, &OHOS::WeatherModel::GetInstance())); + } -//处理更新系统音量 -void HandleUpdateSystemVolume(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSystemVolume"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SoundAndVibrationModel::UpdateSystemVolume, OHOS::SoundAndVibrationModel::GetInstance())); -} + // 处理更新系统音量 + void HandleUpdateSystemVolume(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSystemVolume"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SoundAndVibrationModel::UpdateSystemVolume, OHOS::SoundAndVibrationModel::GetInstance())); + } -//处理更新通话音量 -void HandleUpdateCallVolume(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateCallVolume"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SoundAndVibrationModel::UpdateCallVolume, OHOS::SoundAndVibrationModel::GetInstance())); -} + // 处理更新通话音量 + void HandleUpdateCallVolume(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateCallVolume"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SoundAndVibrationModel::UpdateCallVolume, OHOS::SoundAndVibrationModel::GetInstance())); + } -//处理更新震动模式 -void HandleUpdateVibrationMode(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateVibrationMode"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SoundAndVibrationModel::UpdateVibrationModePickerSelectIndex, OHOS::SoundAndVibrationModel::GetInstance())); -} + // 处理更新震动模式 + void HandleUpdateVibrationMode(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateVibrationMode"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SoundAndVibrationModel::UpdateVibrationModePickerSelectIndex, OHOS::SoundAndVibrationModel::GetInstance())); + } -//处理更新静音模式 -void HandleUpdateSilentMode(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSilentMode"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SoundAndVibrationModel::UpdateSilentModeSwitch, OHOS::SoundAndVibrationModel::GetInstance())); -} + // 处理更新静音模式 + void HandleUpdateSilentMode(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSilentMode"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SoundAndVibrationModel::UpdateSilentModeSwitch, OHOS::SoundAndVibrationModel::GetInstance())); + } -//处理更新勿扰模式 -void HandleUpdateDontDisturbMode(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateDontDisturbMode"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::DnotDisturbModel::UpdateDoNotDisturbMode, &OHOS::DnotDisturbModel::GetInstance())); -} + // 处理更新勿扰模式 + void HandleUpdateDontDisturbMode(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateDontDisturbMode"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::DnotDisturbModel::UpdateDoNotDisturbMode, &OHOS::DnotDisturbModel::GetInstance())); + } -//处理更新音乐列表 -void HandleUpdateMusicPlayerList(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMusicPlayerList"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::PlayersModel::UpdateMusicPlayerList, OHOS::PlayersModel::GetInstance())); -} + // 处理更新音乐列表 + void HandleUpdateMusicPlayerList(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMusicPlayerList"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::PlayersModel::UpdateMusicPlayerList, OHOS::PlayersModel::GetInstance())); + } -//处理Ai回应的用户数据 -void HandleAiJumpToResultView(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToResultView"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::AiVoiceModel::ChangeToReturnResultTextView, &OHOS::AiVoiceModel::GetInstance())); -} + // 处理Ai回应的用户数据 + void HandleAiJumpToResultView(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToResultView"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::AiVoiceModel::ChangeToReturnResultTextView, &OHOS::AiVoiceModel::GetInstance())); + } -//处理更新用户问题字符串 -void HandleUpdateUserQuestionStr(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateUserQuestionStr"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::AiVoiceModel::UpdateUserQuestionStr, &OHOS::AiVoiceModel::GetInstance())); -} + // 处理更新用户问题字符串 + void HandleUpdateUserQuestionStr(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateUserQuestionStr"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::AiVoiceModel::UpdateUserQuestionStr, &OHOS::AiVoiceModel::GetInstance())); + } -//处理更新AI答案字符串 -void HandleUpdateAIAnswerStr(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateAIAnswerStr"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::AiVoiceModel::UpdateAiAnswerStr, &OHOS::AiVoiceModel::GetInstance())); -} + // 处理更新AI答案字符串 + void HandleUpdateAIAnswerStr(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateAIAnswerStr"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::AiVoiceModel::UpdateAiAnswerStr, &OHOS::AiVoiceModel::GetInstance())); + } -//处理手表第一次启动用来跳转主界面的 -void HandleWatchFirstPaired(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleWatchFirstPaired"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::RebootAndShutdownModel::HandFirstTimeStartJumpToMainView, &OHOS::RebootAndShutdownModel::GetInstance())); -} + // 处理手表第一次启动用来跳转主界面的 + void HandleWatchFirstPaired(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleWatchFirstPaired"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::RebootAndShutdownModel::HandFirstTimeStartJumpToMainView, &OHOS::RebootAndShutdownModel::GetInstance())); + } -//处理更新OBU Message -void HandleUpdateOBUMessage(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateOBUMessage"); - // GraphicService::GetInstance()->PostGraphicEvent( - // std::bind(&OHOS::OBUMessageModel::UpdateOBUMessageViewData, &OHOS::OBUMessageModel::GetInstance())); -} + // 处理更新OBU Message + void HandleUpdateOBUMessage(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateOBUMessage"); + // GraphicService::GetInstance()->PostGraphicEvent( + // std::bind(&OHOS::OBUMessageModel::UpdateOBUMessageViewData, &OHOS::OBUMessageModel::GetInstance())); + } -//处理更新查询AI模型是否连接成功的状态 -void HandleAiJumpToListeningMessage(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToListeningMessage"); - bool state = *((bool*)request->data); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::AiVoiceModel::ChangeToAIVoiceListeningView, &OHOS::AiVoiceModel::GetInstance(),state)); -} + // 处理更新查询AI模型是否连接成功的状态 + void HandleAiJumpToListeningMessage(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToListeningMessage"); + bool state = *((bool *)request->data); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::AiVoiceModel::ChangeToAIVoiceListeningView, &OHOS::AiVoiceModel::GetInstance(), state)); + } -//更新睡眠数据 -void HandleUpdateSleep(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSleep"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance())); -} -//更新消息数据 -void HandleUpdateMessage(Request *request) -{ - WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMessage"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::MessageModel::UpdateMessageView, &OHOS::MessageModel::GetInstance())); -} + // 更新睡眠数据 + void HandleUpdateSleep(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSleep"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance())); + } + // 更新消息数据 + void HandleUpdateMessage(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMessage"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::MessageModel::UpdateMessageView, &OHOS::MessageModel::GetInstance())); + } + void HandleUpdateHeartRate(Request *request) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMessage"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance())); + } /* -------------------------------------------------------------------------- */ #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/nativeapp/nativeui/heartrate/src/HeartRateView.cpp b/code/sdk/application/wearable/nativeapp/nativeui/heartrate/src/HeartRateView.cpp index 8c9643544..0d1144ee1 100755 --- a/code/sdk/application/wearable/nativeapp/nativeui/heartrate/src/HeartRateView.cpp +++ b/code/sdk/application/wearable/nativeapp/nativeui/heartrate/src/HeartRateView.cpp @@ -1,9 +1,10 @@ /* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. * Description: heartRate view * Author: * Create: 2021-07-26 - */ + */ #include #include "HeartRateView.h" @@ -12,19 +13,20 @@ #include "ScreenModels.h" #include "ui_resource_image.h" #include "common/image_cache_manager.h" - -namespace OHOS { -static HeartRateView *g_pHeartRateView = nullptr; +#define HEART_DATA_TEST 1 +namespace OHOS +{ + static HeartRateView *g_pHeartRateView = nullptr; // 背景坐标图形 -#define ACT_IMAGE_X 0 // 图片坐标起点 -#define ACT_IMAGE_Y 115 // 图片坐标起点 -#define ACT_IMAGE_COOR_X 45 // 200刻度线到最左端的像素点 +#define ACT_IMAGE_X 38 // 图片坐标起点 +#define ACT_IMAGE_Y 130 // 图片坐标起点 +#define ACT_IMAGE_COOR_X 80 // 200刻度线到最左端的像素点 #define ACT_IMAGE_COOR_Y 145 // 200刻度线到顶端的像素点 #define ACT_IMAGE_COOR_PIXELS 160 // 实际背景坐标0到200心率值的实际像素点 #define ACT_IMAGE_COOR_VALUE HEART_RATE_LIMIT_UPPER // 图片刻度表示的心率范围 -#define ACT_IMAGE_COOR_WIDTH 454 -#define ACT_IMAGE_COOR_HEIGHT 220 +#define ACT_IMAGE_COOR_WIDTH 390 +#define ACT_IMAGE_COOR_HEIGHT 200 // 心电图坐标适配 #define COORDINATE_VALUE 5 // 余量 @@ -38,8 +40,8 @@ static HeartRateView *g_pHeartRateView = nullptr; // 心形心跳 #define HEARTBEAT_IMAGE_WIDTH 92 #define HEARTBEAT_IMAGE_HEIGHT 92 -#define HEARTBEAT_IMAGE_X 130 -#define HEARTBEAT_IMAGE_Y 25 +#define HEARTBEAT_IMAGE_X 105 +#define HEARTBEAT_IMAGE_Y 50 #define HEARTBEAT_IMAGE_NUM 19 #define HEARTBEAT_DELAY 50 @@ -89,10 +91,10 @@ static HeartRateView *g_pHeartRateView = nullptr; #define REST_HEART_TEXT_HEIGHT2 (REST_HEART_TEXT_FONT_SIZE + 5) // 每秒心率 -#define PERSEC_HEART_RATE_FONT_SIZE 45 -#define PERSEC_HEART_RATE_X 225 -#define PERSEC_HEART_RATE_Y 55 -#define PERSEC_HEART_RATE_WIDTH 90 +#define PERSEC_HEART_RATE_FONT_SIZE 60 +#define PERSEC_HEART_RATE_X 202 +#define PERSEC_HEART_RATE_Y 62 +#define PERSEC_HEART_RATE_WIDTH 102 #define PERSEC_HEART_RATE_HEIGHT (PERSEC_HEART_RATE_FONT_SIZE + 5) #define PERSEC_HEART_TEXT_FONT_SIZE 30 @@ -101,686 +103,898 @@ static HeartRateView *g_pHeartRateView = nullptr; #define PERSEC_HEART_TEXT_WIDTH 75 #define PERSEC_HEART_TEXT_HEIGHT (PERSEC_HEART_TEXT_FONT_SIZE + 5) -// 心跳image -static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = { - {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - - {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, -}; - -HeartRateView::HeartRateView() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView"); - dataNume = 0; - currIndex = 0; - serialIndex = 0; - maxRate = 0; - minRate = HEART_RATE_LIMIT_UPPER; - InitHeartRateData(); - SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); - - g_pHeartRateView = this; -} - -HeartRateView::~HeartRateView() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView"); - if (viewiInitStatus) { - int32_t i; - RemoveAll(); - delete imageViewCoordinate; - imageViewCoordinate = nullptr; - - chart->ClearDataSerial(); - for (i = 0; i < HEART_AVE_NUM; i++) { - delete dataSerial[i]; - dataSerial[i] = nullptr; - } - delete chart; - chart = nullptr; - delete imageViewTop; - imageViewTop = nullptr; - delete imageViewBottom; - imageViewBottom = nullptr; - delete dataTopAndbottom; - dataTopAndbottom = nullptr; - imageAnimator->Stop(); - delete imageAnimator; - imageAnimator = nullptr; - delete topRate; - topRate = nullptr; - delete bottomRate; - bottomRate = nullptr; - delete ratePerSec; - ratePerSec = nullptr; - delete ratePerSecText; - ratePerSecText = nullptr; - delete restRate; - restRate = nullptr; - delete restRateText1; - restRateText1 = nullptr; - delete restRateText2; - restRateText2 = nullptr; - } - g_pHeartRateView = nullptr; -} - -HeartRateView *HeartRateView::GetInstance(void) -{ - return g_pHeartRateView; -} - -int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值 -{ - heartRateData[0].x = INVALID_HEART_VALUE; - heartRateData[0].y = INVALID_HEART_VALUE; - - int32_t ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); - if (ret != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret); - } - return ret; -} - -int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize) -{ - if (rateData == nullptr) { - return OHOS_FAILURE; - } - - if (rateDataSize > sizeof(Point) * HEART_AVE_NUM) { - rateDataSize = sizeof(Point) * HEART_AVE_NUM; - } - InitHeartRateData(); - int32_t ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret); - return OHOS_FAILURE; - } - return OHOS_SUCCESS; -} - - -int32_t HeartRateView::HeartRateDataProc(void) -{ - Point datain[HEART_AVE_NUM]; - int32_t ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret); - return OHOS_FAILURE; - } - - ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值 - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret); - return OHOS_FAILURE; - } - - dataNume = 0; - for (int32_t i = 0; i < HEART_AVE_NUM; i++) { - if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 && - datain[i].y <= HEART_RATE_LIMIT_UPPER) { - rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE; - rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE; - dataNume++; - } - } - return OHOS_SUCCESS; -} - -void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo) -{ - label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize); - label->SetPosition(labelInfo.x, labelInfo.y); - label->Resize(labelInfo.width, labelInfo.height); - label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); - Add(label); -} - -void HeartRateView::HeartRateLabelDisplay(void) -{ - LabelInfo PerSecLabel = { PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y, - PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT }; - LabelInfo PerSecTextLabel = { PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y, - PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT }; - - LabelInfo topLabel = { HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT }; - LabelInfo bottomLabel = { HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH, - BOTTOM_TEXT_HEIGHT }; - - LabelInfo restRateLabel = { REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH, - REST_HEART_RATE_HEIGHT }; - LabelInfo restRateTextLabel1 = { REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1, - REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1 }; - LabelInfo restRateTextLabel2 = { REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2, - REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2 }; - - topRate = new UILabel(); - bottomRate = new UILabel(); - ratePerSec = new UILabel(); - ratePerSecText = new UILabel(); - restRate = new UILabel(); - restRateText1 = new UILabel(); - restRateText2 = new UILabel(); - - if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr || - restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail"); - } - - // 实时心率 - SetLabel(ratePerSec, PerSecLabel); - SetLabel(ratePerSecText, PerSecTextLabel); - ratePerSec->SetText("--"); - ratePerSecText->SetText("次/分"); - - // 最高最低心率 - SetLabel(topRate, topLabel); - SetLabel(bottomRate, bottomLabel); - topRate->SetText("--"); - bottomRate->SetText("--"); - - // 静息心率 - SetLabel(restRate, restRateLabel); - SetLabel(restRateText1, restRateTextLabel1); - SetLabel(restRateText2, restRateTextLabel2); - restRateText1->SetText("静息"); - restRate->SetText("--"); - restRateText2->SetText("次/分"); -} - -void HeartRateView::HeartRateCoordinate(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start"); - // 坐标图片 - imageViewCoordinate = new UIImageView(); - if (imageViewCoordinate == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail"); - return; - } - imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y); - imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH); - imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT); - Add(imageViewCoordinate); - - // 心电图坐标适配 - chart = new UIChartPolyline(); - if (chart == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail"); - return; - } - chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y); - chart->SetWidth(COORDINATE_WIDTH); - chart->SetHeight(COORDINATE_HEIGHT); - chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); - chart->SetStyle(STYLE_BACKGROUND_OPA, 0); - chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width - - UIXAxis &xAxis = chart->GetXAxis(); - UIYAxis &yAxis = chart->GetYAxis(); - xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数 - yAxis.SetDataRange(0, COORDINATE_HEIGHT); - xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); - yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); - chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA); - Add(chart); -} - -void HeartRateView::InsertTopAndBottomRateImage(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start"); - imageViewTop = new UIImageView(); - imageViewBottom = new UIImageView(); - if (imageViewTop == nullptr || imageViewBottom == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail"); - return; - } - imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y); - imageViewTop->SetWidth(TOP_IMAGE_WIDTH); - imageViewTop->SetHeight(TOP_IMAGE_HEIGHT); - Add(imageViewTop); - imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y); - imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH); - imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT); - Add(imageViewBottom); -} - -void HeartRateView::UpdataTopAndBottomRate(void) -{ - if (chart == nullptr) { - return; - } - if (dataTopAndbottom != nullptr) { - chart->DeleteDataSerial(dataTopAndbottom); - delete dataTopAndbottom; - dataTopAndbottom = nullptr; - } - dataTopAndbottom = new UIChartDataSerial(); - if (dataTopAndbottom == nullptr) { - return; - } - if (dataNume != 1) { - dataTopAndbottom->SetMaxDataCount(dataNume); // number of data points - dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points - } else { - Point tmp[NUM_2]; - tmp[0].x = tmp[1].x = rateDataTmp[0].x; - tmp[0].y = tmp[1].y = rateDataTmp[0].y; - dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points - dataTopAndbottom->AddPoints(tmp, NUM_2); // number of data points - } - dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明 - chart->AddDataSerial(dataTopAndbottom); - chart->Invalidate(); - - UIChartDataSerial::PointStyle pointStyle; - // 最低心跳 - dataTopAndbottom->EnableBottomPoint(true); - pointStyle.radius = BOTTOM_RADIUS; // Inner radius - pointStyle.fillColor = Color::Gray(); - pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width - pointStyle.strokeColor = Color::Black(); - dataTopAndbottom->SetBottomPointStyle(pointStyle); - chart->Invalidate(); - - uint16_t bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; - // 最高心跳 - dataTopAndbottom->EnableTopPoint(true); - pointStyle.fillColor = Color::Red(); - pointStyle.radius = TOP_RADIUS; // Inner radius - pointStyle.strokeColor = Color::Black(); - pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width - dataTopAndbottom->SetTopPointStyle(pointStyle); - chart->Invalidate(); - - uint16_t top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; - if (top <= HEART_RATE_LIMIT_UPPER) { - maxRate = (maxRate >= top) ? maxRate : top; - } - if (bottom != 0) { - minRate = (minRate <= bottom) ? minRate : bottom; - } -} - -void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index) -{ - Point tmp[NUM_2]; - - if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM) { - return; - } - - tmp[0].x = tmp[1].x = rateData[index].x; - tmp[0].y = tmp[1].y = rateData[index].y; - - dataSerial[serialIndex] = new UIChartDataSerial(); - if (dataSerial[serialIndex] == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex); - serialIndex++; - return; - } - - dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点 - dataSerial[serialIndex]->AddPoints(tmp, NUM_2); - dataSerial[serialIndex]->SetLineColor(Color::Red()); - dataSerial[serialIndex]->SetFillColor(Color::Red()); - dataSerial[serialIndex]->EnableGradient(true); - - chart->AddDataSerial(dataSerial[serialIndex]); - chart->Invalidate(); - serialIndex++; -} - -void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume) -{ - uint16_t i = 0; - uint16_t j = 0; - uint16_t tmp = 1; - if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM) { - return; - } - - while (i < rateDataNume) { - while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4)) { // 15分钟对应的秒数 - tmp++; - j++; - } - if (tmp == 1) { - ElectrocardiogramOnePoint(rateData, i); - } else { - if (serialIndex >= HEART_AVE_NUM) { - return; - } - if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0) { - dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points - chart->Invalidate(); - } else { - dataSerial[serialIndex] = new UIChartDataSerial(); - if (dataSerial[serialIndex] == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex); - serialIndex++; - return; - } - - dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points - dataSerial[serialIndex]->AddPoints(rateData + i, tmp); // number of data points - dataSerial[serialIndex]->SetLineColor(Color::Red()); - dataSerial[serialIndex]->SetFillColor(Color::Red()); - dataSerial[serialIndex]->EnableGradient(true); - - chart->AddDataSerial(dataSerial[serialIndex]); - chart->Invalidate(); - serialIndex++; - } - } - i += tmp; - j = i; - tmp = 1; - } -} - -void HeartRateView::HeartRateElectrocardiogram(void) -{ - if (dataNume == 0) { - return; - } - serialIndex = 0; - if (dataNume != 1) { - ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点 - } else { - ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点 - } - currIndex = dataNume; -} - -void HeartRateView::HeartbeatImageAnimator() -{ - imageAnimator = new UIImageAnimatorView(); - if (imageAnimator == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail"); - return; - } - imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT); - imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY); - imageAnimator->SetRepeat(true); - Add(imageAnimator); - imageAnimator->Start(); -} - -void HeartRateView::HeartbeatImageAnimatorStart(void) -{ - if (imageAnimator != nullptr) { - imageAnimator->Start(); - } -} - -void HeartRateView::HeartbeatImageAnimatorStop(void) -{ - if (imageAnimator != nullptr) { - imageAnimator->Stop(); - } -} - -bool HeartRateView::InitView(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitView"); - HeartRateDataProc(); - HeartRateLabelDisplay(); - HeartbeatImageAnimator(); - HeartRateCoordinate(); - InsertTopAndBottomRateImage(); - HeartRateElectrocardiogram(); - UpdataTopAndBottomRate(); - HeartbeatImageAnimatorStop(); - InitRefreshInterface(); - return true; -} - -void HeartRateView::PreLoad(void) -{ - if (!viewiInitStatus) { - if (InitView()) { - viewiInitStatus = true; - } - } - - if (!resLoadStatus) { - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP); - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM); - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR); - resLoadStatus = true; - } -} - -void HeartRateView::UnLoad(void) -{ - if (resLoadStatus) { - ImageInfo* img = nullptr; - imageViewTop->SetSrc(img); - imageViewBottom->SetSrc(img); - imageViewCoordinate->SetSrc(img); - ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES); - resLoadStatus = false; - } -} - -void HeartRateView::InitRefreshInterface(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface"); - - Point *rateData = HeartModel::GetInstance()->GetAveHeartRate(); - uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount(); - SetHeartRateData(rateData, sizeof(Point) * len); - uint16_t maxHeartRate = HeartModel::GetInstance()->GetHeartRateMax(); - uint16_t minHeartRate = HeartModel::GetInstance()->GetHeartRateMin(); - RefreshElectrocardiogram(); - if (maxHeartRate > 0 && maxHeartRate < HEART_RATE_LIMIT_UPPER) { - RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax()); - } - if (minHeartRate > 0 && minHeartRate < HEART_RATE_LIMIT_UPPER) { - RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin()); - } -} - -// 刷新心率曲线 -void HeartRateView::RefreshElectrocardiogram(void) -{ - int32_t ret = HeartRateDataProc(); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail"); - return; - } - Point *rate = rateDataTmp; - - if (chart == nullptr) { - return; - } - - if (currIndex >= HEART_AVE_NUM) { - currIndex = HEART_AVE_NUM; - } - if (dataNume > currIndex) { - uint16_t tmp = dataNume - currIndex; - if (currIndex > 0) { - rate += (currIndex - 1); - tmp += 1; - } - ElectrocardiogramMultiPoint(rate, tmp); - currIndex = dataNume; - } else if (dataNume == currIndex) { // 当前点平均心率刷新 - if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr) { - Point modPoint; - modPoint.x = rate[currIndex - 1].x; - modPoint.y = rate[currIndex - 1].y; - - uint16_t count = dataSerial[serialIndex - 1]->GetDataCount(); - dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint); - chart->Invalidate(); - } - } else { - return; - } - UpdataTopAndBottomRate(); // 最高、最低心率 -} - -// 清空心率曲线 -void HeartRateView::ClearElectrocardiogram(void) -{ - int32_t i; - dataNume = 0; - currIndex = 0; - maxRate = 0; - minRate = HEART_RATE_LIMIT_UPPER; - InitHeartRateData(); - - if (chart == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr"); - return; - } - - if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr) { - ratePerSec->SetText("--"); - topRate->SetText("--"); - bottomRate->SetText("--"); - restRate->SetText("--"); - } - - chart->DeleteDataSerial(dataTopAndbottom); - delete dataTopAndbottom; - dataTopAndbottom = nullptr; - for (i = 0; i < serialIndex; i++) { - delete dataSerial[i]; - dataSerial[i] = nullptr; - } - chart->ClearDataSerial(); - - serialIndex = 0; - chart->Invalidate(); -} - -// 刷新每秒上报的心率 -void HeartRateView::RefreshHeartRatePerSec(uint16_t value) -{ - char heartRate[NUM_4] = "--"; - int32_t ret = 0; - - if (ratePerSec == nullptr) { - return; - } - - if (value == 0) { - ratePerSec->SetText("--"); - HeartbeatImageAnimatorStop(); - return; - } - HeartbeatImageAnimatorStart(); - if (value > NUM_99) { - ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); - } else { - ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); - } - if (ret > EOK) { - ratePerSec->SetText(heartRate); - } -} - -// 刷新最大心率 -void HeartRateView::RefreshHeartRateMax(uint16_t max) -{ - char top[NUM_4] = "--"; - int32_t ret = 0; - maxRate = (maxRate >= max) ? maxRate : max; - if (topRate == nullptr) { - return; - } - if (maxRate <= HEART_RATE_LIMIT_LOWER) { - topRate->SetText("--"); - return; - } - ret = sprintf_s(top, sizeof(top), "%u", maxRate); - if (ret > EOK) { - topRate->SetText(top); - } -} - -// 刷新最小心率 -void HeartRateView::RefreshHeartRateMin(uint16_t min) -{ - char bottom[NUM_4] = "--"; - int32_t ret = 0; - - minRate = (minRate <= min) ? minRate : min; - if (bottomRate == nullptr) { - return; - } - if (minRate >= HEART_RATE_LIMIT_UPPER) { - bottomRate->SetText("--"); - return; - } - ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate); - if (ret > EOK) { - bottomRate->SetText(bottom); - } -} - -// 刷新静息心率 -void HeartRateView::RefreshRestHeartRate(uint16_t value) -{ - char heartRate[NUM_4] = "--"; - int32_t ret = 0; - - if (restRate == nullptr) { - return; - } - - if (value == 0 || value == (uint16_t)0xFFFF) { // 无效值 - restRate->SetText("--"); - } else { - if (value > NUM_99) { - ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); - } else { - ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); - } - - if (ret > EOK) { - restRate->SetText(heartRate); - } - } -} -} // namespace OHOS +​ // 心跳image +​ static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = { +​ {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + +​ {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, +​ }; + +​ HeartRateView::HeartRateView() +​ { +​ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView"); +​ dataNume = 0; +​ currIndex = 0; +​ serialIndex = 0; +​ maxRate = 0; +​ minRate = HEART_RATE_LIMIT_UPPER; +​ InitHeartRateData(); +​ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + +​ g_pHeartRateView = this; +​ } + +​ HeartRateView::~HeartRateView() +​ { +​ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView"); +​ if (viewiInitStatus == true) +​ { +​ int32_t i; +​ RemoveAll(); +​ UnLoadHeartRateImageRes(); +​ delete imageViewCoordinate; +​ imageViewCoordinate = nullptr; + +​ chart->ClearDataSerial(); +​ for (i = 0; i < HEART_AVE_NUM; i++) +​ { +​ delete dataSerial[i]; +​ dataSerial[i] = nullptr; +​ } +​ delete chart; +​ chart = nullptr; +​ delete imageViewTop; +​ imageViewTop = nullptr; +​ delete imageViewBottom; +​ imageViewBottom = nullptr; +​ delete dataTopAndbottom; +​ dataTopAndbottom = nullptr; +​ imageAnimator->Stop(); +​ delete imageAnimator; +​ imageAnimator = nullptr; +​ delete topRate; +​ topRate = nullptr; +​ delete bottomRate; +​ bottomRate = nullptr; +​ delete ratePerSec; +​ ratePerSec = nullptr; +​ delete ratePerSecText; +​ ratePerSecText = nullptr; +​ delete restRate; +​ restRate = nullptr; +​ delete restRateText1; +​ restRateText1 = nullptr; +​ delete restRateText2; +​ restRateText2 = nullptr; +​ } +​ g_pHeartRateView = nullptr; +​ } + +​ HeartRateView *HeartRateView::GetInstance(void) +​ { +​ return g_pHeartRateView; +​ } + +​ int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值 +​ { +​ int32_t ret; + +​ heartRateData[0].x = INVALID_HEART_VALUE; +​ heartRateData[0].y = INVALID_HEART_VALUE; + +​ ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); +​ if (ret != 0) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret); +​ } +​ return ret; +​ } + +​ int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize) +​ { +​ int ret; + +​ if (rateData == nullptr) +​ { +​ return OHOS_FAILURE; +​ } + +​ if (rateDataSize > sizeof(Point) * HEART_AVE_NUM) +​ { +​ rateDataSize = sizeof(Point) * HEART_AVE_NUM; +​ } +​ InitHeartRateData(); +​ ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize); +​ if (ret != EOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret); +​ return OHOS_FAILURE; +​ } + +​ return OHOS_SUCCESS; +​ } +​ int32_t HeartRateView::HeartRateDataProc(void) +​ { +​ int32_t i, ret; +​ Point datain[HEART_AVE_NUM]; +​ ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM); +​ if (ret != EOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret); +​ return OHOS_FAILURE; +​ } + +​ ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值 +​ if (ret != EOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret); +​ return OHOS_FAILURE; +​ } + +​ dataNume = 0; +​ for (i = 0; i < HEART_AVE_NUM; i += 15) // 每跨过15个点代表一个小时 +​ { +​ if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 && +​ datain[i].y <= HEART_RATE_LIMIT_UPPER) +​ { +​ rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE; +​ rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE; +​ dataNume++; +​ } +​ } +​ return OHOS_SUCCESS; +​ } +​ void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo) +​ { +​ label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize); +​ label->SetPosition(labelInfo.x, labelInfo.y); +​ label->Resize(labelInfo.width, labelInfo.height); +​ label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); +​ Add(label); +​ } + +​ void HeartRateView::HeartRateLabelDisplay(void) +​ { +​ LabelInfo PerSecLabel = {PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y, +​ PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT}; +​ LabelInfo PerSecTextLabel = {PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y, +​ PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT}; + +​ LabelInfo topLabel = {HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT}; +​ LabelInfo bottomLabel = {HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH, +​ BOTTOM_TEXT_HEIGHT}; + +​ LabelInfo restRateLabel = {REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH, +​ REST_HEART_RATE_HEIGHT}; +​ LabelInfo restRateTextLabel1 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1, +​ REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1}; +​ LabelInfo restRateTextLabel2 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2, +​ REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2}; + +​ topRate = new UILabel(); +​ bottomRate = new UILabel(); +​ ratePerSec = new UILabel(); +​ ratePerSecText = new UILabel(); +​ restRate = new UILabel(); +​ restRateText1 = new UILabel(); +​ restRateText2 = new UILabel(); + +​ if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr || +​ restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail"); +​ } + +​ // 实时心率 +​ SetLabel(ratePerSec, PerSecLabel); +​ SetLabel(ratePerSecText, PerSecTextLabel); +​ ratePerSec->SetText("--"); +​ ratePerSec->SetFont(GILROY_BOLD_FONT, PERSEC_HEART_RATE_FONT_SIZE); +​ ratePerSecText->SetText("次/分"); + +​ // 最高最低心率 +​ SetLabel(topRate, topLabel); +​ SetLabel(bottomRate, bottomLabel); +​ topRate->SetText("--"); +​ bottomRate->SetText("--"); + +​ // 静息心率 +​ SetLabel(restRate, restRateLabel); +​ SetLabel(restRateText1, restRateTextLabel1); +​ SetLabel(restRateText2, restRateTextLabel2); +​ restRateText1->SetText("静息"); +​ restRate->SetText("--"); +​ restRateText2->SetText("次/分"); +​ } + +​ void HeartRateView::HeartRateCoordinate(void) +​ { +​ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start"); +​ // 坐标图片 +​ imageViewCoordinate = new UIImageView(); +​ if (imageViewCoordinate == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail"); +​ return; +​ } +​ imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y); +​ imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH); +​ imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT); +​ Add(imageViewCoordinate); + +​ // 心电图坐标适配 +​ chart = new UIChartPolyline(); +​ if (chart == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail"); +​ return; +​ } +​ chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y); +​ chart->SetWidth(COORDINATE_WIDTH); +​ chart->SetHeight(COORDINATE_HEIGHT); +​ chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); +​ chart->SetStyle(STYLE_BACKGROUND_OPA, 0); +​ chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width + +​ UIXAxis &xAxis = chart->GetXAxis(); +​ UIYAxis &yAxis = chart->GetYAxis(); +​ xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数 +​ yAxis.SetDataRange(0, COORDINATE_HEIGHT); +​ xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); +​ yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); +​ chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA); + + +​ // Point pointArray[5] = {{0, 200}, {1, 70}, {2, 80}, {3, 70}, {4, 43}}; +​ // dataSerial->AddPoints(pointArray, 5); +​ // chart->AddDataSerial(dataSerial); + +​ Add(chart); +​ } + +​ void HeartRateView::InsertTopAndBottomRateImage(void) +​ { +​ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start"); +​ imageViewTop = new UIImageView(); +​ imageViewBottom = new UIImageView(); +​ if (imageViewTop == nullptr || imageViewBottom == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail"); +​ return; +​ } +​ imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y); +​ imageViewTop->SetWidth(TOP_IMAGE_WIDTH); +​ imageViewTop->SetHeight(TOP_IMAGE_HEIGHT); +​ Add(imageViewTop); +​ imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y); +​ imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH); +​ imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT); +​ Add(imageViewBottom); +​ } + +​ void HeartRateView::UpdataTopAndBottomRate(void) +​ { +​ uint16_t bottom, top; +​ if (chart == nullptr) +​ { +​ return; +​ } +​ if (dataTopAndbottom != nullptr) +​ { +​ chart->DeleteDataSerial(dataTopAndbottom); +​ delete dataTopAndbottom; +​ dataTopAndbottom = nullptr; +​ } +​ dataTopAndbottom = new UIChartDataSerial(); +​ if (dataTopAndbottom == nullptr) +​ { +​ return; +​ } +​ if (dataNume != 1) +​ { +​ dataTopAndbottom->SetMaxDataCount(dataNume); // number of data points +​ dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points +​ } +​ else +​ { +​ Point tmp[NUM_2]; +​ tmp[0].x = tmp[1].x = rateDataTmp[0].x; +​ tmp[0].y = tmp[1].y = rateDataTmp[0].y; +​ dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points +​ dataTopAndbottom->AddPoints(tmp, NUM_2); // number of data points +​ } +​ dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明 +​ chart->AddDataSerial(dataTopAndbottom); +​ chart->Invalidate(); + +​ UIChartDataSerial::PointStyle pointStyle; +​ // 最低心跳 +​ dataTopAndbottom->EnableBottomPoint(true); +​ pointStyle.radius = BOTTOM_RADIUS; // Inner radius +​ pointStyle.fillColor = Color::Gray(); +​ pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width +​ pointStyle.strokeColor = Color::Black(); +​ dataTopAndbottom->SetBottomPointStyle(pointStyle); +​ chart->Invalidate(); + +​ bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; +​ // 最高心跳 +​ dataTopAndbottom->EnableTopPoint(true); +​ pointStyle.fillColor = Color::Red(); +​ pointStyle.radius = TOP_RADIUS; // Inner radius +​ pointStyle.strokeColor = Color::Black(); +​ pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width +​ dataTopAndbottom->SetTopPointStyle(pointStyle); +​ chart->Invalidate(); + +​ top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; +​ if (top <= HEART_RATE_LIMIT_UPPER) +​ { +​ maxRate = (maxRate >= top) ? maxRate : top; +​ } +​ if (bottom != 0) +​ { +​ minRate = (minRate <= bottom) ? minRate : bottom; +​ } +​ } + +​ void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index) +​ { +​ Point tmp[NUM_2]; + +​ if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM) +​ { +​ return; +​ } + +​ tmp[0].x = tmp[1].x = rateData[index].x; +​ tmp[0].y = tmp[1].y = rateData[index].y; + +​ dataSerial[serialIndex] = new UIChartDataSerial(); +​ if (dataSerial[serialIndex] == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex); +​ serialIndex++; +​ return; +​ } + +​ dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点 +​ dataSerial[serialIndex]->AddPoints(tmp, NUM_2); +​ dataSerial[serialIndex]->SetLineColor(Color::Red()); +​ dataSerial[serialIndex]->SetFillColor(Color::Red()); +​ dataSerial[serialIndex]->EnableGradient(true); + +​ chart->AddDataSerial(dataSerial[serialIndex]); +​ chart->Invalidate(); +​ serialIndex++; +​ } + +​ void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume) +​ { +​ uint16_t i = 0; +​ uint16_t j = 0; +​ uint16_t tmp = 1; +​ if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM) +​ { +​ return; +​ } + +​ while (i < rateDataNume) +​ { +​ while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4)) +​ { // 15分钟对应的秒数 +​ tmp++; +​ j++; +​ } +​ if (tmp == 1) +​ { +​ ElectrocardiogramOnePoint(rateData, i); +​ } +​ else +​ { +​ if (serialIndex >= HEART_AVE_NUM) +​ { +​ return; +​ } +​ if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0) +​ { +​ dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points +​ chart->Invalidate(); +​ } +​ else +​ { +​ dataSerial[serialIndex] = new UIChartDataSerial(); +​ if (dataSerial[serialIndex] == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex); +​ serialIndex++; +​ return; +​ } + +​ dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points +​ dataSerial[serialIndex]->AddPoints(rateData + i, tmp); // number of data points +​ dataSerial[serialIndex]->SetLineColor(Color::Red()); +​ dataSerial[serialIndex]->SetFillColor(Color::Red()); +​ dataSerial[serialIndex]->EnableGradient(true); + +​ chart->AddDataSerial(dataSerial[serialIndex]); +​ chart->Invalidate(); +​ serialIndex++; +​ } +​ } +​ i += tmp; +​ j = i; +​ tmp = 1; +​ } +​ } + +​ void HeartRateView::HeartRateElectrocardiogram(void) +​ { +​ if (dataNume == 0) +​ { +​ return; +​ } +​ serialIndex = 0; +​ if (dataNume != 1) +​ { +​ ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点 +​ } +​ else +​ { +​ ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点 +​ } +​ currIndex = dataNume; +​ } + +​ void HeartRateView::HeartbeatImageAnimator() +​ { +​ imageAnimator = new UIImageAnimatorView(); +​ if (imageAnimator == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail"); +​ return; +​ } +​ imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT); +​ imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY); +​ imageAnimator->SetRepeat(true); +​ Add(imageAnimator); +​ imageAnimator->Start(); +​ } + +​ void HeartRateView::HeartbeatImageAnimatorStart(void) +​ { +​ if (imageAnimator != nullptr) +​ { +​ imageAnimator->Start(); +​ } +​ } + +​ void HeartRateView::HeartbeatImageAnimatorStop(void) +​ { +​ if (imageAnimator != nullptr) +​ { +​ imageAnimator->Stop(); +​ } +​ } + +​ bool HeartRateView::InitView(void) +​ { +​ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InitView"); +​ HeartRateDataProc(); +​ HeartRateLabelDisplay(); +​ HeartbeatImageAnimator(); +​ HeartRateCoordinate(); +​ InsertTopAndBottomRateImage(); +​ HeartRateElectrocardiogram(); +​ UpdataTopAndBottomRate(); +​ // HeartbeatImageAnimatorStop(); 进入界面进行 动画播放 +​ InitRefreshInterface(); +​ return true; +​ } + +​ /*预加载心率图片资源*/ +​ void HeartRateView::PreLoadHeartRateImageRes(void) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoadHeartRateImageRes"); +​ if (!resLoadStatus) +​ { +​ /*心率背景图*/ +​ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_RATE_TOP); +​ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_RATE_BOTTOM); +​ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_RATE_COOR); +​ resLoadStatus = true; +​ } +​ } + +​ /*卸载心率图片资源*/ +​ void HeartRateView::UnLoadHeartRateImageRes(void) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::UnLoadHeartRateImageRes"); +​ if (resLoadStatus) +​ { +​ ImageInfo *img = nullptr; +​ imageViewTop->SetSrc(img); +​ imageViewBottom->SetSrc(img); +​ imageViewCoordinate->SetSrc(img); +​ // ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES); +​ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_TOP, HEART_IAMGES); +​ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_BOTTOM, HEART_IAMGES); +​ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_COOR, HEART_IAMGES); +​ resLoadStatus = false; +​ } +​ } + +​ void HeartRateView::PreLoad(void) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoad"); +​ if (!viewiInitStatus) +​ { +​ if (InitView()) +​ { +​ viewiInitStatus = true; +​ } +​ } +​ PreLoadHeartRateImageRes(); +​ } + +​ void HeartRateView::UnLoad(void) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::UnLoad"); +​ UnLoadHeartRateImageRes(); +​ } + +​ void HeartRateView::InitRefreshInterface(void) +​ { +​ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface"); + +​ Point *rateData = HeartModel::GetInstance()->GetAveHeartRate(); +​ uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount(); +​ SetHeartRateData(rateData, sizeof(Point) * len); +​ // 展示最大,最小,最近一次心率 +​ uint16_t maxRate = HeartModel::GetInstance()->GetHeartRateMax(); +​ uint16_t minRate = HeartModel::GetInstance()->GetHeartRateMin(); +​ uint16_t perRate = HeartModel::GetInstance()->GetHeartdata(); +​ RefreshElectrocardiogram(); +​ if (maxRate > 0 && maxRate < HEART_RATE_LIMIT_UPPER) +​ { +​ RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax()); +​ } +​ if (minRate > 0 && minRate < HEART_RATE_LIMIT_UPPER) +​ { +​ RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin()); +​ } +​ if (perRate > 0 && perRate < HEART_RATE_LIMIT_UPPER) +​ { +​ HeartModel::GetInstance()->SetHeartRatePerSec(perRate); +​ } +​ } + +​ // 刷新心率曲线 +​ void HeartRateView::RefreshElectrocardiogram(void) +​ { +​ int32_t ret; +​ uint16_t tmp, count; +​ Point *rate = nullptr; +​ Point modPoint; + +​ ret = HeartRateDataProc(); +​ if (ret != OHOS_SUCCESS) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail"); +​ return; +​ } +​ rate = rateDataTmp; + +​ if (chart == nullptr) +​ { +​ return; +​ } + +​ if (currIndex >= HEART_AVE_NUM) +​ { +​ currIndex = HEART_AVE_NUM; +​ } +​ if (dataNume > currIndex) +​ { +​ tmp = dataNume - currIndex; +​ if (currIndex > 0) +​ { +​ rate += (currIndex - 1); +​ tmp += 1; +​ } +​ ElectrocardiogramMultiPoint(rate, tmp); +​ currIndex = dataNume; +​ } +​ else if (dataNume == currIndex) +​ { // 当前点平均心率刷新 +​ if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr) +​ { +​ modPoint.x = rate[currIndex - 1].x; +​ modPoint.y = rate[currIndex - 1].y; + +​ count = dataSerial[serialIndex - 1]->GetDataCount(); +​ dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint); +​ chart->Invalidate(); +​ } +​ } +​ else +​ { +​ return; +​ } +​ UpdataTopAndBottomRate(); // 最高、最低心率 +​ } + +​ // 清空心率曲线 +​ void HeartRateView::ClearElectrocardiogram(void) +​ { +​ int32_t i; +​ dataNume = 0; +​ currIndex = 0; +​ maxRate = 0; +​ minRate = HEART_RATE_LIMIT_UPPER; +​ InitHeartRateData(); + +​ if (chart == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr"); +​ return; +​ } + +​ if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr) +​ { +​ ratePerSec->SetText("--"); +​ topRate->SetText("--"); +​ bottomRate->SetText("--"); +​ restRate->SetText("--"); +​ } + +​ chart->DeleteDataSerial(dataTopAndbottom); +​ delete dataTopAndbottom; +​ dataTopAndbottom = nullptr; +​ for (i = 0; i < serialIndex; i++) +​ { +​ delete dataSerial[i]; +​ dataSerial[i] = nullptr; +​ } +​ chart->ClearDataSerial(); + +​ serialIndex = 0; +​ chart->Invalidate(); +​ } + +​ // 刷新每秒上报的心率 +​ void HeartRateView::RefreshHeartRatePerSec(uint16_t value) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView %d", value); + +​ char heartRate[NUM_4] = "--"; +​ int32_t ret = 0; + +​ if (ratePerSec == nullptr) +​ { +​ return; +​ } +​ HeartbeatImageAnimatorStart(); // 界面创建实现动画跳动 +​ if (value == 0) +​ { +​ ratePerSec->SetText("--"); +​ // HeartbeatImageAnimatorStop(); +​ return; +​ } +​ // HeartbeatImageAnimatorStart(); +​ if (value > NUM_99) +​ { +​ ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); +​ } +​ else +​ { +​ ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); +​ } +​ if (ret > EOK) +​ { +​ ratePerSec->SetText(heartRate); +​ } +​ } + +​ // 刷新最大心率 +​ void HeartRateView::RefreshHeartRateMax(uint16_t max) +​ { +​ char top[NUM_4] = "--"; +​ int32_t ret = 0; +​ maxRate = (maxRate >= max) ? maxRate : max; +​ if (topRate == nullptr) +​ { +​ return; +​ } +​ if (maxRate <= HEART_RATE_LIMIT_LOWER) +​ { +​ topRate->SetText("--"); +​ return; +​ } +​ ret = sprintf_s(top, sizeof(top), "%u", maxRate); +​ if (ret > EOK) +​ { +​ topRate->SetText(top); +​ } +​ } + +​ // 刷新最小心率 +​ void HeartRateView::RefreshHeartRateMin(uint16_t min) +​ { +​ char bottom[NUM_4] = "--"; +​ int32_t ret = 0; + +​ minRate = (minRate <= min) ? minRate : min; +​ if (bottomRate == nullptr) +​ { +​ return; +​ } +​ if (minRate >= HEART_RATE_LIMIT_UPPER) +​ { +​ bottomRate->SetText("--"); +​ return; +​ } +​ ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate); +​ if (ret > EOK) +​ { +​ bottomRate->SetText(bottom); +​ } +​ } + +​ // 刷新静息心率 +​ void HeartRateView::RefreshRestHeartRate(uint16_t value) +​ { +​ char heartRate[NUM_4] = "--"; +​ int32_t ret = 0; + +​ if (restRate == nullptr) +​ { +​ return; +​ } + +​ if (value == 0 || value == (uint16_t)0xFFFF) +​ { +​ // 无效值 +​ restRate->SetText("--"); +​ } +​ else +​ { +​ if (value > NUM_99) +​ { +​ ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); +​ } +​ else +​ { +​ ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); +​ } + +​ if (ret > EOK) +​ { +​ restRate->SetText(heartRate); +​ } +​ } +​ } +#if 0 +#ifdef __cplusplus +​ extern "C" +​ { +#endif +​ /* 定时器回调函数 */ +​ void HeartTimerCallback() +​ { +​ g_motionTimes++; +​ HeartCardPresenter *gHeartCardPresenter = HeartPresenter::GetInstance(); +​ if (gHeartCardPresenter == nullptr) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartTimerCallback::gHeartCardPresenter new fail"); +​ return; +​ } +​ // gHeartCardPresenter->ModifiesTime(); +​ // PRINT("HeartTimerCallback\r\n"); +​ } + +​ /* 开启定时器 */ +​ void InitTimer(void) +​ { +​ if (g_startCounting != NULL) +​ { +​ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer already exists!!"); +​ return; +​ } +​ g_startCounting = osTimerNew((osTimerFunc_t)HeartTimerCallback, osTimerPeriodic, NULL, NULL); +​ if (g_startCounting == NULL) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer osTimerNew failed!!"); +​ return; +​ } +​ int tick = osMs2Tick(MS_ONE_SECONDS); +​ osStatus_t retTimer = osTimerStart(g_startCounting, tick); +​ if (retTimer != osOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer osTimerStart failed, ret = %lx!!", retTimer); +​ if (g_startCounting != NULL) +​ { +​ retTimer = osTimerDelete(g_startCounting); +​ if (retTimer != osOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::osTimerDelete failed, ret = %lx!!", retTimer); +​ return; +​ } +​ g_startCounting = NULL; +​ } +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer!"); +​ return; +​ } +​ } +​ /* 关闭定时器 */ +​ void DisableTimer(void) +​ { +​ if (g_startCounting != NULL) +​ { +​ osStatus_t ret = osTimerDelete(g_startCounting); +​ if (ret != osOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret); +​ return; +​ } +​ g_startCounting = NULL; +​ PRINT("g_motionTimes:%d\r\n", sportdata->duration); +​ g_motionTimes = 0; +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisableTimer!"); +​ } +​ } +​ /* 暂停定时器 */ +​ void PauseTimer(void) +​ { +​ // 检查定时器是否存在 +​ if (g_startCounting != NULL) +​ { +​ // 暂停定时器,但不删除它 +​ osStatus_t ret = osTimerStop(g_startCounting); +​ if (ret != osOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopWatch_PauseTimer osTimerStop failed, ret = %lx!!", ret); +​ } +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PauseTimer!"); +​ } +​ } + +​ /*恢复定时器*/ +​ void ResumeTimer(void) +​ { +​ // 检查定时器是否存在 +​ if (g_startCounting != NULL) +​ { +​ int tick = osMs2Tick(MS_ONE_SECONDS); +​ // 恢复定时器 +​ osStatus_t ret = osTimerStart(g_startCounting, tick); +​ if (ret != osOK) +​ { +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ResumeTimer osTimerStart failed, ret = %lx!!", ret); +​ } +​ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ResumeTimer!"); +​ } +​ } + +#ifdef __cplusplus + } +#endif +#endif +} // namespace OHOS \ No newline at end of file diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/MainCard/heart.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/MainCard/heart.bin index a47ea3987..8343ea2a5 100644 --- a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/MainCard/heart.bin +++ b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/MainCard/heart.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e59c777aadc1f8891a4fc3affe5f4e4b48bb9a2e929620de73479f924f6cfad -size 68520 +oid sha256:acd50a8ffb429071ede16fe2970420b241ee83c4e7c9f46b5022eb3abff07791 +size 52616 diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.c b/code/sdk/drivers/peripheral/utils/custom_utils.c index cabbde90c..e60196c5b 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils.c @@ -190,7 +190,9 @@ void shutdown_reboot_prejobs_task(void) //保存信息文件 saveancsdata(); - + //保存当天心率数据 + save_heart_data(); + dial_file_save(); //同步所有需要保存实时数据到config文件 uapi_dev_runtime_sync_runtime_env_to_config(); diff --git a/tools/image_converter_tool/test/hert/heart/BOTTOM.png b/tools/image_converter_tool/test/hert/heart/BOTTOM.png new file mode 100644 index 0000000000000000000000000000000000000000..cf657edce6c75dc00ec71963fcf30fb9c405375f GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^VjwmL8<1SPbY3!$;w(0r%1aer?9eo`c7&i8E|4C#8@>h7eIEGX(uD!gG_mF`=>%;GUat(qv7+rFu zT2@FfswJ=_Fq<_9E@*7x6yR0f!0yz(NI0lN=D6ZN?ce8qSrr>xw3Pi8@@2yE=iY{8 zN)d|kQCG?jIJHL)7=Q+}e66 zzJhgY;DWFUhOLFZo)x@Vt33j3nr`h{sBo|0*5sDD4=h_k53j6xZ~F6fJ;MQO?-l2> SUcCdlnZeW5&t;ucLK6T;ie$O~ literal 0 HcmV?d00001 diff --git a/tools/image_converter_tool/test/hert/heart/COOR.png b/tools/image_converter_tool/test/hert/heart/COOR.png new file mode 100644 index 0000000000000000000000000000000000000000..4252e114b7223b8b64c3ad6174c5abfec439b7fc GIT binary patch literal 5841 zcmchbXH*m4y2fdt8H$1mB1J{%qJq>AKx#lK5k=`ms(+*lp$7yN5isU9)HHJ+q(Z`MvYh%EE+?_Y^M+3kx62 z)DX_X!kPpef9B={wyS948^Dey!1Qh~3(FCqzbh+CexV3(ku?}@a*d_7|1=Fa;qcPG zq0honmv&^&6~w}F!V_kwZxhb?bB5Jl*hq}HVN`YJA9R+PfdM)>UiQL;m=D`WP`P*B zpyG^7&0i&+5R^R;zVAQ#I&Y$X*0CkXetrKC)z=sq+}!%^9ewr7+G=rS)w17t82K>D z3WmzObjcKTg_9Eo?;=XUdPPK}VWR8_(sJ%D>CzrxFseKSsgKIM{NKGvC_y^Eu&~A% z>rAM1!iQV8MQl~&KJfLeVlI`XEr$#g>r_+BEs7y`4<&qdl*neN)W^k0B<~&>Z9c+a zgs4UP`C;swohgSUyfHpLa^}sgt@bmmVc5yp+5UEI6_uNg`0%>?+}zLP+4ktxh=V=E zdD!yk(^x0}DJVW_C&+O^H~iPj2qwcv$1gCjj-Nx_e|Ea$;m^s&<>5CsL*KfbDp6Kc z99~yYP}n^VJv{vNNg!0g)!n`9LA0S={MYAV>UQ?$Q00RfI|D1aevtn~Yk3+HVyasOj&*I+{LlE#o35-BYhRcTrQ*+y6 z1O$^o^Syt+8YLb2+ROGB>#L^^B%L_e10-H$UbGV$^e~LDleF23(lvS(&*0!BHx?D7 zOSi>7ZkK;rE1AmN4c!Sidnz(Aa!XsLVDO;?GWaM5D8?Q&Tx7tNbmZj4;q}5WZv)Uk zk2fUh&)b+Z-jdofl=peTaB0|#rj3h6>_OC3ZEgFKduySfqcWKJdm-F352Vt}wdYhg_VS?0#O5h4OqduJ}#9*i2s6eG{Xv*n=R6E~5sv4Z-@ zZ*?s#6Zxq^qa2`q{f-bj-plQ;#(4Z-WbcO5s8s9THU~mXTf5>`ZBgz z=C5>2L}VPV)wdNG?I1bk^>s^5Y09;MKj6OD`%%M_*4PkI?HMwe?F_s7C9%8{>~p}2 zT1H@{0l`R?bpKa1avhwX-W{+B8Jw7yV6GRa`=1!v_=k)}qnR&CfY;hd`F{5`q&t%U zYi?}371duQ?Ze>Y1=}n@z>#jHu|e@40Wmb<@eX@?n~Qy02Gxl4s{%bg);l{pwXAAt zYHU#D5BR3t#wRA;G&MJ`u;_a@U1K>TTZ6^gwzjr%LDSYZcP1w%4;YDwiA)uzs0)8T zDOF_Y$1D3M#9z#<6}MBk^vZGCDKmwAVN5)kx;L=iKQLemJXU<7#|xLfa4G?|aOJ^74qT$1Ex9dnd-*meH}5z6HQ4pn)lY9H zO1}{^Xcj3w^0Zc}Um&3I*o=jYMPcPdM_hyCC2zi$7zKGlEf`!q>A~f%b}x_6Mltrg z78)Gt*@=O1W#wRkNYqJp7G(+m5?@Q5&D{a~?LMu`#gn z)3sd>-LH|z$UX_E1@@!iJaO=_NIQ%_B@TMs4n|%Q*Sf?o=(KDeoSk(V2yy5!>~l+R z0DMGq6YySU7#;EN{Wk9$LgG{4hxgnMw)l+isr#>XbKmD2LyMSvC~_?bR|^#y$nl=- zdpdDOBzV$`o>1g}k7nPFFF!;c`xjRvPsP0P&)J$w0KDT}`)NY>M|dbHX0WBL6Gps`J@yE)#w^AYNZej?=kNGuZQx=9lu>-O8jO{DSIwIdFhw0K=zg5|!iw zlES+`>n8p4x{S_!0(??Nwp>k3ZP|6=23XW(ZuQ{%Guc&tMIVGdS_r@U<|{uMmq{j%w>wZ7Hd*ig_5G8jk&q`E`|#R z4~yXBTobLYuZI(cg1k974_>3+;&8aw21)%#ar%h^jHQUVSV7^r*)#ayj5pP`*ij`O zAQD5XsXf#tF*A@I=jp{9TwJcPt*pIc$+17e$8+gD* zKk^mjeFD&&&SU+(8I+X!z$G0}@`&3@vOl!zV!0*UpwQlXMLwDK36g4oQpLYwGjKrI zM65bOB30Q8Qmk_e3bcP|=p1-yl}x$)ZF*cp1aEBAZ-5b{3O1A8hi|w=*XQZ`)6j4B zETvpi*x9E{`ywIUt*UT4l&T#&Md8h(mqeGVZ0zT9ZZ=#P9UZOrY2fDOZ@5tF(1MCK zwt6cDL*d5gPB1w;meVsTW-Xd}O3-=yM_^tTRg7_al7olZM7TDV2FsX{sPZ+w(*RZ+ zN=8ZiH^2hC#nC)3TP#BwTFf6v`%zbl&kvUfomyv@+cHUHya2rb9a1~cN}Ae2G$UG} z>uT%s^-wfLGo_9fe9wisxAgPp&s92&MqB=vcw|ELN_uyOTIYKC+H_0sx1NwAM~-X_ zEy1<5wMPJ=u+LEf{58tu6ro3G172&{|2H#Ae*Y^mPSb>@?}Qicf1wv6nu2+bKKFu_ z=tMRF*ik7->)}PkjLXWvPR+h(5_$3uWFXH=BgZgPnr|>gkJ!-C(xNqqsi_ezaQLhK zdZHfvX>ZZF!0$^mD`f%Mej1wdfn z(CM6@8VqJ+h)Sg@z~IfP(w73-bCfaFl#P8x zui=EoCf9KY^%%DZQi$ZO{b6se^BHrWK^p>er42BHx00b13ld4^qYcJ7I8UuF1krGA zfO!F4S=#t@W%^nbV7fUqX7J`DUhtsZIFJAedyGUzAuCnT&8}x*;okn*VigebuP)l6 zTe%$`^j1HuP6>Ae5*+$i53LK}nNIkxZ+dnWLv~MC&cc?vtdPjHGVbr`%7FHvkOya2eo*HeiBJwP`Ft&t3{(loUt4L=$Db;@L6JMRvYW8f3{rsOe}6xc!d!hfz<>RmIPK=11fjsK{R_cw z0-h$Jqjl+dNV#PT^j{th#zD~@+JEQrAI6a7$~NKfU{|jTNM7GV`q$fn`LtgE3M}u? zsa!F^5fNGizkv_S4tn)d-5i9ZK%$u;YNRciuK(EULw_6;feUmjA=is{{Y7I180w%q z_}?ec|EVmHjI!UH^}<@QJ5Wx>efwpxo~I)&L@v_1Yi;d8=z`C0Bvmm=A6K<&9vJ3`TK7djREen_3c9f^2b%Pv0BG!$%8t8jj)!=3#=<4 zzgH&|1-MA;fM7zixmI0NR8)5RV)vO_`vYbk2|qilOFm^PWV;3iUXGOQ`|-oGsAFy8T;FmG12a>$Unba9V=xQN@5QXTMIoIOdeAt-!-I%`!pez zZ~&3#%`9%uWd5G=U+G@2qgw^+h^tA^eWCHnKRP$9j$Xl9LU+oGPipfYN^&X6XzM0o z{J2b`=_K{7d4WUb3RX)X+^fwDLA1~V<^K5aSTg2LEa4f%MaCU5{==Wrj)DI9mas2g z-_T~-U0-hjjKh0>#%VEGCh>&{viDExdV4jMWYM32&y~rN_`+nLMNI0vf>cVsF|?t0}#>R4=2-j{R)f#J3K2X!PX7HSe&Oej0_Y_Z7E{A#X0QDJoX zvr5iT=>FE2^L8K4irMVDS|808p#F@Go4Re0yKSABQ3vTJ9+eX%y)aIG@+I~9_vH4$ zC%wYA&-%;DbMfjwSwj&i!f|B$Uld9{k9#*))Zj;#*O7`EmW`?z0?;zKBxjR_R3yDA z70rKfeb2d<{o#caErB`irWS|`Q<<=biavpq_Up~y%4`*kRc~ec^Pt9SK@9mAa^^7K zQD8xc;sZ7L6Yc60s7euzo*)g(9WtUmxo!)MVp~cC3vsiSl_$A*<+Af^>3e1&ZFQ-B zj;7^j{K<#z&>PkkrHY;UeX_kh;~-96<-D;`is+!~l}l^}j8_%8#-1i1y-A?5z^$D5 zrHx*%peJX*E@RG+-eps{Sya&mJ`V^wDL z9O=Z7UH+lTrgNW#HZSz@tPElc%RPAg9BoYQT6C=~1m82WcX>jyo_Ntd#&b6HPARee z)%a2!dxw8RGyx%fobG$y%{aJC;Y-0avDhIUj_ka$ilv*D^tjNuk+r%# z^HH*bf9gApk7d7%$9O@-Y!=(cK=?ea{Y`A9dYk-pvLv-nbwaa8pw}qk*0C9h8~eRR z!8(z*1iL{i!Y6~IdLKqesrB#j?6PxN2F3}SVL(m(3pc$VqPMC$%=OADLhP%z$StaOw5Da@57o> z7Oex7IY4aEE7y-yQTQj$mmsXl0 zD10ZjX%J)ITu&p7etgLs(e=sks0p^$_jE{xe!%h zQjLxNedIQ4N2(xwu2P;;yHUyB)>gXnO5;{&g-`xm{U?+sy*Z@x%E-!|RnA%2fRS#g zvDe!Qwlr%;eDk7fA$E!B+o-|Q3ma6GB?pzJ7>>E$T+MhqV>v1R<#U>~S;95kzWW~k z`=BQZ33JC+`Y4433ZmtO9XNit1v%uCNMAK-F8KxAQ{6Jt=zOM=HTn9~O2mT3_nY#J zz(vC^&-$j*oiImpM^~Fqqh+JeTTjHB{k)_F$kkYQU2WZ3+oqIpAb-UEcI9a`S*ds* znqdTe!MDa=&XNq>t3|Vu@|og0?R_!uNtxDh%gJ~)@>(e%+AEQr2Sf_(WxLI=F4~V$ z6FYY=#9s5vzI9ec9T=?YHQ}=Qg=D@ohg%(gANX9&M4MFYZ?>N#JR0JaHt;^CMH4H+ zew6N3)`=&d;G;Z4JfE}MI`*&^4lVCHk$BO#Gim&VXn97AdRKgq(ZIY`0Wd4W+rVgY01l?lMzA2ToWO_wBGJrtbA>#Gy)B-||gSC_|VK1g-4|%xjlq&EsC)Q!GoQ9~2>zTL>c-`%GpK00(Wd95vZ-0? znOu9aS24?sUcM-6h|Zloc5XAl`_WSAFWZ%=jGfHBZZ>ZFiK%W(yPd1vd zO%5VgAJD1_Q+_I4o~ul-S4t1$;FdovU(9$Y@+~$Al|d_~7L|>PTooVZPPuo%FCs*k zo=oQ|*Ivb&PKAc)QcK` zQ14{3lzB9}Akg?M n(Ww&&(zKaBkpEDu?(0r%1aer?9eo`c7&i8E|4C#8@;g0U978G?*IwSs*!~7{v&s&SR l{e80+sjSnPdBEbNtjyln|EDhBsRKHS!PC{xWt~$(696cMR0{wA literal 0 HcmV?d00001 diff --git a/tools/language_tool/make_language.sh b/tools/language_tool/make_language.sh index 608fd05e3..18705d3aa 100644 --- a/tools/language_tool/make_language.sh +++ b/tools/language_tool/make_language.sh @@ -1,26 +1,36 @@ -#!/bin/bash +#!/bin/bash ### - # @Date: 2024-07-10 21:03:33 + # @Date: 2024-07-11 20:53:59 # @LastEditors: Caisking 3449750381@qq.com - # @LastEditTime: 2024-07-20 16:13:48 + # @LastEditTime: 2024-08-15 15:59:04 # @FilePath: /FD230/tools/language_tool/make_language.sh ### -# 进入目录 Language_xml +set -e # 在命令失败时退出 -cd Language_xml/ +# 进入目录 Language_xml +cd Language_xml/ -# 运行 languagetool.py -python languagetool.py +# 运行 languagetool.py +python languagetool.py -# 回到上级目录 -cd .. +# 回到上级目录 +cd .. -# 进入目录 stringpack_tool -cd stringpack_tool +# 进入目录 stringpack_tool +cd stringpack_tool -# 运行 language_trans.py -python language_trans.py ../Language_xml/ ../font/ ../font/ +# 运行 language_trans.py +python language_trans.py ../Language_xml/ ../font/ ../font/ -# 打印完成信息 -echo "脚本执行完成。" \ No newline at end of file +# 打印完成信息 +echo "脚本生成文件执行完成。" + +#复制头文件 +cp ./font/ui_resource_string.h ../../../code/sdk/application/wearable/fd230app/nativelauncher/include/ + +#复制资源文件 +cp -r ./font ../../../code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/ + +# 打印完成信息 +echo "脚本复制文件执行完成。" \ No newline at end of file diff --git "a/tools/language_tool/\345\244\232\345\233\275\350\257\255\350\250\200\345\267\245\345\205\267\350\204\232\346\234\254.md" "b/tools/language_tool/\345\244\232\345\233\275\350\257\255\350\250\200\345\267\245\345\205\267\350\204\232\346\234\254.md" index 341f40522..87d9315be 100644 --- "a/tools/language_tool/\345\244\232\345\233\275\350\257\255\350\250\200\345\267\245\345\205\267\350\204\232\346\234\254.md" +++ "b/tools/language_tool/\345\244\232\345\233\275\350\257\255\350\250\200\345\267\245\345\205\267\350\204\232\346\234\254.md" @@ -1,7 +1,7 @@ ## 多国语言工具脚本使用方法 @@ -88,3 +88,6 @@ chmod +x languagemake.sh ### 更新 0720 修复脚本异常 + +### 更新 0815 +脚本增加生成文件直接copy功能 复制到对应文件夹 -- 2.17.1