From 8e9f2e99cbb6d615184805879ddb2d3e429603a2 Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Thu, 17 Oct 2024 17:52:36 +0800 Subject: [PATCH] =?utf8?q?=E7=B3=BB=E7=BB=9F=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?utf8?q?=E6=AF=8F=E7=A7=92=E5=AE=9A=E6=97=B6=E5=99=A8=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../include/AlarmClockTimerConfig.h | 57 ++-- .../src/AlarmClockTimerConfig.cpp | 257 +++++++++--------- 2 files changed, 165 insertions(+), 149 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 c063a8b8a..f85f56413 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h +++ b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h @@ -3,10 +3,11 @@ * @Date: 2024-06-07 11:18:25 * @LastEditors: penglei 1624952103@qq.com * @LastEditTime: 2024-09-06 11:34:44 - * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + * @FilePath: + * /FD230/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h + * @Description: + * + * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ /* * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. @@ -19,8 +20,9 @@ #include -#include "ohos_types.h" #include "cmsis_os.h" +#include "ohos_types.h" + #ifdef __cplusplus extern "C" { @@ -29,36 +31,36 @@ extern "C" { #define ALARM_INTERVAL_MS 1000 typedef union { - struct timeval timeVal; - uint32 value; + struct timeval timeVal; + uint32 value; } AlarmClockEventData; typedef enum { - ALARM_STATUS_UNUSED, /* The alarm timer is not used. */ - ALARM_STATUS_CREATED, /* The alarm timer is created. */ - ALARM_STATUS_RUNNING, /* The alarm timer is timing. */ + ALARM_STATUS_UNUSED, /* The alarm timer is not used. */ + ALARM_STATUS_CREATED, /* The alarm timer is created. */ + ALARM_STATUS_RUNNING, /* The alarm timer is timing. */ } AlarmState; typedef enum { - ALARM_A, - ALARM_B, - ALARM_NONE, + ALARM_A, + ALARM_B, + ALARM_NONE, } AlarmType; typedef struct { - uint8_t week; - uint8_t hour; - uint8_t minute; - uint8_t second; - uint8_t reserved; + uint8_t week; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t reserved; } AlarmInfo; -typedef void(*AlarmCallBack)(void); +typedef void (*AlarmCallBack)(void); typedef struct { - AlarmState state; - AlarmInfo info; - AlarmCallBack callback; + AlarmState state; + AlarmInfo info; + AlarmCallBack callback; } AlarmCtrl; void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data); @@ -72,6 +74,17 @@ void get_sleep_time_notify(void); void clean_sleep_monitoring_flag(void); void clean_sedentary_flag(void); void set_drinkreminder_data(void); + +bool HandleIsBind(void); +bool HandleCanShowDialog(void); +void custom_timer_callback(void); +void HandleSleepReminder(const struct tm* curTime); +void HandleWakeUp(const struct tm* curTime); +void HandleDrinkReminder(const struct tm* curTime); +void HandleHeartRateDetection(const struct tm *curTime); +void HandleAlarmOnTime(const struct tm *curTime); +void HandleMusicUpdate(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 9b582e7a9..add2bda8f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp @@ -155,7 +155,7 @@ extern "C" } } - static bool is_time_range(struct tm &curTime, int start_time_hour, int start_time_min, int end_time_hour, int end_time_min) + static bool is_time_range(const struct tm &curTime, int start_time_hour, int start_time_min, int end_time_hour, int end_time_min) { int start_min = start_time_hour * 60 + start_time_min; /* 开始时间的分钟数 */ int end_min = end_time_hour * 60 + end_time_min; /* 结束时间的分钟数 */ @@ -335,17 +335,6 @@ extern "C" SetZeroAlarm(); // 重置闹钟 } - static void on_time_CallBackProc(void) - { - AlarmClockEventData unuse; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked"); - - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse)); - - // AlarmTimerEventPublish(TOPIC_EVENT_ON_TIME, unuse); - } - void AlarmScan(void *arg) { struct tm curTime; @@ -388,17 +377,74 @@ extern "C" g_alarmCtrB.callback(); } } - - // 未绑定状态下,以下操作不进行 - if (OHOS::ConfigModel::GetInstance()->get_configData_bool(OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART)) - return; - // 整点回调 - if (curTime.tm_min == 0 && curTime.tm_sec == 0) + do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TIMECALL_BACK, nullptr, 0); + } + + //每秒回调 + void custom_timer_callback() { + struct tm curTime; + int32_t ret = AlarmGetCurrentTimeInfo(&curTime); + if (ret != ERRCODE_SUCC) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "time: %d : %d", curTime.tm_hour, curTime.tm_min); - on_time_CallBackProc(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get current time info, error code: %d", ret); + return; + } + + //绑定判断 + if (HandleIsBind()) + return; + + HandleAlarmOnTime(&curTime); + HandleSleepReminder(&curTime); + + //以下弹窗被控制 + if (HandleCanShowDialog()) + return; + + HandleWakeUp(&curTime); + HandleDrinkReminder(&curTime); + HandleHeartRateDetection(&curTime); + HandleMusicUpdate(); + } + + //判断是否绑定 + bool HandleIsBind(void) + { + // 未绑定状态下,以下操作不进行 + if (OHOS::ConfigModel::GetInstance()->get_configData_bool( + OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART)) { + return true; + } + return false; + } + + //判断是否可以弹窗 + bool HandleCanShowDialog(void) + { + bool state = false; + + if (uapi_dev_runtime_get_saveele_status) + state = true; + if (uapi_dev_runtime_get_train_status) + state = true; + + return state; + } + + //整点回调 + void HandleAlarmOnTime(const struct tm *curTime) + { + if (curTime->tm_min == 0 && curTime->tm_sec == 0) { + AlarmClockEventData unuse; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse)); } + } + + //睡眠提醒 + void HandleSleepReminder(const struct tm *curTime) { // 睡眠总开关 if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP)) { @@ -407,7 +453,7 @@ extern "C" if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND)) { // 提醒一次 - if ((curTime.tm_hour == sleep_notify_time_hour) && (curTime.tm_min == sleep_notify_time_min) && (curTime.tm_sec == 0)) + if ((curTime->tm_hour == sleep_notify_time_hour) && (curTime->tm_min == sleep_notify_time_min) && (curTime->tm_sec == 0)) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "It's bedtime in 20 minutes"); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "20分钟后要睡觉啦!"); @@ -417,9 +463,9 @@ extern "C" } } // 退出睡眠检测模式并进入小睡检测模式 - if (!is_time_range(curTime, sleep_time_hour, sleep_time_min, wake_time_hour, wake_time_min) && (uapi_dev_runtime_get_nap_monitoring_status() == 0)) + if (!is_time_range(*curTime, sleep_time_hour, sleep_time_min, wake_time_hour, wake_time_min) && (uapi_dev_runtime_get_nap_monitoring_status() == 0)) { - if (curTime.tm_hour == wake_time_hour && curTime.tm_min == wake_time_min && curTime.tm_sec == 0) + if (curTime->tm_hour == wake_time_hour && curTime->tm_min == wake_time_min && curTime->tm_sec == 0) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "闹铃!"); //退出睡眠模式 @@ -438,7 +484,7 @@ extern "C" } } // 进入睡眠检测模式并退出小睡检测模式 - else if (is_time_range(curTime, sleep_time_hour, sleep_time_min, wake_time_hour, wake_time_min) && (uapi_dev_runtime_get_sleep_monitoring_status() == 0)) + else if (is_time_range(*curTime, sleep_time_hour, sleep_time_min, wake_time_hour, wake_time_min) && (uapi_dev_runtime_get_sleep_monitoring_status() == 0)) { int cmd = 1; uapi_dev_runtime_set_sleep_status(0); // 清零睡眠状态 @@ -455,7 +501,7 @@ extern "C" // 设置状态为睡眠 OHOS::SleepModel::GetInstance().set_sleep_state(OHOS::SLEEPSTATE::SLEPP); - if (curTime.tm_hour == sleep_time_hour && curTime.tm_min == sleep_time_min && curTime.tm_sec == 0) + if (curTime->tm_hour == sleep_time_hour && curTime->tm_min == sleep_time_min && curTime->tm_sec == 0) { //进入睡眠模式 OHOS::SleepModeModel::GetInstance().SetSleepModeEnabled(); @@ -467,114 +513,71 @@ extern "C" do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL); // 算法底层切换睡眠监测模式 } } + } - /*省电模式下,下方弹窗均不开启*/ - if (uapi_dev_runtime_get_saveele_status()) - return; - // 久坐提醒 - if (sedentary_switch) - { - if (is_time_range(curTime, sedentary_start_hour, sedentary_start_min, sedentary_stop_hour, sedentary_stop_min) && (uapi_dev_runtime_get_sedentary_status() == 0)) - { - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_SEDENTARY, NULL); - } - else if (!is_time_range(curTime, sedentary_start_hour, sedentary_start_min, sedentary_stop_hour, sedentary_stop_min) && (uapi_dev_runtime_get_sedentary_status() == 1)) - { - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CLOSE_SEDENTARY, NULL); - } - } - // 喝水提醒 - if (drinkreminder_switch) - { - // 定时提醒 - if (drinkreminder_switch == 1) // 每天在指定的时间提醒用户喝水 - { - if (curTime.tm_hour == drinkreminder_start_hour && - curTime.tm_min == drinkreminder_start_min && - curTime.tm_sec == 0) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!"); - AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0); - } - } - // 间隔提醒 - else if (drinkreminder_switch == 2) - { - // 判断当前时间是否在提醒时间段内 - if (is_time_range(curTime, drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min)) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " curTime.tm_sec = %d", curTime.tm_sec); - double interval_time = (drinkreminder_freq == 0) ? 0.5 : drinkreminder_freq; // 频率设置 - int interval_time_seconds = static_cast(interval_time * 60) * 60; // 设置的间隔时间秒数 - int start_time_seconds = (drinkreminder_start_hour * 60 + drinkreminder_start_min) * 60; // 开始时间秒数 - int current_seconds = (curTime.tm_hour * 60 + curTime.tm_min) * 60; // 当前时间的秒数 - int hour_24_seconds = 24 * 60 * 60; - if (uapi_dev_runtime_get_drinkremind_status() == 0) - { - uapi_dev_runtime_set_drinkremind_status(1); - drinkremind_expectedTime = current_seconds + interval_time_seconds; - if (drinkremind_expectedTime >= hour_24_seconds) - { - drinkremind_expectedTime = drinkremind_expectedTime - hour_24_seconds; - } - } - else - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "current_seconds = %d,drinkremind_expectedTime = %d", current_seconds, drinkremind_expectedTime); - if (current_seconds == drinkremind_expectedTime && curTime.tm_sec == 0) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!"); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "curTime:%d:%d", curTime.tm_hour, curTime.tm_min); - drinkremind_expectedTime = current_seconds + interval_time_seconds; - if (drinkremind_expectedTime >= hour_24_seconds) - { - drinkremind_expectedTime = drinkremind_expectedTime - hour_24_seconds; - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "current_seconds = %d,drinkremind_expectedTime = %d", current_seconds, drinkremind_expectedTime); - AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0); - } - } - } - else if (!is_time_range(curTime, drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min) && uapi_dev_runtime_get_drinkremind_status() == 1) - { - uapi_dev_runtime_set_drinkremind_status(0); - } - } - } - // 心率周期检测 [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"); - /*训练过程中 不需要被动检测*/ - if (uapi_dev_runtime_get_train_status() == 1) - return; - // 开启心率检测 如果有其他心率检测在进行,则不会进行检测[低优先级] - OHOS::HeartModel::GetInstance()->Heart_Control(OHOS::HeartState::Start, OHOS::HeartCheck::PASSIVITY); - } - } - - int16_t curviewid = OHOS::NativeAbility::GetInstance().GetCurSliceId(); - if (curviewid != VIEW_MAIN && OHOS::PlayersView::GetInstance()) // 如果当前不在主界面且音乐界面不为空 - { - OHOS::UICheckBox::UICheckBoxState state = OHOS::PlayersView::GetInstance()->GetPlayerButtonState(); - if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) - { - SendMsgToUIService(UI_UPDATE_PLAYERPROCESS, 0, nullptr, 0); - } + //喝水提醒 + void HandleDrinkReminder(const struct tm *curTime) { + if (drinkreminder_switch == 1) { // 定时提醒 + if (curTime->tm_hour == drinkreminder_start_hour && + curTime->tm_min == drinkreminder_start_min && + curTime->tm_sec == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!"); + AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0); + } + } else if (drinkreminder_switch == 2) { // 间隔提醒 + // 判断当前时间是否在提醒时间段内 + if (is_time_range(*curTime, drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min)) { + double interval_time = (drinkreminder_freq == 0) ? 0.5 : drinkreminder_freq; + int interval_time_seconds = (int)(interval_time * 60) * 60; + int current_seconds = (curTime->tm_hour * 60 + curTime->tm_min) * 60; + int hour_24_seconds = 24 * 60 * 60; + // 进行间隔判断和提醒 + if (uapi_dev_runtime_get_drinkremind_status() == 0) { + uapi_dev_runtime_set_drinkremind_status(1); + drinkremind_expectedTime = current_seconds + interval_time_seconds; + drinkremind_expectedTime %= hour_24_seconds; // 同时处理24小时循环 + } else if (current_seconds == drinkremind_expectedTime && curTime->tm_sec == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!"); + drinkremind_expectedTime += interval_time_seconds; + drinkremind_expectedTime %= hour_24_seconds; // 处理24小时循环 + AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0); + } + } else if (!is_time_range(*curTime, drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min) && uapi_dev_runtime_get_drinkremind_status() == 1) { + uapi_dev_runtime_set_drinkremind_status(0); + } + } + } + + //心率周期检测 + void HandleHeartRateDetection(const struct tm *curTime) { + int heartRateDetectionInterval = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED); + if (heartRateDetectionInterval) { + if (curTime->tm_min % heartRateDetectionInterval == 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); + } } - else if (OHOS::RecordingPlayerView::GetInstance()) - { - OHOS::UICheckBox::UICheckBoxState state = OHOS::RecordingPlayerView::GetInstance()->GetPlayerButtonState(); - if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) - { - SendMsgToUIService(UI_UPDATE_RECORDPROCESS, 0, nullptr, 0); - } + } + + //音乐更新 + void HandleMusicUpdate() { + int16_t curviewid = OHOS::NativeAbility::GetInstance().GetCurSliceId(); + if (curviewid != VIEW_MAIN && OHOS::PlayersView::GetInstance()) { // 当前不在主界面且音乐界面不为空 + OHOS::UICheckBox::UICheckBoxState state = OHOS::PlayersView::GetInstance()->GetPlayerButtonState(); + if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) { + SendMsgToUIService(UI_UPDATE_PLAYERPROCESS, 0, nullptr, 0); + } + } else if (OHOS::RecordingPlayerView::GetInstance()) { + OHOS::UICheckBox::UICheckBoxState state = OHOS::RecordingPlayerView::GetInstance()->GetPlayerButtonState(); + if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) { + SendMsgToUIService(UI_UPDATE_RECORDPROCESS, 0, nullptr, 0); + } } } + static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback) { if (alarmCtrl == nullptr) -- 2.17.1