From f65052a8c69afb0b09da128a4db59944a6e07ae0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A2=81=E6=B8=85=E6=A2=A6?= <3449750381@qq.com> Date: Tue, 2 Jul 2024 01:26:35 +0000 Subject: [PATCH] Merge #425 into sdk602patch0521 from refs/changes/425/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 袁清梦 * refs/changes/425/head: (7 commits squashed) - 筛选表盘数据刷新 - Merge branch 'sdk602patch0521' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0521 - 优化时间戳获取时间字符串函数 - 增加睡眠数据 - 增加设置心率周期检测AT - 设置心率检测优先级控制 - 增加心率检测 睡眠提醒 Signed-off-by: Caisking <3449750381@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/425 --- .../include/AlarmClockTimerConfig.h | 1 + .../src/AlarmClockTimerConfig.cpp | 428 +++++++++++------- .../nativeui/heartrate/include/HeartModel.h | 12 +- .../nativeui/heartrate/src/HeartModel.cpp | 13 +- .../nativeui/heartrate/src/HeartPresenter.cpp | 9 +- .../nativeui/main/src/MainPresenterSample.cpp | 7 +- .../nativeui/message/src/MessageModel.cpp | 4 +- .../src/RespiratoryTrainingModel.cpp | 6 +- .../nativeui/rtcservice/src/rtc_at_cmd.cpp | 12 - .../nativeui/sleep/include/SleepModel.h | 82 ++-- .../nativeui/sleep/include/SleepTimeView.h | 8 +- .../nativeui/sleep/src/SleepModel.cpp | 249 +++++++--- .../nativeui/sleep/src/SleepTimeView.cpp | 22 +- .../fd230app/nativeui/sleep/src/SleepView.cpp | 26 +- .../ble_service/blemoder/CMakeLists.txt | 1 + .../service/ble_service/blemoder/bletest.cpp | 7 + .../peripheral/config/include/ConfigModelC.h | 3 + .../peripheral/config/src/ConfigModel.cpp | 8 + .../drivers/peripheral/utils/custom_utils.c | 32 +- .../drivers/peripheral/utils/custom_utils.h | 9 +- .../peripheral/utils/custom_utils_at_cmd.c | 51 ++- 21 files changed, 647 insertions(+), 343 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h index b799dcb46..978755cbc 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h +++ b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h @@ -67,6 +67,7 @@ int32_t SetZeroAlarm(void); int32_t SetAlarm(AlarmType type, uint8_t week, uint8_t hour, uint8_t minute); int32_t AlarmGetCurrentTimeInfo(struct tm *timeInfo); void set_sleep_and_wake_time(void); +void get_sleep_time_notify(void); #ifdef __cplusplus } #endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp index 935aa7abe..3779fb4b8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp @@ -1,3 +1,9 @@ +/*** + * @Date: 2024-06-29 15:06:13 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-07-01 17:31:58 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp + */ /* * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. * Description: AlarmClockTimer @@ -19,215 +25,287 @@ #include "AlarmClockTimerConfig.h" #include "cywee_service.h" #include "ConfigModelC.h" +#include "ConfigModel.h" +#include "heartrate/include/HeartModel.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -static AlarmCtrl g_alarmCtrA; -static AlarmCtrl g_alarmCtrB; -static osTimerId_t g_AlarmHandle = nullptr; + static AlarmCtrl g_alarmCtrA; + static AlarmCtrl g_alarmCtrB; + static osTimerId_t g_AlarmHandle = nullptr; -static int sleep_time = 0; -static int wake_up_time = 0; +#define SLEPPNOTIFY 20 -void set_sleep_and_wake_time(void) -{ - sleep_time = get_sleep_time_from_config_model(); - wake_up_time = get_wake_up_time_from_config_model(); -} + static int sleep_time = 0; + static int wake_up_time = 0; + static int sleep_time_hour = 0; + static int sleep_time_min = 0; -void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data) -{ - int32 ret; - uint32 size = sizeof(AlarmClockEventData); - Request *request = nullptr; - BroadcastApi *broadcastApi = nullptr; - IUnknown *api = nullptr; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic); - - /* alloc request */ - request = SAMGR_AllocRequestMsg(0, PLATFORM_CORE, BROADCAST_SVR_ID, size); - if (request == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SAMGR_AllocRequestMsg failed"); - return; - } - request->msgId = topic; - ret = memcpy_s(request->data, size, (const void *)&data, size); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s rateDataTmp fail! ret = %d", ret); - return; - } - request->len = size; - request->msgValue = 0; - - /* public request */ - api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); - if (api == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed"); - SAMGR_FreeRequestMsg(request); - return; + // 设置目标睡眠时间 + void set_sleep_and_wake_time(void) + { + sleep_time = get_sleep_time_from_config_model(); + wake_up_time = get_wake_up_time_from_config_model(); } - ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); - if (ret != 0 || broadcastApi == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed"); - SAMGR_FreeRequestMsg(request); - return; + // 设置睡眠提醒时间 + void get_sleep_time_notify(void) + { + int goal_hour = sleep_time >> 16; + int goal_min = (sleep_time & 0X00FF); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "goal_hour:%d goal_min:%d", goal_hour, goal_min); + if ((goal_min - SLEPPNOTIFY) >= 0) + { + sleep_time_hour = goal_hour; + sleep_time_min = goal_min - SLEPPNOTIFY; + } + else + { + sleep_time_hour = goal_hour - 1; + sleep_time_min = goal_min - SLEPPNOTIFY + 60; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep_time_hour:%d sleep_time_min:%d", sleep_time_hour, sleep_time_min); } - broadcastApi->PublishTopic((IUnknown *)broadcastApi, request); - broadcastApi->Release((IUnknown *)broadcastApi); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish end!!"); - - return; -} - -static void AlarmCallBackProcA(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA"); - AlarmClockEventData unuse; - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ALARM_RING, unuse)); -} + void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data) + { + int32 ret; + uint32 size = sizeof(AlarmClockEventData); + Request *request = nullptr; + BroadcastApi *broadcastApi = nullptr; + IUnknown *api = nullptr; -static void AlarmCallBackProcB(void) -{ - AlarmClockEventData unuse; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse)); - GraphicService::GetInstance()->PostGraphicEvent(SetZeroAlarm); -} + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic); -static void on_time_CallBackProc(void) -{ - AlarmClockEventData unuse; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse)); -} + /* alloc request */ + request = SAMGR_AllocRequestMsg(0, PLATFORM_CORE, BROADCAST_SVR_ID, size); + if (request == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SAMGR_AllocRequestMsg failed"); + return; + } + request->msgId = topic; + ret = memcpy_s(request->data, size, (const void *)&data, size); + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s rateDataTmp fail! ret = %d", ret); + return; + } + request->len = size; + request->msgValue = 0; + /* public request */ + api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); + if (api == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed"); + SAMGR_FreeRequestMsg(request); + return; + } + ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (ret != 0 || broadcastApi == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed"); + SAMGR_FreeRequestMsg(request); + return; + } + broadcastApi->PublishTopic((IUnknown *)broadcastApi, request); + broadcastApi->Release((IUnknown *)broadcastApi); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish end!!"); -void AlarmScan(void *arg) -{ - struct tm curTime; - int32_t ret = AlarmGetCurrentTimeInfo(&curTime); - if (ret != ERRCODE_SUCC) { return; } - if (g_alarmCtrA.state == ALARM_STATUS_RUNNING) { - if ((g_alarmCtrA.callback != nullptr) && - (g_alarmCtrA.info.hour == curTime.tm_hour) && - (g_alarmCtrA.info.minute == curTime.tm_min)) { - g_alarmCtrA.callback(); - g_alarmCtrA.state = ALARM_STATUS_CREATED; - } + static void AlarmCallBackProcA(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA"); + AlarmClockEventData unuse; + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ALARM_RING, unuse)); } - if (g_alarmCtrB.state == ALARM_STATUS_RUNNING) { - if ((g_alarmCtrB.callback != NULL) && - //(g_alarmCtrB.info.week == curTime.tm_wday) && - (g_alarmCtrB.info.hour == curTime.tm_hour) && - (g_alarmCtrB.info.minute == curTime.tm_min) && - (g_alarmCtrB.info.second == curTime.tm_sec)) { - g_alarmCtrB.callback(); - g_alarmCtrB.state = ALARM_STATUS_CREATED; - } - } - if(curTime.tm_min==0 && curTime.tm_sec==0) + static void AlarmCallBackProcB(void) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "time: %d : %d",curTime.tm_hour,curTime.tm_min); - on_time_CallBackProc(); + AlarmClockEventData unuse; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse)); + GraphicService::GetInstance()->PostGraphicEvent(SetZeroAlarm); } - else if(curTime.tm_hour == ( ( sleep_time & 0XFF00) >> 16 ) && curTime.tm_min == ( sleep_time & 0X00FF )) + + static void on_time_CallBackProc(void) { - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE,NULL); + AlarmClockEventData unuse; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse)); } - else if(curTime.tm_hour == ( ( wake_up_time & 0XFF00) >> 16 ) && curTime.tm_min == ( wake_up_time & 0X00FF )) + + void AlarmScan(void *arg) { - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE,NULL); - } -} + struct tm curTime; + int32_t ret = AlarmGetCurrentTimeInfo(&curTime); + if (ret != ERRCODE_SUCC) + { + return; + } -static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback) -{ - if (alarmCtrl == nullptr) { - return ERRCODE_FAIL; - } - if (alarmCtrl->state == ALARM_STATUS_UNUSED) { - alarmCtrl->state = ALARM_STATUS_CREATED; - alarmCtrl->callback = callback; - } - return ERRCODE_SUCC; -} + if (g_alarmCtrA.state == ALARM_STATUS_RUNNING) + { + if ((g_alarmCtrA.callback != nullptr) && + (g_alarmCtrA.info.hour == curTime.tm_hour) && + (g_alarmCtrA.info.minute == curTime.tm_min)) + { + g_alarmCtrA.callback(); + g_alarmCtrA.state = ALARM_STATUS_CREATED; + } + } -int32_t AlarmTimerInit(void) -{ - int32_t timerStatus; - int32_t ret; - - g_alarmCtrA.state = ALARM_STATUS_UNUSED; - g_alarmCtrB.state = ALARM_STATUS_UNUSED; - g_AlarmHandle = osTimerNew(AlarmScan, osTimerPeriodic, nullptr, nullptr); - if (g_AlarmHandle == nullptr) { - return ERRCODE_FAIL; - } - timerStatus = osTimerStart(g_AlarmHandle, ALARM_INTERVAL_MS); - if (timerStatus != osOK) { - return ERRCODE_FAIL; + if (g_alarmCtrB.state == ALARM_STATUS_RUNNING) + { + if ((g_alarmCtrB.callback != NULL) && + //(g_alarmCtrB.info.week == curTime.tm_wday) && + (g_alarmCtrB.info.hour == curTime.tm_hour) && + (g_alarmCtrB.info.minute == curTime.tm_min) && + (g_alarmCtrB.info.second == curTime.tm_sec)) + { + g_alarmCtrB.callback(); + g_alarmCtrB.state = ALARM_STATUS_CREATED; + } + } + // 整点回调 + if (curTime.tm_min == 0 && curTime.tm_sec == 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "time: %d : %d", curTime.tm_hour, curTime.tm_min); + on_time_CallBackProc(); + } + // 进入睡眠模式 + if (curTime.tm_hour == ((sleep_time >> 16) && curTime.tm_min == (sleep_time & 0X00FF))) + { + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL); + } + // 退出睡眠模式 + if (curTime.tm_hour == ((wake_up_time >> 16) && curTime.tm_min == (wake_up_time & 0X00FF))) + { + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE, NULL); + } + // 睡眠提醒[前提开启睡眠提醒] + if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND)) + { + // 提醒一次 + if (curTime.tm_hour == sleep_time_hour && curTime.tm_min == sleep_time_min && curTime.tm_sec == 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "It's bedtime in 20 minutes"); + printf("20分钟后要睡觉啦!\r\n"); + } + } + // 早安提醒[前提开启睡眠提醒] + + // 心率周期检测 [0 1 5 10] + if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED)) + { + if (curTime.tm_min % (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED)) == 0 && curTime.tm_sec == 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Automatic heart rate detection starts"); + // 开启心率检测 如果有其他心率检测在进行,则不会进行检测[低优先级] + OHOS::HeartModel::GetInstance()->Heart_Control(OHOS::HeartState::Start, OHOS::HeartCheck::PASSIVITY); + } + } } - ret = AlarmCreate(&g_alarmCtrA, AlarmCallBackProcA); - if (ret != ERRCODE_SUCC) { - return ERRCODE_FAIL; + + static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback) + { + if (alarmCtrl == nullptr) + { + return ERRCODE_FAIL; + } + if (alarmCtrl->state == ALARM_STATUS_UNUSED) + { + alarmCtrl->state = ALARM_STATUS_CREATED; + alarmCtrl->callback = callback; + } + return ERRCODE_SUCC; } - ret = AlarmCreate(&g_alarmCtrB, AlarmCallBackProcB); - if (ret != ERRCODE_SUCC) { - return ERRCODE_FAIL; + + int32_t AlarmTimerInit(void) + { + int32_t timerStatus; + int32_t ret; + + g_alarmCtrA.state = ALARM_STATUS_UNUSED; + g_alarmCtrB.state = ALARM_STATUS_UNUSED; + g_AlarmHandle = osTimerNew(AlarmScan, osTimerPeriodic, nullptr, nullptr); + if (g_AlarmHandle == nullptr) + { + return ERRCODE_FAIL; + } + timerStatus = osTimerStart(g_AlarmHandle, ALARM_INTERVAL_MS); + if (timerStatus != osOK) + { + return ERRCODE_FAIL; + } + ret = AlarmCreate(&g_alarmCtrA, AlarmCallBackProcA); + if (ret != ERRCODE_SUCC) + { + return ERRCODE_FAIL; + } + ret = AlarmCreate(&g_alarmCtrB, AlarmCallBackProcB); + if (ret != ERRCODE_SUCC) + { + return ERRCODE_FAIL; + } + set_sleep_and_wake_time(); + get_sleep_time_notify(); + return ERRCODE_SUCC; } - set_sleep_and_wake_time(); - return ERRCODE_SUCC; -} -int32_t SetAlarm(AlarmType type, uint8_t week, uint8_t hour, uint8_t minute) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetAlarm %d %d %d %d", type, week, hour, minute); - if (type == ALARM_A) { - g_alarmCtrA.state = ALARM_STATUS_RUNNING; - g_alarmCtrA.info.hour = hour; - g_alarmCtrA.info.minute = minute; - } else if (type == ALARM_B) { - g_alarmCtrB.state = ALARM_STATUS_RUNNING; - g_alarmCtrB.info.week = week; - g_alarmCtrB.info.hour = hour; - g_alarmCtrB.info.minute = minute; - g_alarmCtrB.info.second = 1; - } else { - return ERRCODE_FAIL; + int32_t SetAlarm(AlarmType type, uint8_t week, uint8_t hour, uint8_t minute) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetAlarm %d %d %d %d", type, week, hour, minute); + if (type == ALARM_A) + { + g_alarmCtrA.state = ALARM_STATUS_RUNNING; + g_alarmCtrA.info.hour = hour; + g_alarmCtrA.info.minute = minute; + } + else if (type == ALARM_B) + { + g_alarmCtrB.state = ALARM_STATUS_RUNNING; + g_alarmCtrB.info.week = week; + g_alarmCtrB.info.hour = hour; + g_alarmCtrB.info.minute = minute; + g_alarmCtrB.info.second = 1; + } + else + { + return ERRCODE_FAIL; + } + return ERRCODE_SUCC; } - return ERRCODE_SUCC; -} -int32_t SetZeroAlarm(void) -{ - struct tm curTime; - int32_t ret = AlarmGetCurrentTimeInfo(&curTime); - if (ret != ERRCODE_SUCC) { - return ERRCODE_FAIL; + int32_t SetZeroAlarm(void) + { + struct tm curTime; + int32_t ret = AlarmGetCurrentTimeInfo(&curTime); + if (ret != ERRCODE_SUCC) + { + return ERRCODE_FAIL; + } + int32_t weekday = (++curTime.tm_wday) % 7; + return SetAlarm(ALARM_B, weekday, 0, 0); } - int32_t weekday = (++curTime.tm_wday) % 7; - return SetAlarm(ALARM_B, weekday, 0, 0); -} -int32_t AlarmGetCurrentTimeInfo(struct tm *timeInfo) -{ - if (timeInfo == nullptr) { - return ERRCODE_FAIL; + int32_t AlarmGetCurrentTimeInfo(struct tm *timeInfo) + { + if (timeInfo == nullptr) + { + return ERRCODE_FAIL; + } + time_t sec = time(nullptr); + localtime_r(&sec, timeInfo); + return ERRCODE_SUCC; } - time_t sec = time(nullptr); - localtime_r(&sec, timeInfo); - return ERRCODE_SUCC; -} #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index 028337283..91cf57ae7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -81,6 +81,14 @@ extern "C" End = 0, Start, }; + enum class HeartCheck + { + RESTSTSTE = 0, // 未检测状态 + PASSIVITY, // 被动检测心率 + INITIATIVE, // 主动检测心率 + EXERCISE, // 运动心率 + }; + // 控制心率检测 typedef struct { uint32_t heartRatePerSec; @@ -137,7 +145,7 @@ extern "C" void SetCheckTime(uint64_t time); // 设置本次测试完的时间 uint16_t GetIndex(); // 测试点位 void SetIndex(uint16_t index); - void Heart_Control(HeartState state); + void Heart_Control(HeartState state, HeartCheck check); private: HealthAllDatas healthDatas; @@ -168,6 +176,8 @@ extern "C" uint8_t valid_counter_ = 0; // 有效数计数器 uint8_t disvalid_counter_ = 0; // 无效数计数器 uint8_t unwear_counter_ = 0; // 佩戴错误计数器 + + HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态 }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index 14dc31d3b..19c0f1110 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -474,14 +474,21 @@ namespace OHOS /* ---------------------------------- 状态检测 ---------------------------------- */ // 控制心率检测 - void HeartModel::Heart_Control(HeartState state) + void HeartModel::Heart_Control(HeartState state, HeartCheck check) { + if (check < checkstate) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Higher execution instruction exists"); + return; + } if (state == HeartState::End && heartstate == true) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartState End"); uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST; send_ppg_cmd_msg(md); heartstate = false; + // 复原检测状态 + checkstate = HeartCheck::RESTSTSTE; } else if (state == HeartState::Start && heartstate == false) { @@ -640,8 +647,8 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " Save %d %d", data->Heart, data->timestamp); SetCheckTime(data->timestamp); HealthService::GetInstance()->UpdateHealthData(*data); - // 更新卡片心率值 - // SetHeartRatePerSec(heart); + // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级] + HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY); } #endif } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp index bc103aa5c..180bc2550 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp @@ -143,7 +143,7 @@ namespace OHOS if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0) { // 关闭心率检测 - HeartModel::GetInstance()->Heart_Control(HeartState::End); + HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); // 回退 NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM); } @@ -208,7 +208,7 @@ namespace OHOS HeartCheckView::GetInstance()->GetImageAnimator()->Stop(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus false"); // 关闭心率检测 - HeartModel::GetInstance()->Heart_Control(HeartState::End); + HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); startheart = true; } } @@ -225,8 +225,9 @@ namespace OHOS if (startheart == true) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus true"); - // 开启心率检测 - HeartModel::GetInstance()->Heart_Control(HeartState::Start); + // 开启心率检测 [UI优先级最高直接打断正在检测 重新检测] + HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); + HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::INITIATIVE); startheart = false; } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp index 4b0b1dc1c..d2e7b35ea 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp @@ -353,7 +353,7 @@ namespace OHOS if (previousCardId == HEART_RATE && cardId != HEART_RATE) { // 从心率卡片变为其他卡片时调用关闭心率检测的函数 - HeartModel::GetInstance()->Heart_Control(HeartState::End); + HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); } // 更新上一个卡片的值 @@ -362,8 +362,9 @@ namespace OHOS switch (cardId) { case HEART_RATE: - // 开启心率检测 - HeartModel::GetInstance()->Heart_Control(HeartState::Start); + // 开启心率检测 [UI优先级最高直接打断正在检测 重新检测] + HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); + HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); break; case COMPASS: diff --git a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp index 0e6db03e1..7e8eff98f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp @@ -31,7 +31,7 @@ #define MESSAGE_JSON_FILE "user/userdata/message/ancs.json" #define PRINTFDATA 1 -extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds); +extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year); namespace OHOS { MessageData message_; @@ -120,7 +120,7 @@ namespace OHOS uint32 timestamp = cJSON_GetObjectItem(item, "time")->valueint; messagedata.timestamp = timestamp; char labelTime[20]; - if (uapi_get_TIME_STR(timestamp, labelTime, '.', false) != ERRCODE_SUCC) + if (uapi_get_TIME_STR(timestamp, labelTime, '.', false, false) != ERRCODE_SUCC) { messagedata.labelTime = std::string("2024.1.1 00:00"); } diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp index 6d67e862c..0b30109f0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp @@ -57,7 +57,7 @@ namespace OHOS { Time = 5; START_FLAG = false; - HeartModel::GetInstance()->Heart_Control(HeartState::End); // 关闭心率检测 + HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); // 关闭心率检测 } /* -------------------------------------------------------------------------- */ /*定时器到期时的处理*/ @@ -78,7 +78,7 @@ namespace OHOS RespiratoryTrainingModel::GetInstance().RT_StopTimer(); // 停止定时器 RespiratoryTrainingModel::GetInstance().AddRespiratoryTrainingTimes(); // 呼吸训练次数加1 p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_()->Stop(); // 关闭呼吸动画 - HeartModel::GetInstance()->Heart_Control(HeartState::End); // 关闭心率检测 + HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); // 关闭心率检测 p_RespiratoryTrainingView->ChangeView(RESPIRATORYTRAINING, RESPIRATORYTRAININGCOMPLETED); } else @@ -86,7 +86,7 @@ namespace OHOS Time = ONE_MINUTE; p_RespiratoryTrainingView->StartRespiratoryTraining(); // 开始呼吸训练 START_FLAG = true; - HeartModel::GetInstance()->Heart_Control(HeartState::Start); // 开启心率检测 + HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::INITIATIVE); // 开启心率检测 } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/rtcservice/src/rtc_at_cmd.cpp b/code/sdk/application/wearable/fd230app/nativeui/rtcservice/src/rtc_at_cmd.cpp index 1ae2202be..c38fb8d93 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/rtcservice/src/rtc_at_cmd.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/rtcservice/src/rtc_at_cmd.cpp @@ -97,22 +97,10 @@ extern "C" } return ERRCODE_SUCC; } - static uint32_t rtc_restore_factory_settings(uint8_t *para, uint32_t paraLen, char *strCommonCmd) - { - UNUSED(para); - UNUSED(paraLen); - UNUSED(strCommonCmd); - - // 执行恢复出厂设置的操作 - uapi_restore_factory_setting(); - PRINT("Restoring Factory Settings...\n"); - return ERRCODE_SUCC; - } static const at_cmd_table_t g_rtc_cmd[] = { {(char *)"AT^RTCTEST", rtc_do_test, (char *)"enable"}, - {(char *)"AT^RESTORE", rtc_restore_factory_settings, NULL}, }; at_cmd_table_t *get_rtc_cmd_table(uint32_t *cmd_count) diff --git a/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h b/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h index a596d09b1..00735930c 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h @@ -4,9 +4,9 @@ * @LastEditors: penglei 1624952103@qq.com * @LastEditTime: 2024-06-28 15:51:01 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + * @Description: + * + * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ /*** * @Date: 2024-06-25 10:34:10 @@ -20,72 +20,69 @@ #include #include -//#include "AppViewIDs.h" -//#include "UiConfig.h" -//#include "sleep/include/SleepView.h" -//#include "sleep/include/SleepControlPresenter.h" +// #include "AppViewIDs.h" +// #include "UiConfig.h" +// #include "sleep/include/SleepView.h" +// #include "sleep/include/SleepControlPresenter.h" #include "string" - #define SLEEP_PATH "user/userdata/sleep/%s/sleep_%d.bin" #define SLEEP_DIR_PATH "user/userdata/sleep/%s" - namespace OHOS { - #pragma pack(1) +#pragma pack(1) typedef struct { - uint32_t fall_asleep_timestamp; //入睡 - uint32_t wake_up_timestamp; //出睡 - uint16_t total_time; //总时长 + uint32_t fall_asleep_timestamp; // 入睡 + uint32_t wake_up_timestamp; // 出睡 + uint16_t total_time; // 总时长 } NAP_T; typedef struct { uint32_t timestamp; // - uint8_t stat; //状态 - + uint8_t stat; // 状态 + } SLEEP_STATE_T; typedef struct { SLEEP_STATE_T sleep_status[20]; uint8_t status_num; - uint32_t fall_asleep_timestamp; //入睡 - uint32_t wake_up_timestamp; //出睡 - uint16_t total_time; //总时长 - uint16_t total_deep_sleep_time;//深睡 - uint16_t total_mild_sleep_time;//浅睡 - uint16_t total_rem_sleep_time;//清醒 - uint16_t total_wake_time;//动眼 + uint32_t fall_asleep_timestamp; // 入睡 + uint32_t wake_up_timestamp; // 出睡 + uint16_t total_time; // 总时长 + uint16_t total_deep_sleep_time; // 深睡 + uint16_t total_mild_sleep_time; // 浅睡 + uint16_t total_rem_sleep_time; // 清醒 + uint16_t total_wake_time; // 动眼 } SLEEP_T; - - #pragma pack() - bool save_nap_data(NAP_T *data); +#pragma pack() - uint32_t read_sleep_nap_data(char *data,uint32_t size,FILE *fp); - + bool save_nap_data(NAP_T *data); + uint32_t read_sleep_nap_data(char *data, uint32_t size, FILE *fp); void set_nap_data(NAP_T *data); - void set_sleep_data(SLEEP_T *data); - bool save_sleep_data(SLEEP_T *data); class SleepModel { public: static SleepModel &GetInstance(void); - void GetSleepTime(); // 获取睡眠时间 - std::string GetSleepStr(); // 解析睡眠时间 - void GetRestTime(); // 获取入睡时间 - std::string GetRestStr(); // 解析入睡时间 - void GetWalkTime(); // 获取醒来时间 - std::string GetWalkStr(); // 解析醒来时间 - void GetGoalTime(); // 获取目标休息时间(xx-xx) - std::string GetGoalStr(); // 解析目标休息时间 + void update_time_info(uint32_t timestamp, std::string &timeStr); + void update_sleep(SLEEP_T *data); + void set_sleep_goal(); + + int get_sleep_hour(); + int get_sleep_min(); + int get_sleep_goal(); + int get_sleep_total(); + std::string get_rest_str(); // 解析入睡时间 + std::string get_walk_str(); // 解析醒来时间 + std::string get_goal_str(); // 解析目标休息时间 private: SleepModel(); @@ -93,11 +90,12 @@ namespace OHOS SleepModel &operator=(const SleepModel &); virtual ~SleepModel(); - std::string sleepStr; - std::string restStr; - std::string walkStr; - std::string goalsleepStr; - std::string goalwalkStr; + std::string sleepStr{"--"}; + std::string walkStr{"--"}; + std::string goalStr{"--"}; + + uint8_t sleep_total_time = 0; + uint8_t goal_total_time = 0; }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepTimeView.h b/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepTimeView.h index 254087266..867cd550f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepTimeView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepTimeView.h @@ -1,3 +1,9 @@ +/*** + * @Date: 2024-06-25 14:50:26 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-07-01 15:10:12 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepTimeView.h + */ /*** * @Date: 2024-06-25 14:50:26 * @LastEditors: Caisking 3449750381@qq.com @@ -54,7 +60,7 @@ namespace OHOS UILabelExt *sleeptitle{nullptr}; // 入睡时间标题 UILabelExt *walktitle{nullptr}; // 醒来标题 UILabelExt *apptitle{nullptr}; // 详情 - UILabelExt *rest{nullptr}; // 作息时间 + UILabelExt *goal{nullptr}; // 作息时间 UILabelExt *sleep{nullptr}; // 入睡时间 UILabelExt *walk{nullptr}; // 醒来时间 UIImageView *transverseline_1{nullptr}; // 横线1 diff --git a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp index 2a430e086..255dbcedf 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp @@ -4,9 +4,9 @@ * @LastEditors: penglei 1624952103@qq.com * @LastEditTime: 2024-06-28 16:52:58 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + * @Description: + * + * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ #include "sleep/include/SleepModel.h" @@ -15,23 +15,37 @@ #include "sleep/include/SleepControlPresenter.h" #include "custom_utils.h" #include - - - +#include "UiConfig.h" +#include "ui_resource_image.h" +#include "samgr_lite.h" +#include +#include +#include +#include +#include +#include +#include "wearable_log.h" +#include "ConfigModel.h" + +extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year); +extern "C" int get_sleep_time_from_config_model(void); +extern "C" int get_wake_up_time_from_config_model(); namespace OHOS { - static NAP_T nap_data = {0}; - static SLEEP_T sleep_data = {0}; - static SLEEP_STATE_T sleep_status = {0}; + + static NAP_T nap_data = {0}; + static SLEEP_T sleep_data = {0}; + static SLEEP_STATE_T sleep_status = {0}; + bool save_nap_data(NAP_T *data) { struct stat info; - char dir_path[64]={0}; - char file_path[64]={0}; - char day[12]={0}; - uapi_get_YYMMDD_Time(day,'\0'); + char dir_path[64] = {0}; + char file_path[64] = {0}; + char day[12] = {0}; + uapi_get_YYMMDD_Time(day, '\0'); - sprintf_s(dir_path,64,SLEEP_DIR_PATH,day); + sprintf_s(dir_path, 64, SLEEP_DIR_PATH, day); if (stat("user/userdata/sleep", &info) != 0) { if (mkdir("user/userdata/sleep", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) @@ -44,64 +58,62 @@ namespace OHOS { if (mkdir(dir_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir fail %s",dir_path); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir fail %s", dir_path); return false; // Failed to create folder } } uint32_t creationTime; - int ret =uapi_get_timestampe_ss(&creationTime); + int ret = uapi_get_timestampe_ss(&creationTime); - sprintf_s(file_path,64,SLEEP_PATH,day,creationTime); + sprintf_s(file_path, 64, SLEEP_PATH, day, creationTime); FILE *fp; - fp=fopen(file_path,"wb+"); - if(fp==NULL) + fp = fopen(file_path, "wb+"); + if (fp == NULL) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "save_nap_sleep_data fopen fail"); return false; } - uint8_t sleep_type=0; - fwrite(&sleep_type,1,1,fp); + uint8_t sleep_type = 0; + fwrite(&sleep_type, 1, 1, fp); uint32_t fall_asleep_timestamp = data->fall_asleep_timestamp; - fwrite(&fall_asleep_timestamp,1,4,fp); + fwrite(&fall_asleep_timestamp, 1, 4, fp); uint32_t wake_up_timestamp = data->wake_up_timestamp; - fwrite(&wake_up_timestamp,1,4,fp); - - uint16_t total_time=data->total_time; - fwrite(&total_time,1,2,fp); + fwrite(&wake_up_timestamp, 1, 4, fp); + uint16_t total_time = data->total_time; + fwrite(&total_time, 1, 2, fp); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "save_nap_sleep_data succ"); fclose(fp); return true; - } void set_nap_data(NAP_T *data) - { - memset(&nap_data,0,sizeof(NAP_T)); - memcpy_s(&nap_data,sizeof(NAP_T),data,sizeof(NAP_T)); + { + memset(&nap_data, 0, sizeof(NAP_T)); + memcpy_s(&nap_data, sizeof(NAP_T), data, sizeof(NAP_T)); save_nap_data(&nap_data); } - uint32_t read_sleep_nap_data(char *data,uint32_t size,FILE *fp) + uint32_t read_sleep_nap_data(char *data, uint32_t size, FILE *fp) { - return fread(data,1,size,fp); + return fread(data, 1, size, fp); } - + bool save_sleep_data(SLEEP_T *data) { struct stat info; - char dir_path[64]={0}; - char file_path[64]={0}; - char day[12]={0}; - uapi_get_YYMMDD_Time(day,'\0'); + char dir_path[64] = {0}; + char file_path[64] = {0}; + char day[12] = {0}; + uapi_get_YYMMDD_Time(day, '\0'); - sprintf_s(dir_path,64,SLEEP_DIR_PATH,day); + sprintf_s(dir_path, 64, SLEEP_DIR_PATH, day); if (stat("user/userdata/sleep", &info) != 0) { if (mkdir("user/userdata/sleep", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) @@ -114,66 +126,177 @@ namespace OHOS { if (mkdir(dir_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir fail %s",dir_path); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir fail %s", dir_path); return false; // Failed to create folder } } - + uint32_t creationTime; - int ret =uapi_get_timestampe_ss(&creationTime); + int ret = uapi_get_timestampe_ss(&creationTime); - sprintf_s(file_path,64,SLEEP_PATH,day,creationTime); + sprintf_s(file_path, 64, SLEEP_PATH, day, creationTime); FILE *fp; - fp=fopen(file_path,"wb+"); - if(fp==NULL) + fp = fopen(file_path, "wb+"); + if (fp == NULL) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "save_nap_sleep_data fopen fail"); return false; } uint8_t sleep_type = 1; - fwrite(&sleep_type,1,1,fp); + fwrite(&sleep_type, 1, 1, fp); uint32_t fall_asleep_timestamp = data->fall_asleep_timestamp; - fwrite(&fall_asleep_timestamp,1,4,fp); + fwrite(&fall_asleep_timestamp, 1, 4, fp); uint32_t wake_up_timestamp = data->wake_up_timestamp; - fwrite(&wake_up_timestamp,1,4,fp); + fwrite(&wake_up_timestamp, 1, 4, fp); - uint16_t total_time=data->total_time; - fwrite(&total_time,1,2,fp); + uint16_t total_time = data->total_time; + fwrite(&total_time, 1, 2, fp); - uint16_t total_deep_sleep_time=data->total_deep_sleep_time; - fwrite(&total_deep_sleep_time,1,2,fp); + uint16_t total_deep_sleep_time = data->total_deep_sleep_time; + fwrite(&total_deep_sleep_time, 1, 2, fp); - uint16_t total_mild_sleep_time=data->total_mild_sleep_time; - fwrite(&total_mild_sleep_time,1,2,fp); + uint16_t total_mild_sleep_time = data->total_mild_sleep_time; + fwrite(&total_mild_sleep_time, 1, 2, fp); - uint16_t total_rem_sleep_time=data->total_rem_sleep_time; - fwrite(&total_rem_sleep_time,1,2,fp); + uint16_t total_rem_sleep_time = data->total_rem_sleep_time; + fwrite(&total_rem_sleep_time, 1, 2, fp); - uint16_t total_wake_time=data->total_wake_time; - fwrite(&total_wake_time,1,2,fp); + uint16_t total_wake_time = data->total_wake_time; + fwrite(&total_wake_time, 1, 2, fp); - fwrite(data->sleep_status,sizeof(SLEEP_STATE_T),data->status_num,fp); + fwrite(data->sleep_status, sizeof(SLEEP_STATE_T), data->status_num, fp); fclose(fp); return true; } void set_sleep_data(SLEEP_T *data) - { - memset(&sleep_data,0,sizeof(SLEEP_T)); - memcpy_s(&sleep_data,sizeof(SLEEP_T),data,sizeof(SLEEP_T)); + { + memset(&sleep_data, 0, sizeof(SLEEP_T)); + memcpy_s(&sleep_data, sizeof(SLEEP_T), data, sizeof(SLEEP_T)); save_sleep_data(&sleep_data); + // 刷新model里面的数据 + SleepModel::GetInstance().update_sleep(&sleep_data); + } + SleepModel::SleepModel() + { + set_sleep_goal(); } - - SleepModel::SleepModel() {} SleepModel::~SleepModel() {} SleepModel &SleepModel::GetInstance() { static SleepModel instance; return instance; } + + void SleepModel::update_sleep(SLEEP_T *data) + { + if (data == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid input data"); + return; + } + + // 打印数据 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fall_asleep_timestamp:%d wake_up_timestamp:%d total_time:%d", + data->fall_asleep_timestamp, data->wake_up_timestamp, data->total_time); + + update_time_info(data->fall_asleep_timestamp, sleepStr); + update_time_info(data->wake_up_timestamp, walkStr); + + // 更新睡眠总时间 + sleep_total_time = data->total_time; + + // 更新一下配置 + set_sleep_goal(); + } + + void SleepModel::update_time_info(uint32_t timestamp, std::string &timeStr) + { + char labelTime[20]; + if (uapi_get_TIME_STR(timestamp, labelTime, '.', false, false) == ERRCODE_SUCC) + { + timeStr = std::string(labelTime); + } + else + { + timeStr = "--"; + } + } + + /* + 设置睡眠目标 + 前2个字节是显示睡眠小时 + 后2个字节显示睡眠分钟 + 需要单独解析出来。 + */ + void SleepModel::set_sleep_goal() + { + int goal_sleep = get_sleep_time_from_config_model(); + int goal_walk = get_wake_up_time_from_config_model(); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "goal_sleep:%d goal_walk:%d", goal_sleep, goal_walk); + + // 提取小时部分(前2字节) + int goal_sleep_hour = goal_sleep >> 16; + // 提取分钟部分(后2字节) + int goal_sleep_min = goal_sleep & 0x00FF; + + std::ostringstream sleeposs; + sleeposs << std::setfill('0') << std::setw(2) << goal_sleep_hour << ":" << std::setw(2) << goal_sleep_min; + + std::string goalsleepStr = sleeposs.str(); + + // 提取小时部分(前2字节) + int goal_walk_hour = goal_walk >> 16; + // 提取分钟部分(后2字节) + int goal_walk_min = goal_walk & 0x00FF; + + std::ostringstream walkoss; + walkoss << std::setfill('0') << std::setw(2) << goal_walk_hour << ":" << std::setw(2) << goal_walk_min; + + std::string goalwalkStr = walkoss.str(); + + goalStr = goalsleepStr + "-" + goalwalkStr; + goal_total_time = goal_walk_hour * 60 + goal_walk_min; + } + // 获取睡眠总时长(小时) + int SleepModel::get_sleep_hour() + { + return sleep_total_time / 60; + } + // 获取睡眠总时长(分钟) + int SleepModel::get_sleep_min() + { + return sleep_total_time % 60; + } + // 获取睡眠总时长(目标) + int SleepModel::get_sleep_goal() + { + return goal_total_time; + } + // 获取睡眠总时长(实际) + int SleepModel::get_sleep_total() + { + return sleep_total_time; + } + // 解析入睡时间 + std::string SleepModel::get_rest_str() + { + return sleepStr; + } + // 解析醒来时间 + std::string SleepModel::get_walk_str() + { + return walkStr; + } + // 解析目标休息时间 + std::string SleepModel::get_goal_str() + { + return goalStr; + } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepTimeView.cpp b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepTimeView.cpp index 7f234e0e1..24765744a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepTimeView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepTimeView.cpp @@ -29,11 +29,9 @@ namespace OHOS void SleepTimeView::SleepDataRefresh() { -#if 0 - rest->SetText(); - sleep->SetText(); - walk->SetText(); -#endif + sleep->SetText((SleepModel::GetInstance().get_rest_str()).c_str()); + walk->SetText((SleepModel::GetInstance().get_walk_str()).c_str()); + goal->SetText((SleepModel::GetInstance().get_goal_str()).c_str()); } void SleepTimeView::ClearAll() @@ -59,10 +57,10 @@ namespace OHOS delete apptitle; apptitle = nullptr; } - if (rest != nullptr) + if (goal != nullptr) { - delete rest; - rest = nullptr; + delete goal; + goal = nullptr; } if (sleep != nullptr) @@ -141,8 +139,9 @@ namespace OHOS apptitle->SetTextColor(Color::Gray()); /* ------------------------------- 数据label初始化 ------------------------------- */ restStr = "--"; - InitLabelAdapt(rest, 211, 95, 230, 47, "restlabel", restStr.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 30); - rest->SetTextColor(Color::Gray()); + InitLabelAdapt(goal, 117, 95, 300, 50, "restlabel", restStr.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 40); + // goal->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + goal->SetTextColor(Color::Gray()); sleepStr = "--"; InitLabelAdapt(sleep, 99, 238, 230, 47, "sleeplabel", sleepStr.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 30); sleep->SetTextColor(Color::Purple()); @@ -154,7 +153,7 @@ namespace OHOS Add(sleeptitle); Add(walktitle); Add(apptitle); - Add(rest); + Add(goal); Add(sleep); Add(walk); Add(transverseline_1); @@ -173,6 +172,7 @@ namespace OHOS } SetDraggable(true); SetTouchable(true); + SleepDataRefresh(); return true; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepView.cpp b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepView.cpp index b959a4441..d0541a906 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepView.cpp @@ -26,16 +26,23 @@ namespace OHOS g_pSleepView = nullptr; } + // 刷新UI数据 void SleepView::SleepDataRefresh() { -#if 0 - time_minute->SetText(SleepModel::GetInstance().getstepnew()); - time_hour->SetText(SleepModel::GetInstance().getstepSleep()); - circleProgress_->SetValue(SleepModel::GetInstance().getstepvalue()); -#endif - Invalidate(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updata SleppTime!"); - RootView::GetInstance()->Invalidate(); + int sleep_hour = SleepModel::GetInstance().get_sleep_hour(); + int sleep_min = SleepModel::GetInstance().get_sleep_min(); + // 有数据则刷新 + if (sleep_hour != 0 || sleep_min != 0) + { + time_hour->SetText(std::to_string(sleep_hour).c_str()); + time_minute->SetText(std::to_string(sleep_min).c_str()); + + int value = (float(SleepModel::GetInstance().get_sleep_total()) / float(SleepModel::GetInstance().get_sleep_goal())) * 100; + circleProgress_->SetValue(value); + Invalidate(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updata SleppTime!"); + RootView::GetInstance()->Invalidate(); + } } void SleepView::ClearAll() @@ -145,7 +152,7 @@ namespace OHOS circleProgress_->SetRadius(205); circleProgress_->SetStartAngle(320); circleProgress_->SetEndAngle(40); - circleProgress_->SetValue(50); + circleProgress_->SetValue(0); circleProgress_->SetBackgroundImagePosition(36, 26); /* -------------------------------- 将组件添加到根视图 ------------------------------- */ Add(progress_image); @@ -171,6 +178,7 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SleepView::InitPage fail"); return false; } + SleepDataRefresh(); // 刷新数据 SetDraggable(true); SetTouchable(true); return true; diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/CMakeLists.txt b/code/sdk/application/wearable/service/ble_service/blemoder/CMakeLists.txt index 8636427bb..5e12163b5 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/CMakeLists.txt +++ b/code/sdk/application/wearable/service/ble_service/blemoder/CMakeLists.txt @@ -14,6 +14,7 @@ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits ${ROOT_DIR}/application/wearable/nativeapp/nativeui/heartrate/include ${ROOT_DIR}/application/wearable/fd230app/nativeui/weather/include ${ROOT_DIR}/application/wearable/fd230app/nativeui/heart_blood/health_service +${ROOT_DIR}/application/wearable/fd230app/nativeui/sleep/include/ ${ROOT_DIR}/application/wearable/fd230app/nativeui/phone/include ${ROOT_DIR}/application/wearable/fd230app/nativeui/language/include ${ROOT_DIR}/application/wearable/fd230app/nativeui/language diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp index dc1dc03de..db85d49c1 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp @@ -28,9 +28,11 @@ #ifdef FD230 #include "TraingModel.h" #include "WeatherModel.h" +#include "SleepModel.h" #endif #include "AlmmgrAlarmClockManage.h" +#include "AlarmClockTimerConfig.h" #include "AlarmClockManage.h" #include "SetDialModel.h" @@ -493,6 +495,11 @@ void ble_set_sleep_remind(msg_get_sleep_param_info_t data) printf("睡前提醒 %d\r\n",data.bedtime_alarm); p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND,data.bedtime_alarm); + + //更新睡眠配置 + OHOS::SleepModel::GetInstance().set_sleep_goal(); + set_sleep_and_wake_time(); + get_sleep_time_notify(); } return; } diff --git a/code/sdk/drivers/peripheral/config/include/ConfigModelC.h b/code/sdk/drivers/peripheral/config/include/ConfigModelC.h index ad22bc2cd..dbcd21222 100644 --- a/code/sdk/drivers/peripheral/config/include/ConfigModelC.h +++ b/code/sdk/drivers/peripheral/config/include/ConfigModelC.h @@ -98,6 +98,9 @@ void get_user_info_from_config_model(int user_info[5]); int get_sleep_time_from_config_model(void); int get_wake_up_time_from_config_model(void); +//设置睡眠频率 +void set_config_heart(int heartRateDetectionFreq); + #ifdef __cplusplus #if __cplusplus } diff --git a/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp b/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp index 7caecfba0..ace4e6b72 100644 --- a/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp +++ b/code/sdk/drivers/peripheral/config/src/ConfigModel.cpp @@ -1445,18 +1445,26 @@ void get_user_info_from_config_model(int user_info[5]) user_info[3] = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_HEIGHT); user_info[4] = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_WEARING_MODE); } + +//获取睡眠目标[入睡时间] int get_sleep_time_from_config_model(void) { int sleep_time = 0; sleep_time = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_BEDTIME); return sleep_time; } +//获取睡眠目标[醒来时间] int get_wake_up_time_from_config_model(void) { int wake_up_time = 0; wake_up_time = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_GET_UP); return wake_up_time; } +void set_config_heart(int heartRateDetectionFreq) +{ + // 设置心率检测频率 + OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED, heartRateDetectionFreq); +} #ifdef __cplusplus #if __cplusplus } diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.c b/code/sdk/drivers/peripheral/utils/custom_utils.c index 7a5495455..9c47d8dd7 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils.c @@ -791,11 +791,12 @@ errcode_t uapi_get_yyyymmddhhmmss_Date(char *date) /** * @param {uint32_t} time 时间戳 * @param {char} *p_time 字符串 - * @param {bool} *include_seconds 是否包含秒 - * @param {char} 隔断符 + * @param {bool} include_seconds 是否包含秒 + * @param {bool} include_year 是否包含年份 + * * @param {char} 隔断符 * @brief 通过时间戳获取日期 */ -errcode_t uapi_get_TIME_STR(uint32_t time,char *p_time, char separator, bool include_seconds) +errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year) { if (p_time == NULL) { @@ -813,18 +814,35 @@ errcode_t uapi_get_TIME_STR(uint32_t time,char *p_time, char separator, bool inc // 根据需要格式化日期时间字符串,包括时分秒和分隔符 if (include_seconds) { - sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator, - timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min); + if (include_year) + { + sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator, + timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min); + } + else + { + sprintf(p_time, "%02d%c%02d %02d%c%02d", timeinfo->tm_mon + 1, separator, + timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min); + } } else { - sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator, - timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min); + if (include_year) + { + sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator, + timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min); + } + else + { + sprintf(p_time, "%02d%c%02d %02d%c%02d", timeinfo->tm_mon + 1, separator, + timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min); + } } return ERRCODE_SUCC; } + /** * @param {char} *p_time * @param {char} 隔断符 diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.h b/code/sdk/drivers/peripheral/utils/custom_utils.h index 6c87f1e43..b6a904736 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.h +++ b/code/sdk/drivers/peripheral/utils/custom_utils.h @@ -67,14 +67,11 @@ errcode_t uapi_set_time_from_cat1(char* cat1time); /**获取日期*/ errcode_t uapi_get_yyyymmddhhmmss_Date(char *date); - -/*获取日期*/ -errcode_t uapi_get_YYMMDD_Time(char *p_time, char separator); - /*获取日期扩展版*/ errcode_t uapi_get_YYMMDD_Time_extend(char *p_time, char separator,uint8_t day); - +/*获取日期*/ +errcode_t uapi_get_YYMMDD_Time(char *p_time, char separator); /*获取时间*/ errcode_t uapi_get_HHMMSS_Time(char *p_time, char separator, bool include_seconds); /*获取星期*/ @@ -82,7 +79,7 @@ errcode_t uapi_get_WeekStr(char *p_week); /*设置屏幕亮屏*/ void uapi_set_screen_on_api(void); /*通过时间戳解析时间字符串*/ -errcode_t uapi_get_TIME_STR(uint32_t time,char *p_time, char separator, bool include_seconds); +errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year); char *uapi_get_local_yyyymmdd_date(void); diff --git a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c index 01f3818cc..03f5954a4 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c @@ -8,6 +8,7 @@ #include "debug_print.h" #include "custom_runtime.h" #include "lwip/altcp_tls.h" +#include "ConfigModelC.h" #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) #define CUSTOM_UTILS_MAX_ARGC 8 @@ -690,6 +691,52 @@ static uint32_t custom_mem_debug(uint8_t *para, uint32_t paraLen, char *strCommo return ERRCODE_SUCC; } + /*恢复出厂设置*/ + static uint32_t custom_restore_factory_settings(uint8_t *para, uint32_t paraLen, char *strCommonCmd) + { + UNUSED(para); + UNUSED(paraLen); + UNUSED(strCommonCmd); + + // 执行恢复出厂设置的操作 + uapi_restore_factory_setting(); + + PRINT("Restoring Factory Settings...\n"); + return ERRCODE_SUCC; + } + +#if 1 + /*设置心率检测频率*/ + static uint32_t custom_set_heart(uint8_t *para, uint32_t paraLen, char *strCommonCmd) + { + UNUSED(strCommonCmd); + + uint8_t argv[CUSTOM_UTILS_MAX_ARGC][CUSTOM_UTILS_MAX_ARGV_LEN] = {0}; + uint32_t argc = 0; + + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != CUSTOM_UTILS_SUCCESS) + { + PRINT("CUSTOM_UTILSTEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + + if (argc != 1) + { + PRINT("CUSTOM_UTILSTEST power_test ATCMD Set Parameter Failed argc %d\r\n"); + return ERRCODE_FAIL; + } + int heartRateDetectionFreq = atol((char *)argv[0]); + + // 设置心率检测频率 + set_config_heart(heartRateDetectionFreq); + + PRINT("heartRateDetectionFreq is %d\n", heartRateDetectionFreq); + return ERRCODE_SUCC; + } +#endif + + static const at_cmd_table_t g_custom_utils_cmd[] = { { (char *)"AT^CUSTOM_SN", custom_utils_setsn, (char *)"123456789ABCDEF2345678" }, { (char *)"AT^CUSTOM_SN_REQ", custom_utils_getsn, (char *)" " }, @@ -740,7 +787,9 @@ static const at_cmd_table_t g_custom_utils_cmd[] = { { (char *)"AT^EFUSEWRITE", custom_uapi_efuse_test_write, (char *)" " }, { (char *)"AT^SCHEDDEBUG", custom_task_sched_debug, (char *)" " }, { (char *)"AT^MEMDEBUG", custom_mem_debug, (char *)" " }, - + + {(char *)"AT^RESTORE", custom_restore_factory_settings, (char *)" "}, + {(char *)"AT^SETHEART", custom_set_heart, (char *)" "}, }; -- 2.17.1