优化睡眠存储
authorCaisking <3449750381@qq.com>
Sat, 6 Jul 2024 08:27:24 +0000 (16:27 +0800)
committerCaisking <3449750381@qq.com>
Sat, 6 Jul 2024 08:27:24 +0000 (16:27 +0800)
code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp
code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h
code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp

index 8d4b4bd..5ec486d 100644 (file)
@@ -270,6 +270,7 @@ extern "C"
                 AlarmEventPublish(TOPIC_EVENT_SLEEPNOTE, (uint8_t *)sleep_notify_time, 4);\r
                 // 设置状态为睡眠\r
                 OHOS::SleepModel::GetInstance().set_sleep_state(OHOS::SLEEPSTATE::SLEPP);\r
+                OHOS::SleepModel::GetInstance().DeleteSleepData(); // 清空前一天睡眠数据\r
                 LOS_Msleep(1000);\r
                 do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL);\r
             }\r
@@ -285,20 +286,19 @@ extern "C"
                 LOS_Msleep(1000);\r
                 do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE, NULL);\r
             }\r
-\r
-            if(sedentary_switch)\r
+        }\r
+        // 久坐提醒\r
+        if (sedentary_switch)\r
+        {\r
+            if (curTime.tm_hour == ((sedentary_time & 0XFF000000) >> 24) && curTime.tm_min == ((sedentary_time & 0X00FF0000) >> 16) && curTime.tm_sec == 0)\r
             {\r
-                if (curTime.tm_hour == ((sedentary_time & 0XFF000000) >> 24) && curTime.tm_min == ((sedentary_time & 0X00FF0000) >> 16) && curTime.tm_sec == 0)\r
-                {\r
-                    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_SEDENTARY, NULL);\r
-                }\r
-                else if (curTime.tm_hour == ((sedentary_time & 0X0000FF00) >> 8) && curTime.tm_min == (sedentary_time & 0X000000FF) && curTime.tm_sec == 0)\r
-                {\r
-                    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CLOSE_SEDENTARY, NULL);\r
-                }\r
+                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_SEDENTARY, NULL);\r
+            }\r
+            else if (curTime.tm_hour == ((sedentary_time & 0X0000FF00) >> 8) && curTime.tm_min == (sedentary_time & 0X000000FF) && curTime.tm_sec == 0)\r
+            {\r
+                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CLOSE_SEDENTARY, NULL);\r
             }\r
         }\r
-\r
         // 心率周期检测 [0 1 5 10]\r
         if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED))\r
         {\r
index 39038e4..7163a62 100644 (file)
@@ -78,9 +78,11 @@ namespace OHOS
     // 睡眠存储数据
     typedef struct
     {
-        std::string sleeptime; // 睡眠时间
-        std::string waketime;  // 醒来时间
-        int totaltime;         // 睡眠总时间
+        std::string sleeptime;    // 睡眠时间
+        std::string waketime;     // 醒来时间
+        uint32_t sleep_timestamp; // 睡眠时间戳
+        uint32_t wake_timestamp;  // 醒来时间戳
+        int totaltime;            // 睡眠总时间
     } SleepDataUI;
     class SleepModel
     {
@@ -88,8 +90,8 @@ namespace OHOS
         static SleepModel &GetInstance(void);
         void update_time_info(uint32_t timestamp, std::string &timeStr);
         void update_sleep(SLEEP_T *data);
+        void ReInitData(); // 重新刷新UI
         void set_sleep_goal();
-
         int get_sleep_hour();
         int get_sleep_min();
         int get_sleep_goal();
@@ -106,6 +108,7 @@ namespace OHOS
         SLEEPSTATE get_sleep_state();
         SleepDataUI *ReadSleepData();                // 读取睡眠数据
         bool SaveSleepData(const SleepDataUI &data); // 更新睡眠数据
+        bool DeleteSleepData();                      // 清空睡眠文件
 
     private:
         SleepModel();
index cbb9f5a..73203e9 100644 (file)
@@ -217,7 +217,18 @@ namespace OHOS
     {
         // 初始化配置睡眠目标
         set_sleep_goal();
+        // 刷新数据
+        ReInitData();
+    }
+    SleepModel::~SleepModel() {}
+    SleepModel &SleepModel::GetInstance()
+    {
+        static SleepModel instance;
+        return instance;
+    }
 
+    void SleepModel::ReInitData()
+    {
         // 配置睡眠字符串
         SleepDataUI *data = ReadSleepData();
         if (data != nullptr)
@@ -229,17 +240,11 @@ namespace OHOS
             sleep_total_time = data->totaltime;
         }
     }
-    SleepModel::~SleepModel() {}
-    SleepModel &SleepModel::GetInstance()
-    {
-        static SleepModel instance;
-        return instance;
-    }
-
     static constexpr const char *SLEEP_JSON_PATH = "/user/userdata/health/sleep.json";
     // 读取睡眠数据
     SleepDataUI *SleepModel::ReadSleepData()
     {
+
         // 判断文件夹是否存在
         if (!HealthService::GetInstance()->CreateHealthFolder())
         {
@@ -282,12 +287,17 @@ namespace OHOS
         cJSON *sleeptime_item = cJSON_GetObjectItem(sleep_root, "sleeptime");
         cJSON *waketime_item = cJSON_GetObjectItem(sleep_root, "waketime");
         cJSON *totaltime_item = cJSON_GetObjectItem(sleep_root, "totaltime");
+        cJSON *sleep_timestamp_item = cJSON_GetObjectItem(sleep_root, "sleep_timestamp");
+        cJSON *wake_timestamp_item = cJSON_GetObjectItem(sleep_root, "wake_timestamp");
 
         if (sleeptime_item && waketime_item && totaltime_item)
         {
             data->sleeptime = sleeptime_item->valuestring;
             data->waketime = waketime_item->valuestring;
             data->totaltime = totaltime_item->valueint;
+            // 增加时间戳
+            data->sleep_timestamp = sleep_timestamp_item->valueint;
+            data->wake_timestamp = wake_timestamp_item->valueint;
         }
         else
         {
@@ -299,6 +309,7 @@ namespace OHOS
 
         cJSON_Delete(sleep_root);
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadSleepData is ok!");
+
         // 返回结构体
         return data;
     }
@@ -333,6 +344,8 @@ namespace OHOS
         cJSON_AddItemToObject(sleep_root, "sleeptime", cJSON_CreateString(data.sleeptime.c_str()));
         cJSON_AddItemToObject(sleep_root, "waketime", cJSON_CreateString(data.waketime.c_str()));
         cJSON_AddItemToObject(sleep_root, "totaltime", cJSON_CreateNumber(data.totaltime));
+        cJSON_AddItemToObject(sleep_root, "sleep_timestamp", cJSON_CreateNumber(data.sleep_timestamp));
+        cJSON_AddItemToObject(sleep_root, "wake_timestamp", cJSON_CreateNumber(data.wake_timestamp));
 
         char *jsonData = cJSON_Print(sleep_root);
         if (jsonData == NULL)
@@ -355,34 +368,65 @@ namespace OHOS
     }
     void SleepModel::update_sleep(SLEEP_T *data)
     {
-        if (data == NULL)
+        if (data == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid input data");
             return;
         }
 
-        // 打印数据
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "fall_asleep_timestamp:%d wake_up_timestamp:%d total_time:%d",
                       data->fall_asleep_timestamp, data->wake_up_timestamp, data->total_time);
 
-        update_time_info(data->fall_asleep_timestamp, sleepStr); // 睡眠字符串
-        update_time_info(data->wake_up_timestamp, wakeStr);      // 醒来
+        SleepDataUI *UIdata = ReadSleepData();
+        if (UIdata != nullptr)
+        {
+            // 入睡时间是最早时间
+            if (data->fall_asleep_timestamp < UIdata->sleep_timestamp || UIdata->sleep_timestamp == 0)
+            {
+                UIdata->sleep_timestamp = data->fall_asleep_timestamp;
+            }
+            // 起床时间是最晚时间
+            if (data->wake_up_timestamp > UIdata->wake_timestamp || UIdata->wake_timestamp == 0)
+            {
+                UIdata->wake_timestamp = data->wake_up_timestamp;
+            }
+            // 总时间需要累加
+            UIdata->totaltime += data->total_time;
+
+            update_time_info(UIdata->sleep_timestamp, sleepStr);
+            update_time_info(UIdata->wake_timestamp, wakeStr);
+            sleep_total_time = UIdata->totaltime;
+
+            SaveSleepData(*UIdata);
+        }
+        delete UIdata; // Free memory if dynamically allocated
+    }
 
-        // 更新睡眠总时间
-        sleep_total_time = data->total_time; // 睡眠总时长
+    // 清空睡眠数据
+    bool SleepModel::DeleteSleepData()
+    {
+        SleepDataUI data;
+        data.sleeptime = "--";
+        data.waketime = "--";
+        data.totaltime = 0;
+        data.sleep_timestamp = 0;
+        data.wake_timestamp = 0;
+
+        if (SaveSleepData(data))
+        {
+            ReInitData(); // 刷新
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "DeleteSleepData is ok");
+            return true;
+        }
 
-        SleepDataUI UIdata;
-        UIdata.sleeptime = sleepStr;
-        UIdata.waketime = wakeStr;
-        UIdata.totaltime = sleep_total_time;
-        // 数据存储
-        SaveSleepData(UIdata);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DeleteSleepData is error");
+        return false;
     }
 
     void SleepModel::update_time_info(uint32_t timestamp, std::string &timeStr)
     {
         char labelTime[20];
-        if (uapi_get_TIME_STR(timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC)
+        if (uapi_get_TIME_STR(timestamp, labelTime, '.', ':', DATE_H_M) == ERRCODE_SUCC)
         {
             timeStr = std::string(labelTime);
         }
index f3f9edd..fc06cef 100644 (file)
@@ -50,6 +50,7 @@
 #include "BloodOxygenModel.h"
 #include "HeartModel.h"
 #include "SaveEleModel.h"
+#include "sleep/include/SleepModel.h"
 #include "producttest/include/testcat1.h"
 #endif
 #include <cywee_hal.h>
@@ -428,6 +429,12 @@ void MsgCenterNotifyNextDayProc(const Topic topic, Request* req)
     unused(topic);
     unused(req);
     AlarmClockModel::GetInstance()->NextDayNotify();
+    if(!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))
+    {
+        //未设置睡眠监控 nextday进行清除消息。
+        SleepModel::GetInstance().DeleteSleepData();
+    }
+
 }
 
 void MsgCenterNotifyHfpIncomingProc(const Topic topic, Request* req)