\r
#include "AlarmClockTimerConfig.h"\r
\r
-#ifdef __cplusplus\r
-extern "C" {\r
+#include "ConfigModelC.h"\r
+#include "ConfigModel.h"\r
+#include "heartrate/include/HeartModel.h"\r
+#include "sleep/include/SleepModel.h"\r
+#include "sleepmode/include/SleepModeModel.h"\r
+// #include "safemodemanager/include/SafeModeManagerModel.h"\r
+#include "cat1_server_hal.h"\r
+#include "custom_runtime.h"\r
+#include "uiservice/include/ui_service.h"\r
+#include "power_display_service.h"\r
+#include <NativeAbility.h>\r
+#include "AppViewIDs.h"\r
+#include "player/include/PlayersView.h"\r
+#include "record/include/RecordingPlayerView.h"\r
+#include "custom_utils.h"\r
+#include "alarm/include/AlarmClockModel.h"\r
+#ifdef CYWEE_SPORT\r
+#include "cywee_service.h"\r
#endif\r
\r
- #ifdef PPG_HX3695\r
-static AlarmCtrl g_alarmCtrA;\r
-static AlarmCtrl g_alarmCtrB;\r
-namespace OHOS {\r
-GraphicTimer* g_AlarmHandle = nullptr;\r
-}\r
++#ifdef SUPPORT_PPG_SERVICE\r
+#include "ppg_service.h"\r
+#endif\r
\r
-void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data)\r
+#ifdef __cplusplus\r
+extern "C"\r
{\r
- int32 ret;\r
- uint32 size = sizeof(AlarmClockEventData);\r
- BroadcastApi *broadcastApi = nullptr;\r
- IUnknown *api = nullptr;\r
+#endif\r
\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic);\r
+ static AlarmCtrl g_alarmCtrA;\r
+ static AlarmCtrl g_alarmCtrB;\r
+ static osTimerId_t g_AlarmHandle = nullptr;\r
\r
- void *publishData = malloc(size);\r
- if (publishData == nullptr) {\r
- return;\r
+#define SLEPPNOTIFY 20\r
+\r
+ static int sleep_time = 0;\r
+ static int wake_up_time = 0;\r
+ static int sleep_notify_time = 0;\r
+ static int sleep_time_hour = 0;\r
+ static int sleep_time_min = 0;\r
+ static int wake_time_hour = 0;\r
+ static int wake_time_min = 0;\r
+ static int sedentary_switch = 0;\r
+ static int sedentary_interval = 1;\r
+ static int sedentary_time = 0;\r
+ static int sedentary_start_hour = 0;\r
+ static int sedentary_start_min = 0;\r
+ static int sedentary_stop_hour = 0;\r
+ static int sedentary_stop_min = 0;\r
+ static int drinkreminder_switch = 0; /*喝水提醒开关:0 关闭 1开始 2间隔提醒*/\r
+ static int drinkreminder_start_time = 0; /*喝水提醒开始时间*/\r
+ static int drinkreminder_start_hour = 0; /*喝水提醒开始小时*/\r
+ static int drinkreminder_start_min = 0; /*喝水提醒开始分钟*/\r
+ static int drinkreminder_end_time = 0; /*喝水提醒结束时间*/\r
+ static int drinkreminder_end_hour = 0; /*喝水提醒结束小时*/\r
+ static int drinkreminder_end_min = 0; /*喝水提醒结束分钟*/\r
+ static int drinkreminder_freq = 0; /*喝水提醒频率*/\r
+ static int drinkreminder_goal = 0; /*喝水提醒目标ml*/\r
+ static int drinkremind_expectedTime = 0;\r
+ static int sleep_notify_time_min = 0;\r
+ static int sleep_notify_time_hour = 0;\r
+ static int time_sync_flag = 0;\r
+\r
+ // #define SEDENTARY_TIME_RANGE (((curTime.tm_hour > sedentary_start_hour) || (curTime.tm_hour == sedentary_start_hour && curTime.tm_min >= sedentary_start_min)) && \\r
+// ((curTime.tm_hour < sedentary_stop_hour) || (curTime.tm_hour == sedentary_stop_hour && curTime.tm_min < sedentary_stop_min)))\r
+\r
+ // #define WAKE_TIME_RANGE (((wake_time_hour < sleep_time_hour) && \\r
+// ((curTime.tm_hour > wake_time_hour) || \\r
+// (curTime.tm_hour == wake_time_hour && curTime.tm_min >= wake_time_min)) && \\r
+// ((curTime.tm_hour < sleep_time_hour) || \\r
+// (curTime.tm_hour == sleep_time_hour && curTime.tm_min < sleep_time_min))) || \\r
+// ((wake_time_hour >= sleep_time_hour) && \\r
+// (((curTime.tm_hour > wake_time_hour) || \\r
+// (curTime.tm_hour == wake_time_hour && curTime.tm_min >= wake_time_min)) || \\r
+// ((curTime.tm_hour < sleep_time_hour) || \\r
+// (curTime.tm_hour == sleep_time_hour && curTime.tm_min < sleep_time_min))) || \\r
+// ((curTime.tm_hour > wake_time_hour) && (curTime.tm_hour < sleep_time_hour))))\r
+\r
+ // 设置目标睡眠时间\r
+ void set_sleep_and_wake_time(void)\r
+ {\r
+ sleep_time = get_sleep_time_from_config_model();\r
+ wake_up_time = get_wake_up_time_from_config_model();\r
+ // 解析开始时间\r
+ sleep_time_hour = (sleep_time & 0xFFFF0000) >> 16;\r
+ sleep_time_min = sleep_time & 0x0000FFFF;\r
+ wake_time_hour = (wake_up_time & 0xFFFF0000) >> 16;\r
+ wake_time_min = wake_up_time & 0x0000FFFF;\r
+ clean_sleep_monitoring_flag();\r
+ // 解析结束时间\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sleep_time_hour:%d sleep_time_min:%d wake_time_hour:%d wake_time_min:%d", sleep_time_hour, sleep_time_min, wake_time_hour, wake_time_min);\r
}\r
- ret = memcpy_s(publishData, size, (const void *)&data, size);\r
- if (ret != EOK) {\r
- free(publishData);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s fail! ret = %d", ret);\r
- return;\r
+\r
+ void set_sedentary_data(void)\r
+ {\r
+ sedentary_switch = get_sedentary_switch_from_config_model();\r
+ sedentary_time = get_sedentary_time_from_config_model();\r
+ sedentary_interval = get_sedentary_interval_from_config_model();\r
+ #ifdef CYWEE_SPORT\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SET_SEDENTARY_INTERVAL, &sedentary_interval); // 设置久坐提醒间隔\r
+ #endif\r
+\r
+ // sedentary_start_hour = (sedentary_time & 0XFF000000) >> 24;\r
+ // sedentary_start_min = (sedentary_time & 0X00FF0000) >> 16;\r
+ // sedentary_stop_hour = (sedentary_time & 0X0000FF00) >> 8;\r
+ // sedentary_stop_min = sedentary_time & 0X000000FF;\r
+ sedentary_stop_min = (sedentary_time & 0XFF000000) >> 24;\r
+ sedentary_stop_hour = (sedentary_time & 0X00FF0000) >> 16;\r
+ sedentary_start_min = (sedentary_time & 0X0000FF00) >> 8;\r
+ sedentary_start_hour = sedentary_time & 0X000000FF;\r
+ clean_sedentary_flag();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set_sedentary_data:%d:%d~%d:%d", sedentary_start_hour, sedentary_start_min, sedentary_stop_hour, sedentary_stop_min);\r
}\r
\r
- Request request = {\r
- .msgId = topic,\r
- .len = size,\r
- .msgValue = 0,\r
- .data = publishData,\r
- };\r
+ void set_drinkreminder_data(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set_drinkreminder_data");\r
+ drinkreminder_switch = OHOS::ConfigModel::GetInstance()->GetDrinkSwitch();\r
+ drinkreminder_freq = OHOS::ConfigModel::GetInstance()->GetDrinkFreq();\r
+ drinkreminder_goal = OHOS::ConfigModel::GetInstance()->GetDrinkGoal();\r
\r
- /* public request */\r
- api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
- if (api == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed");\r
- free(publishData);\r
- return;\r
+ // 获取提醒时间段\r
+ drinkreminder_start_time = OHOS::ConfigModel::GetInstance()->GetDrinkStart(); // 获取喝水提醒开始时间,int类型 前16位小时,后16位分钟\r
+ drinkreminder_end_time = OHOS::ConfigModel::GetInstance()->GetDrinkEnd(); // 获取喝水提醒结束时间, int类型 前16位小时,后16位分钟\r
+\r
+ // 解析开始时间\r
+ drinkreminder_start_hour = (drinkreminder_start_time & 0XFFFF0000) >> 16; // 前16位是小时\r
+ drinkreminder_start_min = drinkreminder_start_time & 0X0000FFFF; // 后16位是分钟\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d:%d", drinkreminder_start_hour, drinkreminder_start_min);\r
+\r
+ // 解析结束时间\r
+ drinkreminder_end_hour = (drinkreminder_end_time & 0XFFFF0000) >> 16; // 前16位是小时\r
+ drinkreminder_end_min = drinkreminder_end_time & 0x0000FFFF; // 后16位是分钟\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d:%d", drinkreminder_end_hour, drinkreminder_end_min);\r
+\r
+ if (drinkreminder_switch == 2)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d:%d~%d:%d", drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min);\r
+ }\r
}\r
- ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
- if (ret != 0 || broadcastApi == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
- free(publishData);\r
+\r
+ 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)\r
+ {\r
+ int start_min = start_time_hour * 60 + start_time_min; /* 开始时间的分钟数 */\r
+ int end_min = end_time_hour * 60 + end_time_min; /* 结束时间的分钟数 */\r
+ int cur_time_min = curTime.tm_hour * 60 + curTime.tm_min; /* 当前时间的分钟数 */\r
+\r
+ // 处理非跨天的情况\r
+ if (end_min > start_min)\r
+ {\r
+ if (cur_time_min >= start_min && cur_time_min < end_min)\r
+ {\r
+ return true;\r
+ }\r
+ }\r
+ else // 处理跨天的情况\r
+ {\r
+ if (cur_time_min >= start_min || cur_time_min < end_min)\r
+ {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ void clean_sleep_monitoring_flag(void)\r
+ {\r
+ uapi_dev_runtime_set_sleep_monitoring_status(0);\r
+ uapi_dev_runtime_set_nap_monitoring_status(0);\r
+ }\r
+\r
+ void clean_sedentary_flag(void)\r
+ {\r
+ uapi_dev_runtime_set_sedentary_status(0);\r
+ }\r
+\r
+ // 设置睡眠提醒时间\r
+ void get_sleep_time_notify(void)\r
+ {\r
+ int goal_hour = (sleep_time & 0XFFFF0000) >> 16;\r
+ int goal_min = (sleep_time & 0X0000FFFF);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "goal_hour:%d goal_min:%d", goal_hour, goal_min);\r
+\r
+ sleep_notify_time_min = (goal_min >= SLEPPNOTIFY) ? goal_min - SLEPPNOTIFY : ((goal_min + 60) - SLEPPNOTIFY); // 避免分钟数为负\r
+ sleep_notify_time_hour = goal_hour;\r
+ if (goal_min < SLEPPNOTIFY)\r
+ { // 如果需要借位\r
+ sleep_notify_time_hour -= 1; // 小时减1\r
+ }\r
+ // 确保小时数正确\r
+ sleep_notify_time_hour = (sleep_notify_time_hour < 0) ? 23 : sleep_notify_time_hour; // 处理从0点前20分钟的情况,变为前一天的23点40分\r
+\r
+ sleep_notify_time = (sleep_notify_time_hour << 16) | sleep_notify_time_min;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sleep_notify_time_hour:%d sleep_notify_time_min:%d sleep_notify_time:%d", sleep_notify_time_hour, sleep_notify_time_min, sleep_notify_time);\r
+ }\r
+ void AlarmEventPublish(uint16_t topic, uint8_t *data, uint32_t size)\r
+ {\r
+ int32 ret;\r
+\r
+ BroadcastApi *broadcastApi = NULL;\r
+ IUnknown *api = NULL;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish topic=%u!!", topic);\r
+\r
+ void *publishData = nullptr;\r
+ if (size > 0)\r
+ {\r
+ publishData = malloc(size);\r
+ if (publishData == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ ret = memcpy_s(publishData, size, (const void *)data, size);\r
+ if (ret != EOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish memcpy_s rateDataTmp fail! ret = %d", ret);\r
+ free(publishData);\r
+ return;\r
+ }\r
+ }\r
+\r
+ Request request = {.msgId = topic, .len = size, .msgValue = 0, .data = publishData};\r
+\r
+ /* public request */\r
+ api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+ if (api == NULL)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed");\r
+ free(publishData);\r
+ return;\r
+ }\r
+ ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+ if (ret != 0 || broadcastApi == NULL)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
+ free(publishData);\r
+ return;\r
+ }\r
+ broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
+ broadcastApi->Release((IUnknown *)broadcastApi);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish end!!");\r
+\r
return;\r
}\r
- broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
- broadcastApi->Release((IUnknown *)broadcastApi);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish end!!");\r
+ void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data)\r
+ {\r
+ int32 ret;\r
+ uint32 size = sizeof(AlarmClockEventData);\r
+ BroadcastApi *broadcastApi = nullptr;\r
+ IUnknown *api = nullptr;\r
\r
- return;\r
-}\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic);\r
\r
-static void AlarmCallBackProcA(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
- AlarmClockEventData unuse;\r
- AlarmTimerEventPublish(TOPIC_EVENT_ALARM_RING, unuse);\r
-}\r
+ void *publishData = malloc(size);\r
+ if (publishData == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ ret = memcpy_s(publishData, size, (const void *)&data, size);\r
+ if (ret != EOK)\r
+ {\r
+ free(publishData);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s fail! ret = %d", ret);\r
+ return;\r
+ }\r
\r
-static void AlarmCallBackProcB(void)\r
-{\r
- AlarmClockEventData unuse;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\r
- AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
- SetZeroAlarm();\r
-}\r
+ Request request = {\r
+ .msgId = topic,\r
+ .len = size,\r
+ .msgValue = 0,\r
+ .data = publishData,\r
+ };\r
+\r
+ /* public request */\r
+ api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
+ if (api == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed");\r
+ free(publishData);\r
+ return;\r
+ }\r
+ ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+ if (ret != 0 || broadcastApi == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
+ free(publishData);\r
+ return;\r
+ }\r
+ broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
+ broadcastApi->Release((IUnknown *)broadcastApi);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish end!!");\r
\r
-void AlarmScan(void *arg)\r
-{\r
- struct tm curTime;\r
- int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
- if (ret != ERRCODE_SUCC) {\r
return;\r
}\r
+ /*闹钟*/\r
+ static void AlarmCallBackProcA(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
+ AlarmClockEventData unuse;\r
+ AlarmTimerEventPublish(TOPIC_EVENT_ALARM_RING, unuse);\r
+ }\r
+\r
+ /*NextDay*/\r
+ static void AlarmCallBackProcB(void)\r
+ {\r
+ AlarmClockEventData unuse;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\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
+#endif\r
+\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
+\r
+ // AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
+\r
+ // 重置nextday闹钟\r
+ SetZeroAlarm();\r
+ }\r
+\r
+ static void on_time_CallBackProc(void)\r
+ {\r
+ AlarmClockEventData unuse;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked");\r
+ AlarmTimerEventPublish(TOPIC_EVENT_ON_TIME, unuse);\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
+ {\r
+ struct tm curTime;\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
+ if (curTime.tm_sec % 3 == 0)\r
+ {\r
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BLE_ADV_CHECK, nullptr, 0); // 3秒钟检查一次广播\r
+ }\r
+\r
+ if (curTime.tm_sec % 60 == 0)\r
+ {\r
+ #ifdef CYWEE_SPORT\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 一分钟检查一次gsensor是否停止\r
+ #endif\r
+ }\r
+\r
+ if (curTime.tm_min % 60 == 0 && curTime.tm_sec == 0)\r
+ {\r
+ do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_SAVE, nullptr, 0); // 十分钟存一次电池信息\r
+ }\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
+ OHOS::AlarmClockModel::GetInstance()->SetPopTimeData(g_alarmCtrA.info.hour, g_alarmCtrA.info.minute);\r
+ g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
+ g_alarmCtrA.callback();\r
+ }\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.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();\r
+ }\r
+ }\r
+\r
+ // 业务逻辑回调\r
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TIMECALL_BACK, nullptr, 0);\r
+ }\r
\r
- if (g_alarmCtrA.state == ALARM_STATUS_RUNNING) {\r
- if ((g_alarmCtrA.callback != nullptr) &&\r
- (g_alarmCtrA.info.hour == curTime.tm_hour) &&\r
- (g_alarmCtrA.info.minute == curTime.tm_min)) {\r
- g_alarmCtrA.callback();\r
- g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
+ // 每秒回调\r
+ void custom_timer_callback()\r
+ {\r
+ struct tm curTime;\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
+ // 绑定判断\r
+ if (HandleIsBind())\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleAlarmOnTime: not binded");\r
+ return;\r
+ }\r
+\r
+ HandleAlarmOnTime(&curTime);\r
+ HandleSleepReminder(&curTime);\r
+ HandleMusicUpdate();\r
+\r
+ // 以下弹窗被控制\r
+ if (HandleCanShowDialog())\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleAlarmOnTime: not show dialog");\r
+ return;\r
+ }\r
+\r
+ HandleDrinkReminder(&curTime);\r
+ HandleHeartRateDetection(&curTime);\r
}\r
\r
- if (g_alarmCtrB.state == ALARM_STATUS_RUNNING) {\r
- if ((g_alarmCtrB.callback != nullptr) &&\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.callback();\r
- g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
+ // 判断是否绑定\r
+ bool HandleIsBind(void)\r
+ {\r
+ // 未绑定状态下,以下操作不进行\r
+ if (OHOS::ConfigModel::GetInstance()->get_configData_bool(\r
+ OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART))\r
+ {\r
+ return true;\r
}\r
+ return false;\r
}\r
-}\r
\r
-static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback)\r
-{\r
- if (alarmCtrl == nullptr) {\r
- return ERRCODE_FAIL;\r
+ // 判断是否可以弹窗\r
+ bool HandleCanShowDialog(void)\r
+ {\r
+ bool state = false;\r
+\r
+ if (uapi_dev_runtime_get_saveele_status())\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "saveele!");\r
+ state = true;\r
+ }\r
+\r
+ if (uapi_dev_runtime_get_train_status())\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "training!");\r
+ state = true;\r
+ }\r
+\r
+ return state;\r
}\r
- if (alarmCtrl->state == ALARM_STATUS_UNUSED) {\r
- alarmCtrl->state = ALARM_STATUS_CREATED;\r
- alarmCtrl->callback = callback;\r
+\r
+ // 整点回调\r
+ void HandleAlarmOnTime(const struct tm *curTime)\r
+ {\r
+ if (curTime->tm_min == 0 && curTime->tm_sec == 0)\r
+ {\r
+ AlarmClockEventData unuse;\r
+ time_t timetemp = mktime((struct tm *)curTime);\r
+ unuse.value = timetemp - 60 * 60;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked");\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse));\r
+ }\r
}\r
- return ERRCODE_SUCC;\r
-}\r
\r
-int32_t AlarmTimerInit(void)\r
-{\r
- int32_t ret;\r
+ // 睡眠提醒\r
+ void HandleSleepReminder(const struct tm *curTime)\r
+ {\r
+ // 睡眠总开关\r
+ if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CONFIGMODEL_ITEM_SLEEP is OK");\r
+ // 睡眠提醒[前提开启睡眠提醒]\r
+ if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND))\r
+ {\r
+ // 提醒一次\r
+ if ((curTime->tm_hour == sleep_notify_time_hour) && (curTime->tm_min == sleep_notify_time_min) && (curTime->tm_sec == 0))\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "It's bedtime in 20 minutes");\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "20分钟后要睡觉啦!");\r
+ // 设置状态为睡眠提醒\r
+ OHOS::SleepModel::GetInstance().set_sleep_state(OHOS::SLEEPSTATE::SLEEPNOTIFY);\r
+ AlarmEventPublish(TOPIC_EVENT_SLEEPNOTE, NULL, 0);\r
+ }\r
+ }\r
+ if ((curTime->tm_hour == wake_time_hour && curTime->tm_min == wake_time_min && curTime->tm_sec == 0) ||\r
+ (curTime->tm_hour == sleep_time_hour && curTime->tm_min == sleep_time_min && curTime->tm_sec == 0) && curTime->tm_min)\r
+ {\r
+ uapi_cywee_time_sync();\r
+ }\r
+ else if (!time_sync_flag && curTime->tm_min)\r
+ {\r
+ time_sync_flag = 1;\r
+ uapi_cywee_time_sync();\r
+ }\r
+ // 退出睡眠检测模式并进入小睡检测模式\r
+ 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))\r
+ {\r
+ if (curTime->tm_hour == wake_time_hour && curTime->tm_min == wake_time_min && curTime->tm_sec == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "闹铃!");\r
+ // 退出睡眠模式\r
+ OHOS::SleepModeModel::GetInstance().SetSleepModeDisabled();\r
+ OHOS::SleepModel::GetInstance().set_sleep_state(OHOS::SLEEPSTATE::WAKE);\r
+ }\r
\r
- g_alarmCtrA.state = ALARM_STATUS_UNUSED;\r
- g_alarmCtrB.state = ALARM_STATUS_UNUSED;\r
- OHOS::g_AlarmHandle = new OHOS::GraphicTimer(ALARM_INTERVAL_MS, AlarmScan, nullptr, true);\r
- bool timerStatus = OHOS::g_AlarmHandle->Start();\r
- if (!timerStatus) {\r
- return ERRCODE_FAIL;\r
+ // 判断是否还在睡眠\r
+ if (uapi_dev_runtime_get_sleep_status() == 0)\r
+ {\r
+ // 设置状态为小睡\r
+ uapi_dev_runtime_set_nap_status(0); // 清零小睡状态\r
+ uapi_dev_runtime_set_absolute_static_status(0); // 清零绝对静止状态\r
- #ifdef PPG_HX3695\r
++ #ifdef SUPPORT_PPG_SERVICE\r
+ set_keep_in_wear_det_mode(1); // 开启小睡佩戴监测\r
+ #endif\r
+ #ifdef CYWEE_SPORT\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE, NULL); // 算法底层切换小睡监测模式\r
+ #endif\r
+ time_sync_flag = 0;\r
+ }\r
+ }\r
+ // 进入睡眠检测模式并退出小睡检测模式\r
+ 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))\r
+ {\r
+ int cmd = 1;\r
+ uapi_dev_runtime_set_sleep_status(0); // 清零睡眠状态\r
+ uapi_dev_runtime_set_absolute_static_status(0); // 清零绝对静止状态\r
+ // OHOS::clean_sleep_data(); // 清零睡眠文件存储数据\r
+ // if(uapi_dev_runtime_get_nap_monitoring_status() == 1)\r
+ // uapi_clean_sleep_flag(); // 清除睡眠标志文件\r
+ // OHOS::create_sleep_folder(); // 创建睡眠文件夹\r
- #ifdef PPG_HX3695\r
++ #ifdef SUPPORT_PPG_SERVICE\r
+ set_keep_in_wear_det_mode(0);\r
+ #endif\r
+ #ifdef CYWEE_SPORT\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GET_SLEEP_DATA, &cmd); // 强制获取小睡数据,结束小睡\r
+ #endif\r
+\r
+ // 睡眠弹窗\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!");\r
+ // 设置状态为睡眠\r
+ OHOS::SleepModel::GetInstance().clean_sleep_data(); // 清除历史数据\r
+ OHOS::SleepModel::GetInstance().set_sleep_state(OHOS::SLEEPSTATE::SLEPP);\r
+\r
+ if (curTime->tm_hour == sleep_time_hour && curTime->tm_min == sleep_time_min && curTime->tm_sec == 0)\r
+ {\r
+ // 进入睡眠模式\r
+ OHOS::SleepModeModel::GetInstance().SetSleepModeEnabled();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!!!! 开始");\r
+ AlarmEventPublish(TOPIC_EVENT_SLEEPNOTE, NULL, 0);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!!!! 结束");\r
+ }\r
+\r
+ #ifdef CYWEE_SPORT\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL); // 算法底层切换睡眠监测模式\r
+ #endif\r
+ time_sync_flag = 0;\r
+ }\r
+ }\r
}\r
- ret = AlarmCreate(&g_alarmCtrA, AlarmCallBackProcA);\r
- if (ret != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
+\r
+ // 喝水提醒\r
+ void HandleDrinkReminder(const struct tm *curTime)\r
+ {\r
+ if (drinkreminder_switch == 1)\r
+ { // 定时提醒\r
+ if (curTime->tm_hour == drinkreminder_start_hour &&\r
+ curTime->tm_min == drinkreminder_start_min &&\r
+ curTime->tm_sec == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");\r
+ AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0);\r
+ }\r
+ }\r
+ else if (drinkreminder_switch == 2)\r
+ { // 间隔提醒\r
+ // 判断当前时间是否在提醒时间段内\r
+ if (is_time_range(*curTime, drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min))\r
+ {\r
+ double interval_time = (drinkreminder_freq == 0) ? 0.5 : drinkreminder_freq;\r
+ int interval_time_seconds = (int)(interval_time * 60) * 60;\r
+ int current_seconds = (curTime->tm_hour * 60 + curTime->tm_min) * 60;\r
+ int hour_24_seconds = 24 * 60 * 60;\r
+ // 进行间隔判断和提醒\r
+ if (uapi_dev_runtime_get_drinkremind_status() == 0)\r
+ {\r
+ uapi_dev_runtime_set_drinkremind_status(1);\r
+ drinkremind_expectedTime = current_seconds + interval_time_seconds;\r
+ drinkremind_expectedTime %= hour_24_seconds; // 同时处理24小时循环\r
+ }\r
+ else if (current_seconds == drinkremind_expectedTime && curTime->tm_sec == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");\r
+ drinkremind_expectedTime += interval_time_seconds;\r
+ drinkremind_expectedTime %= hour_24_seconds; // 处理24小时循环\r
+ AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0);\r
+ }\r
+ }\r
+ 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)\r
+ {\r
+ uapi_dev_runtime_set_drinkremind_status(0);\r
+ }\r
+ }\r
}\r
- ret = AlarmCreate(&g_alarmCtrB, AlarmCallBackProcB);\r
- if (ret != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
+\r
+ // 心率周期检测\r
+ void HandleHeartRateDetection(const struct tm *curTime)\r
+ {\r
+ int heartRateDetectionInterval = 0;\r
+\r
+ if (uapi_dev_runtime_get_sleep_monitoring_status())\r
+ heartRateDetectionInterval = 20; // 晚上 20分钟检测一次\r
+ else\r
+ heartRateDetectionInterval = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED);\r
+\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Heart rate detection cycle detection is enabled %d", heartRateDetectionInterval);\r
+ if (heartRateDetectionInterval)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Heart rate detection cycle detection is enabled %d", curTime->tm_min % heartRateDetectionInterval);\r
+ if (curTime->tm_min % heartRateDetectionInterval == 0 && curTime->tm_sec == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Automatic heart rate detection starts");\r
+ // 开启心率检测\r
+ OHOS::HeartModel::GetInstance()->Heart_Control(OHOS::HeartState::Start, OHOS::HeartCheck::PASSIVITY);\r
+ }\r
+ }\r
}\r
- return ERRCODE_SUCC;\r
-}\r
\r
-int32_t SetAlarm(AlarmType type, uint8_t week, uint8_t hour, uint8_t minute)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetAlarm %d %d %d %d", type, week, hour, minute);\r
- if (type == ALARM_A) {\r
- g_alarmCtrA.state = ALARM_STATUS_RUNNING;\r
- g_alarmCtrA.info.hour = hour;\r
- g_alarmCtrA.info.minute = minute;\r
- } else if (type == ALARM_B) {\r
- g_alarmCtrB.state = ALARM_STATUS_RUNNING;\r
- g_alarmCtrB.info.week = week;\r
- g_alarmCtrB.info.hour = hour;\r
- g_alarmCtrB.info.minute = minute;\r
- } else {\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
+ // 音乐更新\r
+ void HandleMusicUpdate()\r
+ {\r
+ int16_t curviewid = OHOS::NativeAbility::GetInstance().GetCurSliceId();\r
+ if (curviewid != VIEW_MAIN && OHOS::PlayersView::GetInstance())\r
+ { // 当前不在主界面且音乐界面不为空\r
+ OHOS::UICheckBox::UICheckBoxState state = OHOS::PlayersView::GetInstance()->GetPlayerButtonState();\r
+ if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED)\r
+ {\r
+ SendMsgToUIService(UI_UPDATE_PLAYERPROCESS, 0, nullptr, 0); // 音乐进度条更新\r
+ }\r
+ }\r
+ else if (OHOS::RecordingPlayerView::GetInstance())\r
+ {\r
+ OHOS::UICheckBox::UICheckBoxState state = OHOS::RecordingPlayerView::GetInstance()->GetPlayerButtonState();\r
+ if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED)\r
+ {\r
+ SendMsgToUIService(UI_UPDATE_RECORDPROCESS, 0, nullptr, 0); // 录音进度条更新\r
+ }\r
+ }\r
+ }\r
\r
-int32_t SetZeroAlarm(void)\r
-{\r
- struct tm curTime;\r
- int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
- if (ret != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
+ static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback)\r
+ {\r
+ if (alarmCtrl == nullptr)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ if (alarmCtrl->state == ALARM_STATUS_UNUSED)\r
+ {\r
+ alarmCtrl->state = ALARM_STATUS_CREATED;\r
+ alarmCtrl->callback = callback;\r
+ }\r
+ return ERRCODE_SUCC;\r
}\r
- int32_t weekday = (++curTime.tm_wday) % 7;\r
- return SetAlarm(ALARM_B, weekday, 0, 0);\r
-}\r
\r
-int32_t AlarmGetCurrentTimeInfo(struct tm *timeInfo)\r
-{\r
- if (timeInfo == nullptr) {\r
- return ERRCODE_FAIL;\r
+ int32_t AlarmTimerInit(void)\r
+ {\r
+ int32_t timerStatus;\r
+ int32_t ret;\r
+\r
+ set_sleep_and_wake_time();\r
+ set_sedentary_data();\r
+ set_drinkreminder_data();\r
+ get_sleep_time_notify();\r
+\r
+ g_alarmCtrA.state = ALARM_STATUS_UNUSED;\r
+ g_alarmCtrB.state = ALARM_STATUS_UNUSED;\r
+ g_AlarmHandle = osTimerNew(AlarmScan, osTimerPeriodic, nullptr, nullptr);\r
+ if (g_AlarmHandle == nullptr)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ timerStatus = osTimerStart(g_AlarmHandle, ALARM_INTERVAL_MS);\r
+ if (timerStatus != osOK)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ ret = AlarmCreate(&g_alarmCtrA, AlarmCallBackProcA);\r
+ if (ret != ERRCODE_SUCC)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ ret = AlarmCreate(&g_alarmCtrB, AlarmCallBackProcB);\r
+ if (ret != ERRCODE_SUCC)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ return ERRCODE_SUCC;\r
+ }\r
+\r
+ int32_t SetAlarm(AlarmType type, uint8_t week, uint8_t hour, uint8_t minute)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetAlarm %d %d %d %d", type, week, hour, minute);\r
+ if (type == ALARM_A)\r
+ {\r
+ g_alarmCtrA.state = ALARM_STATUS_RUNNING;\r
+ g_alarmCtrA.info.hour = hour;\r
+ g_alarmCtrA.info.minute = minute;\r
+ }\r
+ else if (type == ALARM_B)\r
+ {\r
+ g_alarmCtrB.state = ALARM_STATUS_RUNNING;\r
+ g_alarmCtrB.info.week = week;\r
+ g_alarmCtrB.info.hour = hour;\r
+ g_alarmCtrB.info.minute = minute;\r
+ g_alarmCtrB.info.second = 5;\r
+ }\r
+ else\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\r
+ }\r
+\r
+ int32_t SetZeroAlarm(void)\r
+ {\r
+ struct tm curTime;\r
+ int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
+ if (ret != ERRCODE_SUCC)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ int32_t weekday = (++curTime.tm_wday) % 7;\r
+ return SetAlarm(ALARM_B, weekday, 0, 0);\r
+ }\r
+\r
+ int32_t AlarmGetCurrentTimeInfo(struct tm *timeInfo)\r
+ {\r
+ if (timeInfo == nullptr)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ time_t sec = time(nullptr);\r
+ localtime_r(&sec, timeInfo);\r
+ return ERRCODE_SUCC;\r
}\r
- time_t sec = time(nullptr);\r
- localtime_r(&sec, timeInfo);\r
- return ERRCODE_SUCC;\r
-}\r
\r
#ifdef __cplusplus\r
}\r