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; // 蓝牙图标蓝色图片
{
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();
namespace OHOS
{
- AddCardView::AddCardView() : contentList_(UIList::HORIZONTAL)
+ AddCardView::AddCardView()
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::AddCardView");
}
contentList_.SetMaxScrollDistance(1000);
contentList_.SetLoopState(true);
contentList_.SetAdapter(addCardAdapter_);
+
contentList_.SetVisible(true);
+ contentList_.SetRotateFactor(1.0);
+ contentList_.RequestFocus();
+ contentList_.SetYScrollBarVisible(true); // 设置滑动滚动条
+
container_->Add(&contentList_);
}
#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;
/*获取日期*/
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+");
{
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<char *>(&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<char *>(&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<const char *>(¤tTime), sizeof(currentTime));
+
+ for (int i = 0; i < MAX_HOURS; ++i)
+ {
+ if (!outFile.write(reinterpret_cast<const char *>(&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<uint8_t>(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;
+ }
+}
#include "stdio.h"
#include "string"
+#include <fstream>
+#include <ctime>
+#include <cstdint>
#define HEART_MAX_POINTS 360
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
void Heart_Control(HeartState state, HeartCheck check);\r
void ReInit();\r
\r
+ void Heart_Update_View(void);\r
+\r
private:\r
HealthAllDatas healthDatas;\r
uint16_t pretime{0};\r
#include "components/ui_card_page.h"\r
#include "HeartModel.h"\r
\r
-namespace OHOS {\r
+namespace OHOS\r
+{\r
#define HEART_AVE_NUM 360\r
#define HEART_RATE_LIMIT_UPPER 200\r
#define HEART_RATE_LIMIT_LOWER 0\r
#define NUM_16 16\r
#define NUM_99 99\r
\r
-class HeartRateView : public UICardPage {\r
-public:\r
- HeartRateView();\r
- ~HeartRateView() override;\r
- static HeartRateView *GetInstance(void);\r
+ class HeartRateView : public UICardPage\r
+ {\r
+ public:\r
+ HeartRateView();\r
+ ~HeartRateView() override;\r
+ static HeartRateView *GetInstance(void);\r
\r
- bool InitView(void);\r
- void PreLoad(void) override;\r
- void UnLoad(void) override;\r
- int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线\r
- void RefreshElectrocardiogram(void); // 刷新心率曲线\r
- void ClearElectrocardiogram(void); // 清空心率曲线\r
- void RefreshHeartRatePerSec(uint16_t value); // 刷新每秒心率\r
- void RefreshHeartRateMax(uint16_t max); // 刷新心率最大值\r
- void RefreshHeartRateMin(uint16_t min); // 刷新心率最小值\r
- void RefreshRestHeartRate(uint16_t value); // 刷新静息心率\r
- void HeartbeatImageAnimatorStart(void); // 心形动画启动\r
- void HeartbeatImageAnimatorStop(void); // 心形动画停止\r
- void InitRefreshInterface(void);\r
+ bool InitView(void);\r
+ void PreLoad(void) override;\r
+ void UnLoad(void) override;\r
+ int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线\r
+ void RefreshElectrocardiogram(void); // 刷新心率曲线\r
+ void ClearElectrocardiogram(void); // 清空心率曲线\r
+ void RefreshHeartRatePerSec(uint16_t value); // 刷新每秒心率\r
+ void RefreshHeartRateMax(uint16_t max); // 刷新心率最大值\r
+ void RefreshHeartRateMin(uint16_t min); // 刷新心率最小值\r
+ void RefreshRestHeartRate(uint16_t value); // 刷新静息心率\r
+ void HeartbeatImageAnimatorStart(void); // 心形动画启动\r
+ void HeartbeatImageAnimatorStop(void); // 心形动画停止\r
+ void InitRefreshInterface(void);\r
+ void InitChartTest(void);\r
+ void Init_data_Chart();\r
+ void Update_data_Chart(int serialIndex);\r
+ void UpdataChart();\r
\r
-private:\r
- typedef struct {\r
- uint8_t fontSize;\r
- int16 x;\r
- int16 y;\r
- int16 width;\r
- int16 height;\r
- } LabelInfo;\r
+ private:\r
+ typedef struct\r
+ {\r
+ uint8_t fontSize;\r
+ int16 x;\r
+ int16 y;\r
+ int16 width;\r
+ int16 height;\r
+ } LabelInfo;\r
\r
- int32_t InitHeartRateData(void);\r
- void SetLabel(UILabel *label, LabelInfo labelInfo);\r
- void HeartRateLabelDisplay(void);\r
- void HeartRateCoordinate(void);\r
- void HeartRateElectrocardiogram(void);\r
- void InsertTopAndBottomRateImage(void);\r
- void UpdataTopAndBottomRate(void);\r
- void ElectrocardiogramOnePoint(Point *rateData, uint16_t index);\r
- void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
- int32_t HeartRateDataProc(void);\r
- void HeartbeatImageAnimator(void);\r
+ int32_t InitHeartRateData(void);\r
+ void SetLabel(UILabel *label, LabelInfo labelInfo);\r
+ void HeartRateLabelDisplay(void);\r
+ void HeartRateCoordinate(void);\r
+ void HeartRateElectrocardiogram(void);\r
+ void InsertTopAndBottomRateImage(void);\r
+ void UpdataTopAndBottomRate(void);\r
+ void ElectrocardiogramOnePoint(Point *rateData, uint16_t index);\r
+ void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
+ int32_t HeartRateDataProc(void);\r
+ void HeartbeatImageAnimator(void);\r
\r
-private:\r
- Point heartRateData[HEART_AVE_NUM];\r
- Point rateDataTmp[HEART_AVE_NUM];\r
+ private:\r
+ Point heartRateData[HEART_AVE_NUM];\r
+ Point rateDataTmp[HEART_AVE_NUM];\r
\r
- void PreLoadHeartRateImageRes(void);\r
- void UnLoadHeartRateImageRes(void);\r
- bool viewiInitStatus{false};\r
- bool resLoadStatus{false};\r
- UIChartPolyline *chart{nullptr};\r
- uint16_t dataNume; // 心率曲线记录数据总个数\r
- uint16_t currIndex; // 当前已显示心率曲线心率个数\r
- UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr};\r
- UIChartDataSerial *dataTopAndbottom{nullptr};\r
- UIImageView *imageViewTop{nullptr};\r
- UIImageView *imageViewBottom{nullptr};\r
- uint16_t serialIndex;\r
- UIImageAnimatorView *imageAnimator{nullptr};\r
- UIImageView *imageViewCoordinate{nullptr};\r
+ void PreLoadHeartRateImageRes(void);\r
+ void UnLoadHeartRateImageRes(void);\r
+ bool viewiInitStatus{false};\r
+ bool resLoadStatus{false};\r
+ UIChartPolyline *chart{nullptr};\r
+ uint16_t dataNume; // 心率曲线记录数据总个数\r
+ uint16_t currIndex; // 当前已显示心率曲线心率个数\r
+ UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr};\r
+ UIChartDataSerial *dataTopAndbottom{nullptr};\r
+ UIImageView *imageViewTop{nullptr};\r
+ UIImageView *imageViewBottom{nullptr};\r
+ uint16_t serialIndex;\r
+ UIImageAnimatorView *imageAnimator{nullptr};\r
+ UIImageView *imageViewCoordinate{nullptr};\r
\r
- UILabel *topRate{nullptr};\r
- UILabel *bottomRate{nullptr};\r
- UILabel *ratePerSec{nullptr};\r
- UILabel *ratePerSecText{nullptr};\r
- UILabel *restRate{nullptr};\r
- UILabel *restRateText1{nullptr};\r
- UILabel *restRateText2{nullptr};\r
+ UILabel *topRate{nullptr};\r
+ UILabel *bottomRate{nullptr};\r
+ UILabel *ratePerSec{nullptr};\r
+ UILabel *ratePerSecText{nullptr};\r
+ UILabel *restRate{nullptr};\r
+ UILabel *restRateText1{nullptr};\r
+ UILabel *restRateText2{nullptr};\r
\r
- uint16_t maxRate;\r
- uint16_t minRate;\r
-};\r
+ uint16_t maxRate;\r
+ uint16_t minRate;\r
+\r
+ Point heartdata[24];\r
+ UIChartDataSerial *heartSerial{nullptr};\r
+ UIChartPolyline *heartchart = nullptr;\r
+ };\r
} // namespace OHOS\r
#endif // HEART_RATE_VIEW_H\r
#include <iostream>\r
#include <memory>\r
\r
+#include "heartrate/include/HeartRateView.h"\r
+#include "ui_service.h"\r
+\r
#ifdef __cplusplus\r
extern "C"\r
{\r
/*初始化读取文件*/\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
+ /*初始化历史文件*/\r
+ HealthService::GetInstance()->LoadDailyHeartRate();\r
if (data != nullptr)\r
{\r
currentheart = data->Heart;\r
if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
{\r
HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len);\r
- HeartRateView::GetInstance()->RefreshElectrocardiogram();\r
+ // HeartRateView::GetInstance()->RefreshElectrocardiogram();\r
HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
if (heartresult_ == HeartResult::SUCCESS)\r
{\r
Heart_Save();\r
+ /*通知进行UI更新*/\r
+ SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
}\r
/*关闭被动检测*/\r
Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
SetCheckTime(data.timestamp);\r
HealthService::GetInstance()->UpdateHealthData(data);\r
\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %ld", currentheart, data.timestamp);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", currentheart, data.timestamp);\r
}\r
\r
// 显示检测结果// 显示检测结果\r
Heart_Stop();\r
}\r
}\r
+\r
+ void HeartModel::Heart_Update_View(void)\r
+ {\r
+ if (HeartRateView::GetInstance())\r
+ {\r
+ int hour = HealthService::GetInstance()->GetCurrentHour();\r
+ if (HeartRateView::GetInstance() != nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片");\r
+ HeartRateView::GetInstance()->Update_data_Chart(hour);\r
+ }\r
+ }\r
+ }\r
}\r
#include "ScreenModels.h"\r
#include "ui_resource_image.h"\r
#include "common/image_cache_manager.h"\r
-\r
+#include "heart_blood/health_service/health_service.h"\r
+#define HEART_DATA_TEST 0\r
namespace OHOS\r
{\r
static HeartRateView *g_pHeartRateView = nullptr;\r
\r
// 背景坐标图形\r
-#define ACT_IMAGE_X 0 // 图片坐标起点\r
-#define ACT_IMAGE_Y 115 // 图片坐标起点\r
-#define ACT_IMAGE_COOR_X 45 // 200刻度线到最左端的像素点\r
+#define ACT_IMAGE_X 38 // 图片坐标起点\r
+#define ACT_IMAGE_Y 130 // 图片坐标起点\r
+#define ACT_IMAGE_COOR_X 80 // 200刻度线到最左端的像素点\r
#define ACT_IMAGE_COOR_Y 145 // 200刻度线到顶端的像素点\r
#define ACT_IMAGE_COOR_PIXELS 160 // 实际背景坐标0到200心率值的实际像素点\r
#define ACT_IMAGE_COOR_VALUE HEART_RATE_LIMIT_UPPER // 图片刻度表示的心率范围\r
-#define ACT_IMAGE_COOR_WIDTH 454\r
-#define ACT_IMAGE_COOR_HEIGHT 220\r
+#define ACT_IMAGE_COOR_WIDTH 390\r
+#define ACT_IMAGE_COOR_HEIGHT 200\r
\r
// 心电图坐标适配\r
#define COORDINATE_VALUE 5 // 余量\r
// 心形心跳\r
#define HEARTBEAT_IMAGE_WIDTH 92\r
#define HEARTBEAT_IMAGE_HEIGHT 92\r
-#define HEARTBEAT_IMAGE_X 130\r
-#define HEARTBEAT_IMAGE_Y 25\r
+#define HEARTBEAT_IMAGE_X 105\r
+#define HEARTBEAT_IMAGE_Y 50\r
#define HEARTBEAT_IMAGE_NUM 19\r
#define HEARTBEAT_DELAY 50\r
\r
#define REST_HEART_TEXT_HEIGHT2 (REST_HEART_TEXT_FONT_SIZE + 5)\r
\r
// 每秒心率\r
-#define PERSEC_HEART_RATE_FONT_SIZE 45\r
-#define PERSEC_HEART_RATE_X 225\r
-#define PERSEC_HEART_RATE_Y 55\r
-#define PERSEC_HEART_RATE_WIDTH 90\r
+#define PERSEC_HEART_RATE_FONT_SIZE 60\r
+#define PERSEC_HEART_RATE_X 202\r
+#define PERSEC_HEART_RATE_Y 62\r
+#define PERSEC_HEART_RATE_WIDTH 102\r
#define PERSEC_HEART_RATE_HEIGHT (PERSEC_HEART_RATE_FONT_SIZE + 5)\r
\r
#define PERSEC_HEART_TEXT_FONT_SIZE 30\r
delete dataSerial[i];\r
dataSerial[i] = nullptr;\r
}\r
+ heartchart->ClearDataSerial();\r
+ delete heartSerial;\r
+ heartSerial = nullptr;\r
+ delete heartchart;\r
delete chart;\r
chart = nullptr;\r
delete imageViewTop;\r
\r
return OHOS_SUCCESS;\r
}\r
+#if 0\r
+ std::vector<Point> HeartRateView::simulateHeartRateData()\r
+ {\r
+ std::vector<Point> heartRateData;\r
+ const int HEART_RATE_MIN = 60; // 心率下限\r
+ const int HEART_RATE_MAX = 100; // 心率上限\r
+\r
+ // 用于生成随机数的种子\r
+ std::srand(std::time(0));\r
+\r
+ for (int i = 0; i < 24; ++i)\r
+ { // 模拟24小时\r
+ Point dataPoint;\r
+ dataPoint.x = i; // 小时数\r
+ dataPoint.y = HEART_RATE_MIN + (std::rand() % (HEART_RATE_MAX - HEART_RATE_MIN + 1)); // 随机生成心率值\r
+ heartRateData.push_back(dataPoint);\r
+ }\r
\r
+ return heartRateData;\r
+ }\r
+#endif\r
int32_t HeartRateView::HeartRateDataProc(void)\r
{\r
int32_t i, ret;\r
}\r
\r
dataNume = 0;\r
- for (i = 0; i < HEART_AVE_NUM; i++)\r
+ for (i = 0; i < HEART_AVE_NUM; i += 15) // 每跨过15个点代表一个小时\r
{\r
if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 &&\r
datain[i].y <= HEART_RATE_LIMIT_UPPER)\r
dataNume++;\r
}\r
}\r
+\r
return OHOS_SUCCESS;\r
}\r
\r
SetLabel(ratePerSec, PerSecLabel);\r
SetLabel(ratePerSecText, PerSecTextLabel);\r
ratePerSec->SetText("--");\r
+ ratePerSec->SetFont(GILROY_BOLD_FONT, PERSEC_HEART_RATE_FONT_SIZE);\r
ratePerSecText->SetText("次/分");\r
\r
// 最高最低心率\r
xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
+ chart->SetVisible(false); // 设置不可见\r
Add(chart);\r
}\r
+ void HeartRateView::InitChartTest(void)\r
+ {\r
+ if (heartchart == nullptr)\r
+ {\r
+ heartchart = new UIChartPolyline();\r
+ }\r
+ heartchart->SetPosition(95, 178);\r
+ heartchart->Resize(320, 110);\r
+ heartchart->SetViewId("uiChart");\r
+ heartchart->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+\r
+ UIXAxis &heartXAxis = heartchart->GetXAxis();\r
+ UIYAxis &heartYAxis = heartchart->GetYAxis();\r
+ heartXAxis.SetMarkNum(1);\r
+ heartXAxis.SetDataRange(0, 24);\r
+ heartXAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+ // heartXAxis.SetLineColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
+ heartYAxis.SetMarkNum(1);\r
+ heartYAxis.SetDataRange(0, 220);\r
+ heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+ // heartYAxis.SetLineColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
+\r
+ heartchart->SetGradientOpacity(0, 0);\r
+\r
+ Add(heartchart);\r
+ }\r
+ void HeartRateView::Init_data_Chart()\r
+ {\r
+ if (heartchart == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init_data_Chart new chart fail");\r
+ return;\r
+ }\r
+ heartSerial = new UIChartDataSerial();\r
+ heartSerial->SetMaxDataCount(24);\r
+#if HEART_DATA_TEST\r
+ Point temp[] = {\r
+ {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}};\r
+ std::copy(std::begin(temp), std::end(temp), heartdata);\r
+#else\r
+ for (int serialIndex = 0; serialIndex < 24; serialIndex++)\r
+ {\r
+ heartdata[serialIndex].x = serialIndex;\r
+ heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
+ }\r
+#endif\r
+ heartSerial->AddPoints(heartdata, 24);\r
+ heartSerial->SetLineColor(Color::Red());\r
+ heartSerial->SetFillColor(Color::Red());\r
+ heartSerial->EnableGradient(true);\r
+\r
+ heartchart->AddDataSerial(heartSerial);\r
+ heartchart->Invalidate();\r
+ }\r
+ void HeartRateView::Update_data_Chart(int serialIndex)\r
+ {\r
+#if HEART_DATA_TEST\r
+ Point tmp[NUM_2];\r
+ if (chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM)\r
+ {\r
+ return;\r
+ }\r
+ heartSerial[serialIndex] = new UIChartDataSerial();\r
+ heartdata[serialIndex].x = serialIndex;\r
+ heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
+\r
+ tmp[0].x = tmp[1].x = heartdata[serialIndex].x;\r
+ tmp[0].y = tmp[1].y = heartdata[serialIndex].y;\r
+\r
+ heartSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点\r
+ heartSerial[serialIndex]->AddPoints(tmp, NUM_2);\r
+ heartSerial[serialIndex]->SetLineColor(Color::Red());\r
+ heartSerial[serialIndex]->SetFillColor(Color::Red());\r
+ heartSerial[serialIndex]->EnableGradient(true);\r
+\r
+ heartchart->AddDataSerial(heartSerial[serialIndex]);\r
+ heartchart->Invalidate();\r
+#else\r
+ if (heartchart == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);\r
+ return;\r
+ }\r
+\r
+ heartdata[serialIndex].x = serialIndex;\r
+ heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
+\r
+ heartSerial->AddPoints(heartdata, 24);\r
+ heartSerial->SetLineColor(Color::Red());\r
+ heartSerial->SetFillColor(Color::Red());\r
+ heartSerial->EnableGradient(true);\r
\r
+ heartchart->AddDataSerial(heartSerial);\r
+ heartchart->Invalidate();\r
+#endif\r
+ }\r
void HeartRateView::InsertTopAndBottomRateImage(void)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start");\r
minRate = (minRate <= bottom) ? minRate : bottom;\r
}\r
}\r
-\r
void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index)\r
{\r
Point tmp[NUM_2];\r
HeartRateLabelDisplay();\r
HeartbeatImageAnimator();\r
HeartRateCoordinate();\r
+ InitChartTest();\r
+ Init_data_Chart();\r
InsertTopAndBottomRateImage();\r
HeartRateElectrocardiogram();\r
UpdataTopAndBottomRate();\r
- HeartbeatImageAnimatorStop();\r
+ // HeartbeatImageAnimatorStop(); 进入界面进行 动画播放\r
InitRefreshInterface();\r
return true;\r
}\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoadHeartRateImageRes");\r
if (!resLoadStatus)\r
{\r
- ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP);\r
- ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM);\r
- ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR);\r
+ /*心率背景图*/\r
+ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_RATE_TOP);\r
+ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_RATE_BOTTOM);\r
+ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_RATE_COOR);\r
resLoadStatus = true;\r
}\r
}\r
imageViewBottom->SetSrc(img);\r
imageViewCoordinate->SetSrc(img);\r
// ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES);\r
- ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATE_TOP, HEART_IAMGES);\r
- ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATE_BOTTOM, HEART_IAMGES);\r
- ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATECOOR, HEART_IAMGES);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_TOP, HEART_IAMGES);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_BOTTOM, HEART_IAMGES);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_COOR, HEART_IAMGES);\r
resLoadStatus = false;\r
}\r
}\r
}\r
}\r
}\r
+\r
#if 0\r
#ifdef __cplusplus\r
extern "C"\r
+/***
+ * @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
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);
/***
* @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
*/
/*
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聆听界面
#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"
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<UiService *>(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<UiService *>(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:
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
}
/*\r
+\r
* Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
* Description: heartRate view\r
* Author:\r
* Create: 2021-07-26\r
- */\r
+ */\r
\r
#include <securec.h>\r
#include "HeartRateView.h"\r
#include "ScreenModels.h"\r
#include "ui_resource_image.h"\r
#include "common/image_cache_manager.h"\r
-\r
-namespace OHOS {\r
-static HeartRateView *g_pHeartRateView = nullptr;\r
+#define HEART_DATA_TEST 1\r
+namespace OHOS\r
+{\r
+ static HeartRateView *g_pHeartRateView = nullptr;\r
\r
// 背景坐标图形\r
-#define ACT_IMAGE_X 0 // 图片坐标起点\r
-#define ACT_IMAGE_Y 115 // 图片坐标起点\r
-#define ACT_IMAGE_COOR_X 45 // 200刻度线到最左端的像素点\r
+#define ACT_IMAGE_X 38 // 图片坐标起点\r
+#define ACT_IMAGE_Y 130 // 图片坐标起点\r
+#define ACT_IMAGE_COOR_X 80 // 200刻度线到最左端的像素点\r
#define ACT_IMAGE_COOR_Y 145 // 200刻度线到顶端的像素点\r
#define ACT_IMAGE_COOR_PIXELS 160 // 实际背景坐标0到200心率值的实际像素点\r
#define ACT_IMAGE_COOR_VALUE HEART_RATE_LIMIT_UPPER // 图片刻度表示的心率范围\r
-#define ACT_IMAGE_COOR_WIDTH 454\r
-#define ACT_IMAGE_COOR_HEIGHT 220\r
+#define ACT_IMAGE_COOR_WIDTH 390\r
+#define ACT_IMAGE_COOR_HEIGHT 200\r
\r
// 心电图坐标适配\r
#define COORDINATE_VALUE 5 // 余量\r
// 心形心跳\r
#define HEARTBEAT_IMAGE_WIDTH 92\r
#define HEARTBEAT_IMAGE_HEIGHT 92\r
-#define HEARTBEAT_IMAGE_X 130\r
-#define HEARTBEAT_IMAGE_Y 25\r
+#define HEARTBEAT_IMAGE_X 105\r
+#define HEARTBEAT_IMAGE_Y 50\r
#define HEARTBEAT_IMAGE_NUM 19\r
#define HEARTBEAT_DELAY 50\r
\r
#define REST_HEART_TEXT_HEIGHT2 (REST_HEART_TEXT_FONT_SIZE + 5)\r
\r
// 每秒心率\r
-#define PERSEC_HEART_RATE_FONT_SIZE 45\r
-#define PERSEC_HEART_RATE_X 225\r
-#define PERSEC_HEART_RATE_Y 55\r
-#define PERSEC_HEART_RATE_WIDTH 90\r
+#define PERSEC_HEART_RATE_FONT_SIZE 60\r
+#define PERSEC_HEART_RATE_X 202\r
+#define PERSEC_HEART_RATE_Y 62\r
+#define PERSEC_HEART_RATE_WIDTH 102\r
#define PERSEC_HEART_RATE_HEIGHT (PERSEC_HEART_RATE_FONT_SIZE + 5)\r
\r
#define PERSEC_HEART_TEXT_FONT_SIZE 30\r
#define PERSEC_HEART_TEXT_WIDTH 75\r
#define PERSEC_HEART_TEXT_HEIGHT (PERSEC_HEART_TEXT_FONT_SIZE + 5)\r
\r
-// 心跳image\r
-static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = {\r
- {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
-\r
- {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
- {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
- IMG_SRC_FILE_PATH},\r
-};\r
-\r
-HeartRateView::HeartRateView()\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView");\r
- dataNume = 0;\r
- currIndex = 0;\r
- serialIndex = 0;\r
- maxRate = 0;\r
- minRate = HEART_RATE_LIMIT_UPPER;\r
- InitHeartRateData();\r
- SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-\r
- g_pHeartRateView = this;\r
-}\r
-\r
-HeartRateView::~HeartRateView()\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView");\r
- if (viewiInitStatus) {\r
- int32_t i;\r
- RemoveAll();\r
- delete imageViewCoordinate;\r
- imageViewCoordinate = nullptr;\r
-\r
- chart->ClearDataSerial();\r
- for (i = 0; i < HEART_AVE_NUM; i++) {\r
- delete dataSerial[i];\r
- dataSerial[i] = nullptr;\r
- }\r
- delete chart;\r
- chart = nullptr;\r
- delete imageViewTop;\r
- imageViewTop = nullptr;\r
- delete imageViewBottom;\r
- imageViewBottom = nullptr;\r
- delete dataTopAndbottom;\r
- dataTopAndbottom = nullptr;\r
- imageAnimator->Stop();\r
- delete imageAnimator;\r
- imageAnimator = nullptr;\r
- delete topRate;\r
- topRate = nullptr;\r
- delete bottomRate;\r
- bottomRate = nullptr;\r
- delete ratePerSec;\r
- ratePerSec = nullptr;\r
- delete ratePerSecText;\r
- ratePerSecText = nullptr;\r
- delete restRate;\r
- restRate = nullptr;\r
- delete restRateText1;\r
- restRateText1 = nullptr;\r
- delete restRateText2;\r
- restRateText2 = nullptr;\r
- }\r
- g_pHeartRateView = nullptr;\r
-}\r
-\r
-HeartRateView *HeartRateView::GetInstance(void)\r
-{\r
- return g_pHeartRateView;\r
-}\r
-\r
-int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值\r
-{\r
- heartRateData[0].x = INVALID_HEART_VALUE;\r
- heartRateData[0].y = INVALID_HEART_VALUE;\r
-\r
- int32_t ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM);\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret);\r
- }\r
- return ret;\r
-}\r
-\r
-int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize)\r
-{\r
- if (rateData == nullptr) {\r
- return OHOS_FAILURE;\r
- }\r
-\r
- if (rateDataSize > sizeof(Point) * HEART_AVE_NUM) {\r
- rateDataSize = sizeof(Point) * HEART_AVE_NUM;\r
- }\r
- InitHeartRateData();\r
- int32_t ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize);\r
- if (ret != EOK) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret);\r
- return OHOS_FAILURE;\r
- }\r
- return OHOS_SUCCESS;\r
-}\r
-\r
-\r
-int32_t HeartRateView::HeartRateDataProc(void)\r
-{\r
- Point datain[HEART_AVE_NUM];\r
- int32_t ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM);\r
- if (ret != EOK) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret);\r
- return OHOS_FAILURE;\r
- }\r
-\r
- ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值\r
- if (ret != EOK) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret);\r
- return OHOS_FAILURE;\r
- }\r
-\r
- dataNume = 0;\r
- for (int32_t i = 0; i < HEART_AVE_NUM; i++) {\r
- if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 &&\r
- datain[i].y <= HEART_RATE_LIMIT_UPPER) {\r
- rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE;\r
- rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE;\r
- dataNume++;\r
- }\r
- }\r
- return OHOS_SUCCESS;\r
-}\r
-\r
-void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo)\r
-{\r
- label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize);\r
- label->SetPosition(labelInfo.x, labelInfo.y);\r
- label->Resize(labelInfo.width, labelInfo.height);\r
- label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
- Add(label);\r
-}\r
-\r
-void HeartRateView::HeartRateLabelDisplay(void)\r
-{\r
- LabelInfo PerSecLabel = { PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y,\r
- PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT };\r
- LabelInfo PerSecTextLabel = { PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y,\r
- PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT };\r
-\r
- LabelInfo topLabel = { HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT };\r
- LabelInfo bottomLabel = { HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH,\r
- BOTTOM_TEXT_HEIGHT };\r
-\r
- LabelInfo restRateLabel = { REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH,\r
- REST_HEART_RATE_HEIGHT };\r
- LabelInfo restRateTextLabel1 = { REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1,\r
- REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1 };\r
- LabelInfo restRateTextLabel2 = { REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2,\r
- REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2 };\r
-\r
- topRate = new UILabel();\r
- bottomRate = new UILabel();\r
- ratePerSec = new UILabel();\r
- ratePerSecText = new UILabel();\r
- restRate = new UILabel();\r
- restRateText1 = new UILabel();\r
- restRateText2 = new UILabel();\r
-\r
- if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr ||\r
- restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail");\r
- }\r
-\r
- // 实时心率\r
- SetLabel(ratePerSec, PerSecLabel);\r
- SetLabel(ratePerSecText, PerSecTextLabel);\r
- ratePerSec->SetText("--");\r
- ratePerSecText->SetText("次/分");\r
-\r
- // 最高最低心率\r
- SetLabel(topRate, topLabel);\r
- SetLabel(bottomRate, bottomLabel);\r
- topRate->SetText("--");\r
- bottomRate->SetText("--");\r
-\r
- // 静息心率\r
- SetLabel(restRate, restRateLabel);\r
- SetLabel(restRateText1, restRateTextLabel1);\r
- SetLabel(restRateText2, restRateTextLabel2);\r
- restRateText1->SetText("静息");\r
- restRate->SetText("--");\r
- restRateText2->SetText("次/分");\r
-}\r
-\r
-void HeartRateView::HeartRateCoordinate(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start");\r
- // 坐标图片\r
- imageViewCoordinate = new UIImageView();\r
- if (imageViewCoordinate == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail");\r
- return;\r
- }\r
- imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y);\r
- imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH);\r
- imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT);\r
- Add(imageViewCoordinate);\r
-\r
- // 心电图坐标适配\r
- chart = new UIChartPolyline();\r
- if (chart == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail");\r
- return;\r
- }\r
- chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
- chart->SetWidth(COORDINATE_WIDTH);\r
- chart->SetHeight(COORDINATE_HEIGHT);\r
- chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
- chart->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
- chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width\r
-\r
- UIXAxis &xAxis = chart->GetXAxis();\r
- UIYAxis &yAxis = chart->GetYAxis();\r
- xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数\r
- yAxis.SetDataRange(0, COORDINATE_HEIGHT);\r
- xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
- yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
- chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
- Add(chart);\r
-}\r
-\r
-void HeartRateView::InsertTopAndBottomRateImage(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start");\r
- imageViewTop = new UIImageView();\r
- imageViewBottom = new UIImageView();\r
- if (imageViewTop == nullptr || imageViewBottom == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail");\r
- return;\r
- }\r
- imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y);\r
- imageViewTop->SetWidth(TOP_IMAGE_WIDTH);\r
- imageViewTop->SetHeight(TOP_IMAGE_HEIGHT);\r
- Add(imageViewTop);\r
- imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y);\r
- imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH);\r
- imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT);\r
- Add(imageViewBottom);\r
-}\r
-\r
-void HeartRateView::UpdataTopAndBottomRate(void)\r
-{\r
- if (chart == nullptr) {\r
- return;\r
- }\r
- if (dataTopAndbottom != nullptr) {\r
- chart->DeleteDataSerial(dataTopAndbottom);\r
- delete dataTopAndbottom;\r
- dataTopAndbottom = nullptr;\r
- }\r
- dataTopAndbottom = new UIChartDataSerial();\r
- if (dataTopAndbottom == nullptr) {\r
- return;\r
- }\r
- if (dataNume != 1) {\r
- dataTopAndbottom->SetMaxDataCount(dataNume); // number of data points\r
- dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points\r
- } else {\r
- Point tmp[NUM_2];\r
- tmp[0].x = tmp[1].x = rateDataTmp[0].x;\r
- tmp[0].y = tmp[1].y = rateDataTmp[0].y;\r
- dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points\r
- dataTopAndbottom->AddPoints(tmp, NUM_2); // number of data points\r
- }\r
- dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明\r
- chart->AddDataSerial(dataTopAndbottom);\r
- chart->Invalidate();\r
-\r
- UIChartDataSerial::PointStyle pointStyle;\r
- // 最低心跳\r
- dataTopAndbottom->EnableBottomPoint(true);\r
- pointStyle.radius = BOTTOM_RADIUS; // Inner radius\r
- pointStyle.fillColor = Color::Gray();\r
- pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width\r
- pointStyle.strokeColor = Color::Black();\r
- dataTopAndbottom->SetBottomPointStyle(pointStyle);\r
- chart->Invalidate();\r
-\r
- uint16_t bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
- // 最高心跳\r
- dataTopAndbottom->EnableTopPoint(true);\r
- pointStyle.fillColor = Color::Red();\r
- pointStyle.radius = TOP_RADIUS; // Inner radius\r
- pointStyle.strokeColor = Color::Black();\r
- pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width\r
- dataTopAndbottom->SetTopPointStyle(pointStyle);\r
- chart->Invalidate();\r
-\r
- uint16_t top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
- if (top <= HEART_RATE_LIMIT_UPPER) {\r
- maxRate = (maxRate >= top) ? maxRate : top;\r
- }\r
- if (bottom != 0) {\r
- minRate = (minRate <= bottom) ? minRate : bottom;\r
- }\r
-}\r
-\r
-void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index)\r
-{\r
- Point tmp[NUM_2];\r
-\r
- if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM) {\r
- return;\r
- }\r
-\r
- tmp[0].x = tmp[1].x = rateData[index].x;\r
- tmp[0].y = tmp[1].y = rateData[index].y;\r
-\r
- dataSerial[serialIndex] = new UIChartDataSerial();\r
- if (dataSerial[serialIndex] == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex);\r
- serialIndex++;\r
- return;\r
- }\r
-\r
- dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点\r
- dataSerial[serialIndex]->AddPoints(tmp, NUM_2);\r
- dataSerial[serialIndex]->SetLineColor(Color::Red());\r
- dataSerial[serialIndex]->SetFillColor(Color::Red());\r
- dataSerial[serialIndex]->EnableGradient(true);\r
-\r
- chart->AddDataSerial(dataSerial[serialIndex]);\r
- chart->Invalidate();\r
- serialIndex++;\r
-}\r
-\r
-void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume)\r
-{\r
- uint16_t i = 0;\r
- uint16_t j = 0;\r
- uint16_t tmp = 1;\r
- if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM) {\r
- return;\r
- }\r
-\r
- while (i < rateDataNume) {\r
- while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4)) { // 15分钟对应的秒数\r
- tmp++;\r
- j++;\r
- }\r
- if (tmp == 1) {\r
- ElectrocardiogramOnePoint(rateData, i);\r
- } else {\r
- if (serialIndex >= HEART_AVE_NUM) {\r
- return;\r
- }\r
- if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0) {\r
- dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points\r
- chart->Invalidate();\r
- } else {\r
- dataSerial[serialIndex] = new UIChartDataSerial();\r
- if (dataSerial[serialIndex] == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex);\r
- serialIndex++;\r
- return;\r
- }\r
-\r
- dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points\r
- dataSerial[serialIndex]->AddPoints(rateData + i, tmp); // number of data points\r
- dataSerial[serialIndex]->SetLineColor(Color::Red());\r
- dataSerial[serialIndex]->SetFillColor(Color::Red());\r
- dataSerial[serialIndex]->EnableGradient(true);\r
-\r
- chart->AddDataSerial(dataSerial[serialIndex]);\r
- chart->Invalidate();\r
- serialIndex++;\r
- }\r
- }\r
- i += tmp;\r
- j = i;\r
- tmp = 1;\r
- }\r
-}\r
-\r
-void HeartRateView::HeartRateElectrocardiogram(void)\r
-{\r
- if (dataNume == 0) {\r
- return;\r
- }\r
- serialIndex = 0;\r
- if (dataNume != 1) {\r
- ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点\r
- } else {\r
- ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点\r
- }\r
- currIndex = dataNume;\r
-}\r
-\r
-void HeartRateView::HeartbeatImageAnimator()\r
-{\r
- imageAnimator = new UIImageAnimatorView();\r
- if (imageAnimator == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail");\r
- return;\r
- }\r
- imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT);\r
- imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY);\r
- imageAnimator->SetRepeat(true);\r
- Add(imageAnimator);\r
- imageAnimator->Start();\r
-}\r
-\r
-void HeartRateView::HeartbeatImageAnimatorStart(void)\r
-{\r
- if (imageAnimator != nullptr) {\r
- imageAnimator->Start();\r
- }\r
-}\r
-\r
-void HeartRateView::HeartbeatImageAnimatorStop(void)\r
-{\r
- if (imageAnimator != nullptr) {\r
- imageAnimator->Stop();\r
- }\r
-}\r
-\r
-bool HeartRateView::InitView(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitView");\r
- HeartRateDataProc();\r
- HeartRateLabelDisplay();\r
- HeartbeatImageAnimator();\r
- HeartRateCoordinate();\r
- InsertTopAndBottomRateImage();\r
- HeartRateElectrocardiogram();\r
- UpdataTopAndBottomRate();\r
- HeartbeatImageAnimatorStop();\r
- InitRefreshInterface();\r
- return true;\r
-}\r
-\r
-void HeartRateView::PreLoad(void)\r
-{\r
- if (!viewiInitStatus) {\r
- if (InitView()) {\r
- viewiInitStatus = true;\r
- }\r
- }\r
-\r
- if (!resLoadStatus) {\r
- ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP);\r
- ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM);\r
- ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR);\r
- resLoadStatus = true;\r
- }\r
-}\r
-\r
-void HeartRateView::UnLoad(void)\r
-{\r
- if (resLoadStatus) {\r
- ImageInfo* img = nullptr;\r
- imageViewTop->SetSrc(img);\r
- imageViewBottom->SetSrc(img);\r
- imageViewCoordinate->SetSrc(img);\r
- ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES);\r
- resLoadStatus = false;\r
- }\r
-}\r
-\r
-void HeartRateView::InitRefreshInterface(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface");\r
-\r
- Point *rateData = HeartModel::GetInstance()->GetAveHeartRate();\r
- uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount();\r
- SetHeartRateData(rateData, sizeof(Point) * len);\r
- uint16_t maxHeartRate = HeartModel::GetInstance()->GetHeartRateMax();\r
- uint16_t minHeartRate = HeartModel::GetInstance()->GetHeartRateMin();\r
- RefreshElectrocardiogram();\r
- if (maxHeartRate > 0 && maxHeartRate < HEART_RATE_LIMIT_UPPER) {\r
- RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax());\r
- }\r
- if (minHeartRate > 0 && minHeartRate < HEART_RATE_LIMIT_UPPER) {\r
- RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin());\r
- }\r
-}\r
-\r
-// 刷新心率曲线\r
-void HeartRateView::RefreshElectrocardiogram(void)\r
-{\r
- int32_t ret = HeartRateDataProc();\r
- if (ret != OHOS_SUCCESS) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail");\r
- return;\r
- }\r
- Point *rate = rateDataTmp;\r
-\r
- if (chart == nullptr) {\r
- return;\r
- }\r
-\r
- if (currIndex >= HEART_AVE_NUM) {\r
- currIndex = HEART_AVE_NUM;\r
- }\r
- if (dataNume > currIndex) {\r
- uint16_t tmp = dataNume - currIndex;\r
- if (currIndex > 0) {\r
- rate += (currIndex - 1);\r
- tmp += 1;\r
- }\r
- ElectrocardiogramMultiPoint(rate, tmp);\r
- currIndex = dataNume;\r
- } else if (dataNume == currIndex) { // 当前点平均心率刷新\r
- if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr) {\r
- Point modPoint;\r
- modPoint.x = rate[currIndex - 1].x;\r
- modPoint.y = rate[currIndex - 1].y;\r
-\r
- uint16_t count = dataSerial[serialIndex - 1]->GetDataCount();\r
- dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint);\r
- chart->Invalidate();\r
- }\r
- } else {\r
- return;\r
- }\r
- UpdataTopAndBottomRate(); // 最高、最低心率\r
-}\r
-\r
-// 清空心率曲线\r
-void HeartRateView::ClearElectrocardiogram(void)\r
-{\r
- int32_t i;\r
- dataNume = 0;\r
- currIndex = 0;\r
- maxRate = 0;\r
- minRate = HEART_RATE_LIMIT_UPPER;\r
- InitHeartRateData();\r
-\r
- if (chart == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr");\r
- return;\r
- }\r
-\r
- if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr) {\r
- ratePerSec->SetText("--");\r
- topRate->SetText("--");\r
- bottomRate->SetText("--");\r
- restRate->SetText("--");\r
- }\r
-\r
- chart->DeleteDataSerial(dataTopAndbottom);\r
- delete dataTopAndbottom;\r
- dataTopAndbottom = nullptr;\r
- for (i = 0; i < serialIndex; i++) {\r
- delete dataSerial[i];\r
- dataSerial[i] = nullptr;\r
- }\r
- chart->ClearDataSerial();\r
-\r
- serialIndex = 0;\r
- chart->Invalidate();\r
-}\r
-\r
-// 刷新每秒上报的心率\r
-void HeartRateView::RefreshHeartRatePerSec(uint16_t value)\r
-{\r
- char heartRate[NUM_4] = "--";\r
- int32_t ret = 0;\r
-\r
- if (ratePerSec == nullptr) {\r
- return;\r
- }\r
-\r
- if (value == 0) {\r
- ratePerSec->SetText("--");\r
- HeartbeatImageAnimatorStop();\r
- return;\r
- }\r
- HeartbeatImageAnimatorStart();\r
- if (value > NUM_99) {\r
- ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
- } else {\r
- ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
- }\r
- if (ret > EOK) {\r
- ratePerSec->SetText(heartRate);\r
- }\r
-}\r
-\r
-// 刷新最大心率\r
-void HeartRateView::RefreshHeartRateMax(uint16_t max)\r
-{\r
- char top[NUM_4] = "--";\r
- int32_t ret = 0;\r
- maxRate = (maxRate >= max) ? maxRate : max;\r
- if (topRate == nullptr) {\r
- return;\r
- }\r
- if (maxRate <= HEART_RATE_LIMIT_LOWER) {\r
- topRate->SetText("--");\r
- return;\r
- }\r
- ret = sprintf_s(top, sizeof(top), "%u", maxRate);\r
- if (ret > EOK) {\r
- topRate->SetText(top);\r
- }\r
-}\r
-\r
-// 刷新最小心率\r
-void HeartRateView::RefreshHeartRateMin(uint16_t min)\r
-{\r
- char bottom[NUM_4] = "--";\r
- int32_t ret = 0;\r
-\r
- minRate = (minRate <= min) ? minRate : min;\r
- if (bottomRate == nullptr) {\r
- return;\r
- }\r
- if (minRate >= HEART_RATE_LIMIT_UPPER) {\r
- bottomRate->SetText("--");\r
- return;\r
- }\r
- ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate);\r
- if (ret > EOK) {\r
- bottomRate->SetText(bottom);\r
- }\r
-}\r
-\r
-// 刷新静息心率\r
-void HeartRateView::RefreshRestHeartRate(uint16_t value)\r
-{\r
- char heartRate[NUM_4] = "--";\r
- int32_t ret = 0;\r
-\r
- if (restRate == nullptr) {\r
- return;\r
- }\r
-\r
- if (value == 0 || value == (uint16_t)0xFFFF) { // 无效值\r
- restRate->SetText("--");\r
- } else {\r
- if (value > NUM_99) {\r
- ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
- } else {\r
- ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
- }\r
-\r
- if (ret > EOK) {\r
- restRate->SetText(heartRate);\r
- }\r
- }\r
-}\r
-} // namespace OHOS\r
+ // 心跳image\r
+ static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = {\r
+ {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+\r
+ {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+ };\r
+\r
+ HeartRateView::HeartRateView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView");\r
+ dataNume = 0;\r
+ currIndex = 0;\r
+ serialIndex = 0;\r
+ maxRate = 0;\r
+ minRate = HEART_RATE_LIMIT_UPPER;\r
+ InitHeartRateData();\r
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+ g_pHeartRateView = this;\r
+ }\r
+\r
+ HeartRateView::~HeartRateView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView");\r
+ if (viewiInitStatus == true)\r
+ {\r
+ int32_t i;\r
+ RemoveAll();\r
+ UnLoadHeartRateImageRes();\r
+ delete imageViewCoordinate;\r
+ imageViewCoordinate = nullptr;\r
+\r
+ chart->ClearDataSerial();\r
+ for (i = 0; i < HEART_AVE_NUM; i++)\r
+ {\r
+ delete dataSerial[i];\r
+ dataSerial[i] = nullptr;\r
+ }\r
+ delete chart;\r
+ chart = nullptr;\r
+ delete imageViewTop;\r
+ imageViewTop = nullptr;\r
+ delete imageViewBottom;\r
+ imageViewBottom = nullptr;\r
+ delete dataTopAndbottom;\r
+ dataTopAndbottom = nullptr;\r
+ imageAnimator->Stop();\r
+ delete imageAnimator;\r
+ imageAnimator = nullptr;\r
+ delete topRate;\r
+ topRate = nullptr;\r
+ delete bottomRate;\r
+ bottomRate = nullptr;\r
+ delete ratePerSec;\r
+ ratePerSec = nullptr;\r
+ delete ratePerSecText;\r
+ ratePerSecText = nullptr;\r
+ delete restRate;\r
+ restRate = nullptr;\r
+ delete restRateText1;\r
+ restRateText1 = nullptr;\r
+ delete restRateText2;\r
+ restRateText2 = nullptr;\r
+ }\r
+ g_pHeartRateView = nullptr;\r
+ }\r
+\r
+ HeartRateView *HeartRateView::GetInstance(void)\r
+ {\r
+ return g_pHeartRateView;\r
+ }\r
+\r
+ int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值\r
+ {\r
+ int32_t ret;\r
+\r
+ heartRateData[0].x = INVALID_HEART_VALUE;\r
+ heartRateData[0].y = INVALID_HEART_VALUE;\r
+\r
+ ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM);\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret);\r
+ }\r
+ return ret;\r
+ }\r
+\r
+ int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize)\r
+ {\r
+ int ret;\r
+\r
+ if (rateData == nullptr)\r
+ {\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ if (rateDataSize > sizeof(Point) * HEART_AVE_NUM)\r
+ {\r
+ rateDataSize = sizeof(Point) * HEART_AVE_NUM;\r
+ }\r
+ InitHeartRateData();\r
+ ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize);\r
+ if (ret != EOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret);\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ return OHOS_SUCCESS;\r
+ }\r
+ int32_t HeartRateView::HeartRateDataProc(void)\r
+ {\r
+ int32_t i, ret;\r
+ Point datain[HEART_AVE_NUM];\r
+ ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM);\r
+ if (ret != EOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret);\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值\r
+ if (ret != EOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret);\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ dataNume = 0;\r
+ for (i = 0; i < HEART_AVE_NUM; i += 15) // 每跨过15个点代表一个小时\r
+ {\r
+ if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 &&\r
+ datain[i].y <= HEART_RATE_LIMIT_UPPER)\r
+ {\r
+ rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE;\r
+ rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE;\r
+ dataNume++;\r
+ }\r
+ }\r
+ return OHOS_SUCCESS;\r
+ }\r
+ void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo)\r
+ {\r
+ label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize);\r
+ label->SetPosition(labelInfo.x, labelInfo.y);\r
+ label->Resize(labelInfo.width, labelInfo.height);\r
+ label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+ Add(label);\r
+ }\r
+\r
+ void HeartRateView::HeartRateLabelDisplay(void)\r
+ {\r
+ LabelInfo PerSecLabel = {PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y,\r
+ PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT};\r
+ LabelInfo PerSecTextLabel = {PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y,\r
+ PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT};\r
+\r
+ LabelInfo topLabel = {HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT};\r
+ LabelInfo bottomLabel = {HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH,\r
+ BOTTOM_TEXT_HEIGHT};\r
+\r
+ LabelInfo restRateLabel = {REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH,\r
+ REST_HEART_RATE_HEIGHT};\r
+ LabelInfo restRateTextLabel1 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1,\r
+ REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1};\r
+ LabelInfo restRateTextLabel2 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2,\r
+ REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2};\r
+\r
+ topRate = new UILabel();\r
+ bottomRate = new UILabel();\r
+ ratePerSec = new UILabel();\r
+ ratePerSecText = new UILabel();\r
+ restRate = new UILabel();\r
+ restRateText1 = new UILabel();\r
+ restRateText2 = new UILabel();\r
+\r
+ if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr ||\r
+ restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail");\r
+ }\r
+\r
+ // 实时心率\r
+ SetLabel(ratePerSec, PerSecLabel);\r
+ SetLabel(ratePerSecText, PerSecTextLabel);\r
+ ratePerSec->SetText("--");\r
+ ratePerSec->SetFont(GILROY_BOLD_FONT, PERSEC_HEART_RATE_FONT_SIZE);\r
+ ratePerSecText->SetText("次/分");\r
+\r
+ // 最高最低心率\r
+ SetLabel(topRate, topLabel);\r
+ SetLabel(bottomRate, bottomLabel);\r
+ topRate->SetText("--");\r
+ bottomRate->SetText("--");\r
+\r
+ // 静息心率\r
+ SetLabel(restRate, restRateLabel);\r
+ SetLabel(restRateText1, restRateTextLabel1);\r
+ SetLabel(restRateText2, restRateTextLabel2);\r
+ restRateText1->SetText("静息");\r
+ restRate->SetText("--");\r
+ restRateText2->SetText("次/分");\r
+ }\r
+\r
+ void HeartRateView::HeartRateCoordinate(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start");\r
+ // 坐标图片\r
+ imageViewCoordinate = new UIImageView();\r
+ if (imageViewCoordinate == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail");\r
+ return;\r
+ }\r
+ imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y);\r
+ imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH);\r
+ imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT);\r
+ Add(imageViewCoordinate);\r
+\r
+ // 心电图坐标适配\r
+ chart = new UIChartPolyline();\r
+ if (chart == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail");\r
+ return;\r
+ }\r
+ chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
+ chart->SetWidth(COORDINATE_WIDTH);\r
+ chart->SetHeight(COORDINATE_HEIGHT);\r
+ chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ chart->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+ chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width\r
+\r
+ UIXAxis &xAxis = chart->GetXAxis();\r
+ UIYAxis &yAxis = chart->GetYAxis();\r
+ xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数\r
+ yAxis.SetDataRange(0, COORDINATE_HEIGHT);\r
+ xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+ yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+ chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
+\r
+\r
+ // Point pointArray[5] = {{0, 200}, {1, 70}, {2, 80}, {3, 70}, {4, 43}};\r
+ // dataSerial->AddPoints(pointArray, 5);\r
+ // chart->AddDataSerial(dataSerial);\r
+\r
+ Add(chart);\r
+ }\r
+\r
+ void HeartRateView::InsertTopAndBottomRateImage(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start");\r
+ imageViewTop = new UIImageView();\r
+ imageViewBottom = new UIImageView();\r
+ if (imageViewTop == nullptr || imageViewBottom == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail");\r
+ return;\r
+ }\r
+ imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y);\r
+ imageViewTop->SetWidth(TOP_IMAGE_WIDTH);\r
+ imageViewTop->SetHeight(TOP_IMAGE_HEIGHT);\r
+ Add(imageViewTop);\r
+ imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y);\r
+ imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH);\r
+ imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT);\r
+ Add(imageViewBottom);\r
+ }\r
+\r
+ void HeartRateView::UpdataTopAndBottomRate(void)\r
+ {\r
+ uint16_t bottom, top;\r
+ if (chart == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ if (dataTopAndbottom != nullptr)\r
+ {\r
+ chart->DeleteDataSerial(dataTopAndbottom);\r
+ delete dataTopAndbottom;\r
+ dataTopAndbottom = nullptr;\r
+ }\r
+ dataTopAndbottom = new UIChartDataSerial();\r
+ if (dataTopAndbottom == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ if (dataNume != 1)\r
+ {\r
+ dataTopAndbottom->SetMaxDataCount(dataNume); // number of data points\r
+ dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points\r
+ }\r
+ else\r
+ {\r
+ Point tmp[NUM_2];\r
+ tmp[0].x = tmp[1].x = rateDataTmp[0].x;\r
+ tmp[0].y = tmp[1].y = rateDataTmp[0].y;\r
+ dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points\r
+ dataTopAndbottom->AddPoints(tmp, NUM_2); // number of data points\r
+ }\r
+ dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明\r
+ chart->AddDataSerial(dataTopAndbottom);\r
+ chart->Invalidate();\r
+\r
+ UIChartDataSerial::PointStyle pointStyle;\r
+ // 最低心跳\r
+ dataTopAndbottom->EnableBottomPoint(true);\r
+ pointStyle.radius = BOTTOM_RADIUS; // Inner radius\r
+ pointStyle.fillColor = Color::Gray();\r
+ pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width\r
+ pointStyle.strokeColor = Color::Black();\r
+ dataTopAndbottom->SetBottomPointStyle(pointStyle);\r
+ chart->Invalidate();\r
+\r
+ bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
+ // 最高心跳\r
+ dataTopAndbottom->EnableTopPoint(true);\r
+ pointStyle.fillColor = Color::Red();\r
+ pointStyle.radius = TOP_RADIUS; // Inner radius\r
+ pointStyle.strokeColor = Color::Black();\r
+ pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width\r
+ dataTopAndbottom->SetTopPointStyle(pointStyle);\r
+ chart->Invalidate();\r
+\r
+ top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
+ if (top <= HEART_RATE_LIMIT_UPPER)\r
+ {\r
+ maxRate = (maxRate >= top) ? maxRate : top;\r
+ }\r
+ if (bottom != 0)\r
+ {\r
+ minRate = (minRate <= bottom) ? minRate : bottom;\r
+ }\r
+ }\r
+\r
+ void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index)\r
+ {\r
+ Point tmp[NUM_2];\r
+\r
+ if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM)\r
+ {\r
+ return;\r
+ }\r
+\r
+ tmp[0].x = tmp[1].x = rateData[index].x;\r
+ tmp[0].y = tmp[1].y = rateData[index].y;\r
+\r
+ dataSerial[serialIndex] = new UIChartDataSerial();\r
+ if (dataSerial[serialIndex] == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex);\r
+ serialIndex++;\r
+ return;\r
+ }\r
+\r
+ dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点\r
+ dataSerial[serialIndex]->AddPoints(tmp, NUM_2);\r
+ dataSerial[serialIndex]->SetLineColor(Color::Red());\r
+ dataSerial[serialIndex]->SetFillColor(Color::Red());\r
+ dataSerial[serialIndex]->EnableGradient(true);\r
+\r
+ chart->AddDataSerial(dataSerial[serialIndex]);\r
+ chart->Invalidate();\r
+ serialIndex++;\r
+ }\r
+\r
+ void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume)\r
+ {\r
+ uint16_t i = 0;\r
+ uint16_t j = 0;\r
+ uint16_t tmp = 1;\r
+ if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM)\r
+ {\r
+ return;\r
+ }\r
+\r
+ while (i < rateDataNume)\r
+ {\r
+ while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4))\r
+ { // 15分钟对应的秒数\r
+ tmp++;\r
+ j++;\r
+ }\r
+ if (tmp == 1)\r
+ {\r
+ ElectrocardiogramOnePoint(rateData, i);\r
+ }\r
+ else\r
+ {\r
+ if (serialIndex >= HEART_AVE_NUM)\r
+ {\r
+ return;\r
+ }\r
+ if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0)\r
+ {\r
+ dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points\r
+ chart->Invalidate();\r
+ }\r
+ else\r
+ {\r
+ dataSerial[serialIndex] = new UIChartDataSerial();\r
+ if (dataSerial[serialIndex] == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex);\r
+ serialIndex++;\r
+ return;\r
+ }\r
+\r
+ dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points\r
+ dataSerial[serialIndex]->AddPoints(rateData + i, tmp); // number of data points\r
+ dataSerial[serialIndex]->SetLineColor(Color::Red());\r
+ dataSerial[serialIndex]->SetFillColor(Color::Red());\r
+ dataSerial[serialIndex]->EnableGradient(true);\r
+\r
+ chart->AddDataSerial(dataSerial[serialIndex]);\r
+ chart->Invalidate();\r
+ serialIndex++;\r
+ }\r
+ }\r
+ i += tmp;\r
+ j = i;\r
+ tmp = 1;\r
+ }\r
+ }\r
+\r
+ void HeartRateView::HeartRateElectrocardiogram(void)\r
+ {\r
+ if (dataNume == 0)\r
+ {\r
+ return;\r
+ }\r
+ serialIndex = 0;\r
+ if (dataNume != 1)\r
+ {\r
+ ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点\r
+ }\r
+ else\r
+ {\r
+ ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点\r
+ }\r
+ currIndex = dataNume;\r
+ }\r
+\r
+ void HeartRateView::HeartbeatImageAnimator()\r
+ {\r
+ imageAnimator = new UIImageAnimatorView();\r
+ if (imageAnimator == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail");\r
+ return;\r
+ }\r
+ imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT);\r
+ imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY);\r
+ imageAnimator->SetRepeat(true);\r
+ Add(imageAnimator);\r
+ imageAnimator->Start();\r
+ }\r
+\r
+ void HeartRateView::HeartbeatImageAnimatorStart(void)\r
+ {\r
+ if (imageAnimator != nullptr)\r
+ {\r
+ imageAnimator->Start();\r
+ }\r
+ }\r
+\r
+ void HeartRateView::HeartbeatImageAnimatorStop(void)\r
+ {\r
+ if (imageAnimator != nullptr)\r
+ {\r
+ imageAnimator->Stop();\r
+ }\r
+ }\r
+\r
+ bool HeartRateView::InitView(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InitView");\r
+ HeartRateDataProc();\r
+ HeartRateLabelDisplay();\r
+ HeartbeatImageAnimator();\r
+ HeartRateCoordinate();\r
+ InsertTopAndBottomRateImage();\r
+ HeartRateElectrocardiogram();\r
+ UpdataTopAndBottomRate();\r
+ // HeartbeatImageAnimatorStop(); 进入界面进行 动画播放\r
+ InitRefreshInterface();\r
+ return true;\r
+ }\r
+\r
+ /*预加载心率图片资源*/\r
+ void HeartRateView::PreLoadHeartRateImageRes(void)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoadHeartRateImageRes");\r
+ if (!resLoadStatus)\r
+ {\r
+ /*心率背景图*/\r
+ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_RATE_TOP);\r
+ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_RATE_BOTTOM);\r
+ ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_RATE_COOR);\r
+ resLoadStatus = true;\r
+ }\r
+ }\r
+\r
+ /*卸载心率图片资源*/\r
+ void HeartRateView::UnLoadHeartRateImageRes(void)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::UnLoadHeartRateImageRes");\r
+ if (resLoadStatus)\r
+ {\r
+ ImageInfo *img = nullptr;\r
+ imageViewTop->SetSrc(img);\r
+ imageViewBottom->SetSrc(img);\r
+ imageViewCoordinate->SetSrc(img);\r
+ // ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_TOP, HEART_IAMGES);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_BOTTOM, HEART_IAMGES);\r
+ ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_COOR, HEART_IAMGES);\r
+ resLoadStatus = false;\r
+ }\r
+ }\r
+\r
+ void HeartRateView::PreLoad(void)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoad");\r
+ if (!viewiInitStatus)\r
+ {\r
+ if (InitView())\r
+ {\r
+ viewiInitStatus = true;\r
+ }\r
+ }\r
+ PreLoadHeartRateImageRes();\r
+ }\r
+\r
+ void HeartRateView::UnLoad(void)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::UnLoad");\r
+ UnLoadHeartRateImageRes();\r
+ }\r
+\r
+ void HeartRateView::InitRefreshInterface(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface");\r
+\r
+ Point *rateData = HeartModel::GetInstance()->GetAveHeartRate();\r
+ uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount();\r
+ SetHeartRateData(rateData, sizeof(Point) * len);\r
+ // 展示最大,最小,最近一次心率\r
+ uint16_t maxRate = HeartModel::GetInstance()->GetHeartRateMax();\r
+ uint16_t minRate = HeartModel::GetInstance()->GetHeartRateMin();\r
+ uint16_t perRate = HeartModel::GetInstance()->GetHeartdata();\r
+ RefreshElectrocardiogram();\r
+ if (maxRate > 0 && maxRate < HEART_RATE_LIMIT_UPPER)\r
+ {\r
+ RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax());\r
+ }\r
+ if (minRate > 0 && minRate < HEART_RATE_LIMIT_UPPER)\r
+ {\r
+ RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin());\r
+ }\r
+ if (perRate > 0 && perRate < HEART_RATE_LIMIT_UPPER)\r
+ {\r
+ HeartModel::GetInstance()->SetHeartRatePerSec(perRate);\r
+ }\r
+ }\r
+\r
+ // 刷新心率曲线\r
+ void HeartRateView::RefreshElectrocardiogram(void)\r
+ {\r
+ int32_t ret;\r
+ uint16_t tmp, count;\r
+ Point *rate = nullptr;\r
+ Point modPoint;\r
+\r
+ ret = HeartRateDataProc();\r
+ if (ret != OHOS_SUCCESS)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail");\r
+ return;\r
+ }\r
+ rate = rateDataTmp;\r
+\r
+ if (chart == nullptr)\r
+ {\r
+ return;\r
+ }\r
+\r
+ if (currIndex >= HEART_AVE_NUM)\r
+ {\r
+ currIndex = HEART_AVE_NUM;\r
+ }\r
+ if (dataNume > currIndex)\r
+ {\r
+ tmp = dataNume - currIndex;\r
+ if (currIndex > 0)\r
+ {\r
+ rate += (currIndex - 1);\r
+ tmp += 1;\r
+ }\r
+ ElectrocardiogramMultiPoint(rate, tmp);\r
+ currIndex = dataNume;\r
+ }\r
+ else if (dataNume == currIndex)\r
+ { // 当前点平均心率刷新\r
+ if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr)\r
+ {\r
+ modPoint.x = rate[currIndex - 1].x;\r
+ modPoint.y = rate[currIndex - 1].y;\r
+\r
+ count = dataSerial[serialIndex - 1]->GetDataCount();\r
+ dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint);\r
+ chart->Invalidate();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ return;\r
+ }\r
+ UpdataTopAndBottomRate(); // 最高、最低心率\r
+ }\r
+\r
+ // 清空心率曲线\r
+ void HeartRateView::ClearElectrocardiogram(void)\r
+ {\r
+ int32_t i;\r
+ dataNume = 0;\r
+ currIndex = 0;\r
+ maxRate = 0;\r
+ minRate = HEART_RATE_LIMIT_UPPER;\r
+ InitHeartRateData();\r
+\r
+ if (chart == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr");\r
+ return;\r
+ }\r
+\r
+ if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr)\r
+ {\r
+ ratePerSec->SetText("--");\r
+ topRate->SetText("--");\r
+ bottomRate->SetText("--");\r
+ restRate->SetText("--");\r
+ }\r
+\r
+ chart->DeleteDataSerial(dataTopAndbottom);\r
+ delete dataTopAndbottom;\r
+ dataTopAndbottom = nullptr;\r
+ for (i = 0; i < serialIndex; i++)\r
+ {\r
+ delete dataSerial[i];\r
+ dataSerial[i] = nullptr;\r
+ }\r
+ chart->ClearDataSerial();\r
+\r
+ serialIndex = 0;\r
+ chart->Invalidate();\r
+ }\r
+\r
+ // 刷新每秒上报的心率\r
+ void HeartRateView::RefreshHeartRatePerSec(uint16_t value)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView %d", value);\r
+\r
+ char heartRate[NUM_4] = "--";\r
+ int32_t ret = 0;\r
+\r
+ if (ratePerSec == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ HeartbeatImageAnimatorStart(); // 界面创建实现动画跳动\r
+ if (value == 0)\r
+ {\r
+ ratePerSec->SetText("--");\r
+ // HeartbeatImageAnimatorStop();\r
+ return;\r
+ }\r
+ // HeartbeatImageAnimatorStart();\r
+ if (value > NUM_99)\r
+ {\r
+ ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
+ }\r
+ else\r
+ {\r
+ ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
+ }\r
+ if (ret > EOK)\r
+ {\r
+ ratePerSec->SetText(heartRate);\r
+ }\r
+ }\r
+\r
+ // 刷新最大心率\r
+ void HeartRateView::RefreshHeartRateMax(uint16_t max)\r
+ {\r
+ char top[NUM_4] = "--";\r
+ int32_t ret = 0;\r
+ maxRate = (maxRate >= max) ? maxRate : max;\r
+ if (topRate == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ if (maxRate <= HEART_RATE_LIMIT_LOWER)\r
+ {\r
+ topRate->SetText("--");\r
+ return;\r
+ }\r
+ ret = sprintf_s(top, sizeof(top), "%u", maxRate);\r
+ if (ret > EOK)\r
+ {\r
+ topRate->SetText(top);\r
+ }\r
+ }\r
+\r
+ // 刷新最小心率\r
+ void HeartRateView::RefreshHeartRateMin(uint16_t min)\r
+ {\r
+ char bottom[NUM_4] = "--";\r
+ int32_t ret = 0;\r
+\r
+ minRate = (minRate <= min) ? minRate : min;\r
+ if (bottomRate == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ if (minRate >= HEART_RATE_LIMIT_UPPER)\r
+ {\r
+ bottomRate->SetText("--");\r
+ return;\r
+ }\r
+ ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate);\r
+ if (ret > EOK)\r
+ {\r
+ bottomRate->SetText(bottom);\r
+ }\r
+ }\r
+\r
+ // 刷新静息心率\r
+ void HeartRateView::RefreshRestHeartRate(uint16_t value)\r
+ {\r
+ char heartRate[NUM_4] = "--";\r
+ int32_t ret = 0;\r
+\r
+ if (restRate == nullptr)\r
+ {\r
+ return;\r
+ }\r
+\r
+ if (value == 0 || value == (uint16_t)0xFFFF)\r
+ {\r
+ // 无效值\r
+ restRate->SetText("--");\r
+ }\r
+ else\r
+ {\r
+ if (value > NUM_99)\r
+ {\r
+ ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
+ }\r
+ else\r
+ {\r
+ ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
+ }\r
+\r
+ if (ret > EOK)\r
+ {\r
+ restRate->SetText(heartRate);\r
+ }\r
+ }\r
+ }\r
+#if 0\r
+#ifdef __cplusplus\r
+ extern "C"\r
+ {\r
+#endif\r
+ /* 定时器回调函数 */\r
+ void HeartTimerCallback()\r
+ {\r
+ g_motionTimes++;\r
+ HeartCardPresenter *gHeartCardPresenter = HeartPresenter::GetInstance();\r
+ if (gHeartCardPresenter == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartTimerCallback::gHeartCardPresenter new fail");\r
+ return;\r
+ }\r
+ // gHeartCardPresenter->ModifiesTime();\r
+ // PRINT("HeartTimerCallback\r\n");\r
+ }\r
+\r
+ /* 开启定时器 */\r
+ void InitTimer(void)\r
+ {\r
+ if (g_startCounting != NULL)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer already exists!!");\r
+ return;\r
+ }\r
+ g_startCounting = osTimerNew((osTimerFunc_t)HeartTimerCallback, osTimerPeriodic, NULL, NULL);\r
+ if (g_startCounting == NULL)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer osTimerNew failed!!");\r
+ return;\r
+ }\r
+ int tick = osMs2Tick(MS_ONE_SECONDS);\r
+ osStatus_t retTimer = osTimerStart(g_startCounting, tick);\r
+ if (retTimer != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer osTimerStart failed, ret = %lx!!", retTimer);\r
+ if (g_startCounting != NULL)\r
+ {\r
+ retTimer = osTimerDelete(g_startCounting);\r
+ if (retTimer != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::osTimerDelete failed, ret = %lx!!", retTimer);\r
+ return;\r
+ }\r
+ g_startCounting = NULL;\r
+ }\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer!");\r
+ return;\r
+ }\r
+ }\r
+ /* 关闭定时器 */\r
+ void DisableTimer(void)\r
+ {\r
+ if (g_startCounting != NULL)\r
+ {\r
+ osStatus_t ret = osTimerDelete(g_startCounting);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret);\r
+ return;\r
+ }\r
+ g_startCounting = NULL;\r
+ PRINT("g_motionTimes:%d\r\n", sportdata->duration);\r
+ g_motionTimes = 0;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisableTimer!");\r
+ }\r
+ }\r
+ /* 暂停定时器 */\r
+ void PauseTimer(void)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_startCounting != NULL)\r
+ {\r
+ // 暂停定时器,但不删除它\r
+ osStatus_t ret = osTimerStop(g_startCounting);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopWatch_PauseTimer osTimerStop failed, ret = %lx!!", ret);\r
+ }\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PauseTimer!");\r
+ }\r
+ }\r
+\r
+ /*恢复定时器*/\r
+ void ResumeTimer(void)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_startCounting != NULL)\r
+ {\r
+ int tick = osMs2Tick(MS_ONE_SECONDS);\r
+ // 恢复定时器\r
+ osStatus_t ret = osTimerStart(g_startCounting, tick);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ResumeTimer osTimerStart failed, ret = %lx!!", ret);\r
+ }\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ResumeTimer!");\r
+ }\r
+ }\r
+\r
+#ifdef __cplusplus\r
+ }\r
+#endif\r
+#endif\r
+} // namespace OHOS
\ No newline at end of file
version https://git-lfs.github.com/spec/v1
-oid sha256:4e59c777aadc1f8891a4fc3affe5f4e4b48bb9a2e929620de73479f924f6cfad
-size 68520
+oid sha256:acd50a8ffb429071ede16fe2970420b241ee83c4e7c9f46b5022eb3abff07791
+size 52616
//保存信息文件
saveancsdata();
-
+ //保存当天心率数据
+ save_heart_data();
+
dial_file_save();
//同步所有需要保存实时数据到config文件
uapi_dev_runtime_sync_runtime_env_to_config();
-#!/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
<!--\r
* @Date: 2024-04-15 10:55:58\r
* @LastEditors: Caisking 3449750381@qq.com\r
- * @LastEditTime: 2024-07-20 16:14:59\r
+ * @LastEditTime: 2024-08-15 16:00:55\r
* @FilePath: /FD230/tools/language_tool/多国语言工具脚本.md\r
-->\r
## 多国语言工具脚本使用方法\r
\r
### 更新 0720\r
修复脚本异常\r
+\r
+### 更新 0815\r
+脚本增加生成文件直接copy功能 复制到对应文件夹\r