系统:修改每秒定时器回调
authorCaisking <3449750381@qq.com>
Thu, 17 Oct 2024 09:52:36 +0000 (17:52 +0800)
committerCaisking <3449750381@qq.com>
Thu, 17 Oct 2024 09:52:36 +0000 (17:52 +0800)
code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h
code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp

index c063a8b..f85f564 100644 (file)
@@ -3,10 +3,11 @@
  * @Date: 2024-06-07 11:18:25\r
  * @LastEditors: penglei 1624952103@qq.com\r
  * @LastEditTime: 2024-09-06 11:34:44\r
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h\r
- * @Description: \r
- * \r
- * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. \r
+ * @FilePath:\r
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h\r
+ * @Description:\r
+ *\r
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.\r
  */\r
 /*\r
  * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
@@ -19,8 +20,9 @@
 \r
 #include <sys/time.h>\r
 \r
-#include "ohos_types.h"\r
 #include "cmsis_os.h"\r
+#include "ohos_types.h"\r
+\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
@@ -29,36 +31,36 @@ extern "C" {
 #define ALARM_INTERVAL_MS 1000\r
 \r
 typedef union {\r
-    struct timeval timeVal;\r
-    uint32 value;\r
+  struct timeval timeVal;\r
+  uint32 value;\r
 } AlarmClockEventData;\r
 \r
 typedef enum {\r
-    ALARM_STATUS_UNUSED,  /* The alarm timer is not used. */\r
-    ALARM_STATUS_CREATED, /* The alarm timer is created. */\r
-    ALARM_STATUS_RUNNING, /* The alarm timer is timing. */\r
+  ALARM_STATUS_UNUSED,  /* The alarm timer is not used. */\r
+  ALARM_STATUS_CREATED, /* The alarm timer is created. */\r
+  ALARM_STATUS_RUNNING, /* The alarm timer is timing. */\r
 } AlarmState;\r
 \r
 typedef enum {\r
-    ALARM_A,\r
-    ALARM_B,\r
-    ALARM_NONE,\r
+  ALARM_A,\r
+  ALARM_B,\r
+  ALARM_NONE,\r
 } AlarmType;\r
 \r
 typedef struct {\r
-    uint8_t week;\r
-    uint8_t hour;\r
-    uint8_t minute;\r
-    uint8_t second;\r
-    uint8_t reserved;\r
+  uint8_t week;\r
+  uint8_t hour;\r
+  uint8_t minute;\r
+  uint8_t second;\r
+  uint8_t reserved;\r
 } AlarmInfo;\r
 \r
-typedef void(*AlarmCallBack)(void);\r
+typedef void (*AlarmCallBack)(void);\r
 \r
 typedef struct {\r
-    AlarmState state;\r
-    AlarmInfo info;\r
-    AlarmCallBack callback;\r
+  AlarmState state;\r
+  AlarmInfo info;\r
+  AlarmCallBack callback;\r
 } AlarmCtrl;\r
 \r
 void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data);\r
@@ -72,6 +74,17 @@ void get_sleep_time_notify(void);
 void clean_sleep_monitoring_flag(void);\r
 void clean_sedentary_flag(void);\r
 void set_drinkreminder_data(void);\r
+\r
+bool HandleIsBind(void);\r
+bool HandleCanShowDialog(void);\r
+void custom_timer_callback(void);\r
+void HandleSleepReminder(const struct tm* curTime);\r
+void HandleWakeUp(const struct tm* curTime);\r
+void HandleDrinkReminder(const struct tm* curTime);\r
+void HandleHeartRateDetection(const struct tm *curTime);\r
+void HandleAlarmOnTime(const struct tm *curTime);\r
+void HandleMusicUpdate(void);\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 9b582e7..add2bda 100644 (file)
@@ -155,7 +155,7 @@ extern "C"
         }\r
     }\r
 \r
-    static bool is_time_range(struct tm &curTime, int start_time_hour, int start_time_min, int end_time_hour, int end_time_min)\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
@@ -335,17 +335,6 @@ extern "C"
         SetZeroAlarm(); // 重置闹钟\r
     }\r
 \r
-    static void on_time_CallBackProc(void)\r
-    {\r
-        AlarmClockEventData unuse;\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked");\r
-\r
-        GraphicService::GetInstance()->PostGraphicEvent(\r
-            std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse));\r
-\r
-        // AlarmTimerEventPublish(TOPIC_EVENT_ON_TIME, unuse);\r
-    }\r
-\r
     void AlarmScan(void *arg)\r
     {\r
         struct tm curTime;\r
@@ -388,17 +377,74 @@ extern "C"
                 g_alarmCtrB.callback();\r
             }\r
         }\r
-  \r
-        // 未绑定状态下,以下操作不进行\r
-        if (OHOS::ConfigModel::GetInstance()->get_configData_bool(OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART))\r
-            return;\r
 \r
-        // 整点回调\r
-        if (curTime.tm_min == 0 && curTime.tm_sec == 0)\r
+        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TIMECALL_BACK, nullptr, 0);\r
+    }\r
+\r
+    //每秒回调\r
+    void custom_timer_callback() {  \r
+        struct tm curTime;\r
+        int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
+        if (ret != ERRCODE_SUCC)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "time: %d : %d", curTime.tm_hour, curTime.tm_min);\r
-            on_time_CallBackProc();\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
+          return;\r
+\r
+        HandleAlarmOnTime(&curTime);\r
+        HandleSleepReminder(&curTime);\r
+\r
+        //以下弹窗被控制\r
+        if (HandleCanShowDialog())\r
+          return;\r
+\r
+        HandleWakeUp(&curTime);  \r
+        HandleDrinkReminder(&curTime);  \r
+        HandleHeartRateDetection(&curTime);  \r
+        HandleMusicUpdate();\r
+    }\r
+    \r
+    //判断是否绑定\r
+    bool HandleIsBind(void)\r
+    {\r
+        // 未绑定状态下,以下操作不进行\r
+        if (OHOS::ConfigModel::GetInstance()->get_configData_bool(\r
+                OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART)) {\r
+            return true;\r
+            }\r
+        return false;\r
+    }\r
+\r
+    //判断是否可以弹窗\r
+    bool HandleCanShowDialog(void)\r
+    {\r
+      bool state = false;\r
+\r
+      if (uapi_dev_runtime_get_saveele_status)\r
+        state = true;\r
+      if (uapi_dev_runtime_get_train_status)\r
+        state = true;\r
+\r
+      return state;\r
+    }\r
+    \r
+    //整点回调\r
+    void HandleAlarmOnTime(const struct tm *curTime)\r
+    {\r
+      if (curTime->tm_min == 0 && curTime->tm_sec == 0) {\r
+            AlarmClockEventData unuse;\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
+\r
+    //睡眠提醒\r
+    void HandleSleepReminder(const struct tm *curTime) {  \r
         // 睡眠总开关\r
         if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))\r
         {\r
@@ -407,7 +453,7 @@ extern "C"
             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
+                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_LOGE(WEARABLE_LOG_MODULE_APP, "20分钟后要睡觉啦!");\r
@@ -417,9 +463,9 @@ extern "C"
                 }\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
+            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
+                if (curTime->tm_hour == wake_time_hour && curTime->tm_min == wake_time_min && curTime->tm_sec == 0)\r
                 {\r
                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "闹铃!");\r
                     //退出睡眠模式\r
@@ -438,7 +484,7 @@ extern "C"
                 }\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
+            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
@@ -455,7 +501,7 @@ extern "C"
                 // 设置状态为睡眠\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
+                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
@@ -467,114 +513,71 @@ extern "C"
                 do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL); // 算法底层切换睡眠监测模式\r
             }\r
         }\r
+    }\r
 \r
-        /*省电模式下,下方弹窗均不开启*/\r
-        if (uapi_dev_runtime_get_saveele_status())\r
-            return;\r
 \r
-        // 久坐提醒\r
-        if (sedentary_switch)\r
-        {\r
-            if (is_time_range(curTime, sedentary_start_hour, sedentary_start_min, sedentary_stop_hour, sedentary_stop_min) && (uapi_dev_runtime_get_sedentary_status() == 0))\r
-            {\r
-                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_SEDENTARY, NULL);\r
-            }\r
-            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))\r
-            {\r
-                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CLOSE_SEDENTARY, NULL);\r
-            }\r
-        }\r
-        // 喝水提醒\r
-        if (drinkreminder_switch)\r
-        {\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_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");\r
-                    AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0);\r
-                }\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
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " curTime.tm_sec = %d", curTime.tm_sec);\r
-                    double interval_time = (drinkreminder_freq == 0) ? 0.5 : drinkreminder_freq;             // 频率设置\r
-                    int interval_time_seconds = static_cast<int>(interval_time * 60) * 60;                   // 设置的间隔时间秒数\r
-                    int start_time_seconds = (drinkreminder_start_hour * 60 + drinkreminder_start_min) * 60; // 开始时间秒数\r
-                    int current_seconds = (curTime.tm_hour * 60 + curTime.tm_min) * 60;                      // 当前时间的秒数\r
-                    int hour_24_seconds = 24 * 60 * 60;\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
-                        if (drinkremind_expectedTime >= hour_24_seconds)\r
-                        {\r
-                            drinkremind_expectedTime = drinkremind_expectedTime - hour_24_seconds;\r
-                        }\r
-                    }\r
-                    else\r
-                    {\r
-                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "current_seconds = %d,drinkremind_expectedTime = %d", current_seconds, drinkremind_expectedTime);\r
-                        if (current_seconds == drinkremind_expectedTime && curTime.tm_sec == 0)\r
-                        {\r
-                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");\r
-                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "curTime:%d:%d", curTime.tm_hour, curTime.tm_min);\r
-                            drinkremind_expectedTime = current_seconds + interval_time_seconds;\r
-                            if (drinkremind_expectedTime >= hour_24_seconds)\r
-                            {\r
-                                drinkremind_expectedTime = drinkremind_expectedTime - hour_24_seconds;\r
-                            }\r
-                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "current_seconds = %d,drinkremind_expectedTime = %d", current_seconds, drinkremind_expectedTime);\r
-                            AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0);\r
-                        }\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
-        // 心率周期检测 [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
-                if (uapi_dev_runtime_get_train_status() == 1)\r
-                    return;\r
-                // 开启心率检测 如果有其他心率检测在进行,则不会进行检测[低优先级]\r
-                OHOS::HeartModel::GetInstance()->Heart_Control(OHOS::HeartState::Start, OHOS::HeartCheck::PASSIVITY);\r
-            }\r
-        }\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
+    void HandleDrinkReminder(const struct tm *curTime) {  \r
+        if (drinkreminder_switch == 1) { // 定时提醒  \r
+            if (curTime->tm_hour == drinkreminder_start_hour &&  \r
+                curTime->tm_min == drinkreminder_start_min &&  \r
+                curTime->tm_sec == 0) {  \r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");  \r
+                AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0);  \r
+            }  \r
+        } else if (drinkreminder_switch == 2) { // 间隔提醒  \r
+            // 判断当前时间是否在提醒时间段内  \r
+            if (is_time_range(*curTime, drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min)) {  \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
+                    uapi_dev_runtime_set_drinkremind_status(1);  \r
+                    drinkremind_expectedTime = current_seconds + interval_time_seconds;  \r
+                    drinkremind_expectedTime %= hour_24_seconds; // 同时处理24小时循环  \r
+                } else if (current_seconds == drinkremind_expectedTime && curTime->tm_sec == 0) {  \r
+                    WEARABLE_LOGE(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
+            } 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
+                uapi_dev_runtime_set_drinkremind_status(0);  \r
+            }  \r
+        }  \r
+    }\r
+\r
+    //心率周期检测\r
+    void HandleHeartRateDetection(const struct tm *curTime) {  \r
+        int heartRateDetectionInterval = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED);  \r
+        if (heartRateDetectionInterval) {  \r
+            if (curTime->tm_min % heartRateDetectionInterval == 0 && curTime->tm_sec == 0) {  \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
-        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
+    void HandleMusicUpdate() {\r
+        int16_t curviewid = OHOS::NativeAbility::GetInstance().GetCurSliceId();  \r
+        if (curviewid != VIEW_MAIN && OHOS::PlayersView::GetInstance()) { // 当前不在主界面且音乐界面不为空  \r
+            OHOS::UICheckBox::UICheckBoxState state = OHOS::PlayersView::GetInstance()->GetPlayerButtonState();  \r
+            if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) {  \r
+                SendMsgToUIService(UI_UPDATE_PLAYERPROCESS, 0, nullptr, 0);  \r
+            }  \r
+        } else if (OHOS::RecordingPlayerView::GetInstance()) {  \r
+            OHOS::UICheckBox::UICheckBoxState state = OHOS::RecordingPlayerView::GetInstance()->GetPlayerButtonState();  \r
+            if (state == OHOS::UICheckBox::UICheckBoxState::SELECTED) {  \r
+                SendMsgToUIService(UI_UPDATE_RECORDPROCESS, 0, nullptr, 0);  \r
+            }  \r
         }\r
     }\r
 \r
+                                  \r
     static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback)\r
     {\r
         if (alarmCtrl == nullptr)\r