补交优化运动模式切换函数,添加静态模式切换函数
authorpenglei <1624952103@qq.com>
Thu, 11 Apr 2024 10:32:26 +0000 (18:32 +0800)
committerpenglei <1624952103@qq.com>
Thu, 11 Apr 2024 10:32:26 +0000 (18:32 +0800)
code/sdk/drivers/peripheral/cywee/Inc/cywee_hal.h
code/sdk/drivers/peripheral/cywee/service/cywee_service.c
code/sdk/drivers/peripheral/cywee/src/main_dml.c

index 9059742..9a9e698 100644 (file)
@@ -43,6 +43,14 @@ extern void CWM_OS_restoreData(uint8_t* data, uint32_t len);
 #define   SPORT_ACTIVE_MODE_FREE_TRAINING      5001                // 自由運動     FreeTraining    5001
 #define   SPORT_ACTIVE_MODE_AR_ALERT           1001                // 長時間動作偵測    AR alert        1001
 
+#define   INACTIVITY_MODE_NOTHING            0               // 无作用
+#define   INACTIVITY_MODE_SEDENTARY          1               // 久坐和有效站立
+#define   INACTIVITY_MODE_SLEEPING           2               // 睡眠
+#define   INACTIVITY_MODE_SEDENTARY_AND_NAP  3               // 久坐、有效站立和小睡
+#define   INACTIVITY_MODE_NAP                4     
+
+
+
 #pragma pack(1)
 
 /**
@@ -447,7 +455,27 @@ typedef struct
     int max_pace;
     int ar_alert_type;
     int MHR_zone;
-}cywee_result_t;
+}cywee_activity_result_t;
+
+typedef struct 
+{
+    int inactivity_mode;
+    int sedentary_status;
+    int sleep_status;
+    int nap_status;
+    int stand_freq;
+    int month;
+    int day;
+    int hour;
+    int minute;
+    int total_sleep_time;
+    int total_nap_time;
+    int total_mild_sleep_time;
+    int total_deep_sleep_time;
+    int total_wake_time;
+    int total_rem_sleep_time;
+}cywee_inactivity_result_t;
+
 #pragma pack()
 typedef enum{
     CYWEE_MSG_TYPE_NORMAL_UPDATE,
@@ -458,6 +486,11 @@ typedef enum{
     CYWEE_MSG_TYPE_FREE_TRAINING_UPDATE,
     CYWEE_MSG_TYPE_AR_ALERT_UPDATE,
     CYWEE_MSG_TYPE_EXTRA_INFO_UPDATE,
+    CYWEE_MSG_TYPE_SEDENTARY_UPDATE,
+    CYWEE_MSG_TYPE_SLEEPING_UPDATE,
+    CYWEE_MSG_TYPE_SLEEPING_ACCUMULATE_TIME_UPDATE,
+    CYWEE_MSG_TYPE_NAP_UPDATE,
+    CYWEE_MSG_TYPE_NAP_ACCUMULATE_TIME_UPDATE
 } cywee_msg_type_t;
 
 
index 03bce95..50b7f7e 100644 (file)
@@ -60,84 +60,149 @@ static void cywee_service_check_timer_callback(void* data);
 void cywee_msg_callback(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen)
 {
     PRINT("cywee_msg_callback\r\n");
-    cywee_result_t c_result_t;
-    memcpy(&c_result_t, msg_data, sizeof(cywee_result_t));
+    cywee_activity_result_t c_activity_result_t;
+    cywee_inactivity_result_t c_inactivity_result_t;
     switch(msg_type)
     {
         //一般模式
         case CYWEE_MSG_TYPE_NORMAL_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_NORMAL_UPDATE");
+            PRINT("CYWEE_MSG_TYPE_NORMAL_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
             PRINT("activit_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%d], pace[%d], BMR calories[%d], is_pause[%d],len[%d]\n",
-            c_result_t.activity_mode,c_result_t.steps,c_result_t.distance,c_result_t.calories,c_result_t.step_frequency,
-            c_result_t.step_length,c_result_t.pace,c_result_t.BMR_calories,c_result_t.is_pause,sizeof(cywee_result_t));
-            CustomEventPublish(TOPIC_EVENT_NORMAL_UPDATE,&c_result_t,sizeof(cywee_result_t));
+            c_activity_result_t.activity_mode,c_activity_result_t.steps,c_activity_result_t.distance,c_activity_result_t.calories,c_activity_result_t.step_frequency,
+            c_activity_result_t.step_length,c_activity_result_t.pace,c_activity_result_t.BMR_calories,c_activity_result_t.is_pause,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_NORMAL_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
 
         //跑步机模式
         case CYWEE_MSG_TYPE_TREADMILL_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_TREADMILL_UPDATE");
+            PRINT("CYWEE_MSG_TYPE_TREADMILL_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
             PRINT("activit_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%d], pace[%d], BMR calories[%d], is_pause[%d],len[%d]\n",
-            c_result_t.activity_mode,c_result_t.steps,c_result_t.distance,c_result_t.calories,c_result_t.step_frequency,
-            c_result_t.step_length,c_result_t.pace,c_result_t.BMR_calories,c_result_t.is_pause,sizeof(cywee_result_t));
-            CustomEventPublish(TOPIC_EVENT_TREADMILL_UPDATE,&c_result_t,sizeof(cywee_result_t));
+            c_activity_result_t.activity_mode,c_activity_result_t.steps,c_activity_result_t.distance,c_activity_result_t.calories,c_activity_result_t.step_frequency,
+            c_activity_result_t.step_length,c_activity_result_t.pace,c_activity_result_t.BMR_calories,c_activity_result_t.is_pause,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_TREADMILL_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
 
         //户外跑步模式
         case CYWEE_MSG_TYPE_OUTDOOR_RUNNING_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_OUTDOOR_RUNNING_UPDATE");
+            PRINT("CYWEE_MSG_TYPE_OUTDOOR_RUNNING_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
             PRINT("activit_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%d], pace[%d], BMR calories[%d], is_pause[%d],len[%d]\n",
-            c_result_t.activity_mode,c_result_t.steps,c_result_t.distance,c_result_t.calories,c_result_t.step_frequency,
-            c_result_t.step_length,c_result_t.pace,c_result_t.BMR_calories,c_result_t.is_pause,sizeof(cywee_result_t));
-            CustomEventPublish(TOPIC_EVENT_OUTDOOR_RUNNING_UPDATE,&c_result_t,sizeof(cywee_result_t));
+            c_activity_result_t.activity_mode,c_activity_result_t.steps,c_activity_result_t.distance,c_activity_result_t.calories,c_activity_result_t.step_frequency,
+            c_activity_result_t.step_length,c_activity_result_t.pace,c_activity_result_t.BMR_calories,c_activity_result_t.is_pause,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_OUTDOOR_RUNNING_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
 
         //室内跑步模式
         case CYWEE_MSG_TYPE_INDOOR_RUNNING_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_INDOOR_RUNNING_UPDATE");
+            PRINT("CYWEE_MSG_TYPE_INDOOR_RUNNING_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
             PRINT("activit_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%d], pace[%d], BMR calories[%d], is_pause[%d],len[%d]\n",
-            c_result_t.activity_mode,c_result_t.steps,c_result_t.distance,c_result_t.calories,c_result_t.step_frequency,
-            c_result_t.step_length,c_result_t.pace,c_result_t.BMR_calories,c_result_t.is_pause,sizeof(cywee_result_t));
-            CustomEventPublish(TOPIC_EVENT_INDOOR_RUNNING_UPDATE,&c_result_t,sizeof(cywee_result_t));
+            c_activity_result_t.activity_mode,c_activity_result_t.steps,c_activity_result_t.distance,c_activity_result_t.calories,c_activity_result_t.step_frequency,
+            c_activity_result_t.step_length,c_activity_result_t.pace,c_activity_result_t.BMR_calories,c_activity_result_t.is_pause,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_INDOOR_RUNNING_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
 
         //防误触计步模式
         case CYWEE_MSG_TYPE_FITNESS_PEDOMETERR_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_FITNESS_PEDOMETERR_UPDATE");
+            PRINT("CYWEE_MSG_TYPE_FITNESS_PEDOMETERR_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
             PRINT("activit_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%d], pace[%d], BMR calories[%d], is_pause[%d],len[%d]\n",
-            c_result_t.activity_mode,c_result_t.steps,c_result_t.distance,c_result_t.calories,c_result_t.step_frequency,
-            c_result_t.step_length,c_result_t.pace,c_result_t.BMR_calories,c_result_t.is_pause,sizeof(cywee_result_t));
-            CustomEventPublish(TOPIC_EVENT_FITNESS_PEDOMETERR_UPDATE,&c_result_t,sizeof(cywee_result_t));
+            c_activity_result_t.activity_mode,c_activity_result_t.steps,c_activity_result_t.distance,c_activity_result_t.calories,c_activity_result_t.step_frequency,
+            c_activity_result_t.step_length,c_activity_result_t.pace,c_activity_result_t.BMR_calories,c_activity_result_t.is_pause,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_FITNESS_PEDOMETERR_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
 
         //自由运动模式
         case CYWEE_MSG_TYPE_FREE_TRAINING_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_FREE_TRAINING_UPDATE");
+            PRINT("CYWEE_MSG_TYPE_FREE_TRAINING_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
             PRINT("activit_mode[%d], calories[%d], duration[%d], MHR_zone[%d],len[%d]\n",
-            c_result_t.activity_mode,c_result_t.calories,c_result_t.duration,c_result_t.MHR_zone,sizeof(c_result_t));
-            CustomEventPublish(TOPIC_EVENT_FREE_TRAINING_UPDATE,&c_result_t,sizeof(c_result_t));
+            c_activity_result_t.activity_mode,c_activity_result_t.calories,c_activity_result_t.duration,c_activity_result_t.MHR_zone,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_FREE_TRAINING_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
 
         //长时间动作侦测模式
         case CYWEE_MSG_TYPE_AR_ALERT_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_AR_ALERT_UPDATE");
+            PRINT("CYWEE_MSG_TYPE_AR_ALERT_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
             PRINT("activit_mode[%d], ar alert type[%d], len[%d]\n",
-            c_result_t.activity_mode,c_result_t.ar_alert_type,sizeof(cywee_result_t));
-            CustomEventPublish(TOPIC_EVENT_AR_ALERT_UPDATE,&c_result_t,sizeof(cywee_result_t));
+            c_activity_result_t.activity_mode,c_activity_result_t.ar_alert_type,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_AR_ALERT_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
 
         //额外信息
         case CYWEE_MSG_TYPE_EXTRA_INFO_UPDATE:
-            PRINT("CYWEE_MSG_TYPE_EXTRA_INFO_UPDATE");
-            PRINT("average step frequency[%d], average step length[%d], average pace[%d], max step frequency[%d], max pace[%d]\n",
-            c_result_t.avg_step_freq,c_result_t.avg_step_len,c_result_t.avg_pace,c_result_t.max_step_freq,c_result_t.max_pace,sizeof(cywee_result_t));
-            CustomEventPublish(TOPIC_EVENT_EXTRA_INFO_UPDATE,&c_result_t,sizeof(cywee_result_t));
+            PRINT("CYWEE_MSG_TYPE_EXTRA_INFO_UPDATE\r\n");
+            memcpy(&c_activity_result_t, msg_data, sizeof(cywee_activity_result_t));
+            PRINT("average step frequency[%d], average step length[%d], average pace[%d], max step frequency[%d], max pace[%d], len[%d]\n",
+            c_activity_result_t.avg_step_freq,c_activity_result_t.avg_step_len,c_activity_result_t.avg_pace,c_activity_result_t.max_step_freq,c_activity_result_t.max_pace,sizeof(cywee_activity_result_t));
+            CustomEventPublish(TOPIC_EVENT_EXTRA_INFO_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
             break;
+
+        //久坐
+        case CYWEE_MSG_TYPE_SEDENTARY_UPDATE:
+            PRINT("CYWEE_MSG_TYPE_SEDENTARY_UPDATE\r\n");
+            memcpy(&c_inactivity_result_t, msg_data, sizeof(cywee_inactivity_result_t));
+            PRINT("inactivity_mode_number[%d], sedentary status[%d], stand freq[%d], len[%d]\n",
+            c_inactivity_result_t.inactivity_mode,c_inactivity_result_t.sedentary_status,
+            c_inactivity_result_t.stand_freq,sizeof(cywee_inactivity_result_t));
+            //CustomEventPublish(TOPIC_EVENT_EXTRA_INFO_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
+            break;
+
+        //睡眠
+        case CYWEE_MSG_TYPE_SLEEPING_UPDATE:
+            PRINT("CYWEE_MSG_TYPE_SLEEPING_UPDATE\r\n");
+            memcpy(&c_inactivity_result_t, msg_data, sizeof(cywee_inactivity_result_t));
+            PRINT("inactivity_mode_number[%d], sleep status[%d], month[%d], day[%d], hour[%d], min[%d], len[%d]\n",
+            c_inactivity_result_t.inactivity_mode,c_inactivity_result_t.sleep_status,
+            c_inactivity_result_t.month,c_inactivity_result_t.day,
+            c_inactivity_result_t.hour,c_inactivity_result_t.minute,
+            sizeof(cywee_inactivity_result_t));
+            //CustomEventPublish(TOPIC_EVENT_EXTRA_INFO_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
+            break;
+
+        //睡眠累计
+        case CYWEE_MSG_TYPE_SLEEPING_ACCUMULATE_TIME_UPDATE:
+            PRINT("CYWEE_MSG_TYPE_SLEEPING_ACCUMULATE_TIME_UPDATE\r\n");
+            memcpy(&c_inactivity_result_t, msg_data, sizeof(cywee_inactivity_result_t));
+            PRINT("inactivity_mode_number[%d], total sleep time[%d], total nap time[%d], total deep sleep time[%d], total wake time[%d], total rem sleep time[%d], len[%d]\n",
+            c_inactivity_result_t.inactivity_mode,c_inactivity_result_t.total_sleep_time,c_inactivity_result_t.total_mild_sleep_time,
+            c_inactivity_result_t.total_deep_sleep_time,c_inactivity_result_t.total_wake_time,c_inactivity_result_t.total_rem_sleep_time,
+            c_inactivity_result_t.stand_freq,sizeof(cywee_inactivity_result_t));
+            //CustomEventPublish(TOPIC_EVENT_EXTRA_INFO_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
+            break;
+
+        //小睡
+        case CYWEE_MSG_TYPE_NAP_UPDATE:
+            PRINT("CYWEE_MSG_TYPE_NAP_UPDATE\r\n");
+            memcpy(&c_inactivity_result_t, msg_data, sizeof(cywee_inactivity_result_t));
+            PRINT("inactivity_mode_number[%d], nap status[%d], month[%d], day[%d], hour[%d], min[%d], len[%d]\n",
+            c_inactivity_result_t.inactivity_mode,c_inactivity_result_t.nap_status,c_inactivity_result_t.month,
+            c_inactivity_result_t.day,c_inactivity_result_t.hour,c_inactivity_result_t.minute,sizeof(cywee_inactivity_result_t));
+            //CustomEventPublish(TOPIC_EVENT_EXTRA_INFO_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
+            break;
+        
+        //小睡累计
+        case CYWEE_MSG_TYPE_NAP_ACCUMULATE_TIME_UPDATE:
+            PRINT("CYWEE_MSG_TYPE_NAP_ACCUMULATE_TIME_UPDATE\r\n");
+            memcpy(&c_inactivity_result_t, msg_data, sizeof(cywee_inactivity_result_t));
+            PRINT("inactivity_mode_number[%d], total nap time[%d], total mild time[%d], total deep sleep time[%d], total wake time[%d], total rem sleep time[%d], len[%d]\n",
+            c_inactivity_result_t.inactivity_mode,c_inactivity_result_t.total_nap_time,c_inactivity_result_t.total_mild_sleep_time,
+            c_inactivity_result_t.total_deep_sleep_time,c_inactivity_result_t.total_wake_time,c_inactivity_result_t.total_rem_sleep_time,
+            c_inactivity_result_t.stand_freq,sizeof(cywee_inactivity_result_t));
+            //CustomEventPublish(TOPIC_EVENT_EXTRA_INFO_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
+            break;
+
         default:
+
             PRINT("Unknown sensor message type");
             break;
     }
 }
 
+
 static void cywee_service_timer_start_check(uint32_t rtc_ms)
 {
     
index d88e091..d63e6ee 100644 (file)
@@ -12,6 +12,8 @@
 #include "osal_mutex.h" 
 #include "ppg_service.h"
 #include "custom_utils.h"
+#include "sys/time.h"
+#include "time.h"
 
 #define AP_ENABLE_DML_SDO_LISTEN
 
@@ -30,7 +32,8 @@ static int16 right_falg=-1;
 
 SettingControl_t scl;
 
-cywee_result_t c_result_t;
+cywee_activity_result_t c_activity_result_t;
+cywee_inactivity_result_t c_inactivity_result_t;
 
 static int cywee_installized = 0 ;
 static int free_training_installized = 0 ;
@@ -43,32 +46,29 @@ static osTimerId_t g_cywee_oncharging_timer;
 
 CustomSensorData csd;
 
-void free_training_task(void)
+void time_sync(void)
 {
-    ppg_send_cmd_to_driver("hrs",1);
-}
-
-errcode_t free_training_init(void)
-{
-    app_task_definition_t taskcfg={0};
-    taskcfg.create_queue_handle = NULL;
-    taskcfg.attr.name="free_training_service";
-    taskcfg.attr.priority = TASK_PRIORITY_CMD;
-    taskcfg.attr.stack_size =  1024*8;
-    taskcfg.func = free_training_task;
-    taskcfg.use_mem = USE_EXTEND_MEM;
+    time_t rawtime;
+    struct tm* timeinfo;
+    time(&rawtime);
+    timeinfo = localtime(&rawtime);
+    PRINT("year[%d], mon[%d], day[%d], hour[%d], min[%d], msc[%d] \r\n",
+    timeinfo->tm_year,timeinfo->tm_mon,timeinfo->tm_mday,
+    timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
 
-    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
-    if(ret != ERRCODE_SUCC)
-    {
-        PRINT("create free_training_task failed %d!\r\n",ret);
-        return ERRCODE_FAIL;
-    }
-
-    return ERRCODE_SUCC;
+    memset(&scl, 0, sizeof(scl));
+    scl.iData[0] = 1;
+    scl.iData[1] = timeinfo->tm_year;
+    scl.iData[2] = timeinfo->tm_mon;
+    scl.iData[3] = timeinfo->tm_mday;
+    scl.iData[4] = timeinfo->tm_hour;
+    scl.iData[5] = timeinfo->tm_min;
+    scl.iData[6] = timeinfo->tm_sec;
+    CWM_SettingControl(SCL_DATE_TIME, &scl);
 }
 
 
+
 void cywee_hrs_check_timer_callback(void)
 {
     uint8_t hrs,wearstatus;
@@ -96,6 +96,38 @@ void cywee_oncharging_check_timer_callback(void)
 }
 
 
+void free_training_task(void)
+{
+    ppg_send_cmd_to_driver("hrs",1);
+}
+
+errcode_t free_training_init(void)
+{
+    if(free_training_installized == 1)
+        return ERRCODE_FAIL;
+    free_training_installized = 1;
+    app_task_definition_t taskcfg={0};
+    taskcfg.create_queue_handle = NULL;
+    taskcfg.attr.name="free_training_service";
+    taskcfg.attr.priority = TASK_PRIORITY_CMD;
+    taskcfg.attr.stack_size =  1024*8;
+    taskcfg.func = free_training_task;
+    taskcfg.use_mem = USE_EXTEND_MEM;
+
+    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+    if(ret != ERRCODE_SUCC)
+    {
+        PRINT("create free_training_task failed %d!\r\n",ret);
+        return ERRCODE_FAIL;
+    }
+
+    g_cywee_hrs_timer = osTimerNew((osTimerFunc_t)cywee_hrs_check_timer_callback, osTimerPeriodic, NULL, NULL);
+    //g_cywee_wearstatus_timer = osTimerNew((osTimerFunc_t)cywee_wearstatus_check_timer_callback, osTimerPeriodic, NULL, NULL);
+    g_cywee_oncharging_timer = osTimerNew((osTimerFunc_t)cywee_oncharging_check_timer_callback, osTimerPeriodic, NULL, NULL);
+
+    return ERRCODE_SUCC;
+}
+
 void watch_hand_updown(int fdata)
 {
     #if defined(SUPPORT_POWER_MANAGER)
@@ -134,8 +166,8 @@ void activity_exit(void)
     scl.iData[0] = 1;
     CWM_SettingControl(SCL_REQ_ACTIVITY_EXIT, &scl);
 
-    if(cywee_installized == 1)
-        cywee_installized = 0;
+    // if(cywee_installized == 1)
+    //     cywee_installized = 0;
     if(free_training_installized == 1)
     {
         free_training_installized = 0;
@@ -148,7 +180,56 @@ void activity_exit(void)
     }
 }
 
-void cyw_mode_init(int mode)
+void cyw_inactivity_mode_change(int mode)
+{
+    switch (mode)
+    {
+        //無作用
+        case INACTIVITY_MODE_NOTHING:
+            memset(&scl, 0, sizeof(scl));
+            scl.iData[0] = 1;
+            scl.iData[1] = 0;
+            CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl);
+            break;
+
+        //久坐和有效站立
+        case INACTIVITY_MODE_SEDENTARY:
+            memset(&scl, 0, sizeof(scl));
+            scl.iData[0] = 1;
+            scl.iData[1] = 1;
+            CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl);
+            break;
+
+        //睡眠
+        case INACTIVITY_MODE_SLEEPING:
+            memset(&scl, 0, sizeof(scl));
+            scl.iData[0] = 1;
+            scl.iData[1] = 2;
+            CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl);
+            break;
+
+        //久坐、有效站立和小睡
+        case INACTIVITY_MODE_SEDENTARY_AND_NAP:
+            memset(&scl, 0, sizeof(scl));
+            scl.iData[0] = 1;
+            scl.iData[1] = 3;
+            CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl);
+            break;
+
+        //小睡
+        case INACTIVITY_MODE_NAP:
+            memset(&scl, 0, sizeof(scl));
+            scl.iData[0] = 1;
+            scl.iData[1] = 4;
+            CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl);
+            break;
+
+        default:
+            break;
+    }
+}
+
+void cyw_activity_mode_change(int mode)
 {
     switch (mode)
     {
@@ -198,7 +279,6 @@ void cyw_mode_init(int mode)
 
         //自由运动
         case SPORT_ACTIVE_MODE_FREE_TRAINING:
-            free_training_installized = 1;
             free_training_init();
             memset(&scl, 0, sizeof(scl));
             scl.iData[0] = 1;
@@ -206,24 +286,6 @@ void cyw_mode_init(int mode)
             CWM_SettingControl(SCL_SET_ACTIVITY_MODE, &scl);
             break;
 
-        //长时间动作侦测
-        // case SPORT_ACTIVE_MODE_AR_ALERT:
-        //     break;
-        
-        case 2:
-            memset(&scl, 0, sizeof(scl));
-            scl.iData[0] = 1;
-            scl.iData[1] = 2;
-            CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl);
-            break;
-
-        case 1:
-            memset(&scl, 0, sizeof(scl));
-            scl.iData[0] = 1;
-            scl.iData[1] = 1;
-            CWM_SettingControl(SCL_SET_INACTIVITY_MODE, &scl);
-            break;
-
         default:
             break;
     }
@@ -364,22 +426,91 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
             CWM_OS_dbgPrintf("IDX_ALGO_SHAKE\n");
              break;
         case IDX_ALGO_INACTIVITY_OUTPUT:
+            cywee_func = cywee_get_send_msg_callback_func();
             CWM_OS_dbgPrintf("IDX_ALGO_INACTIVITY_OUTPUT\n");
-            if((int)sensorEVT->fData[0] == 21)
+            if((int)sensorEVT->fData[0] == 20)
             {
-                CWM_OS_dbgPrintf("sleep status[%d], month[%d], day[%d], hour[%d], min[%d], mintue[%d], inactivity_mode_number[%d]\n",
+                CWM_OS_dbgPrintf("inactivity_mode_number[%d], sedentary status[%d], stand freq[%d]\n",
+                                (int)sensorEVT->fData[15],
+                                (int)sensorEVT->fData[2],
+                                (int)sensorEVT->fData[3]);
+                memset(&c_inactivity_result_t,0,sizeof(cywee_inactivity_result_t));
+                c_inactivity_result_t.inactivity_mode = (int)sensorEVT->fData[15];
+                c_inactivity_result_t.sedentary_status = (int)sensorEVT->fData[2];
+                c_inactivity_result_t.stand_freq = (int)sensorEVT->fData[3];
+                cywee_func(CYWEE_MSG_TYPE_SEDENTARY_UPDATE,&c_inactivity_result_t,sizeof(cywee_inactivity_result_t));
+
+            }else if((int)sensorEVT->fData[0] == 21){
+                CWM_OS_dbgPrintf("inactivity_mode_number[%d], sleep status[%d], month[%d], day[%d], hour[%d], min[%d]\n",
+                                (int)sensorEVT->fData[15],
                                 (int)sensorEVT->fData[2],
                                 (int)sensorEVT->fData[3],
                                 (int)sensorEVT->fData[4],
                                 (int)sensorEVT->fData[5],
-                                (int)sensorEVT->fData[6],
-                                (int)sensorEVT->fData[8],
-                                (int)sensorEVT->fData[9],
-                                (int)sensorEVT->fData[10],
-                                (int)sensorEVT->fData[15]);
-            }   
+                                (int)sensorEVT->fData[6]);
+                memset(&c_inactivity_result_t,0,sizeof(cywee_inactivity_result_t));
+                c_inactivity_result_t.inactivity_mode = (int)sensorEVT->fData[15];
+                c_inactivity_result_t.sleep_status = (int)sensorEVT->fData[2];
+                c_inactivity_result_t.month = (int)sensorEVT->fData[3];
+                c_inactivity_result_t.day = (int)sensorEVT->fData[4];
+                c_inactivity_result_t.hour = (int)sensorEVT->fData[5];
+                c_inactivity_result_t.minute = (int)sensorEVT->fData[6];
+                cywee_func(CYWEE_MSG_TYPE_SLEEPING_UPDATE,&c_inactivity_result_t,sizeof(cywee_inactivity_result_t));
+
+            }else if((int)sensorEVT->fData[0] == 31){
+                CWM_OS_dbgPrintf("inactivity_mode_number[%d], total sleep time[%d], total mild time[%d], total deep sleep time[%d], total wake time[%d], total rem sleep time[%d]\n",
+                                (int)sensorEVT->fData[15],
+                                (int)sensorEVT->fData[1],
+                                (int)sensorEVT->fData[2],
+                                (int)sensorEVT->fData[3],
+                                (int)sensorEVT->fData[4],
+                                (int)sensorEVT->fData[5]);
+                memset(&c_inactivity_result_t,0,sizeof(cywee_inactivity_result_t));
+                c_inactivity_result_t.inactivity_mode = (int)sensorEVT->fData[15];
+                c_inactivity_result_t.total_sleep_time = (int)sensorEVT->fData[1];
+                c_inactivity_result_t.total_mild_sleep_time = (int)sensorEVT->fData[2];
+                c_inactivity_result_t.total_deep_sleep_time = (int)sensorEVT->fData[3];
+                c_inactivity_result_t.total_wake_time = (int)sensorEVT->fData[4];
+                c_inactivity_result_t.total_rem_sleep_time = (int)sensorEVT->fData[5];
+                cywee_func(CYWEE_MSG_TYPE_SLEEPING_ACCUMULATE_TIME_UPDATE,&c_inactivity_result_t,sizeof(cywee_inactivity_result_t));
+
+            }else if((int)sensorEVT->fData[0] == 22){
+                CWM_OS_dbgPrintf("inactivity_mode_number[%d], nap status[%d], month[%d], day[%d], hour[%d], min[%d]\n",
+                                (int)sensorEVT->fData[15],
+                                (int)sensorEVT->fData[2],
+                                (int)sensorEVT->fData[3],
+                                (int)sensorEVT->fData[4],
+                                (int)sensorEVT->fData[5],
+                                (int)sensorEVT->fData[6]);
+                memset(&c_inactivity_result_t,0,sizeof(cywee_inactivity_result_t));
+                c_inactivity_result_t.inactivity_mode = (int)sensorEVT->fData[15];
+                c_inactivity_result_t.nap_status = (int)sensorEVT->fData[2];
+                c_inactivity_result_t.month = (int)sensorEVT->fData[3];
+                c_inactivity_result_t.day = (int)sensorEVT->fData[4];
+                c_inactivity_result_t.hour = (int)sensorEVT->fData[5];
+                c_inactivity_result_t.minute = (int)sensorEVT->fData[6];
+                cywee_func(CYWEE_MSG_TYPE_NAP_UPDATE,&c_inactivity_result_t,sizeof(cywee_inactivity_result_t));
+
+            }else if((int)sensorEVT->fData[0] == 32){
+                CWM_OS_dbgPrintf("inactivity_mode_number[%d], total nap time[%d], total mild time[%d], total deep sleep time[%d], total wake time[%d], total rem sleep time[%d]\n",
+                                (int)sensorEVT->fData[15],
+                                (int)sensorEVT->fData[1],
+                                (int)sensorEVT->fData[2],
+                                (int)sensorEVT->fData[3],
+                                (int)sensorEVT->fData[4],
+                                (int)sensorEVT->fData[5]);
+                memset(&c_inactivity_result_t,0,sizeof(cywee_inactivity_result_t));
+                c_inactivity_result_t.inactivity_mode = (int)sensorEVT->fData[15];
+                c_inactivity_result_t.total_nap_time = (int)sensorEVT->fData[1];
+                c_inactivity_result_t.total_mild_sleep_time = (int)sensorEVT->fData[2];
+                c_inactivity_result_t.total_deep_sleep_time = (int)sensorEVT->fData[3];
+                c_inactivity_result_t.total_wake_time = (int)sensorEVT->fData[4];
+                c_inactivity_result_t.total_rem_sleep_time = (int)sensorEVT->fData[5];
+                cywee_func(CYWEE_MSG_TYPE_NAP_ACCUMULATE_TIME_UPDATE,&c_inactivity_result_t,sizeof(cywee_inactivity_result_t));
+            }  
             break;
         case IDX_ALGO_ACTIVITY_OUTPUT:
+            cywee_func = cywee_get_send_msg_callback_func();
             if((int)sensorEVT->fData[0] == 100)
             {
                 CWM_OS_dbgPrintf("average step frequency[%d], average step length[%d], average pace[%d], max step frequency[%d], max pace[%d]\n",
@@ -389,14 +520,13 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
                                 (int)sensorEVT->fData[4],
                                 (int)sensorEVT->fData[5]);
 
-                memset(&c_result_t,0,sizeof(cywee_result_t));
-                c_result_t.avg_step_freq = (int)sensorEVT->fData[1];
-                c_result_t.avg_step_len = (int)sensorEVT->fData[2];
-                c_result_t.avg_pace = (int)sensorEVT->fData[3];
-                c_result_t.max_step_freq = (int)sensorEVT->fData[4];
-                c_result_t.max_pace = (int)sensorEVT->fData[5];
-                cywee_func = cywee_get_send_msg_callback_func();
-                cywee_func(CYWEE_MSG_TYPE_EXTRA_INFO_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                memset(&c_activity_result_t,0,sizeof(cywee_activity_result_t));
+                c_activity_result_t.avg_step_freq = (int)sensorEVT->fData[1];
+                c_activity_result_t.avg_step_len = (int)sensorEVT->fData[2];
+                c_activity_result_t.avg_pace = (int)sensorEVT->fData[3];
+                c_activity_result_t.max_step_freq = (int)sensorEVT->fData[4];
+                c_activity_result_t.max_pace = (int)sensorEVT->fData[5];
+                cywee_func(CYWEE_MSG_TYPE_EXTRA_INFO_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
 
             }else if((int)sensorEVT->fData[0] == 5001)
             {
@@ -405,23 +535,21 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
                                 (int)sensorEVT->fData[5],
                                 (int)sensorEVT->fData[6]);
 
-                memset(&c_result_t,0,sizeof(cywee_result_t));
-                c_result_t.activity_mode = (int)sensorEVT->fData[0];
-                c_result_t.calories = (int)sensorEVT->fData[1];
-                c_result_t.duration = (int)sensorEVT->fData[5];
-                c_result_t.MHR_zone = (int)sensorEVT->fData[6];
-                cywee_func = cywee_get_send_msg_callback_func();
-                cywee_func(CYWEE_MSG_TYPE_FREE_TRAINING_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                memset(&c_activity_result_t,0,sizeof(cywee_activity_result_t));
+                c_activity_result_t.activity_mode = (int)sensorEVT->fData[0];
+                c_activity_result_t.calories = (int)sensorEVT->fData[1];
+                c_activity_result_t.duration = (int)sensorEVT->fData[5];
+                c_activity_result_t.MHR_zone = (int)sensorEVT->fData[6];
+                cywee_func(CYWEE_MSG_TYPE_FREE_TRAINING_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
                 
             }else if((int)sensorEVT->fData[0] == 102)
             {
                 CWM_OS_dbgPrintf("ar alert type : %d\n",(int)sensorEVT->fData[1]);
 
-                memset(&c_result_t,0,sizeof(cywee_result_t));
-                c_result_t.activity_mode = (int)sensorEVT->fData[0];
-                c_result_t.ar_alert_type = (int)sensorEVT->fData[1];
-                cywee_func = cywee_get_send_msg_callback_func();
-                cywee_func(CYWEE_MSG_TYPE_AR_ALERT_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                memset(&c_activity_result_t,0,sizeof(cywee_activity_result_t));
+                c_activity_result_t.activity_mode = (int)sensorEVT->fData[0];
+                c_activity_result_t.ar_alert_type = (int)sensorEVT->fData[1];
+                cywee_func(CYWEE_MSG_TYPE_AR_ALERT_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
                 
             }else{
                  CWM_OS_dbgPrintf("activity_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%d], pace[%d], BMR calories[%d], is_pause[%d]\n",
@@ -435,38 +563,37 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
                                 (int)sensorEVT->fData[8],
                                 (int)sensorEVT->fData[14]);
                 int stepcount = (int)sensorEVT->fData[1];
-                memset(&c_result_t,0,sizeof(cywee_result_t));
-                c_result_t.activity_mode = (int)sensorEVT->fData[0];
-                c_result_t.steps = (int)sensorEVT->fData[1];
-                c_result_t.distance = (int)sensorEVT->fData[2];
-                c_result_t.calories = (int)sensorEVT->fData[3];
-                c_result_t.step_frequency = (int)sensorEVT->fData[5];
-                c_result_t.step_length = (int)sensorEVT->fData[6];
-                c_result_t.pace = (int)sensorEVT->fData[7];
-                c_result_t.BMR_calories = (int)sensorEVT->fData[8];
-                c_result_t.is_pause = (int)sensorEVT->fData[14];
-                cywee_func = cywee_get_send_msg_callback_func();
+                memset(&c_activity_result_t,0,sizeof(cywee_activity_result_t));
+                c_activity_result_t.activity_mode = (int)sensorEVT->fData[0];
+                c_activity_result_t.steps = (int)sensorEVT->fData[1];
+                c_activity_result_t.distance = (int)sensorEVT->fData[2];
+                c_activity_result_t.calories = (int)sensorEVT->fData[3];
+                c_activity_result_t.step_frequency = (int)sensorEVT->fData[5];
+                c_activity_result_t.step_length = (int)sensorEVT->fData[6];
+                c_activity_result_t.pace = (int)sensorEVT->fData[7];
+                c_activity_result_t.BMR_calories = (int)sensorEVT->fData[8];
+                c_activity_result_t.is_pause = (int)sensorEVT->fData[14];
 
                 switch ((int)sensorEVT->fData[0])
                 {
                     case SPORT_ACTIVE_MODE_NORMAL:
-                        cywee_func(CYWEE_MSG_TYPE_NORMAL_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                        cywee_func(CYWEE_MSG_TYPE_NORMAL_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
                         break;
 
                     case SPORT_ACTIVE_MODE_TREADMILL:
-                        cywee_func(CYWEE_MSG_TYPE_TREADMILL_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                        cywee_func(CYWEE_MSG_TYPE_TREADMILL_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
                         break;
 
                     case SPORT_ACTIVE_MODE_OUTDOOR_RUNNING:
-                        cywee_func(CYWEE_MSG_TYPE_OUTDOOR_RUNNING_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                        cywee_func(CYWEE_MSG_TYPE_OUTDOOR_RUNNING_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
                         break;
 
                     case SPORT_ACTIVE_MODE_INDOOR_RUNNING:
-                        cywee_func(CYWEE_MSG_TYPE_INDOOR_RUNNING_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                        cywee_func(CYWEE_MSG_TYPE_INDOOR_RUNNING_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
                         break;
 
                     case SPORT_ACTIVE_MODE_FITNESS_PEDOMETERR:
-                        cywee_func(CYWEE_MSG_TYPE_FITNESS_PEDOMETERR_UPDATE,&c_result_t,sizeof(cywee_result_t));
+                        cywee_func(CYWEE_MSG_TYPE_FITNESS_PEDOMETERR_UPDATE,&c_activity_result_t,sizeof(cywee_activity_result_t));
                         break;
                     
                     default:
@@ -532,377 +659,236 @@ void CWM_AP_dmlSensorDataOutput_listen(const dml_sensorData_t * pSdo) {
 
 int cywee_main_dml(int cmd) {
 
-    if (cywee_installized==1)
+    if (cywee_installized==0)
     {
-        CWM_OS_dbgPrintf("cywee_installized skip install\n");
-        return 0;
-
-    }
-    cywee_installized = 1;
-    int i;
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    CWM_SettingControl(SCL_GET_LIB_INFO, &scl);
-    CWM_OS_dbgPrintf("version:%d.%d.%d.%d product:%d model:%d\n", scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4], scl.iData[5], scl.iData[6]);
-    CWM_OS_dbgPrintf("[DBG] ach: %d\n", scl.iData[7]);
-#if USE_P813
-    os_api api = {
-        .GetTimeNs    = CWM_OS_GetTimeNs,
-        .dbgOutput    = CWM_OS_dbgOutput,
-        .i2cRead      = CWM_OS_i2cRead,
-        .i2cWrite     = CWM_OS_i2cWrite,
-        .uSleep       = CWM_OS_uSleep,
-        .free         = CWM_OS_free,
-        .malloc       = CWM_OS_malloc,
-        .spiRead      = NULL,
-        .spiWrite      = NULL,
-    };
-    CWM_LibPreInit(&api);
-
-#else
-    OsAPI apiOS = {
-        .GetTimeNs    = CWM_OS_GetTimeNs,
-        .dbgOutput    = CWM_OS_dbgOutput,
-        .i2cRead      = CWM_OS_i2cRead,
-        .i2cWrite     = CWM_OS_i2cWrite,
-        .uSleep       = CWM_OS_uSleep,
-        .free         = CWM_OS_free,
-        .malloc       = CWM_OS_malloc,
-        .i2cTransfer  = CWM_OS_i2cTransfer,
-        .restoreData  = CWM_OS_restoreData,
-        .saveData     = CWM_OS_saveData,
-        .spiRead      = NULL,
-        .spiWrite     = NULL,
-        .securityCodeWrite      = NULL,
-        .setGpio      = NULL,
-        .enableGpioIRQ      = NULL,
-        .disableGpioIRQ      = NULL,
-    };
-    CWM_LibPreInit(&apiOS);
-#endif
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    //set mcu_chip information, must call this before CWM_LibPostInit()
-
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[1] = 2; // 0: mcu_auto_detect 2: skip_mcu_auto_detect
-    CWM_SettingControl(SCL_CHIP_VENDOR_CONFIG, &scl);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    CWM_LibPostInit(CWM_AP_SensorListen);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    //get chip information
-
-    char chipInfo[64];
-
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[1] = 1;
-    scl.iData[2] = (int)chipInfo;
-    scl.iData[3] = sizeof(chipInfo);
-    scl.iData[4] = 0;
-    scl.iData[5] = 0;
-    scl.iData[6] = 0;
-    CWM_SettingControl(SCL_GET_CHIP_INFO, &scl);
-    CWM_OS_dbgPrintf("have_security = %d.%d ret_buff_size = %d  chipInfo = %s\n", scl.iData[5], scl.iData[6], scl.iData[4], chipInfo);
-    CWM_OS_dbgPrintf("chip_settings = %d, %d, %d\n", scl.iData[9], scl.iData[10], scl.iData[11]);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    CWM_Dml_LibInit();
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    #ifdef AP_ENABLE_DML_SDO_LISTEN
-    // This API allows customers to develop custom features.
-    // Specific settingControl commands needs to be called for this API to work.
-    // No need to enable or implement this function for general usage.
-    CWM_Dml_sensorDataOutput_register(CWM_AP_dmlSensorDataOutput_listen);
+        cywee_installized = 1;
+        int i;
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_GET_LIB_INFO, &scl);
+        CWM_OS_dbgPrintf("version:%d.%d.%d.%d product:%d model:%d\n", scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4], scl.iData[5], scl.iData[6]);
+        CWM_OS_dbgPrintf("[DBG] ach: %d\n", scl.iData[7]);
+    #if USE_P813
+        os_api api = {
+            .GetTimeNs    = CWM_OS_GetTimeNs,
+            .dbgOutput    = CWM_OS_dbgOutput,
+            .i2cRead      = CWM_OS_i2cRead,
+            .i2cWrite     = CWM_OS_i2cWrite,
+            .uSleep       = CWM_OS_uSleep,
+            .free         = CWM_OS_free,
+            .malloc       = CWM_OS_malloc,
+            .spiRead      = NULL,
+            .spiWrite      = NULL,
+        };
+        CWM_LibPreInit(&api);
+
+    #else
+        OsAPI apiOS = {
+            .GetTimeNs    = CWM_OS_GetTimeNs,
+            .dbgOutput    = CWM_OS_dbgOutput,
+            .i2cRead      = CWM_OS_i2cRead,
+            .i2cWrite     = CWM_OS_i2cWrite,
+            .uSleep       = CWM_OS_uSleep,
+            .free         = CWM_OS_free,
+            .malloc       = CWM_OS_malloc,
+            .i2cTransfer  = CWM_OS_i2cTransfer,
+            .restoreData  = CWM_OS_restoreData,
+            .saveData     = CWM_OS_saveData,
+            .spiRead      = NULL,
+            .spiWrite     = NULL,
+            .securityCodeWrite      = NULL,
+            .setGpio      = NULL,
+            .enableGpioIRQ      = NULL,
+            .disableGpioIRQ      = NULL,
+        };
+        CWM_LibPreInit(&apiOS);
     #endif
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    CWM_SettingControl(SCL_DML_GET_LIB_INFO, &scl);
-    CWM_OS_dbgPrintf("dml version:%d.%d.%d.%d product:%d model:%d\n", scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4], scl.iData[5], scl.iData[6]);
-
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[1] = 18; //00000000000000000000000000010010  高位在前
-    // CWM_SettingControl(SCL_DML_DEBUG, &scl);
-
-    //设置acc gyro 相关参数
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[3] = 2;
-    scl.iData[4] = 2; //1 anytime 2 fifo
-    scl.iData[6] = 5; //先設定5
-    scl.iData[7] = 5;
-    scl.iData[8] = 52; // for st sensor(52Hz)
-    CWM_SettingControl(SCL_DML_DRV_AG_CONFIG, &scl);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    //设定搜寻哪种型号的传感器,以及要搜寻的属性
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[1] = 2;
-    scl.iData[6] = 3002502;
-    scl.iData[7] = (0|1|8|256|1024);
-    CWM_SettingControl(SCL_DML_DRV_HW_CONFIG, &scl);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        //set mcu_chip information, must call this before CWM_LibPostInit()
+
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[1] = 2; // 0: mcu_auto_detect 2: skip_mcu_auto_detect
+        CWM_SettingControl(SCL_CHIP_VENDOR_CONFIG, &scl);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        CWM_LibPostInit(CWM_AP_SensorListen);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        //get chip information
+
+        char chipInfo[64];
+
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[1] = 1;
+        scl.iData[2] = (int)chipInfo;
+        scl.iData[3] = sizeof(chipInfo);
+        scl.iData[4] = 0;
+        scl.iData[5] = 0;
+        scl.iData[6] = 0;
+        CWM_SettingControl(SCL_GET_CHIP_INFO, &scl);
+        CWM_OS_dbgPrintf("have_security = %d.%d ret_buff_size = %d  chipInfo = %s\n", scl.iData[5], scl.iData[6], scl.iData[4], chipInfo);
+        CWM_OS_dbgPrintf("chip_settings = %d, %d, %d\n", scl.iData[9], scl.iData[10], scl.iData[11]);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        CWM_Dml_LibInit();
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        #ifdef AP_ENABLE_DML_SDO_LISTEN
+        // This API allows customers to develop custom features.
+        // Specific settingControl commands needs to be called for this API to work.
+        // No need to enable or implement this function for general usage.
+        CWM_Dml_sensorDataOutput_register(CWM_AP_dmlSensorDataOutput_listen);
+        #endif
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_DML_GET_LIB_INFO, &scl);
+        CWM_OS_dbgPrintf("dml version:%d.%d.%d.%d product:%d model:%d\n", scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4], scl.iData[5], scl.iData[6]);
+
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[1] = 18; //00000000000000000000000000010010  高位在前
+        // CWM_SettingControl(SCL_DML_DEBUG, &scl);
+
+        //设置acc gyro 相关参数
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[3] = 2;
+        scl.iData[4] = 2; //1 anytime 2 fifo
+        scl.iData[6] = 5; //先設定5
+        scl.iData[7] = 5;
+        scl.iData[8] = 52; // for st sensor(52Hz)
+        CWM_SettingControl(SCL_DML_DRV_AG_CONFIG, &scl);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        //设定搜寻哪种型号的传感器,以及要搜寻的属性
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[1] = 2;
+        scl.iData[6] = 3002502;
+        scl.iData[7] = (0|1|8|256|1024);
+        CWM_SettingControl(SCL_DML_DRV_HW_CONFIG, &scl);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        //搜寻是否接入传感器
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[1] = 1;
+        CWM_SettingControl(SCL_DML_DRV_INIT, &scl); 
+        CWM_OS_dbgPrintf("DML device=%d\n", scl.iData[2]);
+
+        //获取初始化 driver清单
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_DML_GET_INITED_LIST, &scl);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        for (i = 0; i < scl.iData[2]; i ++) {
+
+            CWM_OS_dbgPrintf("DML device[%d]: hw_id=%d hw_attr=%d\n", i, scl.iData[6 + i * 2], scl.iData[7 + i * 2]);
+        }
 
-    //搜寻是否接入传感器
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[1] = 1;
-    CWM_SettingControl(SCL_DML_DRV_INIT, &scl); 
-    CWM_OS_dbgPrintf("DML device=%d\n", scl.iData[2]);
+        //设置抬腕功能
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        // scl.iData[1] = 5;
+        // scl.iData[2] = 5;
+        // scl.iData[3] = 5;
+        // scl.iData[4] = 5;
+        CWM_SettingControl(SCL_HAND_UPDOWN_CONFIG, &scl);
 
-    //获取初始化 driver清单
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    CWM_SettingControl(SCL_DML_GET_INITED_LIST, &scl);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+        //配置跑步机模式相关参数(进入跑步机模式自动生效)
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_PEDO_CONFIG, &scl);
 
-    for (i = 0; i < scl.iData[2]; i ++) {
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_ACTIVITY_CONFIG, &scl);
 
-        CWM_OS_dbgPrintf("DML device[%d]: hw_id=%d hw_attr=%d\n", i, scl.iData[6 + i * 2], scl.iData[7 + i * 2]);
-    }
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_PEDO_CONFIG, &scl);
 
-    //设置抬腕功能
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    // scl.iData[1] = 5;
-    // scl.iData[2] = 5;
-    // scl.iData[3] = 5;
-    // scl.iData[4] = 5;
-    CWM_SettingControl(SCL_HAND_UPDOWN_CONFIG, &scl);
-
-/*
-int[0] = 1
-int[1] = floor_Height (cm)(設定樓層高度)(default: 380cm = 3.8m)
-  (0: default, 150 - 1000)
-int[2] = Anti-misoperation (一般模式時的防誤計步等級) (default: 4)
-  (0: default, 1: 最容易誤計步, 2, 3, 4:預設等級, 5, 6, 7: 最不容易誤計步)
-int[3] = 戶外跑步和一般模式時距離、配速和步距的調整 (default: 4)
-   (0: default, 1: 距離最短, 2, 3, 4:預設, 5, 6, 7:距離最長)
-int[4] = enable_extra_packet  (default: 不發送)
-   (0: default, 1: 發送, 2: 不發送)
-int[5] = Treadmill__steps  (跑步機校正參數)(steps) (default: 不校正)
-   (0: 不校正)
-int[6] = Treadmill__average_step_frequency  (跑步機校正參數) (steps/minute) (default: 不校正)
-   (0: 不校正)
-int[7] = Treadmill__uncalibration_distance  (跑步機校正參數)(meters) (default: 不校正)
-   (0: 不校正)
-int[8] = Treadmill__ground_truth_distance  (跑步機校正參數: 真實的跑步距離)(meters) (default: 不校正)
-   (0: 不校正)
-int[9] = floor_sensitivity  (樓層計算嚴謹度)(default: 3)
-  (0: default, 1:寬容, 2, 3, 4, 5, 7: 嚴格)
-int[10] = 防高頻誤觸  (default: 開啟)
-  (0: default,  1: 開啟, 2: 關閉)
-int[11] = 高步頻走路步距修正  (default: 開啟)
-  (0: default,  1: 開啟, 2: 關閉)
-int[12] = 活動程度區間的中度活動步頻  (default: 60)
-  (0: default, 60 - 270)
-int[13] = 活動程度區間的高度活動步頻  (default: 120)
-  (0: default, 60 - 270)
-
-*/
-    //配置跑步机模式相关参数(进入跑步机模式自动生效)
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[2] = 4;
-    scl.iData[3] = 4;
-
-    scl.iData[5] = 0;
-    scl.iData[6] = 0;
-    scl.iData[7] = 0;
-    scl.iData[8] = 0;
-
-    scl.iData[10] = 1;
-    scl.iData[11] = 1;
-    scl.iData[12] = 60;
-    scl.iData[13] = 120;
-    CWM_SettingControl(SCL_PEDO_CONFIG, &scl);
-
-/*
-int[0] = 1
-int[1] = 卡路里計算是否包含基礎卡路里  (default: 不包含基礎卡路里)
-  (0: default, 1:包含基礎卡路里, 2:不包含基礎卡路里)
-int[2] = 一般模式1001是否使用心率來計算卡路里 (default: 不使用心率)
-  (0: default, 1: 使用心率, 2:不使用心率)
-int[3] = 靜態運動時是否持續計算卡路里 (default: 停止計算)
-  (0: default, 1: 持續計算, 2: 停止計算)
-int[4] = 運動模式(包含一般模式1001)時,脫錶後是否持續計算卡路里 (default: 持續計算)
-  (0: default, 1: 持續計算, 2: 停止計算)
-int[5] = ar_model  (default: on)
-  (0: default, 1: on, 2: off)
-int[6] = ar_pedo_mode (default: 平衡)
-  (0: 平衡, 1: 計步優先, 2: 防誤觸優先)
-int[7] = 靜止時是否持續計算卡路里 (default: 持續計算)
-  (0: default, 1: 持續計算, 2: 停止計算)
-int[8] = motionSensScale活動量的靈敏度   (default: 4)
-  (0: default, 1: 最靈敏, 2, 3, 4, 5, 6, 7: 最不靈敏)
-int[9] = 軸向判斷     (default: 有軸向判斷)
-  (0: default, 1: 無軸向判斷, 2: 有軸向判斷)
-int[10] = 感測器雜訊度等級 (default: 低雜訊)
-  (0: 低雜訊, 1: 高雜訊A, 2 - 4, 5: 高雜訊E)
-*/
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    CWM_SettingControl(SCL_PEDO_CONFIG, &scl);
-
-/*
-SCL_SLEEP_CONFIG
-
-int[0] = 1
-int[1] = reserved
-int[2] = 是否使用心率來判斷睡眠狀態  (default: 不使用心率)
-(0: default, 1: 使用心率, 2: 不使用心率)
-int[3] = 入睡難易度  (default: 4)
-(0: default, 1:不容易入睡, 2, 3, 4:標準, 5, 6, 7:容易入睡)
-int[4] = 出睡難易度 (default: 4)
-(0: default, 1:不容易出睡, 2, 3, 4:標準, 5, 6, 7:容易出睡)
-int[5] = reserved
-int[6] = 清醒難易度 (default: 4)
-(0: default, 1:不容易清醒, 2, 3, 4:標準, 5, 6, 7:容易清醒) 
-int[7] = 硬體訊號等級  (default: 1)
- (0: default, 1: 低雜訊, 2, 3, 4, 5, 6, 7: 高雜訊)
-int[8] = reserved
-int[9] = 睡眠間距  (default: 60)
- (0: default, 1 - 180)
-int[10] = 無心率時是否輸出REM     (default: 會輸出REM)
- (0: default, 1: 禁止輸出REM, 2: 會輸出REM)
-int[11] = 長時間小睡  (default: turn_off)
- (0: default, 1: turn_on, 2: turn_off)
-int[12] = 靜態活動角度靈敏度  (default: 13)
- (0: default, 1: 較難入睡 - 30: 容易入睡)
-*/
 
-    // memset(&scl, 0, sizeof(scl));
-    // scl.iData[0] = 1;
-    // scl.iData[3] = 7;
-    // scl.iData[4] = 7;
-    // scl.iData[6] = 7;
-    // scl.iData[7] = 7;
-    // scl.iData[9] = 1;
-    // CWM_SettingControl(SCL_SLEEP_CONFIG, &scl);
-
-/*
-SCL_REQ_SLEEPING_DATA
-int[0] = 1
-int[1] = terminate_sleep
-(0: 立刻輸出狀態,但不中止此段睡眠偵測, 
-1: 立刻輸出狀態,並中止此段睡眠偵測)
-*/
-    // memset(&scl, 0, sizeof(scl));
-    // scl.iData[0] = 1;
-    // scl.iData[1] = 1;
-    // CWM_SettingControl(SCL_REQ_SLEEPING_DATA, &scl);
-
-/*
-SCL_INACTIVITY_CONFIG
-int[0] = 1
-int[1] = 感測器雜訊度等級 (default: 低雜訊)
-  (0: 低雜訊, 1: 高雜訊)
-*/
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[1] = 1;
-    CWM_SettingControl(SCL_INACTIVITY_CONFIG, &scl);
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_SLEEP_CONFIG, &scl);
 
     /*
-    SCL_DATE_TIME
+    SCL_REQ_SLEEPING_DATA
     int[0] = 1
-    int[1] = year     (1900 - 2100)
-    int[2] = month  (1 - 12)
-    int[3] = day      (1 - 31)
-    int[4] = hour     (0 - 23)
-    int[5] = minute (0 - 59)
-    int[6] = second (0 - 59)
+    int[1] = terminate_sleep
+    (0: 立刻輸出狀態,但不中止此段睡眠偵測, 
+    1: 立刻輸出狀態,並中止此段睡眠偵測)
     */
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[1] = 0;
+        CWM_SettingControl(SCL_REQ_SLEEPING_DATA, &scl);
 
-    // char databuf[64] = {0};
-    // int year,month,day,hour,min,sec;
-    // uapi_get_yyyymmddhhmmss_Date(databuf);
-    // PRINT("databuf : %s \r\n",databuf);
-    // sscanf(databuf, "%4d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &min, &sec);
-    // memset(&scl, 0, sizeof(scl));
-    // scl.iData[0] = 1;
-    // scl.iData[1] = year;
-    // scl.iData[2] = month;
-    // scl.iData[3] = day;
-    // scl.iData[4] = hour;
-    // scl.iData[5] = min;
-    // scl.iData[6] = sec;
-    // CWM_SettingControl(SCL_DATE_TIME, &scl);
-
-/*
-SCL_SEDENTARY
-
-int[0] = 1
-int[1] = reserved
-int[2] = is_reminder_on  (提醒功能)(default: turn_off)
-  (0: default, 1: turn on,  2: turn off)
-int[3] = reminder_time (minutes)(提醒時間)(default: 5)
-  (0:default, 1 - 10)
-int[4] = release_level  (解除久坐狀態的等級)(default: 3)
-  (0:default, 1:容易解除, 2, 3, 4, 5:不容易解除)
-int[5] = release_mode (解除久坐的算法模式)(default: 行走模式)
-  (0: default, 1: 行走模式, 2: 活動量模式)
-
-*/
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[2] = 1;
-    // int[2] = 3,代表開啟acc和gyro感測器  1代表开启acc
-    scl.iData[3] = 1;
-    scl.iData[4] = 3;
-    scl.iData[5] = 1;
-    CWM_SettingControl(SCL_SEDENTARY, &scl);
-
-
-    //呼叫任一個CWM_Sensor_Enable 前呼叫此指令 设置手动或自动模式
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[1] = 1;
-    // int[2] = 3,代表開啟acc和gyro感測器  1代表开启acc
-    scl.iData[2] = 1;
-    CWM_SettingControl(SCL_DML_DRV_ENABLE, &scl);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-
-    memset(&scl, 0, sizeof(scl));
-    scl.iData[0] = 1;
-    scl.iData[3] = 3;
-    scl.iData[4] = 5;
-    // CWM_SettingControl(SCL_LOG, &scl);
-    
-
-    g_cywee_hrs_timer = osTimerNew((osTimerFunc_t)cywee_hrs_check_timer_callback, osTimerPeriodic, NULL, NULL);
-    //g_cywee_wearstatus_timer = osTimerNew((osTimerFunc_t)cywee_wearstatus_check_timer_callback, osTimerPeriodic, NULL, NULL);
-    g_cywee_oncharging_timer = osTimerNew((osTimerFunc_t)cywee_oncharging_check_timer_callback, osTimerPeriodic, NULL, NULL);
-
-    CWM_Sensor_Enable(IDX_REQUEST_SENSOR);
-    // //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-    CWM_Sensor_Enable(IDX_ALGO_INACTIVITY_OUTPUT);
+    /*
+    SCL_INACTIVITY_CONFIG
+    int[0] = 1
+    int[1] = 感測器雜訊度等級 (default: 低雜訊)
+    (0: 低雜訊, 1: 高雜訊)
+    */
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        CWM_SettingControl(SCL_INACTIVITY_CONFIG, &scl);
+
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[2] = 1;
+        // int[2] = 3,代表開啟acc和gyro感測器  1代表开启acc
+        scl.iData[3] = 1;
+        scl.iData[4] = 3;
+        scl.iData[5] = 1;
+        CWM_SettingControl(SCL_SEDENTARY, &scl);
+
+
+        //呼叫任一個CWM_Sensor_Enable 前呼叫此指令 设置手动或自动模式
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[1] = 1;
+        // int[2] = 3,代表開啟acc和gyro感測器  1代表开启acc
+        scl.iData[2] = 1;
+        CWM_SettingControl(SCL_DML_DRV_ENABLE, &scl);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+
+        memset(&scl, 0, sizeof(scl));
+        scl.iData[0] = 1;
+        scl.iData[3] = 3;
+        scl.iData[4] = 5;
+        // CWM_SettingControl(SCL_LOG, &scl);
+        
+        CWM_Sensor_Enable(IDX_REQUEST_SENSOR);
+        // //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+        CWM_Sensor_Enable(IDX_ALGO_INACTIVITY_OUTPUT);
+        
+        CWM_Sensor_Enable(IDX_ALGO_ACTIVITY_OUTPUT);
+
+        CWM_Sensor_Enable(IDX_ACCEL);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+        // CWM_Sensor_Enable(IDX_GYRO);
+        CWM_Sensor_Enable(IDX_ALGO_NO_MOTION);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+        // CWM_Sensor_Enable(IDX_ALGO_ANY_MOTIOIN);
+        CWM_Sensor_Enable(IDX_ALGO_ABSOLUTE_STATIC);
+        //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
+        CWM_Sensor_Enable(IDX_ALGO_WATCH_HANDUP);
+            CWM_OS_dbgPrintf("cywee_installized skip install\n");
+    }
     
-    CWM_Sensor_Enable(IDX_ALGO_ACTIVITY_OUTPUT);
-
-    CWM_Sensor_Enable(IDX_ACCEL);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-    // CWM_Sensor_Enable(IDX_GYRO);
-    CWM_Sensor_Enable(IDX_ALGO_NO_MOTION);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-    // CWM_Sensor_Enable(IDX_ALGO_ANY_MOTIOIN);
-    CWM_Sensor_Enable(IDX_ALGO_ABSOLUTE_STATIC);
-    //CWM_OS_dbgPrintf("[DBG] %s %d\n", __func__,__LINE__);
-    CWM_Sensor_Enable(IDX_ALGO_WATCH_HANDUP);
-
-
-    cyw_mode_init(cmd);
-
+    cyw_activity_mode_change(cmd);
+    if(cmd == SPORT_ACTIVE_MODE_NORMAL)
+        cyw_activity_mode_change(INACTIVITY_MODE_NOTHING);
     // memset(&scl, 0, sizeof(scl));
     // scl.iData[0] = 1;
     // scl.iData[1] = SPORT_ACTIVE_MODE_NORMAL; //ACTIVITY_MODE_NORMAL 1001