Merge #425 into sdk602patch0521 from refs/changes/425/head 426/target/1
author袁清梦 <3449750381@qq.com>
Tue, 2 Jul 2024 01:26:35 +0000 (01:26 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Tue, 2 Jul 2024 01:26:35 +0000 (01:26 +0000)
Code review from 袁清梦

* refs/changes/425/head: (7 commits squashed)

  - 筛选表盘数据刷新

  - Merge branch &#39;sdk602patch0521&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0521

  - 优化时间戳获取时间字符串函数

  - 增加睡眠数据

  - 增加设置心率周期检测AT

  - 设置心率检测优先级控制

  - 增加心率检测 睡眠提醒

Signed-off-by: Caisking <3449750381@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/425
21 files changed:
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/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/rtcservice/src/rtc_at_cmd.cpp
code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h
code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepTimeView.h
code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp
code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepTimeView.cpp
code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepView.cpp
code/sdk/application/wearable/service/ble_service/blemoder/CMakeLists.txt
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/drivers/peripheral/config/include/ConfigModelC.h
code/sdk/drivers/peripheral/config/src/ConfigModel.cpp
code/sdk/drivers/peripheral/utils/custom_utils.c
code/sdk/drivers/peripheral/utils/custom_utils.h
code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c

index b799dcb..978755c 100644 (file)
@@ -67,6 +67,7 @@ int32_t SetZeroAlarm(void);
 int32_t SetAlarm(AlarmType type, uint8_t week, uint8_t hour, uint8_t minute);\r
 int32_t AlarmGetCurrentTimeInfo(struct tm *timeInfo);\r
 void set_sleep_and_wake_time(void);\r
+void get_sleep_time_notify(void);\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 935aa7a..3779fb4 100644 (file)
@@ -1,3 +1,9 @@
+/***\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
index 0283372..91cf57a 100644 (file)
@@ -81,6 +81,14 @@ extern "C"
             End = 0,\r
             Start,\r
         };\r
+        enum class HeartCheck\r
+        {\r
+            RESTSTSTE = 0, // 未检测状态\r
+            PASSIVITY,     // 被动检测心率\r
+            INITIATIVE,    // 主动检测心率\r
+            EXERCISE,      // 运动心率\r
+        };\r
+        // 控制心率检测\r
         typedef struct\r
         {\r
             uint32_t heartRatePerSec;\r
@@ -137,7 +145,7 @@ extern "C"
             void SetCheckTime(uint64_t time); // 设置本次测试完的时间\r
             uint16_t GetIndex();              // 测试点位\r
             void SetIndex(uint16_t index);\r
-            void Heart_Control(HeartState state);\r
+            void Heart_Control(HeartState state, HeartCheck check);\r
 \r
         private:\r
             HealthAllDatas healthDatas;\r
@@ -168,6 +176,8 @@ extern "C"
             uint8_t valid_counter_ = 0;    // 有效数计数器\r
             uint8_t disvalid_counter_ = 0; // 无效数计数器\r
             uint8_t unwear_counter_ = 0;   // 佩戴错误计数器\r
+\r
+            HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
         };\r
     }\r
 \r
index 14dc31d..19c0f11 100644 (file)
@@ -474,14 +474,21 @@ namespace OHOS
     /* ---------------------------------- 状态检测 ---------------------------------- */\r
 \r
     // 控制心率检测\r
-    void HeartModel::Heart_Control(HeartState state)\r
+    void HeartModel::Heart_Control(HeartState state, HeartCheck check)\r
     {\r
+        if (check < checkstate)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Higher execution instruction exists");\r
+            return;\r
+        }\r
         if (state == HeartState::End && heartstate == true)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartState End");\r
             uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
             send_ppg_cmd_msg(md);\r
             heartstate = false;\r
+            // 复原检测状态\r
+            checkstate = HeartCheck::RESTSTSTE;\r
         }\r
         else if (state == HeartState::Start && heartstate == false)\r
         {\r
@@ -640,8 +647,8 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " Save %d %d", data->Heart, data->timestamp);\r
             SetCheckTime(data->timestamp);\r
             HealthService::GetInstance()->UpdateHealthData(*data);\r
-            // 更新卡片心率值\r
-            // SetHeartRatePerSec(heart);\r
+            // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级]\r
+            HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
         }\r
 #endif\r
     }\r
index bc103aa..180bc25 100644 (file)
@@ -143,7 +143,7 @@ namespace OHOS
         if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0)
         {
             // 关闭心率检测
-            HeartModel::GetInstance()->Heart_Control(HeartState::End);
+            HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE);
             // 回退
             NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);
         }
@@ -208,7 +208,7 @@ namespace OHOS
                 HeartCheckView::GetInstance()->GetImageAnimator()->Stop();
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus false");
                 // 关闭心率检测
-                HeartModel::GetInstance()->Heart_Control(HeartState::End);
+                HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE);
                 startheart = true;
             }
         }
@@ -225,8 +225,9 @@ namespace OHOS
             if (startheart == true)
             {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetCheckStatus true");
-                // 开启心率检测
-                HeartModel::GetInstance()->Heart_Control(HeartState::Start);
+                // 开启心率检测 [UI优先级最高直接打断正在检测 重新检测]
+                HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE);
+                HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::INITIATIVE);
                 startheart = false;
             }
         }
index 4b0b1dc..d2e7b35 100644 (file)
@@ -353,7 +353,7 @@ namespace OHOS
         if (previousCardId == HEART_RATE && cardId != HEART_RATE)
         {
             // 从心率卡片变为其他卡片时调用关闭心率检测的函数
-            HeartModel::GetInstance()->Heart_Control(HeartState::End);
+            HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE);
         }
 
         // 更新上一个卡片的值
@@ -362,8 +362,9 @@ namespace OHOS
         switch (cardId)
         {
         case HEART_RATE:
-            // 开启心率检测
-            HeartModel::GetInstance()->Heart_Control(HeartState::Start);
+            // 开启心率检测 [UI优先级最高直接打断正在检测 重新检测]
+            HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE);
+            HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);
             break;
 
         case COMPASS:
index 0e6db03..7e8eff9 100644 (file)
@@ -31,7 +31,7 @@
 #define MESSAGE_JSON_FILE "user/userdata/message/ancs.json"
 #define PRINTFDATA 1
 
-extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds);
+extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year);
 namespace OHOS
 {
     MessageData message_;
@@ -120,7 +120,7 @@ namespace OHOS
             uint32 timestamp = cJSON_GetObjectItem(item, "time")->valueint;
             messagedata.timestamp = timestamp;
             char labelTime[20];
-            if (uapi_get_TIME_STR(timestamp, labelTime, '.', false) != ERRCODE_SUCC)
+            if (uapi_get_TIME_STR(timestamp, labelTime, '.', false, false) != ERRCODE_SUCC)
             {
                 messagedata.labelTime = std::string("2024.1.1 00:00");
             }
index 6d67e86..0b30109 100644 (file)
@@ -57,7 +57,7 @@ namespace OHOS
     {
         Time = 5;
         START_FLAG = false;
-        HeartModel::GetInstance()->Heart_Control(HeartState::End); // 关闭心率检测
+        HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); // 关闭心率检测
     }
     /* -------------------------------------------------------------------------- */
     /*定时器到期时的处理*/
@@ -78,7 +78,7 @@ namespace OHOS
                 RespiratoryTrainingModel::GetInstance().RT_StopTimer();                // 停止定时器
                 RespiratoryTrainingModel::GetInstance().AddRespiratoryTrainingTimes(); // 呼吸训练次数加1
                 p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_()->Stop();  // 关闭呼吸动画
-                HeartModel::GetInstance()->Heart_Control(HeartState::End);             // 关闭心率检测
+                HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE);             // 关闭心率检测
                 p_RespiratoryTrainingView->ChangeView(RESPIRATORYTRAINING, RESPIRATORYTRAININGCOMPLETED);
             }
             else
@@ -86,7 +86,7 @@ namespace OHOS
                 Time = ONE_MINUTE;
                 p_RespiratoryTrainingView->StartRespiratoryTraining(); // 开始呼吸训练
                 START_FLAG = true;
-                HeartModel::GetInstance()->Heart_Control(HeartState::Start); // 开启心率检测
+                HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::INITIATIVE); // 开启心率检测
             }
         }
 
index 1ae2202..c38fb8d 100644 (file)
@@ -97,22 +97,10 @@ extern "C"
         }
         return ERRCODE_SUCC;
     }
-    static uint32_t rtc_restore_factory_settings(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
-    {
-        UNUSED(para);
-        UNUSED(paraLen);
-        UNUSED(strCommonCmd);
-
-        // 执行恢复出厂设置的操作
-        uapi_restore_factory_setting();
 
-        PRINT("Restoring Factory Settings...\n");
-        return ERRCODE_SUCC;
-    }
 
     static const at_cmd_table_t g_rtc_cmd[] = {
         {(char *)"AT^RTCTEST", rtc_do_test, (char *)"enable"},
-        {(char *)"AT^RESTORE", rtc_restore_factory_settings, NULL},
     };
 
     at_cmd_table_t *get_rtc_cmd_table(uint32_t *cmd_count)
index a596d09..0073593 100644 (file)
@@ -4,9 +4,9 @@
  * @LastEditors: penglei 1624952103@qq.com
  * @LastEditTime: 2024-06-28 15:51:01
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepModel.h
- * @Description: 
- * 
- * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
+ * @Description:
+ *
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
  */
 /***
  * @Date: 2024-06-25 10:34:10
 
 #include <cstdint>
 #include <map>
-//#include "AppViewIDs.h"
-//#include "UiConfig.h"
-//#include "sleep/include/SleepView.h"
-//#include "sleep/include/SleepControlPresenter.h"
+// #include "AppViewIDs.h"
+// #include "UiConfig.h"
+// #include "sleep/include/SleepView.h"
+// #include "sleep/include/SleepControlPresenter.h"
 #include "string"
 
-
 #define SLEEP_PATH "user/userdata/sleep/%s/sleep_%d.bin"
 
 #define SLEEP_DIR_PATH "user/userdata/sleep/%s"
 
-
 namespace OHOS
 {
-    #pragma pack(1)
+#pragma pack(1)
     typedef struct
     {
-        uint32_t fall_asleep_timestamp; //入睡
-        uint32_t wake_up_timestamp; //出睡
-        uint16_t total_time; //总时长
+        uint32_t fall_asleep_timestamp; // 入睡
+        uint32_t wake_up_timestamp;     // 出睡
+        uint16_t total_time;            // 总时长
     } NAP_T;
 
     typedef struct
     {
         uint32_t timestamp; //
-        uint8_t stat; //状态
-       
+        uint8_t stat;       // 状态
+
     } SLEEP_STATE_T;
 
     typedef struct
     {
         SLEEP_STATE_T sleep_status[20];
         uint8_t status_num;
-        uint32_t fall_asleep_timestamp; //入睡
-        uint32_t wake_up_timestamp; //出睡
-        uint16_t total_time; //总时长
-        uint16_t total_deep_sleep_time;//深睡
-        uint16_t total_mild_sleep_time;//浅睡
-        uint16_t total_rem_sleep_time;//清醒
-        uint16_t total_wake_time;//动眼
+        uint32_t fall_asleep_timestamp; // 入睡
+        uint32_t wake_up_timestamp;     // 出睡
+        uint16_t total_time;            // 总时长
+        uint16_t total_deep_sleep_time; // 深睡
+        uint16_t total_mild_sleep_time; // 浅睡
+        uint16_t total_rem_sleep_time;  // 清醒
+        uint16_t total_wake_time;       // 动眼
     } SLEEP_T;
-    
-    #pragma pack()
 
-    bool save_nap_data(NAP_T *data);
+#pragma pack()
 
-    uint32_t read_sleep_nap_data(char *data,uint32_t size,FILE *fp);
-    
+    bool save_nap_data(NAP_T *data);
+    uint32_t read_sleep_nap_data(char *data, uint32_t size, FILE *fp);
     void set_nap_data(NAP_T *data);
-
     void set_sleep_data(SLEEP_T *data);
-
     bool save_sleep_data(SLEEP_T *data);
 
     class SleepModel
     {
     public:
         static SleepModel &GetInstance(void);
-        void GetSleepTime();       // 获取睡眠时间
-        std::string GetSleepStr(); // 解析睡眠时间
-        void GetRestTime();        // 获取入睡时间
-        std::string GetRestStr();  // 解析入睡时间
-        void GetWalkTime();        // 获取醒来时间
-        std::string GetWalkStr();  // 解析醒来时间
-        void GetGoalTime();        // 获取目标休息时间(xx-xx)
-        std::string GetGoalStr();  // 解析目标休息时间
+        void update_time_info(uint32_t timestamp, std::string &timeStr);
+        void update_sleep(SLEEP_T *data);
+        void set_sleep_goal();
+
+        int get_sleep_hour();
+        int get_sleep_min();
+        int get_sleep_goal();
+        int get_sleep_total();
+        std::string get_rest_str(); // 解析入睡时间
+        std::string get_walk_str(); // 解析醒来时间
+        std::string get_goal_str(); // 解析目标休息时间
 
     private:
         SleepModel();
@@ -93,11 +90,12 @@ namespace OHOS
         SleepModel &operator=(const SleepModel &);
         virtual ~SleepModel();
 
-        std::string sleepStr;
-        std::string restStr;
-        std::string walkStr;
-        std::string goalsleepStr;
-        std::string goalwalkStr;
+        std::string sleepStr{"--"};
+        std::string walkStr{"--"};
+        std::string goalStr{"--"};
+
+        uint8_t sleep_total_time = 0;
+        uint8_t goal_total_time = 0;
     };
 }
 
index 2540872..867cd55 100644 (file)
@@ -1,3 +1,9 @@
+/*** 
+ * @Date: 2024-06-25 14:50:26
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-01 15:10:12
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/include/SleepTimeView.h
+ */
 /***
  * @Date: 2024-06-25 14:50:26
  * @LastEditors: Caisking 3449750381@qq.com
@@ -54,7 +60,7 @@ namespace OHOS
         UILabelExt *sleeptitle{nullptr};        // 入睡时间标题
         UILabelExt *walktitle{nullptr};         // 醒来标题
         UILabelExt *apptitle{nullptr};          // 详情
-        UILabelExt *rest{nullptr};              // 作息时间
+        UILabelExt *goal{nullptr};              // 作息时间
         UILabelExt *sleep{nullptr};             // 入睡时间
         UILabelExt *walk{nullptr};              // 醒来时间
         UIImageView *transverseline_1{nullptr}; // 横线1
index 2a430e0..255dbce 100644 (file)
@@ -4,9 +4,9 @@
  * @LastEditors: penglei 1624952103@qq.com
  * @LastEditTime: 2024-06-28 16:52:58
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp
- * @Description: 
- * 
- * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
+ * @Description:
+ *
+ * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
  */
 
 #include "sleep/include/SleepModel.h"
 #include "sleep/include/SleepControlPresenter.h"
 #include "custom_utils.h"
 #include <sys/stat.h>
-
-
-
+#include "UiConfig.h"
+#include "ui_resource_image.h"
+#include "samgr_lite.h"
+#include <vector>
+#include <sstream>
+#include <iomanip>
+#include <fstream>
+#include <iostream>
+#include <string>
+#include "wearable_log.h"
+#include "ConfigModel.h"
+
+extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year);
+extern "C" int get_sleep_time_from_config_model(void);
+extern "C" int get_wake_up_time_from_config_model();
 namespace OHOS
 {
-    static NAP_T nap_data = {0}; 
-    static SLEEP_T sleep_data = {0}; 
-    static SLEEP_STATE_T sleep_status = {0}; 
+
+    static NAP_T nap_data = {0};
+    static SLEEP_T sleep_data = {0};
+    static SLEEP_STATE_T sleep_status = {0};
+
     bool save_nap_data(NAP_T *data)
     {
         struct stat info;
-        char dir_path[64]={0};
-        char file_path[64]={0};
-        char day[12]={0};
-        uapi_get_YYMMDD_Time(day,'\0');
+        char dir_path[64] = {0};
+        char file_path[64] = {0};
+        char day[12] = {0};
+        uapi_get_YYMMDD_Time(day, '\0');
 
-        sprintf_s(dir_path,64,SLEEP_DIR_PATH,day);
+        sprintf_s(dir_path, 64, SLEEP_DIR_PATH, day);
         if (stat("user/userdata/sleep", &info) != 0)
         {
             if (mkdir("user/userdata/sleep", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
@@ -44,64 +58,62 @@ namespace OHOS
         {
             if (mkdir(dir_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
             {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir  fail %s",dir_path);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir  fail %s", dir_path);
                 return false; // Failed to create folder
             }
         }
         uint32_t creationTime;
-        int ret =uapi_get_timestampe_ss(&creationTime);
+        int ret = uapi_get_timestampe_ss(&creationTime);
 
-        sprintf_s(file_path,64,SLEEP_PATH,day,creationTime);
+        sprintf_s(file_path, 64, SLEEP_PATH, day, creationTime);
 
         FILE *fp;
-        fp=fopen(file_path,"wb+");
-        if(fp==NULL)
+        fp = fopen(file_path, "wb+");
+        if (fp == NULL)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "save_nap_sleep_data fopen fail");
             return false;
         }
 
-        uint8_t sleep_type=0;
-        fwrite(&sleep_type,1,1,fp);
+        uint8_t sleep_type = 0;
+        fwrite(&sleep_type, 1, 1, fp);
 
         uint32_t fall_asleep_timestamp = data->fall_asleep_timestamp;
-        fwrite(&fall_asleep_timestamp,1,4,fp);
+        fwrite(&fall_asleep_timestamp, 1, 4, fp);
 
         uint32_t wake_up_timestamp = data->wake_up_timestamp;
-        fwrite(&wake_up_timestamp,1,4,fp);
-
-        uint16_t total_time=data->total_time;
-        fwrite(&total_time,1,2,fp);
+        fwrite(&wake_up_timestamp, 1, 4, fp);
 
+        uint16_t total_time = data->total_time;
+        fwrite(&total_time, 1, 2, fp);
 
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "save_nap_sleep_data succ");
 
         fclose(fp);
         return true;
-        
     }
 
     void set_nap_data(NAP_T *data)
-    {   
-        memset(&nap_data,0,sizeof(NAP_T));
-        memcpy_s(&nap_data,sizeof(NAP_T),data,sizeof(NAP_T));
+    {
+        memset(&nap_data, 0, sizeof(NAP_T));
+        memcpy_s(&nap_data, sizeof(NAP_T), data, sizeof(NAP_T));
         save_nap_data(&nap_data);
     }
 
-    uint32_t read_sleep_nap_data(char *data,uint32_t size,FILE *fp)
+    uint32_t read_sleep_nap_data(char *data, uint32_t size, FILE *fp)
     {
-        return fread(data,1,size,fp);
+        return fread(data, 1, size, fp);
     }
-   
+
     bool save_sleep_data(SLEEP_T *data)
     {
         struct stat info;
-        char dir_path[64]={0};
-        char file_path[64]={0};
-        char day[12]={0};
-        uapi_get_YYMMDD_Time(day,'\0');
+        char dir_path[64] = {0};
+        char file_path[64] = {0};
+        char day[12] = {0};
+        uapi_get_YYMMDD_Time(day, '\0');
 
-        sprintf_s(dir_path,64,SLEEP_DIR_PATH,day);
+        sprintf_s(dir_path, 64, SLEEP_DIR_PATH, day);
         if (stat("user/userdata/sleep", &info) != 0)
         {
             if (mkdir("user/userdata/sleep", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
@@ -114,66 +126,177 @@ namespace OHOS
         {
             if (mkdir(dir_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
             {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir  fail %s",dir_path);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir  fail %s", dir_path);
                 return false; // Failed to create folder
             }
         }
-        
+
         uint32_t creationTime;
-        int ret =uapi_get_timestampe_ss(&creationTime);
+        int ret = uapi_get_timestampe_ss(&creationTime);
 
-        sprintf_s(file_path,64,SLEEP_PATH,day,creationTime);
+        sprintf_s(file_path, 64, SLEEP_PATH, day, creationTime);
 
         FILE *fp;
-        fp=fopen(file_path,"wb+");
-        if(fp==NULL)
+        fp = fopen(file_path, "wb+");
+        if (fp == NULL)
         {
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "save_nap_sleep_data fopen fail");
             return false;
         }
 
         uint8_t sleep_type = 1;
-        fwrite(&sleep_type,1,1,fp);
+        fwrite(&sleep_type, 1, 1, fp);
 
         uint32_t fall_asleep_timestamp = data->fall_asleep_timestamp;
-        fwrite(&fall_asleep_timestamp,1,4,fp);
+        fwrite(&fall_asleep_timestamp, 1, 4, fp);
 
         uint32_t wake_up_timestamp = data->wake_up_timestamp;
-        fwrite(&wake_up_timestamp,1,4,fp);
+        fwrite(&wake_up_timestamp, 1, 4, fp);
 
-        uint16_t total_time=data->total_time;
-        fwrite(&total_time,1,2,fp);
+        uint16_t total_time = data->total_time;
+        fwrite(&total_time, 1, 2, fp);
 
-        uint16_t total_deep_sleep_time=data->total_deep_sleep_time;
-        fwrite(&total_deep_sleep_time,1,2,fp);
+        uint16_t total_deep_sleep_time = data->total_deep_sleep_time;
+        fwrite(&total_deep_sleep_time, 1, 2, fp);
 
-        uint16_t total_mild_sleep_time=data->total_mild_sleep_time;
-        fwrite(&total_mild_sleep_time,1,2,fp);
+        uint16_t total_mild_sleep_time = data->total_mild_sleep_time;
+        fwrite(&total_mild_sleep_time, 1, 2, fp);
 
-        uint16_t total_rem_sleep_time=data->total_rem_sleep_time;
-        fwrite(&total_rem_sleep_time,1,2,fp);
+        uint16_t total_rem_sleep_time = data->total_rem_sleep_time;
+        fwrite(&total_rem_sleep_time, 1, 2, fp);
 
-        uint16_t total_wake_time=data->total_wake_time;
-        fwrite(&total_wake_time,1,2,fp);
+        uint16_t total_wake_time = data->total_wake_time;
+        fwrite(&total_wake_time, 1, 2, fp);
 
-        fwrite(data->sleep_status,sizeof(SLEEP_STATE_T),data->status_num,fp);
+        fwrite(data->sleep_status, sizeof(SLEEP_STATE_T), data->status_num, fp);
 
         fclose(fp);
         return true;
     }
 
     void set_sleep_data(SLEEP_T *data)
-    {   
-        memset(&sleep_data,0,sizeof(SLEEP_T));
-        memcpy_s(&sleep_data,sizeof(SLEEP_T),data,sizeof(SLEEP_T));
+    {
+        memset(&sleep_data, 0, sizeof(SLEEP_T));
+        memcpy_s(&sleep_data, sizeof(SLEEP_T), data, sizeof(SLEEP_T));
         save_sleep_data(&sleep_data);
+        // 刷新model里面的数据
+        SleepModel::GetInstance().update_sleep(&sleep_data);
+    }
+    SleepModel::SleepModel()
+    {
+        set_sleep_goal();
     }
-
-    SleepModel::SleepModel() {}
     SleepModel::~SleepModel() {}
     SleepModel &SleepModel::GetInstance()
     {
         static SleepModel instance;
         return instance;
     }
+
+    void SleepModel::update_sleep(SLEEP_T *data)
+    {
+        if (data == NULL)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid input data");
+            return;
+        }
+
+        // 打印数据
+        WEARABLE_LOGE(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, walkStr);
+
+        // 更新睡眠总时间
+        sleep_total_time = data->total_time;
+
+        // 更新一下配置
+        set_sleep_goal();
+    }
+
+    void SleepModel::update_time_info(uint32_t timestamp, std::string &timeStr)
+    {
+        char labelTime[20];
+        if (uapi_get_TIME_STR(timestamp, labelTime, '.', false, false) == ERRCODE_SUCC)
+        {
+            timeStr = std::string(labelTime);
+        }
+        else
+        {
+            timeStr = "--";
+        }
+    }
+
+    /*
+        设置睡眠目标
+        前2个字节是显示睡眠小时
+        后2个字节显示睡眠分钟
+        需要单独解析出来。
+    */
+    void SleepModel::set_sleep_goal()
+    {
+        int goal_sleep = get_sleep_time_from_config_model();
+        int goal_walk = get_wake_up_time_from_config_model();
+
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "goal_sleep:%d goal_walk:%d", goal_sleep, goal_walk);
+
+        // 提取小时部分(前2字节)
+        int goal_sleep_hour = goal_sleep >> 16;
+        // 提取分钟部分(后2字节)
+        int goal_sleep_min = goal_sleep & 0x00FF;
+
+        std::ostringstream sleeposs;
+        sleeposs << std::setfill('0') << std::setw(2) << goal_sleep_hour << ":" << std::setw(2) << goal_sleep_min;
+
+        std::string goalsleepStr = sleeposs.str();
+
+        // 提取小时部分(前2字节)
+        int goal_walk_hour = goal_walk >> 16;
+        // 提取分钟部分(后2字节)
+        int goal_walk_min = goal_walk & 0x00FF;
+
+        std::ostringstream walkoss;
+        walkoss << std::setfill('0') << std::setw(2) << goal_walk_hour << ":" << std::setw(2) << goal_walk_min;
+
+        std::string goalwalkStr = walkoss.str();
+
+        goalStr = goalsleepStr + "-" + goalwalkStr;
+        goal_total_time = goal_walk_hour * 60 + goal_walk_min;
+    }
+    // 获取睡眠总时长(小时)
+    int SleepModel::get_sleep_hour()
+    {
+        return sleep_total_time / 60;
+    }
+    // 获取睡眠总时长(分钟)
+    int SleepModel::get_sleep_min()
+    {
+        return sleep_total_time % 60;
+    }
+    // 获取睡眠总时长(目标)
+    int SleepModel::get_sleep_goal()
+    {
+        return goal_total_time;
+    }
+    // 获取睡眠总时长(实际)
+    int SleepModel::get_sleep_total()
+    {
+        return sleep_total_time;
+    }
+    // 解析入睡时间
+    std::string SleepModel::get_rest_str()
+    {
+        return sleepStr;
+    }
+    // 解析醒来时间
+    std::string SleepModel::get_walk_str()
+    {
+        return walkStr;
+    }
+    // 解析目标休息时间
+    std::string SleepModel::get_goal_str()
+    {
+        return goalStr;
+    }
 }
\ No newline at end of file
index 7f234e0..2476574 100644 (file)
@@ -29,11 +29,9 @@ namespace OHOS
 
     void SleepTimeView::SleepDataRefresh()
     {
-#if 0
-        rest->SetText();
-        sleep->SetText();
-        walk->SetText();
-#endif
+        sleep->SetText((SleepModel::GetInstance().get_rest_str()).c_str());
+        walk->SetText((SleepModel::GetInstance().get_walk_str()).c_str());
+        goal->SetText((SleepModel::GetInstance().get_goal_str()).c_str());
     }
 
     void SleepTimeView::ClearAll()
@@ -59,10 +57,10 @@ namespace OHOS
             delete apptitle;
             apptitle = nullptr;
         }
-        if (rest != nullptr)
+        if (goal != nullptr)
         {
-            delete rest;
-            rest = nullptr;
+            delete goal;
+            goal = nullptr;
         }
 
         if (sleep != nullptr)
@@ -141,8 +139,9 @@ namespace OHOS
         apptitle->SetTextColor(Color::Gray());
         /* ------------------------------- 数据label初始化 ------------------------------- */
         restStr = "--";
-        InitLabelAdapt(rest, 211, 95, 230, 47, "restlabel", restStr.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 30);
-        rest->SetTextColor(Color::Gray());
+        InitLabelAdapt(goal, 117, 95, 300, 50, "restlabel", restStr.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 40);
+        // goal->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+        goal->SetTextColor(Color::Gray());
         sleepStr = "--";
         InitLabelAdapt(sleep, 99, 238, 230, 47, "sleeplabel", sleepStr.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 30);
         sleep->SetTextColor(Color::Purple());
@@ -154,7 +153,7 @@ namespace OHOS
         Add(sleeptitle);
         Add(walktitle);
         Add(apptitle);
-        Add(rest);
+        Add(goal);
         Add(sleep);
         Add(walk);
         Add(transverseline_1);
@@ -173,6 +172,7 @@ namespace OHOS
         }
         SetDraggable(true);
         SetTouchable(true);
+        SleepDataRefresh();
         return true;
     }
 
index b959a44..d0541a9 100644 (file)
@@ -26,16 +26,23 @@ namespace OHOS
         g_pSleepView = nullptr;
     }
 
+    // 刷新UI数据
     void SleepView::SleepDataRefresh()
     {
-#if 0
-        time_minute->SetText(SleepModel::GetInstance().getstepnew());
-        time_hour->SetText(SleepModel::GetInstance().getstepSleep());
-        circleProgress_->SetValue(SleepModel::GetInstance().getstepvalue());
-#endif
-        Invalidate();
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updata SleppTime!");
-        RootView::GetInstance()->Invalidate();
+        int sleep_hour = SleepModel::GetInstance().get_sleep_hour();
+        int sleep_min = SleepModel::GetInstance().get_sleep_min();
+        // 有数据则刷新
+        if (sleep_hour != 0 || sleep_min != 0)
+        {
+            time_hour->SetText(std::to_string(sleep_hour).c_str());
+            time_minute->SetText(std::to_string(sleep_min).c_str());
+
+            int value = (float(SleepModel::GetInstance().get_sleep_total()) / float(SleepModel::GetInstance().get_sleep_goal())) * 100;
+            circleProgress_->SetValue(value);
+            Invalidate();
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updata SleppTime!");
+            RootView::GetInstance()->Invalidate();
+        }
     }
 
     void SleepView::ClearAll()
@@ -145,7 +152,7 @@ namespace OHOS
         circleProgress_->SetRadius(205);
         circleProgress_->SetStartAngle(320);
         circleProgress_->SetEndAngle(40);
-        circleProgress_->SetValue(50);
+        circleProgress_->SetValue(0);
         circleProgress_->SetBackgroundImagePosition(36, 26);
         /* -------------------------------- 将组件添加到根视图 ------------------------------- */
         Add(progress_image);
@@ -171,6 +178,7 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SleepView::InitPage fail");
             return false;
         }
+        SleepDataRefresh(); // 刷新数据
         SetDraggable(true);
         SetTouchable(true);
         return true;
index 8636427..5e12163 100644 (file)
@@ -14,6 +14,7 @@ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
 ${ROOT_DIR}/application/wearable/nativeapp/nativeui/heartrate/include
 ${ROOT_DIR}/application/wearable/fd230app/nativeui/weather/include
 ${ROOT_DIR}/application/wearable/fd230app/nativeui/heart_blood/health_service
+${ROOT_DIR}/application/wearable/fd230app/nativeui/sleep/include/
 ${ROOT_DIR}/application/wearable/fd230app/nativeui/phone/include
 ${ROOT_DIR}/application/wearable/fd230app/nativeui/language/include 
 ${ROOT_DIR}/application/wearable/fd230app/nativeui/language
index dc1dc03..db85d49 100644 (file)
 #ifdef FD230
 #include "TraingModel.h"
 #include "WeatherModel.h"
+#include "SleepModel.h"
 #endif
 
 #include "AlmmgrAlarmClockManage.h"
+#include "AlarmClockTimerConfig.h"
 #include "AlarmClockManage.h"
 
 #include "SetDialModel.h"
@@ -493,6 +495,11 @@ void ble_set_sleep_remind(msg_get_sleep_param_info_t data)
 
         printf("睡前提醒 %d\r\n",data.bedtime_alarm);
         p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND,data.bedtime_alarm);
+
+        //更新睡眠配置
+        OHOS::SleepModel::GetInstance().set_sleep_goal();
+        set_sleep_and_wake_time();
+        get_sleep_time_notify();
     }  
     return;
 }
index ad22bc2..dbcd212 100644 (file)
@@ -98,6 +98,9 @@ void get_user_info_from_config_model(int user_info[5]);
 int get_sleep_time_from_config_model(void);
 int get_wake_up_time_from_config_model(void);
 
+//设置睡眠频率
+void set_config_heart(int heartRateDetectionFreq);
+
 #ifdef __cplusplus
 #if __cplusplus
 }
index 7caecfb..ace4e6b 100644 (file)
@@ -1445,18 +1445,26 @@ void get_user_info_from_config_model(int user_info[5])
     user_info[3] = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_HEIGHT);
     user_info[4] = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_WEARING_MODE);
 }
+
+//获取睡眠目标[入睡时间]
 int get_sleep_time_from_config_model(void)
 {
     int sleep_time = 0;
     sleep_time = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_BEDTIME);
     return sleep_time;
 }
+//获取睡眠目标[醒来时间]
 int get_wake_up_time_from_config_model(void)
 {
     int wake_up_time = 0;
     wake_up_time = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_GET_UP);
     return wake_up_time;
 }
+void set_config_heart(int heartRateDetectionFreq)
+{
+     // 设置心率检测频率
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED, heartRateDetectionFreq);
+}
 #ifdef __cplusplus
 #if __cplusplus
 }
index 7a54954..9c47d8d 100644 (file)
@@ -791,11 +791,12 @@ errcode_t uapi_get_yyyymmddhhmmss_Date(char *date)
 /**
  * @param {uint32_t} time 时间戳
  * @param {char} *p_time 字符串
- * @param {bool} *include_seconds 是否包含秒
- * @param {char} 隔断符
+ * @param {bool} include_seconds 是否包含秒
+ * @param {bool} include_year 是否包含年份
+ *  * @param {char} 隔断符
  * @brief 通过时间戳获取日期
  */
-errcode_t uapi_get_TIME_STR(uint32_t time,char *p_time, char separator, bool include_seconds)
+errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year)
 {
     if (p_time == NULL)
     {
@@ -813,18 +814,35 @@ errcode_t uapi_get_TIME_STR(uint32_t time,char *p_time, char separator, bool inc
     // 根据需要格式化日期时间字符串,包括时分秒和分隔符
     if (include_seconds)
     {
-        sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator,
-                timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min);
+        if (include_year)
+        {
+            sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator,
+                    timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min);
+        }
+        else
+        {
+            sprintf(p_time, "%02d%c%02d %02d%c%02d", timeinfo->tm_mon + 1, separator,
+                    timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min);
+        }
     }
     else
     {
-        sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator,
-                timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min);
+        if (include_year)
+        {
+            sprintf(p_time, "%04d%c%02d%c%02d %02d%c%02d", timeinfo->tm_year + 1900, separator, timeinfo->tm_mon + 1, separator,
+                    timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min);
+        }
+        else
+        {
+            sprintf(p_time, "%02d%c%02d %02d%c%02d", timeinfo->tm_mon + 1, separator,
+                    timeinfo->tm_mday, timeinfo->tm_hour, separator, timeinfo->tm_min);
+        }
     }
 
     return ERRCODE_SUCC;
 }
 
+
 /**
  * @param {char} *p_time
  * @param {char} 隔断符
index 6c87f1e..b6a9047 100644 (file)
@@ -67,14 +67,11 @@ errcode_t uapi_set_time_from_cat1(char* cat1time);
 
 /**获取日期*/
 errcode_t uapi_get_yyyymmddhhmmss_Date(char *date);
-
-/*获取日期*/
-errcode_t uapi_get_YYMMDD_Time(char *p_time, char separator);
-
 /*获取日期扩展版*/
 errcode_t uapi_get_YYMMDD_Time_extend(char *p_time, char separator,uint8_t day);
 
-
+/*获取日期*/
+errcode_t uapi_get_YYMMDD_Time(char *p_time, char separator);
 /*获取时间*/
 errcode_t uapi_get_HHMMSS_Time(char *p_time, char separator, bool include_seconds);
 /*获取星期*/
@@ -82,7 +79,7 @@ errcode_t uapi_get_WeekStr(char *p_week);
 /*设置屏幕亮屏*/
 void uapi_set_screen_on_api(void);
 /*通过时间戳解析时间字符串*/
-errcode_t uapi_get_TIME_STR(uint32_t time,char *p_time, char separator, bool include_seconds);
+errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char separator, bool include_seconds, bool include_year);
 
 char *uapi_get_local_yyyymmdd_date(void);
 
index 01f3818..03f5954 100644 (file)
@@ -8,6 +8,7 @@
 #include "debug_print.h"
 #include "custom_runtime.h"
 #include "lwip/altcp_tls.h"
+#include "ConfigModelC.h"
 
 #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
 #define CUSTOM_UTILS_MAX_ARGC            8
@@ -690,6 +691,52 @@ static uint32_t custom_mem_debug(uint8_t *para, uint32_t paraLen, char *strCommo
 
     return ERRCODE_SUCC;
 }
+    /*恢复出厂设置*/
+    static uint32_t custom_restore_factory_settings(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+    {
+        UNUSED(para);
+        UNUSED(paraLen);
+        UNUSED(strCommonCmd);
+
+        // 执行恢复出厂设置的操作
+        uapi_restore_factory_setting();
+
+        PRINT("Restoring Factory Settings...\n");
+        return ERRCODE_SUCC;
+    }
+
+#if 1
+    /*设置心率检测频率*/
+    static uint32_t custom_set_heart(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+    {
+        UNUSED(strCommonCmd);
+
+        uint8_t argv[CUSTOM_UTILS_MAX_ARGC][CUSTOM_UTILS_MAX_ARGV_LEN] = {0};
+        uint32_t argc = 0;
+
+        int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
+        if (ret != CUSTOM_UTILS_SUCCESS)
+        {
+            PRINT("CUSTOM_UTILSTEST ATCMD Convert Command Failed\n");
+            return ERRCODE_FAIL;
+        }
+
+        if (argc != 1)
+        {
+            PRINT("CUSTOM_UTILSTEST power_test ATCMD Set Parameter Failed argc %d\r\n");
+            return ERRCODE_FAIL;
+        }
+        int heartRateDetectionFreq = atol((char *)argv[0]);
+
+        // 设置心率检测频率
+        set_config_heart(heartRateDetectionFreq);
+
+        PRINT("heartRateDetectionFreq is %d\n", heartRateDetectionFreq);
+        return ERRCODE_SUCC;
+    }
+#endif
+
+ 
 static const at_cmd_table_t g_custom_utils_cmd[] = {
     { (char *)"AT^CUSTOM_SN",      custom_utils_setsn, (char *)"123456789ABCDEF2345678" },
     { (char *)"AT^CUSTOM_SN_REQ",  custom_utils_getsn, (char *)" " },
@@ -740,7 +787,9 @@ static const at_cmd_table_t g_custom_utils_cmd[] = {
     { (char *)"AT^EFUSEWRITE",      custom_uapi_efuse_test_write, (char *)" " },
     { (char *)"AT^SCHEDDEBUG",      custom_task_sched_debug, (char *)" " },
     { (char *)"AT^MEMDEBUG",      custom_mem_debug, (char *)" " },
-
+    
+    {(char *)"AT^RESTORE", custom_restore_factory_settings, (char *)" "},
+    {(char *)"AT^SETHEART", custom_set_heart, (char *)" "},
 };