Merge branch 'sdk650pathc0423' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0... 1768/target/2 1769/1 1769/head 1770/target/1
authorluozheng <1732036298@qq.com>
Tue, 20 May 2025 08:23:29 +0000 (16:23 +0800)
committerluozheng <1732036298@qq.com>
Tue, 20 May 2025 08:23:29 +0000 (16:23 +0800)
1  2 
code/sdk/application/wearable/fd230/nativeapp/CMakeLists.txt
code/sdk/application/wearable/fd230/nativeapp/nativeui/alarm/include/AlarmClockModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/alarm/src/AlarmClockModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodResultPresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/compass/src/CompassModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartResultPresenter.cpp
code/sdk/zhihui/utils/custom_cmd_service.c

@@@ -99,7 -99,7 +99,7 @@@ set(PRIVATE_HEADE
      ${ROOT_DIR}/application/wearable/service/dial_market
      ${ROOT_DIR}/open_source/openharmony/third_party/cJSON
  
--
++    ${ROOT_DIR}/zhihui/drivers/
      ${ROOT_DIR}/zhihui/UI/CustomUIComponentTool/
      ${ROOT_DIR}/zhihui/UI/producttest/include/
      ${ROOT_DIR}/application/wearable/fd230/nativeabilityfwk/include
  \r
  #include "AlarmClockTimerConfig.h"\r
  \r
 -#ifdef __cplusplus\r
 -extern "C" {\r
 +#include "ConfigModelC.h"\r
 +#include "ConfigModel.h"\r
 +#include "heartrate/include/HeartModel.h"\r
 +#include "sleep/include/SleepModel.h"\r
 +#include "sleepmode/include/SleepModeModel.h"\r
 +// #include "safemodemanager/include/SafeModeManagerModel.h"\r
 +#include "cat1_server_hal.h"\r
 +#include "custom_runtime.h"\r
 +#include "uiservice/include/ui_service.h"\r
 +#include "power_display_service.h"\r
 +#include <NativeAbility.h>\r
 +#include "AppViewIDs.h"\r
 +#include "player/include/PlayersView.h"\r
 +#include "record/include/RecordingPlayerView.h"\r
 +#include "custom_utils.h"\r
 +#include "alarm/include/AlarmClockModel.h"\r
 +#ifdef CYWEE_SPORT\r
 +#include "cywee_service.h"\r
  #endif\r
  \r
- #ifdef PPG_HX3695\r
 -static AlarmCtrl g_alarmCtrA;\r
 -static AlarmCtrl g_alarmCtrB;\r
 -namespace OHOS {\r
 -GraphicTimer* g_AlarmHandle = nullptr;\r
 -}\r
++#ifdef SUPPORT_PPG_SERVICE\r
 +#include "ppg_service.h"\r
 +#endif\r
  \r
 -void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data)\r
 +#ifdef __cplusplus\r
 +extern "C"\r
  {\r
 -    int32 ret;\r
 -    uint32 size = sizeof(AlarmClockEventData);\r
 -    BroadcastApi *broadcastApi = nullptr;\r
 -    IUnknown *api = nullptr;\r
 +#endif\r
  \r
 -    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic);\r
 +    static AlarmCtrl g_alarmCtrA;\r
 +    static AlarmCtrl g_alarmCtrB;\r
 +    static osTimerId_t g_AlarmHandle = nullptr;\r
  \r
 -    void *publishData = malloc(size);\r
 -    if (publishData == nullptr) {\r
 -        return;\r
 +#define SLEPPNOTIFY 20\r
 +\r
 +    static int sleep_time = 0;\r
 +    static int wake_up_time = 0;\r
 +    static int sleep_notify_time = 0;\r
 +    static int sleep_time_hour = 0;\r
 +    static int sleep_time_min = 0;\r
 +    static int wake_time_hour = 0;\r
 +    static int wake_time_min = 0;\r
 +    static int sedentary_switch = 0;\r
 +    static int sedentary_interval = 1;\r
 +    static int sedentary_time = 0;\r
 +    static int sedentary_start_hour = 0;\r
 +    static int sedentary_start_min = 0;\r
 +    static int sedentary_stop_hour = 0;\r
 +    static int sedentary_stop_min = 0;\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_expectedTime = 0;\r
 +    static int sleep_notify_time_min = 0;\r
 +    static int sleep_notify_time_hour = 0;\r
 +    static int time_sync_flag = 0;\r
 +\r
 +    // #define SEDENTARY_TIME_RANGE (((curTime.tm_hour > sedentary_start_hour) || (curTime.tm_hour == sedentary_start_hour && curTime.tm_min >= sedentary_start_min)) && \\r
 +//                               ((curTime.tm_hour < sedentary_stop_hour) || (curTime.tm_hour == sedentary_stop_hour && curTime.tm_min < sedentary_stop_min)))\r
 +\r
 +    // #define WAKE_TIME_RANGE (((wake_time_hour < sleep_time_hour) &&                                              \\r
 +//                           ((curTime.tm_hour > wake_time_hour) ||                                             \\r
 +//                            (curTime.tm_hour == wake_time_hour && curTime.tm_min >= wake_time_min)) &&        \\r
 +//                           ((curTime.tm_hour < sleep_time_hour) ||                                            \\r
 +//                            (curTime.tm_hour == sleep_time_hour && curTime.tm_min < sleep_time_min))) ||      \\r
 +//                          ((wake_time_hour >= sleep_time_hour) &&                                             \\r
 +//                               (((curTime.tm_hour > wake_time_hour) ||                                        \\r
 +//                                 (curTime.tm_hour == wake_time_hour && curTime.tm_min >= wake_time_min)) ||   \\r
 +//                                ((curTime.tm_hour < sleep_time_hour) ||                                       \\r
 +//                                 (curTime.tm_hour == sleep_time_hour && curTime.tm_min < sleep_time_min))) || \\r
 +//                           ((curTime.tm_hour > wake_time_hour) && (curTime.tm_hour < sleep_time_hour))))\r
 +\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
 +        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
 +        clean_sleep_monitoring_flag();\r
 +        // 解析结束时间\r
 +        WEARABLE_LOGD(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
 -    ret = memcpy_s(publishData, size, (const void *)&data, size);\r
 -    if (ret != EOK) {\r
 -        free(publishData);\r
 -        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s fail! ret = %d", ret);\r
 -        return;\r
 +\r
 +    void set_sedentary_data(void)\r
 +    {\r
 +        sedentary_switch = get_sedentary_switch_from_config_model();\r
 +        sedentary_time = get_sedentary_time_from_config_model();\r
 +        sedentary_interval = get_sedentary_interval_from_config_model();\r
 +        #ifdef CYWEE_SPORT\r
 +        do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SET_SEDENTARY_INTERVAL, &sedentary_interval); // 设置久坐提醒间隔\r
 +        #endif\r
 +\r
 +        // sedentary_start_hour = (sedentary_time & 0XFF000000) >> 24;\r
 +        // sedentary_start_min = (sedentary_time & 0X00FF0000) >> 16;\r
 +        // sedentary_stop_hour = (sedentary_time & 0X0000FF00) >> 8;\r
 +        // sedentary_stop_min = sedentary_time & 0X000000FF;\r
 +        sedentary_stop_min = (sedentary_time & 0XFF000000) >> 24;\r
 +        sedentary_stop_hour = (sedentary_time & 0X00FF0000) >> 16;\r
 +        sedentary_start_min = (sedentary_time & 0X0000FF00) >> 8;\r
 +        sedentary_start_hour = sedentary_time & 0X000000FF;\r
 +        clean_sedentary_flag();\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "set_sedentary_data:%d:%d~%d:%d", sedentary_start_hour, sedentary_start_min, sedentary_stop_hour, sedentary_stop_min);\r
      }\r
  \r
 -    Request request = {\r
 -        .msgId = topic,\r
 -        .len = size,\r
 -        .msgValue = 0,\r
 -        .data = publishData,\r
 -    };\r
 +    void set_drinkreminder_data(void)\r
 +    {\r
 +        WEARABLE_LOGD(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
 -    /* 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
 -        free(publishData);\r
 -        return;\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_LOGD(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_LOGD(WEARABLE_LOG_MODULE_APP, "%d:%d", drinkreminder_end_hour, drinkreminder_end_min);\r
 +\r
 +        if (drinkreminder_switch == 2)\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d:%d~%d:%d", drinkreminder_start_hour, drinkreminder_start_min, drinkreminder_end_hour, drinkreminder_end_min);\r
 +        }\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
 -        free(publishData);\r
 +\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
 +        int cur_time_min = curTime.tm_hour * 60 + curTime.tm_min; /* 当前时间的分钟数 */\r
 +\r
 +        // 处理非跨天的情况\r
 +        if (end_min > start_min)\r
 +        {\r
 +            if (cur_time_min >= start_min && cur_time_min < end_min)\r
 +            {\r
 +                return true;\r
 +            }\r
 +        }\r
 +        else // 处理跨天的情况\r
 +        {\r
 +            if (cur_time_min >= start_min || cur_time_min < end_min)\r
 +            {\r
 +                return true;\r
 +            }\r
 +        }\r
 +        return false;\r
 +    }\r
 +\r
 +    void clean_sleep_monitoring_flag(void)\r
 +    {\r
 +        uapi_dev_runtime_set_sleep_monitoring_status(0);\r
 +        uapi_dev_runtime_set_nap_monitoring_status(0);\r
 +    }\r
 +\r
 +    void clean_sedentary_flag(void)\r
 +    {\r
 +        uapi_dev_runtime_set_sedentary_status(0);\r
 +    }\r
 +\r
 +    // 设置睡眠提醒时间\r
 +    void get_sleep_time_notify(void)\r
 +    {\r
 +        int goal_hour = (sleep_time & 0XFFFF0000) >> 16;\r
 +        int goal_min = (sleep_time & 0X0000FFFF);\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "goal_hour:%d goal_min:%d", goal_hour, goal_min);\r
 +\r
 +        sleep_notify_time_min = (goal_min >= SLEPPNOTIFY) ? goal_min - SLEPPNOTIFY : ((goal_min + 60) - SLEPPNOTIFY); // 避免分钟数为负\r
 +        sleep_notify_time_hour = goal_hour;\r
 +        if (goal_min < SLEPPNOTIFY)\r
 +        {                                // 如果需要借位\r
 +            sleep_notify_time_hour -= 1; // 小时减1\r
 +        }\r
 +        // 确保小时数正确\r
 +        sleep_notify_time_hour = (sleep_notify_time_hour < 0) ? 23 : sleep_notify_time_hour; // 处理从0点前20分钟的情况,变为前一天的23点40分\r
 +\r
 +        sleep_notify_time = (sleep_notify_time_hour << 16) | sleep_notify_time_min;\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sleep_notify_time_hour:%d sleep_notify_time_min:%d sleep_notify_time:%d", sleep_notify_time_hour, sleep_notify_time_min, sleep_notify_time);\r
 +    }\r
 +    void AlarmEventPublish(uint16_t topic, uint8_t *data, uint32_t size)\r
 +    {\r
 +        int32 ret;\r
 +\r
 +        BroadcastApi *broadcastApi = NULL;\r
 +        IUnknown *api = NULL;\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish topic=%u!!", topic);\r
 +\r
 +        void *publishData = nullptr;\r
 +        if (size > 0)\r
 +        {\r
 +            publishData = malloc(size);\r
 +            if (publishData == nullptr)\r
 +            {\r
 +                return;\r
 +            }\r
 +            ret = memcpy_s(publishData, size, (const void *)data, size);\r
 +            if (ret != EOK)\r
 +            {\r
 +                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish memcpy_s rateDataTmp fail! ret = %d", ret);\r
 +                free(publishData);\r
 +                return;\r
 +            }\r
 +        }\r
 +\r
 +        Request request = {.msgId = topic, .len = size, .msgValue = 0, .data = publishData};\r
 +\r
 +        /* public request */\r
 +        api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
 +        if (api == NULL)\r
 +        {\r
 +            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed");\r
 +            free(publishData);\r
 +            return;\r
 +        }\r
 +        ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
 +        if (ret != 0 || broadcastApi == NULL)\r
 +        {\r
 +            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed");\r
 +            free(publishData);\r
 +            return;\r
 +        }\r
 +        broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
 +        broadcastApi->Release((IUnknown *)broadcastApi);\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish end!!");\r
 +\r
          return;\r
      }\r
 -    broadcastApi->PublishTopic((IUnknown *)broadcastApi, &request);\r
 -    broadcastApi->Release((IUnknown *)broadcastApi);\r
 -    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish end!!");\r
 +    void AlarmTimerEventPublish(uint16 topic, AlarmClockEventData data)\r
 +    {\r
 +        int32 ret;\r
 +        uint32 size = sizeof(AlarmClockEventData);\r
 +        BroadcastApi *broadcastApi = nullptr;\r
 +        IUnknown *api = nullptr;\r
  \r
 -    return;\r
 -}\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish topic=%u!!", topic);\r
  \r
 -static void AlarmCallBackProcA(void)\r
 -{\r
 -    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
 -    AlarmClockEventData unuse;\r
 -    AlarmTimerEventPublish(TOPIC_EVENT_ALARM_RING, unuse);\r
 -}\r
 +        void *publishData = malloc(size);\r
 +        if (publishData == nullptr)\r
 +        {\r
 +            return;\r
 +        }\r
 +        ret = memcpy_s(publishData, size, (const void *)&data, size);\r
 +        if (ret != EOK)\r
 +        {\r
 +            free(publishData);\r
 +            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlarmTimerEventPublish memcpy_s fail! ret = %d", ret);\r
 +            return;\r
 +        }\r
  \r
 -static void AlarmCallBackProcB(void)\r
 -{\r
 -    AlarmClockEventData unuse;\r
 -    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\r
 -    AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
 -    SetZeroAlarm();\r
 -}\r
 +        Request request = {\r
 +            .msgId = topic,\r
 +            .len = size,\r
 +            .msgValue = 0,\r
 +            .data = publishData,\r
 +        };\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
 +            free(publishData);\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
 +            free(publishData);\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
 +    static void AlarmCallBackProcA(void)\r
 +    {\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA");\r
 +        AlarmClockEventData unuse;\r
 +        AlarmTimerEventPublish(TOPIC_EVENT_ALARM_RING, unuse);\r
 +    }\r
 +\r
 +    /*NextDay*/\r
 +    static void AlarmCallBackProcB(void)\r
 +    {\r
 +        AlarmClockEventData unuse;\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB");\r
 +#if 0\r
 +    // 记录当前时间\r
 +    time_t now = time(nullptr);\r
 +    struct tm *localTime = localtime(&now);\r
 +    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current time - Hour: %d, Minute: %d", localTime->tm_hour, localTime->tm_min);\r
 +    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Posting next day update event");\r
 +\r
 +#endif\r
 +\r
 +        GraphicService::GetInstance()->PostGraphicEvent(std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse));\r
 +\r
 +        // AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse);\r
 +\r
 +        // 重置nextday闹钟\r
 +        SetZeroAlarm();\r
 +    }\r
 +\r
 +    static void on_time_CallBackProc(void)\r
 +    {\r
 +        AlarmClockEventData unuse;\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked");\r
 +        AlarmTimerEventPublish(TOPIC_EVENT_ON_TIME, unuse);\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
 +        int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
 +        if (ret != ERRCODE_SUCC)\r
 +        {\r
 +            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get current time info, error code: %d", ret);\r
 +            return;\r
 +        }\r
 +\r
 +        if (curTime.tm_sec % 3 == 0)\r
 +        {\r
 +            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BLE_ADV_CHECK, nullptr, 0); // 3秒钟检查一次广播\r
 +        }\r
 +\r
 +        if (curTime.tm_sec % 60 == 0)\r
 +        {\r
 +            #ifdef CYWEE_SPORT\r
 +            do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 一分钟检查一次gsensor是否停止\r
 +            #endif\r
 +        }\r
 +\r
 +        if (curTime.tm_min % 60 == 0 && curTime.tm_sec == 0)\r
 +        {\r
 +            do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_BATTERY_DATA_SAVE, nullptr, 0); // 十分钟存一次电池信息\r
 +        }\r
 +\r
 +        if (g_alarmCtrA.state == ALARM_STATUS_RUNNING)\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm A");\r
 +            if ((g_alarmCtrA.callback != nullptr) &&\r
 +                (g_alarmCtrA.info.hour == curTime.tm_hour) &&\r
 +                (g_alarmCtrA.info.minute == curTime.tm_min))\r
 +            {\r
 +                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm A triggered");\r
 +                OHOS::AlarmClockModel::GetInstance()->SetPopTimeData(g_alarmCtrA.info.hour, g_alarmCtrA.info.minute);\r
 +                g_alarmCtrA.state = ALARM_STATUS_CREATED;\r
 +                g_alarmCtrA.callback();\r
 +            }\r
 +        }\r
 +\r
 +        if (g_alarmCtrB.state == ALARM_STATUS_RUNNING)\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm B");\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
 +                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm B triggered");\r
 +                g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
 +                g_alarmCtrB.callback();\r
 +            }\r
 +        }\r
 +\r
 +        // 业务逻辑回调\r
 +        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TIMECALL_BACK, nullptr, 0);\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
 +    void custom_timer_callback()\r
 +    {\r
 +        struct tm curTime;\r
 +        int32_t ret = AlarmGetCurrentTimeInfo(&curTime);\r
 +        if (ret != ERRCODE_SUCC)\r
 +        {\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
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleAlarmOnTime: not binded");\r
 +            return;\r
 +        }\r
 +\r
 +        HandleAlarmOnTime(&curTime);\r
 +        HandleSleepReminder(&curTime);\r
 +        HandleMusicUpdate();\r
 +\r
 +        // 以下弹窗被控制\r
 +        if (HandleCanShowDialog())\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleAlarmOnTime: not show dialog");\r
 +            return;\r
 +        }\r
 +\r
 +        HandleDrinkReminder(&curTime);\r
 +        HandleHeartRateDetection(&curTime);\r
      }\r
  \r
 -    if (g_alarmCtrB.state == ALARM_STATUS_RUNNING) {\r
 -        if ((g_alarmCtrB.callback != nullptr) &&\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.callback();\r
 -            g_alarmCtrB.state = ALARM_STATUS_CREATED;\r
 +    // 判断是否绑定\r
 +    bool HandleIsBind(void)\r
 +    {\r
 +        // 未绑定状态下,以下操作不进行\r
 +        if (OHOS::ConfigModel::GetInstance()->get_configData_bool(\r
 +                OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART))\r
 +        {\r
 +            return true;\r
          }\r
 +        return false;\r
      }\r
 -}\r
  \r
 -static int32_t AlarmCreate(AlarmCtrl *alarmCtrl, AlarmCallBack callback)\r
 -{\r
 -    if (alarmCtrl == nullptr) {\r
 -        return ERRCODE_FAIL;\r
 +    // 判断是否可以弹窗\r
 +    bool HandleCanShowDialog(void)\r
 +    {\r
 +        bool state = false;\r
 +\r
 +        if (uapi_dev_runtime_get_saveele_status())\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "saveele!");\r
 +            state = true;\r
 +        }\r
 +\r
 +        if (uapi_dev_runtime_get_train_status())\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "training!");\r
 +            state = true;\r
 +        }\r
 +\r
 +        return state;\r
      }\r
 -    if (alarmCtrl->state == ALARM_STATUS_UNUSED) {\r
 -        alarmCtrl->state = ALARM_STATUS_CREATED;\r
 -        alarmCtrl->callback = callback;\r
 +\r
 +    // 整点回调\r
 +    void HandleAlarmOnTime(const struct tm *curTime)\r
 +    {\r
 +        if (curTime->tm_min == 0 && curTime->tm_sec == 0)\r
 +        {\r
 +            AlarmClockEventData unuse;\r
 +            time_t timetemp = mktime((struct tm *)curTime);\r
 +            unuse.value = timetemp - 60 * 60;\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
 -    return ERRCODE_SUCC;\r
 -}\r
  \r
 -int32_t AlarmTimerInit(void)\r
 -{\r
 -    int32_t ret;\r
 +    // 睡眠提醒\r
 +    void HandleSleepReminder(const struct tm *curTime)\r
 +    {\r
 +        // 睡眠总开关\r
 +        if (OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP))\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CONFIGMODEL_ITEM_SLEEP is OK");\r
 +            // 睡眠提醒[前提开启睡眠提醒]\r
 +            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
 +                {\r
 +                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "It's bedtime in 20 minutes");\r
 +                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "20分钟后要睡觉啦!");\r
 +                    // 设置状态为睡眠提醒\r
 +                    OHOS::SleepModel::GetInstance().set_sleep_state(OHOS::SLEEPSTATE::SLEEPNOTIFY);\r
 +                    AlarmEventPublish(TOPIC_EVENT_SLEEPNOTE, NULL, 0);\r
 +                }\r
 +            }\r
 +            if ((curTime->tm_hour == wake_time_hour && curTime->tm_min == wake_time_min && curTime->tm_sec == 0) ||\r
 +                (curTime->tm_hour == sleep_time_hour && curTime->tm_min == sleep_time_min && curTime->tm_sec == 0) && curTime->tm_min)\r
 +            {\r
 +                uapi_cywee_time_sync();\r
 +            }\r
 +            else if (!time_sync_flag && curTime->tm_min)\r
 +            {\r
 +                time_sync_flag = 1;\r
 +                uapi_cywee_time_sync();\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
 +            {\r
 +                if (curTime->tm_hour == wake_time_hour && curTime->tm_min == wake_time_min && curTime->tm_sec == 0)\r
 +                {\r
 +                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "闹铃!");\r
 +                    // 退出睡眠模式\r
 +                    OHOS::SleepModeModel::GetInstance().SetSleepModeDisabled();\r
 +                    OHOS::SleepModel::GetInstance().set_sleep_state(OHOS::SLEEPSTATE::WAKE);\r
 +                }\r
  \r
 -    g_alarmCtrA.state = ALARM_STATUS_UNUSED;\r
 -    g_alarmCtrB.state = ALARM_STATUS_UNUSED;\r
 -    OHOS::g_AlarmHandle = new OHOS::GraphicTimer(ALARM_INTERVAL_MS, AlarmScan, nullptr, true);\r
 -    bool timerStatus = OHOS::g_AlarmHandle->Start();\r
 -    if (!timerStatus) {\r
 -        return ERRCODE_FAIL;\r
 +                // 判断是否还在睡眠\r
 +                if (uapi_dev_runtime_get_sleep_status() == 0)\r
 +                {\r
 +                    // 设置状态为小睡\r
 +                    uapi_dev_runtime_set_nap_status(0);                                     // 清零小睡状态\r
 +                    uapi_dev_runtime_set_absolute_static_status(0);                         // 清零绝对静止状态\r
-                     #ifdef PPG_HX3695\r
++                    #ifdef SUPPORT_PPG_SERVICE\r
 +                    set_keep_in_wear_det_mode(1);                                           // 开启小睡佩戴监测\r
 +                    #endif\r
 +                    #ifdef CYWEE_SPORT\r
 +                    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE, NULL); // 算法底层切换小睡监测模式\r
 +                    #endif\r
 +                    time_sync_flag = 0;\r
 +                }\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
 +            {\r
 +                int cmd = 1;\r
 +                uapi_dev_runtime_set_sleep_status(0);           // 清零睡眠状态\r
 +                uapi_dev_runtime_set_absolute_static_status(0); // 清零绝对静止状态\r
 +                // OHOS::clean_sleep_data();                       // 清零睡眠文件存储数据\r
 +                // if(uapi_dev_runtime_get_nap_monitoring_status() == 1)\r
 +                // uapi_clean_sleep_flag();                        // 清除睡眠标志文件\r
 +                // OHOS::create_sleep_folder();                     // 创建睡眠文件夹\r
-                 #ifdef PPG_HX3695\r
++                #ifdef SUPPORT_PPG_SERVICE\r
 +                set_keep_in_wear_det_mode(0);\r
 +                #endif\r
 +                #ifdef CYWEE_SPORT\r
 +                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GET_SLEEP_DATA, &cmd); // 强制获取小睡数据,结束小睡\r
 +                #endif\r
 +\r
 +                // 睡眠弹窗\r
 +                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!");\r
 +                // 设置状态为睡眠\r
 +                OHOS::SleepModel::GetInstance().clean_sleep_data(); // 清除历史数据\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
 +                {\r
 +                    // 进入睡眠模式\r
 +                    OHOS::SleepModeModel::GetInstance().SetSleepModeEnabled();\r
 +                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!!!! 开始");\r
 +                    AlarmEventPublish(TOPIC_EVENT_SLEEPNOTE, NULL, 0);\r
 +                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!!!! 结束");\r
 +                }\r
 +\r
 +                #ifdef CYWEE_SPORT\r
 +                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL); // 算法底层切换睡眠监测模式\r
 +                #endif\r
 +                time_sync_flag = 0;\r
 +            }\r
 +        }\r
      }\r
 -    ret = AlarmCreate(&g_alarmCtrA, AlarmCallBackProcA);\r
 -    if (ret != ERRCODE_SUCC) {\r
 -        return ERRCODE_FAIL;\r
 +\r
 +    // 喝水提醒\r
 +    void HandleDrinkReminder(const struct tm *curTime)\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_LOGD(WEARABLE_LOG_MODULE_APP, "该喝水了!!该喝水了!!");\r
 +                AlarmEventPublish(TOPIC_EVENT_DRINKREMINDER, NULL, 0);\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
 +                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
 +                {\r
 +                    uapi_dev_runtime_set_drinkremind_status(1);\r
 +                    drinkremind_expectedTime = current_seconds + interval_time_seconds;\r
 +                    drinkremind_expectedTime %= hour_24_seconds; // 同时处理24小时循环\r
 +                }\r
 +                else if (current_seconds == drinkremind_expectedTime && curTime->tm_sec == 0)\r
 +                {\r
 +                    WEARABLE_LOGD(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
 +            }\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
 -    ret = AlarmCreate(&g_alarmCtrB, AlarmCallBackProcB);\r
 -    if (ret != ERRCODE_SUCC) {\r
 -        return ERRCODE_FAIL;\r
 +\r
 +    // 心率周期检测\r
 +    void HandleHeartRateDetection(const struct tm *curTime)\r
 +    {\r
 +        int heartRateDetectionInterval = 0;\r
 +\r
 +        if (uapi_dev_runtime_get_sleep_monitoring_status())\r
 +            heartRateDetectionInterval = 20; // 晚上 20分钟检测一次\r
 +        else\r
 +            heartRateDetectionInterval = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED);\r
 +\r
 +        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Heart rate detection cycle detection is enabled %d", heartRateDetectionInterval);\r
 +        if (heartRateDetectionInterval)\r
 +        {\r
 +            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Heart rate detection cycle detection is enabled %d", curTime->tm_min % heartRateDetectionInterval);\r
 +            if (curTime->tm_min % heartRateDetectionInterval == 0 && curTime->tm_sec == 0)\r
 +            {\r
 +                WEARABLE_LOGD(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
 -    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
 -    } else {\r
 -        return ERRCODE_FAIL;\r
 -    }\r
 -    return ERRCODE_SUCC;\r
 -}\r
 +    // 音乐更新\r
 +    void HandleMusicUpdate()\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
 +        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
 -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
 +    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
 -    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 AlarmTimerInit(void)\r
 +    {\r
 +        int32_t timerStatus;\r
 +        int32_t ret;\r
 +\r
 +        set_sleep_and_wake_time();\r
 +        set_sedentary_data();\r
 +        set_drinkreminder_data();\r
 +        get_sleep_time_notify();\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
 +\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
 +        {\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 = 5;\r
 +        }\r
 +        else\r
 +        {\r
 +            return ERRCODE_FAIL;\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
 +        {\r
 +            return ERRCODE_FAIL;\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
 +        {\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
   */
  
  #include <sys/time.h>
 -#include "CompassModel.h"
 +#include "compass/include/CompassModel.h"
  #include <ctime>
  
 -#include "mag_hal.h"
 -#include "mag_service.h"
+ #ifdef SUPORT_MAG_SERVICE
++#include "mag/hal/mag_hal.h"
++#include "mag/service/mag_service.h"
++#include "mag/mmc5603/mmc5603_hal.h"
+ #endif
+ 
  #ifdef __cplusplus
  extern "C" {
  #endif
@@@ -38,41 -44,24 +49,41 @@@ void CompassModel::SetCalibrationStatus
      calibrationStatus = status;
  }
  
 +/*
 + * @brief 获取校准状态
 + * @param  void
 + * @return 如果校准精度小于3,返回<b>1</b>,否则返回<b>0</b>
 +*/
  uint8_t CompassModel::GetCalibrationStatus(void)
  {
-     #ifdef MAG_MMC5603
 -#ifdef SUPORT_MAG_SERVICE
 -    if(mag_get_iAccuracy() < 3)
++    #ifdef SUPORT_MAG_SERVICE
 +    if( mag_service_get_iAccuracy() < 3)
          return 1;
      else 
          return 0;
 -#endif
 +    #else
      return 0;
 +    #endif
  }
  
 +/* 
 + * @brief 设置显示的角度,通常表示为从地磁北方向到设备当前朝向的角度。
 +*/
  void CompassModel::SetDisplayAngle(uint16_t angle)
  {
-     #ifdef MAG_MMC5603
 -#ifdef SUPORT_MAG_SERVICE
 -    displayAngle = (int16_t)mag_get_fAzimuth();
 -#endif
++    #ifdef SUPORT_MAG_SERVICE
 +    displayAngle = (int16_t)mag_service_get_fAzimuth();
 +    #else
 +    displayAngle += angle;
 +    if (displayAngle > 359) {
 +        displayAngle = 0;
 +    }
 +    #endif
  }
  
 +/*
 + * @brief 获取显示角度 
 +*/
  uint16_t CompassModel::GetDisplayAngle(void)
  {
      return displayAngle;
@@@ -95,29 -84,19 +106,29 @@@ time_t CompassModel::GetCurrentTime(voi
      return tv.tv_sec;
  }
  
 +/*
 + * @brief 打开指南针传感器 
 + * @param void
 + * @return 如果指南针传感器打开成功则返回true,否则返回false
 +*/
  bool CompassModel::OpenCompassSensor(void)
  {
-     #ifdef MAG_MMC5603
 -#ifdef SUPORT_MAG_SERVICE
 -    mag_start();
 -#endif
++    #ifdef SUPORT_MAG_SERVICE
 +    do_mag_service_check_msg(MAG_SERVICE_CMD_START_CHECK);
 +    #endif
      return true;
  }
  
 +/*
 + * @brief 关闭指南针传感器 
 + * @param void
 + * @return 如果指南针传感器关闭成功则返回true,否则返回false
 +*/
  bool CompassModel::CloseCompassSensor(void)
  {
-     #ifdef MAG_MMC5603
 -#ifdef SUPORT_MAG_SERVICE
 -    mag_stop();
 -#endif
++    #ifdef SUPORT_MAG_SERVICE
 +    do_mag_service_check_msg(MAG_SERVICE_CMD_STOP_CHECK);
 +    #endif
      return true;
  }
  }