+/***\r
+ * @Date: 2024-06-29 15:06:13\r
+ * @LastEditors: Caisking 3449750381@qq.com\r
+ * @LastEditTime: 2024-07-01 17:31:58\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp\r
+ */\r
/*\r
* Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
* Description: AlarmClockTimer\r
#include "AlarmClockTimerConfig.h"\r
#include "cywee_service.h"\r
#include "ConfigModelC.h"\r
+#include "ConfigModel.h"\r
+#include "heartrate/include/HeartModel.h"\r
\r
#ifdef __cplusplus\r
-extern "C" {\r
+extern "C"\r
+{\r
#endif\r
\r
-static AlarmCtrl g_alarmCtrA;\r
-static AlarmCtrl g_alarmCtrB;\r
-static osTimerId_t g_AlarmHandle = nullptr;\r
+ static AlarmCtrl g_alarmCtrA;\r
+ static AlarmCtrl g_alarmCtrB;\r
+ static osTimerId_t g_AlarmHandle = nullptr;\r
\r
-static int sleep_time = 0;\r
-static int wake_up_time = 0;\r
+#define SLEPPNOTIFY 20\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
+ static int sleep_time = 0;\r
+ static int wake_up_time = 0;\r
+ static int sleep_time_hour = 0;\r
+ static int sleep_time_min = 0;\r
\r
-void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data)\r
-{\r
- int32 ret;\r
- uint32 size = sizeof(AlarmClockEventData);\r
- Request *request = nullptr;\r
- BroadcastApi *broadcastApi = nullptr;\r
- IUnknown *api = nullptr;\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic);\r
-\r
- /* alloc request */\r
- request = SAMGR_AllocRequestMsg(0, PLATFORM_CORE, BROADCAST_SVR_ID, size);\r
- if (request == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SAMGR_AllocRequestMsg failed");\r
- return;\r
- }\r
- request->msgId = topic;\r
- ret = memcpy_s(request->data, size, (const void *)&data, size);\r
- if (ret != EOK) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s rateDataTmp fail! ret = %d", ret);\r
- return;\r
- }\r
- request->len = size;\r
- request->msgValue = 0;\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
- SAMGR_FreeRequestMsg(request);\r
- return;\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
- ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
- if (ret != 0 || broadcastApi == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
- SAMGR_FreeRequestMsg(request);\r
- return;\r
+ // 设置睡眠提醒时间\r
+ void get_sleep_time_notify(void)\r
+ {\r
+ int goal_hour = sleep_time >> 16;\r
+ int goal_min = (sleep_time & 0X00FF);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "goal_hour:%d goal_min:%d", goal_hour, goal_min);\r
+ if ((goal_min - SLEPPNOTIFY) >= 0)\r
+ {\r
+ sleep_time_hour = goal_hour;\r
+ sleep_time_min = goal_min - SLEPPNOTIFY;\r
+ }\r
+ else\r
+ {\r
+ sleep_time_hour = goal_hour - 1;\r
+ sleep_time_min = goal_min - SLEPPNOTIFY + 60;\r
+ }\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sleep_time_hour:%d sleep_time_min:%d", sleep_time_hour, sleep_time_min);\r
}\r
- broadcastApi->PublishTopic((IUnknown *)broadcastApi, request);\r
- broadcastApi->Release((IUnknown *)broadcastApi);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish end!!");\r
-\r
- return;\r
-}\r
-\r
-static void AlarmCallBackProcA(void)\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
- AlarmClockEventData unuse;\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ALARM_RING, unuse));\r
-}\r
+ void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data)\r
+ {\r
+ int32 ret;\r
+ uint32 size = sizeof(AlarmClockEventData);\r
+ Request *request = nullptr;\r
+ BroadcastApi *broadcastApi = nullptr;\r
+ IUnknown *api = nullptr;\r
\r
-static void AlarmCallBackProcB(void)\r
-{\r
- AlarmClockEventData unuse;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
- GraphicService::GetInstance()->PostGraphicEvent(SetZeroAlarm);\r
-}\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic);\r
\r
-static void on_time_CallBackProc(void)\r
-{\r
- AlarmClockEventData unuse;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc");\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse));\r
-}\r
+ /* alloc request */\r
+ request = SAMGR_AllocRequestMsg(0, PLATFORM_CORE, BROADCAST_SVR_ID, size);\r
+ if (request == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SAMGR_AllocRequestMsg failed");\r
+ return;\r
+ }\r
+ request->msgId = topic;\r
+ ret = memcpy_s(request->data, size, (const void *)&data, size);\r
+ if (ret != EOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s rateDataTmp fail! ret = %d", ret);\r
+ return;\r
+ }\r
+ request->len = size;\r
+ request->msgValue = 0;\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
+ SAMGR_FreeRequestMsg(request);\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
+ SAMGR_FreeRequestMsg(request);\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
- 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
+ static void AlarmCallBackProcA(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
+ AlarmClockEventData unuse;\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ALARM_RING, unuse));\r
}\r
\r
- if (g_alarmCtrB.state == ALARM_STATUS_RUNNING) {\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
- g_alarmCtrB.callback();\r
- g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
- }\r
- }\r
- if(curTime.tm_min==0 && curTime.tm_sec==0)\r
+ static void AlarmCallBackProcB(void)\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "time: %d : %d",curTime.tm_hour,curTime.tm_min);\r
- on_time_CallBackProc();\r
+ AlarmClockEventData unuse;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
+ GraphicService::GetInstance()->PostGraphicEvent(SetZeroAlarm);\r
}\r
- else if(curTime.tm_hour == ( ( sleep_time & 0XFF00) >> 16 ) && curTime.tm_min == ( sleep_time & 0X00FF ))\r
+\r
+ static void on_time_CallBackProc(void)\r
{\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE,NULL);\r
+ AlarmClockEventData unuse;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc");\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse));\r
}\r
- else if(curTime.tm_hour == ( ( wake_up_time & 0XFF00) >> 16 ) && curTime.tm_min == ( wake_up_time & 0X00FF ))\r
+\r
+ void AlarmScan(void *arg)\r
{\r
- do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE,NULL);\r
- }\r
-}\r
+ struct tm curTime;\r
+ int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
+ if (ret != ERRCODE_SUCC)\r
+ {\r
+ return;\r
+ }\r
\r
-static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback)\r
-{\r
- if (alarmCtrl == nullptr) {\r
- return ERRCODE_FAIL;\r
- }\r
- if (alarmCtrl->state == ALARM_STATUS_UNUSED) {\r
- alarmCtrl->state = ALARM_STATUS_CREATED;\r
- alarmCtrl->callback = callback;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
+ if (g_alarmCtrA.state == ALARM_STATUS_RUNNING)\r
+ {\r
+ if ((g_alarmCtrA.callback != nullptr) &&\r
+ (g_alarmCtrA.info.hour == curTime.tm_hour) &&\r
+ (g_alarmCtrA.info.minute == curTime.tm_min))\r
+ {\r
+ g_alarmCtrA.callback();\r
+ g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
+ }\r
+ }\r
\r
-int32_t AlarmTimerInit(void)\r
-{\r
- int32_t timerStatus;\r
- int32_t ret;\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
- return ERRCODE_FAIL;\r
- }\r
- timerStatus = osTimerStart(g_AlarmHandle, ALARM_INTERVAL_MS);\r
- if (timerStatus != osOK) {\r
- return ERRCODE_FAIL;\r
+ if (g_alarmCtrB.state == ALARM_STATUS_RUNNING)\r
+ {\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
+ g_alarmCtrB.callback();\r
+ g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
+ }\r
+ }\r
+ // 整点回调\r
+ if (curTime.tm_min == 0 && curTime.tm_sec == 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "time: %d : %d", curTime.tm_hour, curTime.tm_min);\r
+ on_time_CallBackProc();\r
+ }\r
+ // 进入睡眠模式\r
+ if (curTime.tm_hour == ((sleep_time >> 16) && curTime.tm_min == (sleep_time & 0X00FF)))\r
+ {\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL);\r
+ }\r
+ // 退出睡眠模式\r
+ if (curTime.tm_hour == ((wake_up_time >> 16) && curTime.tm_min == (wake_up_time & 0X00FF)))\r
+ {\r
+ do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE, NULL);\r
+ }\r
+ // 睡眠提醒[前提开启睡眠提醒]\r
+ if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND))\r
+ {\r
+ // 提醒一次\r
+ if (curTime.tm_hour == sleep_time_hour && curTime.tm_min == sleep_time_min && curTime.tm_sec == 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "It's bedtime in 20 minutes");\r
+ printf("20分钟后要睡觉啦!\r\n");\r
+ }\r
+ }\r
+ // 早安提醒[前提开启睡眠提醒]\r
+\r
+ // 心率周期检测 [0 1 5 10]\r
+ if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED))\r
+ {\r
+ if (curTime.tm_min % (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED)) == 0 && curTime.tm_sec == 0)\r
+ {\r
+ WEARABLE_LOGE(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
- ret = AlarmCreate(&g_alarmCtrA, AlarmCallBackProcA);\r
- if (ret != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
+\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
- ret = AlarmCreate(&g_alarmCtrB, AlarmCallBackProcB);\r
- if (ret != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
+\r
+ int32_t AlarmTimerInit(void)\r
+ {\r
+ int32_t timerStatus;\r
+ int32_t ret;\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
+ set_sleep_and_wake_time();\r
+ get_sleep_time_notify();\r
+ return ERRCODE_SUCC;\r
}\r
- set_sleep_and_wake_time();\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
- g_alarmCtrB.info.second = 1;\r
- } else {\r
- return ERRCODE_FAIL;\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 = 1;\r
+ }\r
+ else\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ return ERRCODE_SUCC;\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
- return ERRCODE_FAIL;\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
- 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 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