喝水提醒实现
authorluozheng <1732036298@qq.com>
Wed, 17 Jul 2024 10:25:58 +0000 (18:25 +0800)
committerluozheng <1732036298@qq.com>
Wed, 17 Jul 2024 10:25:58 +0000 (18:25 +0800)
1.每天在指定的时间提醒用户喝水
2..每天在指定的时间段间隔提醒用户喝水
解决设置震动模式手表没有物理震动问题

code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h
code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp
code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/watchQRcode/src/WatchQRCodePresenter.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/msg_center/include/notify/drinkReminder_notification.h
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/application/wearable/service/msg_center/src/notify/drinkReminder_notification.cpp

index 6b00037..aa93b63 100644 (file)
@@ -1,8 +1,8 @@
 /*\r
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-06-07 11:18:25\r
- * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2024-07-04 20:35:41\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-07-17 09:56:10\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/include/AlarmClockTimerConfig.h\r
  * @Description: \r
  * \r
@@ -71,6 +71,7 @@ void set_sedentary_data(void);
 void get_sleep_time_notify(void);\r
 void clean_sleep_flag(void);\r
 void clean_sedentary_flag(void);\r
+void set_drinkreminder_data(void);\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 908a720..4180251 100644 (file)
@@ -56,7 +56,16 @@ extern "C"
     static int sedentary_start_min = 0;\r
     static int sedentary_stop_hour = 0;\r
     static int sedentary_stop_min = 0;\r
-\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_cnt = 0;          // 喝水提醒计数器\r
     static int sleep_notify_time_min = 0;\r
     static int sleep_notify_time_hour = 0;\r
 \r
@@ -80,11 +89,13 @@ extern "C"
     {\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
-        WEARABLE_LOGE(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
+        WEARABLE_LOGE(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
 \r
     void set_sedentary_data(void)\r
@@ -97,6 +108,33 @@ extern "C"
         sedentary_stop_min = sedentary_time & 0X000000FF;\r
     }\r
 \r
+    void set_drinkreminder_data(void)\r
+    {\r
+        WEARABLE_LOGE(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
+        // 获取提醒时间段\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_LOGE(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_LOGE(WEARABLE_LOG_MODULE_APP, "%d:%d", drinkreminder_end_hour, drinkreminder_end_min);\r
+\r
+        if (drinkreminder_switch == 2)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d:%d~%d:%d", drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min);\r
+        }\r
+    }\r
+\r
     void clean_sleep_flag(void)\r
     {\r
         uapi_dev_runtime_set_sleep_status(0);\r
@@ -367,6 +405,49 @@ extern "C"
                 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 ((curTime.tm_hour > drinkreminder_start_hour ||\r
+                     (curTime.tm_hour == drinkreminder_start_hour && curTime.tm_min >= drinkreminder_start_min)) &&\r
+                    (curTime.tm_hour < drinkreminder_end_hour ||\r
+                     (curTime.tm_hour == drinkreminder_end_hour && curTime.tm_min < drinkreminder_end_min)))\r
+                {\r
+                    double interval_time = (drinkreminder_freq == 0) ? 0.5 : drinkreminder_freq; // 频率设置\r
+\r
+                    int currentMinutes = curTime.tm_hour * 60 + curTime.tm_min;                       // 当前时间分钟数\r
+                    int start_time_Minutes = drinkreminder_start_hour * 60 + drinkreminder_start_min; // 开始时间分钟数\r
+                    int drinkremind_max_cnt = (drinkreminder_end_hour * 60 + drinkreminder_end_min - start_time_Minutes) / (interval_time * 60);\r
+\r
+                    // 检查提醒次数\r
+                    if (drinkremind_cnt < drinkremind_max_cnt)\r
+                    {\r
+                        if (currentMinutes == (start_time_Minutes + interval_time * 60 * drinkremind_cnt) && curTime.tm_sec == 0)\r
+                        {\r
+                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");\r
+                            drinkremind_cnt++; // 增加提醒计数\r
+                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drinkremind_max_cnt = %d , drinkremind_cnt = %d", drinkremind_max_cnt, drinkremind_cnt);\r
+                            AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0);\r
+                        }\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
@@ -422,6 +503,7 @@ extern "C"
         }\r
         set_sleep_and_wake_time();\r
         set_sedentary_data();\r
+        set_drinkreminder_data();\r
         get_sleep_time_notify();\r
         return ERRCODE_SUCC;\r
     }\r
index 612fb8e..4024b91 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com\r
  * @Date: 2024-02-19 10:39:11\r
  * @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-06-22 18:24:34\r
+ * @LastEditTime: 2024-07-16 17:04:06\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp\r
  */\r
 \r
@@ -135,9 +135,9 @@ namespace OHOS
         else if ((view_->GetVibrationModeView() != nullptr) && (&view == view_->GetVibrationModeView()->GetVibrationModeLabelButton()))\r
         {\r
             int VibrationMode = view_->GetVibrationModeView()->GetVibrationModePicker()->GetSelected();\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VibrationMode = %d", VibrationMode);\r
-            // VibationModeSet(VibrationMode);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "VibrationMode = %d", VibrationMode);\r
             SoundAndVibrationModel::GetInstance()->SetVibrationReminderToggleButtonStaus(VibrationMode);\r
+            uapi_vibrationModeSet(VibrationMode);\r
             view_->ChangeView(VIBRATIONMODEVIEW, SOUNDANDVIBRATIONVIEW);\r
         }\r
         return true;\r
index 1bf455a..5d5149d 100644 (file)
@@ -120,9 +120,11 @@ namespace OHOS
 
     std::string WatchQRCodePresenter::WatchQRCodeGetQRCodeStr()
     {
-        std::string QRCodeStr = "https://www.kumi.top/p-i-kumi.html?c=5&p=5";
+        /*实例:https://www.kumi.top/p-i-kumi.html?c=5&p=5&m=7a:8c:2d:61:9a:fc*/
+        /*m=后边的值为手表 mac 地址,前面部分为固定格式*/
+        std::string QRCodeStr = "https://www.kumi.top/p-i-kumi.html?c=5&p=5&m=";
         std::string MacAddress = GetCurrentWatchMacAddress(); // 假设这是获取当前手表 Mac 地址的函数
-        QRCodeStr += "&m=" + MacAddress;
+        QRCodeStr += MacAddress;
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QRCodeStr:%s", QRCodeStr.c_str());
         return QRCodeStr;
     }
index 45f840c..33bbbea 100644 (file)
@@ -838,7 +838,7 @@ void ble_set_drink_remind(msg_drink_info_t data)
             p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_DRINK_FREQ,data.freq);
         }
     }
-    CustomEventPublish(TOPIC_EVENT_DRINKREMINDER,NULL,0);    
+    set_drinkreminder_data();/*更新喝水提醒时间*/
     return;
 }
 
index c842942..0b9f335 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-12 11:44:04
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-07-04 15:16:56
+ * @LastEditTime: 2024-07-16 17:08:00
  * @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/include/notify/drinkReminder_notification.h
  */
 #ifndef DRINKREMINDER_NOTIFICATION
@@ -31,6 +31,8 @@ namespace OHOS
         void DrinkReminder_StartTimer();
         void DrinkReminder_StopTimer(void);
 
+        void set_screen_on_and_vibration(void);
+
     private:
         DrinkReminderViewEventListener();
         ~DrinkReminderViewEventListener();
index 8837100..2260a2f 100644 (file)
@@ -951,34 +951,8 @@ void MsgCenterNotifyDrinkReminderProc(const Topic topic, Request *req)
     unused(topic);
     unused(req);
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDrinkReminderProc !");
-    int state = DrinkReminderViewEventListener::GetInstance().DrinkReminderOpenState();
-    switch (state)
-    {
-    case 0:
-        if (DrinkReminderViewEventListener::GetInstance().IsDrinkReminderTimerOpen())
-        {
-            DrinkReminderViewEventListener::GetInstance().DrinkReminder_StopTimer();
-        }
-
-        break;
-    case 1:
-        if (DrinkReminderViewEventListener::GetInstance().IsDrinkReminderTimerOpen())
-        {
-            DrinkReminderViewEventListener::GetInstance().DrinkReminder_StopTimer();
-        }
-        // uapi_set_screen_on_api();
-        // NotificationManager::GetInstance()->ShowNotify(showDrinkReminderNotify, (uint16_t)topic, true);
-        
-        break;
-    case 2:
-        if (!DrinkReminderViewEventListener::GetInstance().IsDrinkReminderTimerOpen())
-        {
-            DrinkReminderViewEventListener::GetInstance().DrinkReminder_StartTimer();
-        }
-        break;
-    default:
-        break;
-    }
+    DrinkReminderViewEventListener::GetInstance().set_screen_on_and_vibration();
+    NotificationManager::GetInstance()->ShowNotify(showDrinkReminderNotify, (uint16_t)topic, true);
 }
 //每日训练
 void MsgCenterNotifyActivityProc(const Topic topic, Request* req)
index 39681d7..a951494 100644 (file)
@@ -92,6 +92,13 @@ namespace OHOS
         return true;
     }
 
+    void DrinkReminderViewEventListener::set_screen_on_and_vibration(void)
+    {
+        /*亮屏加震动*/
+        uapi_set_screen_on_api();
+        uapi_vibrationModeSet(ConfigModel::GetInstance()->GetVibrationReminder());
+    }
+
     void DrinkReminderViewEventListener::SetDrinkReminderTopic(uint16_t topic)
     {
         drinkReminderTopic = topic;
@@ -166,12 +173,12 @@ namespace OHOS
         int drinkReminderEndTime = ConfigModel::GetInstance()->GetDrinkEnd();     // 获取喝水提醒结束时间, int类型 前16位小时,后16位分钟
 
         // 解析开始时间
-        int startHour = (drinkReminderStartTime >> 8) & 0xFF; // 前8位是小时
-        int startMinute = drinkReminderStartTime & 0xFF;      // 后8位是分钟
+        int startHour = (drinkReminderStartTime & 0XFFFF0000) >> 16; // 前16位是小时
+        int startMinute = drinkReminderStartTime & 0X0000FFFF;       // 后16位是分钟
 
         // 解析结束时间
-        int endHour = (drinkReminderEndTime >> 8) & 0xFF; // 中前8位是小时
-        int endMinute = drinkReminderEndTime & 0xFF;      // 后8位是分钟
+        int endHour = (drinkReminderEndTime & 0XFFFF0000) >> 16; // 前16位是小时
+        int endMinute = drinkReminderEndTime & 0x0000FFFF;       // 后16位是分钟
 
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentHour = %d,currentMinute =  %d", currentHour, currentMinute);
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "drinkReminderStartTime = %d,drinkReminderEndTime =  %d", drinkReminderStartTime, drinkReminderEndTime);
@@ -205,12 +212,14 @@ namespace OHOS
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DrinkReminder_TimerCallbackProc");
         if (DrinkReminderViewEventListener::GetInstance().IsDrinkReminderTime())
         {
-            uapi_set_screen_on_api();
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");
+            DrinkReminderViewEventListener::GetInstance().set_screen_on_and_vibration();
             NotificationManager::GetInstance()->ShowNotify(showDrinkReminderNotify, DrinkReminderViewEventListener::GetInstance().GetDrinkReminderTopic(), true);
         }
         else
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DrinkReminder Out of time");
+            DrinkReminderViewEventListener::GetInstance().DrinkReminder_StopTimer();
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DrinkReminder Out of time");/*如果超出范围内设置的时间就停止定时器*/
         }
     }
 
@@ -280,7 +289,7 @@ namespace OHOS
     /*创建喝水提醒视图*/
     UIViewGroup *CreateDrinkReminderView(void)
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateDrinkReminderView(void)");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CreateDrinkReminderView(void)");
         if (DrinkReminderGroupView == nullptr)
         {
             DrinkReminderGroupView = new UIViewGroup();