#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
\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
}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
break;\r
}\r
bool raise = data[2];\r
+\r
set_ScreenDuration(screen_time);\r
Set_RaiseToWake(raise);\r
}\r
\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
\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
\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
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
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
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
//获取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
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
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
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
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
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
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
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
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
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
}\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
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
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