static void AlarmCallBackProcA(void)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
+\r
AlarmClockEventData unuse;\r
AlarmTimerEventPublish(TOPIC_EVENT_ALARM_RING, unuse);\r
}\r
static void AlarmCallBackProcB(void)\r
{\r
AlarmClockEventData unuse;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB invoked");\r
+#if 0\r
+ // 记录当前时间\r
+ time_t now = time(nullptr);\r
+ struct tm *localTime = localtime(&now);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current time - Hour: %d, Minute: %d", localTime->tm_hour, localTime->tm_min);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Posting next day update event");\r
+\r
+ // GraphicService::GetInstance()->PostGraphicEvent(\r
+ // std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
+#endif\r
+ AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
\r
- // AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
- SetZeroAlarm();\r
+ SetZeroAlarm(); // 重置闹钟\r
}\r
\r
static void on_time_CallBackProc(void)\r
{\r
AlarmClockEventData unuse;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked");\r
+\r
GraphicService::GetInstance()->PostGraphicEvent(\r
std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse));\r
+\r
+ // AlarmTimerEventPublish(TOPIC_EVENT_ON_TIME, unuse);\r
}\r
\r
void AlarmScan(void *arg)\r
int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
if (ret != ERRCODE_SUCC)\r
{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get current time info, error code: %d", ret);\r
return;\r
}\r
\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Scanning alarms - Current time: %02d:%02d:%02d",\r
+ curTime.tm_hour, curTime.tm_min, curTime.tm_sec);\r
+\r
if (g_alarmCtrA.state == ALARM_STATUS_RUNNING)\r
{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm A");\r
if ((g_alarmCtrA.callback != nullptr) &&\r
(g_alarmCtrA.info.hour == curTime.tm_hour) &&\r
(g_alarmCtrA.info.minute == curTime.tm_min))\r
{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm A triggered");\r
g_alarmCtrA.callback();\r
g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
}\r
\r
if (g_alarmCtrB.state == ALARM_STATUS_RUNNING)\r
{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm B");\r
if ((g_alarmCtrB.callback != NULL) &&\r
- (g_alarmCtrB.info.week == curTime.tm_wday) &&\r
+ // (g_alarmCtrB.info.week == curTime.tm_wday) &&\r
(g_alarmCtrB.info.hour == curTime.tm_hour) &&\r
(g_alarmCtrB.info.minute == curTime.tm_min) &&\r
(g_alarmCtrB.info.second == curTime.tm_sec))\r
{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm B triggered");\r
g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
- g_alarmCtrB.callback(); // 由于只有callback中SetZeroAlarm会设置state为ALARM_STATUS_RUNNING , 所以必须把state=ALARM_STATUS_CREATED提前,或者干脆删除。\r
+ g_alarmCtrB.callback();\r
}\r
}\r
+\r
// 未绑定状态下,以下操作不进行\r
if (OHOS::ConfigModel::GetInstance()->get_configData_bool(OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART))\r
return;\r
+\r
// 整点回调\r
if (curTime.tm_min == 0 && curTime.tm_sec == 0)\r
{\r
/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-05 14:58:21
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h
+ */
+/***
* @Date: 2024-04-15 10:55:58
* @LastEditors: Caisking 3449750381@qq.com
* @LastEditTime: 2024-07-31 10:38:26
void Blood_Result(void);
void Blood_Control(BloodState state);
- void ReInit();
+ void ClearDisplayData();
+ void CleanAllData();
private:
-
uint16_t displayspo2;
uint16_t currentspo2;
uint32_t timestamp_ms;
#include "AppViewIDs.h"
#include "NativeAbility.h"
#include "battery_hal.h"
+#include "heart_blood/BloodCardView.h"
+#include "MainViewSample.h"
#define MAX_UNWARE_COUNT 10
#define MAX_VALID_SPO2_COUNT 30
return &instance;
}
/* ---------------------------------- 状态检测 ---------------------------------- */
- // 重新初始化
- void BloodOxygenModel::ReInit()
+
+ void BloodOxygenModel::ClearDisplayData()
{
currentspo2 = 0;
timestamp_ms = 0;
}
// 更新SPO2数据
-
void BloodOxygenModel::UpSPO2data(uint8_t spo2)
{
displayspo2 = spo2;
Blood_Stop();
}
}
+
+ // 更新血氧数据
+ void BloodOxygenModel::CleanAllData(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");
+ if (MainViewSample::GetInstance() != nullptr && BloodCardView::GetInstance() != nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面血氧卡片");
+ BloodCardView::GetInstance()->UpSPO2Text();
+ }
+ if (BloodResultView::GetInstance() != nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量血氧卡片");
+ BloodResultView::GetInstance()->UpSPO2Text();
+ }
+ }
}
-/***
+/***
* @Date: 2024-04-15 10:55:58
* @LastEditors: Caisking 3449750381@qq.com
* @LastEditTime: 2024-07-31 14:36:25
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp
*/
-
#include "common/image_cache_manager.h"
#include "ui_resource_image.h"
#include <ui_scroll_view.h>
/* -------------------------------------------------------------------------- */
void BloodResultView::UpSPO2Text()
{
+ if (bloodLabel == nullptr || timeLabel == nullptr)
+ return;
+
// 更新血氧数据
uint16_t spo2 = BloodOxygenModel::GetInstance()->GetSPO2data();
if (spo2 != 0) // 判断是否为默认数据
/* -------------------------------------------------------------------------- */\r
void BloodCardView::UpSPO2Text()\r
{\r
+ if (bloodLabel == nullptr || timeLabel == nullptr)\r
+ return;\r
+ \r
// 更新血氧数据\r
uint16_t spo2 = BloodOxygenModel::GetInstance()->GetSPO2data();\r
if (spo2 != 0) // 判断是否为默认数据\r
// 清空健康数据
bool HealthService::CleanHealthData()
{
- HeartRateData heartdata;
- heartdata.Heart = 0;
- heartdata.timestamp = 0;
- BloodOxygenData blooddata;
- blooddata.SPO2 = 0;
- blooddata.timestamp = 0;
- if (!UpdateHealthData(heartdata))
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData heartdata is error");
- return false;
- }
- if (!UpdateHealthData(blooddata))
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData blooddata is error");
- return false;
- }
- HeartModel::GetInstance()->ReInit();
- BloodOxygenModel::GetInstance()->ReInit();
+ ClearHourlyHeartRates();
+ HeartModel::GetInstance()->ClearDisplayData();
+ BloodOxygenModel::GetInstance()->ClearDisplayData();
+
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanHealthData is ok");
return true;
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "************************************************");
}
- // 如果不是同一天,清空文件内容
+ // 如果不是同一天,关闭文件
file.close();
- SaveDailyHeartRate();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Not same-day data");
return false; // 不是同一天
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updating heart rate: 小时 %d, 心率值 %d", hour, heartRate);
// 确保 hour 在有效范围内,并且心率不是异常值(例如负值)
- if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负
+ if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负 并且 小时不能为24
{
dailyHeartRates[hour] = heartRate;
- }
- // 记录目前更新时间点
- currenthour = hour;
+ // 记录目前更新时间点
+ currenthour = hour;
+ }
}
uint16_t HealthService::GetHourlyHeartRate(uint16_t hour)
class HeartChartView;
class HeartChartPresenter : public Presenter<HeartChartView>,
- public ModelListenerSample,
public UIView::OnClickListener,
public UIView::OnDragListener,
public RootView::OnKeyActListener,
void OnStart() override;
void OnResume() override;
void OnStop() override;
- void OnTickEvent() override;
- void Notify() override {}
bool OnClick(UIView &view, const ClickEvent &event) override;
bool OnDrag(UIView &view, const DragEvent &event) override;
bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
-/***
+/***
* @Date: 2024-08-15 18:38:49
* @LastEditors: Caisking 3449750381@qq.com
* @LastEditTime: 2024-08-26 15:17:07
void UpdateShowHeart(void);
void Update_data_Chart(int serialIndex);
+ void CleanAllDataView();
private:
UILabelExt *CurrentHeartText{nullptr};
void Heart_Result(void);\r
\r
void Heart_Control(HeartState state, HeartCheck check);\r
- void ReInit();\r
-\r
+ void ClearDisplayData();\r
void Heart_Update_View(void);\r
+ void CleanAllData(void);\r
\r
private:\r
HealthAllDatas healthDatas;\r
void Init_data_Chart();\r
void Update_data_Chart(int serialIndex);\r
void UpdataChart();\r
+ void CleanAllDataView();\r
\r
private:\r
typedef struct\r
void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
int32_t HeartRateDataProc(void);\r
void HeartbeatImageAnimator(void);\r
+ void SetDataTopAndBottom();\r
\r
private:\r
Point heartRateData[HEART_AVE_NUM];\r
+/***
+ * @Date: 2024-08-15 18:39:25
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-03 21:04:56
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp
+ */
/*
* Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
* Description: HeartChartPresenter.cpp
g_pHeartChartPresenter = this;
display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
- ResetTickTimer();
#ifdef MEM_CHECK
MemCheck::GetInstance()->EnableLeakCheck(true);
#endif
return true;
}
- void HeartChartPresenter::OnTickEvent()
- {
- // 更新显示心率数据
- HeartChartView::GetInstance()->UpdateShowHeart();
-#if 0
- /*该界面一直在检测 不需要做超时 具有无效数标志*/
- uint64_t current_time = osKernelGetTick2ms();
- if ((startTime != 0) && (current_time - startTime > HEART_KEEP_TIME))
- {
- // 超时处理
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时处理 HEART_KEEP_TIME: %lld", current_time - startTime);
- HeartModel::GetInstance()->SetResult(HeartResult::TIMEOUT);
- HeartModel::GetInstance()->Heart_Stop();
- startTime = 0; // 重置
-
- }
-#endif
- }
- void HeartChartPresenter::ResetTickTimer(void)
- {
- startTime = osKernelGetTick2ms();
- }
// 增加按键事件
bool HeartChartPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
{
+/***
+ * @Date: 2024-08-15 18:39:02
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-05 14:36:17
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
+ */
/***
* @Date: 2024-04-15 10:55:58
* @LastEditors: Caisking 3449750381@qq.com
{
// 获取当前心率
uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
- std::string heartrateStr = std::to_string(heart_);
+ std::string heartrateStr = (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_));
// 更新当前心率显示
- if (CurrentHeartText != nullptr && heart_ != 0)
+ if (CurrentHeartText != nullptr)
{
CurrentHeartText->SetText(heartrateStr.c_str());
}
// 获取最大心率
uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
- std::string heartmaxStr = std::to_string(heartmax_);
+ std::string heartmaxStr = (heartmax_ == 0) ? "--" : (heartmax_ < 50 ? "--" : std::to_string(heartmax_));
// 更新最大心率显示
- if (MaxHeartText != nullptr && heartmax_ != 0)
+ if (MaxHeartText != nullptr)
{
MaxHeartText->SetText(heartmaxStr.c_str());
}
// 获取最小心率
uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
- std::string heartminStr = std::to_string(heartmin_);
+ std::string heartminStr = (heartmin_ == 0) ? "--" : (heartmin_ < 50 ? "--" : std::to_string(heartmin_));
// 更新最小心率显示
- if (MinHeartText != nullptr && heartmin_ != 0)
+ if (MinHeartText != nullptr)
{
MinHeartText->SetText(heartminStr.c_str());
}
heartchart->AddDataSerial(heartSerial);
heartchart->Invalidate();
}
+ void HeartChartView::CleanAllDataView()
+ {
+ if (heartchart == nullptr || MaxHeartText == nullptr || MinHeartText == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " CleanAllDataView fail");
+ return;
+ }
+ for (int serialIndex = 0; serialIndex < 24; serialIndex++)
+ {
+ heartdata[serialIndex].x = serialIndex;
+ heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+ }
+
+ /*清空原数据*/
+ heartSerial->ClearData();
+ heartSerial->AddPoints(heartdata, 24);
+ heartSerial->SetLineColor(Color::Red());
+ heartSerial->SetFillColor(Color::Red());
+ heartSerial->EnableGradient(true);
+
+ heartchart->AddDataSerial(heartSerial);
+ heartchart->RefreshChart();
+
+ /*更新最大最小值*/
+ SetDataTopAndBottom();
+ }
/*设置最大最小数据*/
void HeartChartView::SetDataTopAndBottom()
{
#include "custom_runtime.h"\r
#include <iostream>\r
#include <memory>\r
+#include <algorithm>\r
\r
#include "ui_service.h"\r
#include "battery_hal.h"\r
#define MAX_UNWEAR_COUNT 30\r
#define MAX_VALID_HRS_COUNT 40\r
#define MAX_DISVALID_HRS_COUNT 70\r
+#define MIN_DISPLAY_HEART 60\r
#define HEARTTEST 1 //[0 开启测试 1 关闭]\r
\r
/* 佩戴检测结果 */\r
.args = nullptr,\r
.Notify = Notify,\r
};\r
-\r
+ static void ProcessHeartRateUpdate(Request *request);\r
+ static void RefreshHeartData();\r
void HeartDataSubscribeTopic(Topic topic)\r
{\r
BroadcastApi *broadcastApi = nullptr;\r
UNUSED(args);\r
UNUSED(topic);\r
\r
- /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
- if (uapi_dev_runtime_get_train_status() == 1)\r
- return;\r
-\r
- if (request == nullptr)\r
+ // 训练过程中不需要判断数据准确性,不需要存储心率数据\r
+ if (uapi_dev_runtime_get_train_status() == 1 || request == NULL)\r
{\r
return;\r
}\r
- if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA)\r
- {\r
-#if 0\r
- int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo *)request->data, request->len);\r
- if (rets != EOK)\r
- {\r
- free(heartInfo);\r
- heartInfo = nullptr;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s heartRateData fail! ret = %d", rets);\r
- return;\r
- }\r
-#endif\r
- uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
- // 筛选出正常数据\r
- if (preheart > HEART_RATE_LIMIT_LOWER && preheart <= HEART_RATE_LIMIT_UPPER)\r
- {\r
- uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
- HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
- if (heartInfo == nullptr)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
- return;\r
- }\r
- heartInfo->index = index_;\r
- heartInfo->maxX = index_;\r
- heartInfo->minX = index_;\r
- heartInfo->perSec = preheart;\r
- heartInfo->rest = preheart;\r
- heartInfo->maxValue = preheart;\r
- heartInfo->minValue = preheart;\r
- /*\r
- 暂时屏蔽主界面动态曲线\r
- heartInfo->value[index_].x = index_;\r
- heartInfo->value[index_].y = preheart;\r
- index_++;\r
- if (index_ == HEART_ALL_POINTS)\r
- {\r
- index_ = 0;\r
- }\r
- HeartModel::GetInstance()->SetIndex(index_);\r
- */\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
- OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
- free(heartInfo);\r
- heartInfo = nullptr;\r
- }\r
- }\r
- /* Nextday 刷新*/\r
- if (request->msgId == TOPIC_EVENT_NEXTDAY_UPDATE)\r
- {\r
- OHOS::HeartModel::GetInstance()->ClearHeartData();\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
- }\r
- /* UTCTIME 刷新*/\r
- if (request->msgId == TOPIC_EVENT_UTCTIME_UPDATE)\r
+\r
+ switch (request->msgId)\r
{\r
- OHOS::HeartModel::GetInstance()->ClearHeartData();\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
+ case TOPIC_EVENT_HEARTRATE_UPDATA:\r
+ // ProcessHeartRateUpdate(request);\r
+ break;\r
+\r
+ case TOPIC_EVENT_NEXTDAY_UPDATE:\r
+ case TOPIC_EVENT_UTCTIME_UPDATE:\r
+ RefreshHeartData();\r
+ break;\r
+\r
+ case TOPIC_EVENT_WEARSTATE_UPDATE:\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
- if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE)\r
+ }\r
+\r
+ static void ProcessHeartRateUpdate(Request *request)\r
+ {\r
+ uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
+\r
+ // 直接处理心率数据,不进行筛选\r
+ uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
+ HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
+ if (heartInfo == NULL)\r
{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
+ return;\r
}\r
+\r
+ heartInfo->index = index_;\r
+ heartInfo->maxX = index_;\r
+ heartInfo->minX = index_;\r
+ heartInfo->perSec = preheart;\r
+ heartInfo->rest = preheart;\r
+ /*最大最小值不为0*/\r
+ heartInfo->maxValue = preheart;\r
+ heartInfo->minValue = preheart;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
+ OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
+\r
+ free(heartInfo); // 释放内存\r
+ heartInfo = nullptr;\r
+ }\r
+\r
+ static void RefreshHeartData()\r
+ {\r
+ OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
}\r
\r
#ifdef __cplusplus\r
{\r
uint16_t perSecHeartRate = 0;\r
uint16_t restHeartRate = 0;\r
-#if 0\r
- // 使用随机数生成模拟数据\r
- std::random_device rd;\r
- std::mt19937 gen(rd());\r
- std::uniform_int_distribution<> heartRateDist(50, 100);\r
-\r
- heartInfo->perSec = heartRateDist(gen);\r
- heartInfo->rest = heartRateDist(gen);\r
- heartInfo->maxValue = heartRateDist(gen);\r
- heartInfo->minValue = heartRateDist(gen);\r
- heartInfo->minX = 1;\r
- heartInfo->maxX = 10;\r
- // heartInfo->index = 0;\r
- heartInfo->value[heartInfo->index].x = 0;\r
- heartInfo->value[heartInfo->index].y = heartRateDist(gen);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " heartRateData: %d %d %d %d %d %d %d %d ",\r
- heartInfo->perSec, heartInfo->rest, heartInfo->maxValue, heartInfo->minValue, heartInfo->minX, heartInfo->index, heartInfo->value[0].x, heartInfo->value[0].y);\r
\r
-#endif\r
// 每秒心率\r
perSecHeartRate = heartInfo->perSec;\r
- if (perSecHeartRate > HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
+ if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
{\r
healthDatas.heartRatePerSec = perSecHeartRate;\r
}\r
\r
- // 静息心率\r
- restHeartRate = heartInfo->rest;\r
- if (restHeartRate > HEART_RATE_LIMIT_LOWER && restHeartRate <= HEART_RATE_LIMIT_UPPER)\r
- {\r
- healthDatas.heartRateRest = restHeartRate;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateRest:%d ", healthDatas.heartRateRest);\r
- }\r
- HandleMinHeart(heartInfo->minX, heartInfo->minValue);\r
- HandleMaxHeart(heartInfo->maxX, heartInfo->maxValue);\r
- // 平均心率\r
- uint16_t count = aveCount + heartInfo->index;\r
- if (aveCount < HEART_AVE_NUM)\r
- {\r
- for (int i = aveCount; i < count; i++)\r
- {\r
- if (healthDatas.heartRateMin.x != heartInfo->value[i - aveCount].x && healthDatas.heartRateMax.x != heartInfo->value[i - aveCount].x)\r
- {\r
- healthDatas.heartRateAvg[aveCount].x = heartInfo->value[i - aveCount].x;\r
- healthDatas.heartRateAvg[aveCount].y = heartInfo->value[i - aveCount].y;\r
- aveCount++;\r
- }\r
- }\r
- }\r
-\r
- for (int i = 0; i < aveCount - 1; i++)\r
- {\r
- if (healthDatas.heartRateAvg[i].x == healthDatas.heartRateAvg[i + 1].x)\r
- {\r
- if (healthDatas.heartRateAvg[i].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i].y != healthDatas.heartRateMax.y)\r
- {\r
- for (int j = i; j < aveCount - 1; j++)\r
- {\r
- healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1];\r
- }\r
- aveCount--;\r
- }\r
- else if (healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMax.y)\r
- {\r
- for (int j = i + 1; j < aveCount - 1; j++)\r
- {\r
- healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1];\r
- }\r
- aveCount--;\r
- }\r
- }\r
- }\r
GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
}\r
\r
void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate)\r
{\r
- UNUSED(rest);\r
- Point *rateData;\r
- int len = GetAveHeartRateCount();\r
- rateData = GetAveHeartRate();\r
-\r
uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();\r
+ /*主界面刷新心率*/\r
if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr)\r
{\r
MainClockView::GetInstance()->RefreshHeartRate(perSec);\r
}\r
-\r
- if (IndoorWalkPreparedView::GetInstance() != nullptr)\r
- {\r
- IndoorWalkPreparedView::GetInstance()->RefreshHeartbeatData(perSec);\r
- }\r
- if (IndoorWalkPresenter::GetInstance() != nullptr)\r
- {\r
- IndoorWalkPresenter::GetInstance()->ModifiesHeartRate(perSec);\r
- }\r
-\r
+ /*心率卡片刷新心率数据*/\r
if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
{\r
if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
{\r
- HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len);\r
- // HeartRateView::GetInstance()->RefreshElectrocardiogram();\r
HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
- HeartRateView::GetInstance()->RefreshRestHeartRate(rest);\r
}\r
}\r
+ /*applist心率刷新心率数据*/\r
+ if (HeartChartView::GetInstance() != nullptr)\r
+ {\r
+ HeartChartView::GetInstance()->UpdateShowHeart();\r
+ }\r
}\r
/* ---------------------------------- 状态检测 ---------------------------------- */\r
\r
// 重新初始化\r
- void HeartModel::ReInit()\r
+ void HeartModel::ClearDisplayData()\r
{\r
+ /*显示的心率数据清空*/\r
currentheart = 0;\r
timestamp_ms = 0;\r
+ displayheart = 0;\r
+ displayheart_max = 0; // 显示最大心率\r
+ displayheart_min = 0; // 显示最小心率\r
}\r
// 获取心率数据\r
uint16_t HeartModel::GetHeartdata()\r
void HeartModel::Heart_Start()\r
{\r
displayheart = 0;\r
- displayheart_max = 0; // 显示最大心率\r
- displayheart_min = 0; // 显示最小心率\r
+ // displayheart_max = 0; // 显示最大心率 [每次检测进行清除]\r
+ // displayheart_min = 0; // 显示最小心率 [每次检测进行清除]\r
\r
SetResult(HeartResult::NOT_TESTED); // 重置检测\r
// 进行初始化操作\r
if (heartresult_ == HeartResult::SUCCESS)\r
{\r
Heart_Save();\r
- /*通知进行UI更新*/\r
- SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
+ /*更新曲线*/\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
}\r
/*关闭被动检测*/\r
Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
+ return;\r
}\r
\r
if (sensorstate)\r
case HeartResult::SUCCESS:\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
Heart_Save();\r
- /*通知进行UI更新*/\r
- SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
+ /*更新曲线*/\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
break;\r
\r
case HeartResult::NOT_WORN: // 未佩戴状态\r
\r
void HeartModel::UpHeartdata(uint16_t heart)\r
{\r
- /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
+ // 如果处于训练模式,提前返回\r
if (uapi_dev_runtime_get_train_status() == 1)\r
return;\r
\r
displayheart = heart;\r
\r
- // 处理有效与无效计数\r
+ // 更新心率和计数器\r
if (displayheart != 0)\r
{\r
- currentheart = displayheart; // 更新 currentheart\r
+ currentheart = displayheart; // 更新当前心率\r
valid_counter_++; // 增加有效计数器\r
disvalid_counter_ = 0; // 清空无效计数器\r
- if (displayheart_max == 0 || displayheart_min == 0)\r
+\r
+ // 更新最大和最小心率\r
+ displayheart_max = (displayheart_max < displayheart ? displayheart : displayheart_max);\r
+\r
+ // 确保最小心率的第一次赋值大于50\r
+ if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART)\r
+ {\r
+ displayheart_min = displayheart; // 初始化最小心率\r
+ }\r
+ else\r
{\r
- displayheart_min = displayheart_max = displayheart;\r
+ displayheart_min = (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART)\r
+ ? displayheart\r
+ : displayheart_min;\r
}\r
- if (displayheart_max < displayheart)\r
- displayheart_max = displayheart;\r
- if (displayheart_min > displayheart)\r
- displayheart_min = displayheart;\r
}\r
else\r
{\r
if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
- SetResult(HeartResult::INVALID_DATA); // æ\97 æ\95\88æ\95°è¾¾æ \87\r
+ SetResult(HeartResult::INVALID_DATA); // æ \87记为æ\97 æ\95\88æ\95°æ\8d®\r
Heart_Stop();\r
+ return;\r
}\r
\r
// 检查有效计数器是否达标\r
if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
- SetResult(HeartResult::SUCCESS); // 成功检测\r
+ SetResult(HeartResult::SUCCESS); // æ \87记为æ\88\90å\8a\9fæ£\80æµ\8b\r
Heart_Stop();\r
+ return;\r
}\r
+\r
+ // 刷新心率显示\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[heart data update displayheart %d displayheart_max %d displayheart_min %d]", displayheart,\r
+ displayheart_max, displayheart_min);\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+ displayheart, 0, displayheart_max, displayheart_min));\r
}\r
\r
void HeartModel::Heart_Update_View(void)\r
HeartChartView::GetInstance()->Update_data_Chart(hour);\r
}\r
}\r
+\r
+ void HeartModel::CleanAllData(void)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");\r
+ if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");\r
+ HeartRateView::GetInstance()->CleanAllDataView();\r
+ }\r
+ if (HeartChartView::GetInstance() != nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+ HeartChartView::GetInstance()->CleanAllDataView();\r
+ }\r
+ }\r
}\r
#include "ui_resource_image.h"\r
#include "common/image_cache_manager.h"\r
#include "heart_blood/health_service/health_service.h"\r
+#include "string.h"\r
#define HEART_DATA_TEST 0\r
namespace OHOS\r
{\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
heartYAxis.SetDataRange(0, 220);\r
heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
\r
- //heartchart->SetGradientOpacity(60, 0);\r
+ // heartchart->SetGradientOpacity(60, 0);\r
heartchart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
Add(heartchart);\r
}\r
}\r
void HeartRateView::Update_data_Chart(int serialIndex)\r
{\r
- if (heartchart == nullptr)\r
+ if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);\r
return;\r
}\r
\r
/*清空原数据*/\r
- // heartchart->DeleteDataSerial(heartSerial);\r
heartSerial->ClearData();\r
\r
heartdata[serialIndex].x = serialIndex;\r
heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
\r
- for (int i = 0; i < 24; i++)\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->RefreshChart();\r
+ }\r
+ void HeartRateView::CleanAllDataView()\r
+ {\r
+ if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanAllDataView fail");\r
+ return;\r
+ }\r
+ for (int serialIndex = 0; serialIndex < 24; serialIndex++)\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d %d", i, heartdata[i].y);\r
+ heartdata[serialIndex].x = serialIndex;\r
+ heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
}\r
\r
+ /*清空原数据*/\r
+ heartSerial->ClearData();\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
heartchart->RefreshChart();\r
+\r
+ /*更新最大最小值*/\r
+ SetDataTopAndBottom();\r
+ }\r
+ /*设置最大最小数据*/\r
+ void HeartRateView::SetDataTopAndBottom()\r
+ {\r
+ int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax();\r
+ int MinHeart = HeartModel::GetInstance()->GetHeartRateMin();\r
+\r
+ if (topRate != nullptr)\r
+ {\r
+ topRate->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str() : "--");\r
+ }\r
+\r
+ if (bottomRate != nullptr)\r
+ {\r
+ bottomRate->SetText(MinHeart > 0 ? (std::to_string(MinHeart)).c_str() : "--");\r
+ }\r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MaxHeart: %d, MinHeart: %d", MaxHeart, MinHeart);\r
}\r
void HeartRateView::InsertTopAndBottomRateImage(void)\r
{\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
+ uint16_t maxRate = HeartModel::GetInstance()->GetShowMaxHeartdata();\r
+ uint16_t minRate = HeartModel::GetInstance()->GetShowMinHeartdata();\r
+ uint16_t perRate = HeartModel::GetInstance()->GetShowHeartdata();\r
+\r
+ RefreshHeartRateMax(maxRate);\r
+ RefreshHeartRateMin(minRate);\r
+ HeartModel::GetInstance()->SetHeartRatePerSec(perRate);\r
}\r
\r
// 刷新心率曲线\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
+ // 判断心率值,并设置文本\r
+ if (value == 0 || value < 50)\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
+ std::string ratePerSecStr = std::to_string(value);\r
+ ratePerSec->SetText(ratePerSecStr.c_str());\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
+ // 设置刷新文本\r
+ if (max >= HEART_RATE_LIMIT_UPPER || max < 60)\r
{\r
topRate->SetText("--");\r
- return;\r
}\r
- ret = sprintf_s(top, sizeof(top), "%u", maxRate);\r
- if (ret > EOK)\r
+ else\r
{\r
- topRate->SetText(top);\r
+ std::string topRateStr = std::to_string(max);\r
+ topRate->SetText(topRateStr.c_str());\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
+ // 设置刷新文本\r
+ if (min >= HEART_RATE_LIMIT_UPPER || min < 60)\r
{\r
bottomRate->SetText("--");\r
- return;\r
}\r
- ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate);\r
- if (ret > EOK)\r
+ else\r
{\r
- bottomRate->SetText(bottom);\r
+ std::string bottomRateStr = std::to_string(min);\r
+ bottomRate->SetText(bottomRateStr.c_str());\r
}\r
}\r
-\r
// 刷新静息心率\r
void HeartRateView::RefreshRestHeartRate(uint16_t value)\r
{\r
\r
std::string Cnweekday[] = {"周天", "周一", "周二", "周三", "周四", "周五", "周六"};\r
\r
-static constexpr const char *WHITE_BATTERY = "/user/res/Battery/Battery-E.bin";\r
+static constexpr const char *WHITE_BATTERY = "/user/res/Battery/Battery_White.bin";\r
static constexpr const char *SAVE_BUTTON = "/user/res/Save_Ele/finger.bin";\r
static constexpr const char *BACK_BUTTON = "/user/res/Save_Ele/finger2.bin";\r
static constexpr const char *SAVE_WATHCH = "/user/res/Save_Ele/wathch.bin";\r
void SleepModel::UpdateSleepView()
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "睡眠数据更新");
SleepControlView *p_SleepControlView = SleepControlView::GetInstance();
if (p_SleepControlView != nullptr)
{
TakephotosView::~TakephotosView()
{
// DeInit();
- creamAnimator->Stop();
- smileAnimator->Stop();
- FreeImageInfoArray(creamimageInfos, creambasePath.c_str(), 50);
- FreeImageInfoArray(smileimageInfos, smilebasePath.c_str(), 50);
- ReleaseImageAnimatorSource(creamimageAnimatorInfo, 50);
+ PopupPhoto staust = TakephotosModel::GetInstance()->GetPopStaust();
+ if (staust == PopupPhoto::CreamPopup)
+ {
+ creamAnimator->Stop();
+ FreeImageInfoArray(creamimageInfos, creambasePath.c_str(), 50);
+ }
+ else
+ {
+ smileAnimator->Stop();
+ FreeImageInfoArray(smileimageInfos, smilebasePath.c_str(), 50);
+ }
ReleaseImageAnimatorSource(smileimageAnimatorInfo, 50);
-
+ ReleaseImageAnimatorSource(creamimageAnimatorInfo, 50);
UIViewGroup *tmpGroup = dynamic_cast<UIViewGroup *>(container_);
UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup);
#endif
/*NextDay*/
-void MsgCenterNotifyNextDayProc(const Topic topic, Request* req)
+void MsgCenterNotifyNextDayProc(const Topic topic, Request *req)
{
unused(topic);
- unused(req);
-
+ unused(req);
AlarmClockModel::GetInstance()->NextDayNotify();
-#ifdef FD230
day_timestamp = 0;
-
- if(!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))
+#ifdef FD230
+ printf("******nextday is begin******\r\n");
+ /* ----------------------------------- 睡眠相关 ----------------------------------- */
+ if (!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))
{
- //未设置睡眠监控 nextday进行清除睡眠数据。
+ // 未设置睡眠监控 nextday进行清除睡眠数据。
SleepModel::GetInstance().DeleteSleepData();
+ // 通知UI更新
+ GraphicService::GetInstance()->PostGraphicEvent(
+ std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance()));
}
-
- // 清空当日的心率曲线数据
- HealthService::GetInstance()->ClearHourlyHeartRates();
- HealthService::GetInstance()->SaveDailyHeartRate();
-
- //午夜清除运动数据
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA,NULL);
+ /* ---------------------------------- 健康数据相关 ---------------------------------- */
+ // 清空当日的心率血氧数据
+ HealthService::GetInstance()->CleanHealthData();
+ // 通知UI更新
+ GraphicService::GetInstance()->PostGraphicEvent(
+ std::bind(&OHOS::HeartModel::CleanAllData, OHOS::HeartModel::GetInstance()));
+ GraphicService::GetInstance()->PostGraphicEvent(
+ std::bind(&OHOS::BloodOxygenModel::CleanAllData, OHOS::BloodOxygenModel::GetInstance()));
+ /* --------------------------------- 每日目标相关 --------------------------------- */
+ // 午夜清除运动数据
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA, NULL);
+ printf("******nextday is end******\r\n");
#endif
}
{ConfigDataType::DATATYPE_INT, "traningauto", "0" },//CONFIGMODEL_ITEM_TRANING_AUTO,//开启关闭自动获取实时数据
{ConfigDataType::DATATYPE_INT, "traningheart", "190" },//CONFIGMODEL_ITEM_TRAINING_HEART_MAX//训练最高心率
//心率相关
- {ConfigDataType::DATATYPE_INT, "heartrate_freq", "15" },// CONFIGMODEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率
+ {ConfigDataType::DATATYPE_INT, "heartrate_freq", "30" },// CONFIGMODEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率
{ConfigDataType::DATATYPE_INT, "heartrate_remind", "0"},// CONFIGMODEL_ITEM_HEARTRATE_REMIND//提醒开关
{ConfigDataType::DATATYPE_INT, "heartrate_threshold_value", "0"},// CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE//心率值
}\r
avg_hrs = (sum_hrs - max_hrs - min_hrs) / (hrs_num - 2);\r
//PRINT("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs);\r
- hx3695_msg_callback_t func = hx3695_get_send_msg_callback_func();\r
- if(func != NULL)\r
- {\r
- hrsresult.lastesthrs = avg_hrs;\r
- func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
- if(uapi_get_cywee_static_state())\r
- {\r
- func(HX3695_MSG_TYPE_STATIC_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
- }\r
- }\r
+ hrsresult.lastesthrs = avg_hrs;\r
if(hrs_mode_state)\r
{\r
cywee_data = hrsresult.lastesthrs;\r
\r
if(hrs_wear_status == MSG_HRS_WEAR && hrsresult.hr_living == MSG_LIVING_TRUE)\r
{\r
- if(hrsresult.lastesthrs > 50)\r
+ if(hrsresult.lastesthrs > 60 || hrsresult.lastesthrs == 0)\r
get_avg_hrs(hrsresult.lastesthrs);\r
hrsresult.wearstatus = MSG_HRS_WEAR;\r
}\r
else\r
{\r
hrsresult.wearstatus = MSG_HRS_NO_WEAR;\r
+ hrsresult.lastesthrs = 0;\r
}\r
hx3695_msg_callback_t func = hx3695_get_send_msg_callback_func();\r
if(func != NULL)\r
{\r
- func(HX3695_MSG_TYPE_WEARSTAT_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
+ PRINT("hrsresult.lastesthrs : %d \n",hrsresult.lastesthrs);\r
+ func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
+ if(uapi_get_cywee_static_state())\r
+ {\r
+ func(HX3695_MSG_TYPE_STATIC_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
+ }\r
+ func(HX3695_MSG_TYPE_WEARSTAT_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
}\r
\r
+\r
//PRINT("hx3695 data_cnt: %d, hr_living: %d, hr_living_qu: %d, hr_living_std: %d, hr_result:%d \r\n",\r
//alg_results.data_cnt, hrsresult.hr_living, hrsresult.hr_living_qu, hrsresult.hr_living_std, hrsresult.lastesthrs);\r
\r