ble部分协议修正 382/1
authorhcj <1224667075@qq.com>
Wed, 26 Jun 2024 10:34:25 +0000 (18:34 +0800)
committerhcj <1224667075@qq.com>
Wed, 26 Jun 2024 10:34:25 +0000 (18:34 +0800)
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.h
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h

index 1f1b67b..f052009 100644 (file)
@@ -55,7 +55,7 @@ extern "C" {
 #include "chip_io.h"
 #include "gpio.h"
 #include "pm_veto.h"
-
+#include "cywee_service.h"
 #include "rtc.h"
 #include "timer.h"
 #include "systick.h"
@@ -315,6 +315,7 @@ void ble_get_drink_remind(msg_drink_info_t *data)
     data->drink_on = p_ConfigModel-> get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_DRINK);
     if(data->drink_on)
     data->drink_on=1;
+
     printf("开关:%d\r\n",data->drink_on);
     
     return;
@@ -576,7 +577,7 @@ uint32_t tar_rmove(char *tar_path)
     return 0;
 }
 
-char * tar_dir_to_json_buf_malloc_(char* file_name,uint32_t *file_size)
+char * tar_dir_to_json_buf_malloc_(char* file_name,uint64_t *file_size)
 {
     char dir_path[128]={0};
     sprintf_s(dir_path,128,"%s",TAR_PATH);
@@ -761,6 +762,8 @@ void set_user_data(msg_user_info_t *data)
     //目标燃脂
     printf("目标燃脂 %d\r\n",data->fat_time);
     p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_DURATION,data->fat_time);
+
+    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SET_USER_INFO, NULL);
     /*
     时制
     p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_AGE,data.timeformat);
@@ -922,6 +925,54 @@ void Set_DmpChangeMode(int state)
     p_ConfigModel->SetDmpChangeMode(state);
 }
 
+void Set_heart_cmd(msg_get_heart_set_param_info_t *data)
+{
+    OHOS::ConfigModel *p_ConfigModel  =  OHOS::ConfigModel::GetInstance();
+    
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED,data->frequence);
+    
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND,data->remind_on);
+    if(data->remind_on)
+    {
+        p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN,data->max_min);
+        p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE,data->heart);
+    }
+   
+}
+
+
+void Get_heart_cmd(msg_get_heart_set_param_info_t *data)
+{
+    OHOS::ConfigModel *p_ConfigModel  =  OHOS::ConfigModel::GetInstance();
+    
+    data->frequence = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED);
+    data->remind_on = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);
+    data->max_min= p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);
+    data->heart = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);
+  
+}
+
+void Set_oxygen_cmd(msg_get_spo2_set_param_info_t *data)
+{
+    OHOS::ConfigModel *p_ConfigModel  =  OHOS::ConfigModel::GetInstance();
+    
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_DETECTED,data->frequence);
+    
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_REMIND,data->remind_on);
+   
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_THRESHOLD_VALUE,data->spo2);
+ 
+
+}
+
+void Get_oxygen_cmd(msg_get_spo2_set_param_info_t *data)
+{
+    OHOS::ConfigModel *p_ConfigModel  =  OHOS::ConfigModel::GetInstance();
+    
+    data->frequence = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_DETECTED);
+    data->remind_on = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_REMIND);
+    data->spo2= p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_THRESHOLD_VALUE);
+}
 
 int Get_DmpChangeMode(void)
 {
@@ -1014,7 +1065,7 @@ const char *get_health_HEART_data_path( uint8_t day)
     #ifdef FD230
  
     char timeday[12] = {0};
-    uapi_get_YYMMDD_Time_extend(timeday, '\0',day);
+    uapi_get_YYMMDD_Time_extend(timeday,'\0',day);
     printf("%s\r\n",timeday);
 
     char buf[PATH_MAX_LEN]={0};
@@ -1044,10 +1095,9 @@ const char *get_health_OXYGEN_data_path(uint8_t day)
     #ifdef FD230
 
     char timeday[12] = {0};
-    uapi_get_YYMMDD_Time_extend(timeday, '\0',day);
+    uapi_get_YYMMDD_Time_extend(timeday,'\0',day);
     printf("%s\r\n",timeday);
 
-
     char buf[PATH_MAX_LEN]={0};
     sprintf_s(buf,PATH_MAX_LEN-1,"%s%s.json",OHOS::GET_HEALTH_JSON_PATH_C_STR_OXYGEN(),timeday);
     if(JSON_F_buf != NULL)
index 1a24d0d..8869e10 100644 (file)
@@ -205,6 +205,14 @@ char * ble_sywee_history(uint8_t day,uint16_t *len,uint8_t type);
 void Set_DmpChangeMode(int state);
 int Get_DmpChangeMode(void);
 
+void Set_heart_cmd(msg_get_heart_set_param_info_t *data);
+
+void Get_heart_cmd(msg_get_heart_set_param_info_t *data);
+
+void Set_oxygen_cmd(msg_get_spo2_set_param_info_t *data);
+
+
+void Get_oxygen_cmd(msg_get_spo2_set_param_info_t *data);
 
 //////////////////////表盘相关////////////////////////////
 void ble_set_dial_by_id(uint16_t id);
@@ -232,7 +240,7 @@ void ble_set_password(uint8_t falg, char * data);
 uint8_t ble_get_password(void);
 
 ///////////////////////文件传输//////////////////////////
-char * tar_dir_to_json_buf_malloc_(char* file_name,uint32_t *file_size);
+char * tar_dir_to_json_buf_malloc_(char* file_name,uint64_t *file_size);
 
 void get_tar_dir_file_count(void);
 
index 7e0f337..82d3124 100644 (file)
@@ -37,6 +37,7 @@ extern "C" {
 #include "hidService.h"\r
 #include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"\r
 #include "errcode.h"\r
+#include "sys/statfs.h"\r
 \r
 #include "bletest.h"\r
 #include "custom_utils.h"\r
@@ -525,6 +526,15 @@ void sendtraningdata(msg_get_train_data_info_t *data)
     \r
     cJSON_free(jsonString);\r
 }\r
+//发送AI录音准备就绪国内/国外标识:0:国内版本 1:国外版本\r
+void send_AI_is_ready(uint8_t type)\r
+{\r
+  \r
+    printf("发送AI准备就绪\r\n");\r
+    send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);\r
+\r
+}\r
+\r
 //发送ble数据\r
 uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 \r
 uint8_t parie_mac[6];//配对完成之后的的mac地址\r
@@ -1630,6 +1640,7 @@ void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalD
         }else if(type == 1)//设置亮屏时长 抬碗亮屏\r
         {\r
             uint8_t screen_type = data[1];//ms级别\r
+\r
             int screen_time = 5*1000;\r
             switch (screen_type)\r
             {\r
@@ -1655,6 +1666,7 @@ void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalD
                     break;\r
             }\r
             bool raise = data[2];\r
+\r
             set_ScreenDuration(screen_time);\r
             Set_RaiseToWake(raise);\r
         }\r
@@ -1729,7 +1741,7 @@ void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
     \r
 }\r
 \r
-void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
+void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//app设置心率参数\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1745,22 +1757,12 @@ void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData
 \r
        if(Check_CRC(data,len,crcvalue))\r
        {\r
-        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
-        memset(&hr_param,0,sizeof(msg_get_heart_set_param_info_t));\r
-        if(func != NULL)\r
-        {\r
-            func(READ_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
-        }\r
-        // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
-        hr_param.frequence = data[0];\r
-        hr_param.remind_on = data[1];\r
-        hr_param.max_min = data[2];\r
-        hr_param.heart = data[3];\r
-        if(func != NULL)\r
-        {\r
-            func(WRITE_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
-        }\r
-        \r
+        msg_get_heart_set_param_info_t set_data;\r
+        set_data.frequence = data[0];\r
+        set_data.remind_on=data[1];\r
+        set_data.max_min=data[2];\r
+        set_data.heart=data[3];\r
+        Set_heart_cmd(&set_data);\r
         sendBuf[17] = 1;\r
         sendBuf[18] = Calculate_CRC(sendBuf,18);\r
         sendBleData(sendBuf,19);\r
@@ -1791,25 +1793,14 @@ void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalDa
 \r
        if(Check_CRC(data,len,crcvalue))\r
        {\r
-        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
-        memset(&spo2_param,0,sizeof(msg_get_spo2_set_param_info_t));\r
-        if(func != NULL)\r
-        {\r
-            func(READ_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t));\r
-        }\r
-        // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
-        spo2_param.frequence = data[0];\r
-        spo2_param.remind_on = data[1];\r
-        if(spo2_param.remind_on)\r
-        {\r
-            spo2_param.spo2 = data[2];\r
-        }\r
-        \r
-        if(func != NULL)\r
-        {\r
-            func(WRITE_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t));\r
-        }\r
         \r
+        msg_get_spo2_set_param_info_t set_data;\r
+        set_data.frequence = data[0];\r
+        set_data.remind_on=data[1];\r
+        set_data.spo2=data[2];\r
+\r
+        Set_oxygen_cmd(&set_data);\r
+\r
         sendBuf[17] = 1;\r
         sendBuf[18] = Calculate_CRC(sendBuf,18);\r
         sendBleData(sendBuf,19);\r
@@ -2074,6 +2065,54 @@ uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气
     return 1;\r
 }\r
 \r
+uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析 天气数据\r
+{\r
+    uint8_t flag = 0;\r
+    // printf("jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
+    #if 0\r
+        FILE *fp=fopen("user/weather.json","wb+");\r
+        printf("jsonCheck_weather len %d",strlen((char *)buf)+1);\r
+        //fwrite((void*)buf,1,strlen((char *)buf)+1,fp);\r
+        fputs((char *)buf,fp);\r
+        fclose(fp);\r
+        1+1+2\r
+    #endif\r
+    uint16_t offset=0;\r
+\r
+    while (len>offset)\r
+    {\r
+       if(buf[offset]==1)\r
+       {\r
+            offset++;\r
+            uint16_t txt_len=buf[offset];\r
+            offset++;\r
+            char buf[128]={0};\r
+            memcpy_s(buf,128,buf[offset],txt_len);\r
+            printf("%s\r\n",buf);\r
+            offset+=txt_len;\r
+            offset+=1;\r
+       }\r
+       else if(buf[offset]==2)\r
+       {\r
+            offset++;\r
+            uint16_t txt_len=buf[offset];\r
+            offset++;\r
+            char buf[128]={0};\r
+            memcpy_s(buf,128,buf[offset],txt_len);\r
+            printf("%s\r\n",buf);\r
+            offset+=txt_len;\r
+            offset+=1;\r
+       }\r
+       else if(buf[offset]==0)\r
+       {\r
+          offset++;\r
+       }\r
+    }\r
+   \r
+    *check = 1;\r
+    return 1;\r
+}\r
+\r
 \r
 void GetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据\r
 {\r
@@ -2102,11 +2141,41 @@ void GetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,ui
                sendBuf[17] = 0;\r
         sendBuf[18] = Calculate_CRC(sendBuf,18);\r
         sendBleData(sendBuf,19);\r
-    }\r
-    \r
+    } \r
 }\r
 \r
 \r
+void GetAiResultCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据\r
+{\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    uint8_t sendBuf[19];\r
+    memset(sendBuf,0,19);\r
+    sendBuf[0] = 0x72;\r
+    sendBuf[1] = 0x02;\r
+    sendBuf[2] = 0x20;\r
+    memcpy(sendBuf+3,&tmp,4);\r
+    memcpy(sendBuf+7,&tmp,4);\r
+    memcpy(sendBuf+11,&tmp,4);\r
+    memcpy(sendBuf+15,&tmp_data,2);\r
+    // printf("GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
+       if(Check_CRC(data,len,crcvalue))\r
+       {\r
+        uint8_t check = 1;\r
+        binCheck_AI(data,&check,len);\r
+\r
+        sendBuf[17] = check;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    } \r
+}\r
+\r
 void query_dial_installed(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
 {\r
 \r
@@ -2383,6 +2452,10 @@ void type2AE4Data(ble_read_data *buffer_handle,uint8_t *buf_cmd,uint8_t *data,ui
         case SET_WEATHER_DATA_CMD://app下发的天气数据\r
             GetWeatherCmd(typeID,data,datalen,totalData,crcvalue);\r
             break;\r
+         case SET_APP_AI_TXT_CMD://app下发的AI数据\r
+            GetAiResultCmd(typeID,data,datalen,totalData,crcvalue);\r
+            break;\r
+        \r
         default:\r
             break;\r
     }\r
@@ -2603,32 +2676,70 @@ static void findWatchCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totald
 //获取sd卡剩余空间\r
 static void GetSDSpaceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
-    uint8_t value[20];\r
-    memset(value,0,20);\r
+    uint8_t value[28];\r
+    memset(value,0,28);\r
     value[0] = 0x72;\r
     value[1] = 0x01;\r
     value[2] = 0x05;\r
-    uint32_t tmp = 2;\r
-    uint16_t tmp_data = 1;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
+    \r
     if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t sdFlag = 0;\r
+        uint32_t tmp_ = 1;\r
+        uint32_t tmp = 9;\r
+        uint16_t tmp_data = 9;\r
+        memcpy(value+3,&tmp_,4);\r
+        memcpy(value+7,&tmp,4);\r
+        memcpy(value+11,&tmp_,4);\r
+        memcpy(value+15,&tmp_data,2);\r
+\r
+        uint8_t sdFlag = 1;\r
+\r
+        uint64_t free_size=0;\r
+        int i;\r
+        struct statfs file_buf = {0};\r
+        static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};\r
+\r
+        for (i = 0; i < 4; i++) {\r
+            /* 获取文件系统状态 */\r
+            if (statfs(g_volume_names[i], &file_buf) != 0) {\r
+                return ;\r
+            }\r
+            if(strcmp("/user/",g_volume_names[i])==0)\r
+            {\r
+                free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));\r
+                //printf("free_size :%ld\r\n",free_size);\r
+                printf("free_size :%lu\r\n",free_size);\r
+            }\r
+        }\r
         if(sdFlag == 1)// 1获取失败 2 获取成功 \r
         {\r
             value[17] = 1;//校验标志\r
-            value[19] = Calculate_CRC(value,19);\r
-            sendBleData(value,20);\r
+            memcpy_s(value+18,8,&free_size,8);\r
+\r
+            value[26] = Calculate_CRC(value,26);\r
+            sendBleData(value,27);\r
         }else{\r
+            \r
+            uint32_t tmp = 1;\r
+            uint16_t tmp_data = 1;\r
+            memcpy(value+3,&tmp,4);\r
+            memcpy(value+7,&tmp,4);\r
+            memcpy(value+11,&tmp,4);\r
+            memcpy(value+15,&tmp_data,2);\r
             value[17] = 2;//校验标志\r
             value[18] = Calculate_CRC(value,18); \r
             sendBleData(value,19);\r
         }\r
     }else\r
     {\r
+\r
+        uint32_t tmp = 1;\r
+        uint16_t tmp_data = 1;\r
+        memcpy(value+3,&tmp,4);\r
+        memcpy(value+7,&tmp,4);\r
+        memcpy(value+11,&tmp,4);\r
+        memcpy(value+15,&tmp_data,2);\r
+\r
         value[17] = 0;//校验标志\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -3173,7 +3284,8 @@ static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *t
     memcpy(value+15,&tmp_data,2);\r
 \r
     int brigntess = get_brigthness();\r
-    int screen_time = 0;\r
+    int screen_time =get_ScreenDuration();\r
+     printf("GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time);\r
     switch (get_ScreenDuration()/1000)\r
     {\r
         case 5:\r
@@ -3202,6 +3314,7 @@ static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *t
     value[17] = brigntess;\r
     value[18] = screen_time;\r
     value[19] = wrist_on;\r
+    printf("GetScreenParamCmd %d %d %d  \r\n",brigntess,screen_time,wrist_on);\r
     value[20] = Calculate_CRC(value,20);\r
     sendBleData(value,21);\r
 }\r
@@ -3334,17 +3447,9 @@ static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
     memcpy(value+15,&tmp_data,2);\r
     if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t hrfreq = 0;//监测频率\r
-        uint8_t hrSwitch = 0;//心率提醒开关\r
-        uint8_t hrMaxMin = 0;//高于或低于\r
-        uint8_t hrValue = 0;//阈值\r
+        \r
         msg_get_heart_set_param_info_t heart_param;\r
-        memset(&heart_param,0,sizeof(msg_get_heart_set_param_info_t));\r
-        ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
-        if(func != NULL)\r
-        {\r
-            func(READ_FLASH_DATA,cmd,&heart_param,sizeof(msg_get_heart_set_param_info_t));\r
-        }\r
+        Get_heart_cmd(&heart_param);\r
 \r
         value[17] = heart_param.frequence;//\r
         value[18] = heart_param.remind_on;//\r
@@ -3378,12 +3483,17 @@ static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *
     memcpy(value+15,&tmp_data,2);\r
     if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t spo2freq = 0;//监测频率\r
-        uint8_t spo2Switch = 0;//心率提醒开关\r
-        uint8_t spo2MaxMin = 0;//高于或低于\r
+        msg_get_spo2_set_param_info_t SO2_param;\r
+        Get_oxygen_cmd(&SO2_param);\r
+\r
+        uint8_t spo2freq = SO2_param.frequence;//监测频率\r
+        uint8_t spo2Switch = SO2_param.remind_on;//心率提醒开关\r
+        uint8_t spo2MaxMin = SO2_param.spo2;//高于或低于\r
+\r
         value[17] = spo2freq;//\r
         value[18] = spo2Switch;//\r
         value[19] = spo2MaxMin;// \r
+\r
         value[20] = Calculate_CRC(value,20);\r
         sendBleData(value,21);\r
     }else\r
@@ -3489,7 +3599,6 @@ static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *total
     memcpy(value+15,&tmp_data,2);\r
     if(Check_CRC(data,len,crcvalue))\r
     {\r
-        \r
         value[17] = 1;// \r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -3499,6 +3608,10 @@ static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *total
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }\r
+    if( value[17])\r
+    {\r
+        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);\r
+    }\r
 }\r
 //APP发送重新启动\r
 static uint8_t power_buf[2]={0};\r
@@ -3691,8 +3804,10 @@ static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
         else\r
         {\r
             printf( "GetAllDialUidCmd yes\r\n");\r
+\r
         }\r
         send_big_data(0,dail_uid_buf,data_size,data_size,1,1,0x2a,1);\r
+\r
         free(dail_uid_buf);\r
         \r
     }else\r
@@ -3813,6 +3928,100 @@ static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *tota
         sendBleData(value,19);\r
     }\r
 }\r
+\r
+#define AI_RECORD_PATH "/user/userdata/AiRecording/AIAudio.pcm"\r
+\r
+bool get_AI_PATH_and_size(char *path,uint64_t *size)\r
+{\r
+    memcpy((void*)path,AI_RECORD_PATH,strlen(AI_RECORD_PATH));\r
+    FILE *fp= fopen(path,"r+");\r
+    if(fp)\r
+    {\r
+        fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
+        *size = ftell(fp);       // 获取当前文件指针位置,即文件大小\r
+        fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
+        fclose(fp);\r
+\r
+        return true;\r
+    }\r
+    else\r
+    {\r
+        return false;\r
+    }\r
+}\r
+//APP获取录音文件,录音文件上传\r
+static void GetAiRecordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x2f;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    char file_name[64]={0};\r
+    uint64_t file_size=0;\r
+    if(get_AI_PATH_and_size(file_name,&file_size))\r
+    {\r
+        int num=(ble_nus_max_data_len-18); \r
+        if(num>482)num=482;\r
+        sendbigDataBufState = true;//分包同步数据不允许打断\r
+\r
+        char *data= (char *)malloc(num+1);\r
+        \r
+        uint16_t read_size=0;\r
+        FILE *fp=fopen(file_name,"rb+");\r
+        \r
+        printf("GetAiRecordCmd size %d\r\n",file_size);\r
+        uint16_t pack=file_size/num+1;\r
+        uint8_t pack_id=1;\r
+        if(fp==NULL)\r
+        {\r
+            printf("fopen fail %s\r\n",file_name);\r
+            goto GetAiRecordFail;\r
+        }\r
+        do\r
+        {\r
+            memset_s(data,num+1,0,num+1);\r
+            read_size=fread(data,1,num,fp);\r
+            \r
+            send_big_data(1,data,read_size,file_size,pack_id,pack,0x34,1);\r
+            pack_id++;\r
+            msleep(50);\r
+\r
+        } while (read_size==num);\r
+        free(data);\r
+        fclose(fp);\r
+        sendbigDataBufState = false;\r
+   \r
+       \r
+    }else\r
+    {\r
+        GetAiRecordFail:\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+\r
+//AI录音已经就绪\r
+static void AiIsReadyCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+\r
+    if(data[0])\r
+    {\r
+        printf("AiIsReadyCmd succ\r\n");  \r
+    }else\r
+    {\r
+        printf("AiIsReadyCmd fail\r\n");  \r
+    }\r
+}\r
 //app发送解除配对消息\r
 static void UnpairMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
@@ -4430,7 +4639,10 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u
         case GET_PASSWORD_CMD: //获取手表密码\r
             GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue);\r
             break;\r
-        \r
+        case AI_IS_READ_DATA_CMD:\r
+            GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case APP_GET_AI_PCM_DATA_CMD://获取手表闹钟//同步闹钟\r
         case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据\r
             //heartDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
         case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据\r
@@ -5609,7 +5821,7 @@ static errcode_t install_dial(void)
 }\r
 \r
 static char file_name[128]={0};\r
-static uint32_t file_size=0;\r
+static uint64_t file_size=0;\r
 \r
 bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id)\r
 {\r
@@ -5693,12 +5905,13 @@ void decode_file_checksum(ble_read_data *buffer_handle)
                     break;\r
                 case 2://mp3\r
 \r
+                    \r
                     break;\r
                 case 3://dial\r
                     //TODO: 设置成当前下载的表盘\r
                     if (install_dial() == ERRCODE_SUCC)\r
                     {\r
-                        ble_set_dial_by_id(ble_dial_uid);\r
+                        //ble_set_dial_by_id(ble_dial_uid);\r
 \r
                         TRANSMIT_DATA= TRANS_DIAL_SUCC;\r
                         CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
@@ -5941,7 +6154,7 @@ errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t
     if(buffer_handle->file_recv_stat.recv_file_stat <= 0 && buffer_handle->file_recv_stat.file == NULL)\r
     {\r
         buffer_handle->file_recv_stat.lrcvalue = 0;\r
-                if (buffer_handle->file_recv_stat.file_type == 1)\r
+        if (buffer_handle->file_recv_stat.file_type == 1)\r
         {\r
             buffer_handle->file_recv_stat.file = fopen("/update/update.fwpkg","w+");\r
             printf("create file /update/update.fwpkg %X\n",buffer_handle->file_recv_stat.file);\r
index deb09ff..ce675a9 100644 (file)
@@ -95,11 +95,13 @@ void cameram_send_data(void);
 #define SYN_DIS_HISTORY_DATA_CMD 0x0147 //同步距离历史数据
 #define SYN_BASIC_TRANIN_HISTORY_DATA_CMD 0x0149 //同步基础训练历史数据basic training
 #define SYN_SLEEP_HISTORY_DATA_CMD 0x014B //同步睡眠历史数据
+#define APP_GET_AI_PCM_DATA_CMD 0x0134 //APP获取录音文件
+#define AI_IS_READ_DATA_CMD 0x0505 //AI准备就绪
 
 #define SET_DMP_MODE_CMD 0x0135
 #define GET_DMP_MODE_CMD 0x0136
 
-#define FIND_PHONE_CMD 0x0501 //同步睡眠历史数据
+#define FIND_PHONE_CMD 0x0501
 
 #define MSG_DIRECTION_RECV 0x73
 #define MSG_DIRECTION_RECV_ANDROID 0x4A
@@ -427,6 +429,7 @@ typedef struct
     //对应数据的指令类型
     uint8_t frequence;//检测频率 0关闭 1 1分 2 五分钟 3 10分钟
     uint8_t remind_on;//心率提醒 0关闭 1开启
+    
     uint8_t max_min;//高于或者低于 0低于 1高于
     uint8_t heart;//心率区间阈值30-200
 
@@ -606,10 +609,12 @@ TYPE:02
 #define SET_OTHER_TARGET_CMD 0x0217 //app发送其他目标
 #define SET_PASSWORD_CMD 0x021C //APP设置手表密码password
 #define SET_SEDENTARINESS_PARAM_CMD 0x021D //APP设置久坐提醒
+#define SET_APP_AI_TXT_CMD 0x021F //设置AI返回的文本
 #define SET_WEATHER_DATA_CMD 0x0220 //发送天气数据
 #define SET_ALARM_DATA_CMD 0x0221 //发送闹钟数据
 #define DELETE_FILE_CMD 0x0222 //删除指定文件
 #define SYN_BASIC_REAL_HEATR_CMD 0x024B //同步基础训练试试心率记录
+
 #define SYN_TODAY_BASIC_TRAIN_TXT_CMD 0x024D //同步当天任意时间之后的基础训练记录
 
 #pragma pack(1)
@@ -772,6 +777,8 @@ void message_data(int uid,int appid,char  *title,char  *msg,int hasCode);
 
 void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void);
 
+void send_AI_is_ready(uint8_t type);
+
 #ifdef __cplusplus
 }
 #endif