return "unknown handle";\r
\r
}\r
+static errcode_t get_file_recv_file_path(char* input_filename ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
+{\r
+ if(input_filename == NULL || output_file_path == NULL)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ int ret = sprintf_s(output_file_path,max_output_size,"/user/userdata/%s",input_filename);\r
+ if (ret < 0)\r
+ return ERRCODE_FAIL;\r
+\r
+ return ERRCODE_SUCC;\r
+} \r
+\r
+static errcode_t get_dial_file_path(char* input_dialname ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
+{\r
+ if(input_dialname == NULL || output_file_path == NULL)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
\r
+ int ret = sprintf_s(output_file_path,max_output_size,"/user/dial/%s.bin",input_dialname);\r
+ if (ret < 0)\r
+ return ERRCODE_FAIL;\r
+\r
+ return ERRCODE_SUCC;\r
+} \r
// typedef void (*hx3695_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen);\r
uint32_t ble_recv_register_msg_callback(ble_recv_msg_callback_t func)\r
{\r
\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
+ uint8_t reply[2]={0};\r
+ if (len != 2)\r
+ {\r
+ ble_reply_cmdarr(cmd,reply,2);//crc error\r
+ }\r
+ if(Check_CRC(data,len,crcvalue))\r
+ {\r
+ uint16_t dial_uid = *(uint16_t*)data;\r
+ printf("query dial 0x%04X installed !!!!!!!!\r\n",dial_uid);\r
+ reply[0]=2; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装\r
+ reply[1]=0; //表盘列表是否已满 0:未满 1:已满\r
+ ble_reply_cmdarr(cmd,reply,2);\r
+ \r
+ }else{\r
+ ble_reply_cmdarr(cmd,reply,2);//crc error\r
+ }\r
+\r
+}\r
+\r
void getUserInfo(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
{\r
\r
\r
printf("getUserInfo ");\r
- for(uint8_t i = 0;i<len;i++)\r
- {\r
- printf("%x ",data[i]);\r
- }\r
- printf("\n");\r
+ // for(uint8_t i = 0;i<len;i++)\r
+ // {\r
+ // printf("%x ",data[i]);\r
+ // }\r
+ // printf("\n");\r
if(Check_CRC(data,len,crcvalue))\r
{\r
ble_reply_cmd(USER_INFOR_CMD,1);\r
void type2AE4Data(ble_read_data *buffer_handle,uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)\r
{\r
uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
- printf("type2AE4Data typeID:0x%x\r\n",typeID);\r
+ printf("type2AE4Data typeID:0x%04X\r\n",typeID);\r
switch (typeID) //ID\r
{\r
case USER_INFOR_CMD://app下发的获取用户信息\r
case SET_OTHER_TARGET_CMD:\r
GetOtherTarget(typeID,data,datalen,totalData,crcvalue);\r
break;\r
+ case QUERY_DIAL_INSTALLED_PARAM_CMD:\r
+ query_dial_installed(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
+ break;\r
case DELETE_FILE_CMD:\r
break;\r
case SYN_BASIC_REAL_HEATR_CMD:\r
void type2AE1Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)\r
{\r
uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
- printf("type2AE1Data typeID:0x%x\r\n",typeID);\r
+ printf("type2AE1Data typeID:0x%4X\r\n",typeID);\r
switch (typeID) //ID\r
{\r
case ANDROID_ANCS_CMD://\r
*/\r
\r
cJSON* root = cJSON_Parse((const char *)data);\r
- \r
if(root != NULL)\r
{ \r
cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");\r
\r
cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");\r
if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {\r
- buffer_handle->file_recv_stat.file_name = ota_name_json->valuestring;\r
+ uint32_t filenamelen=strlen(ota_name_json->valuestring);\r
+ if (filenamelen > 0 && filenamelen < 255)\r
+ {\r
+ buffer_handle->file_recv_stat.file_name = malloc(filenamelen);\r
+ if (buffer_handle->file_recv_stat.file_name!=NULL)\r
+ memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);\r
+ //下载完成再在 cancel download 里 free filename\r
+ }else{\r
+ buffer_handle->file_recv_stat.file_name = NULL;\r
+ }\r
+ }else{\r
+ buffer_handle->file_recv_stat.file_name = NULL;\r
}\r
-\r
cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");\r
if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))\r
{\r
}\r
}\r
\r
+\r
+errcode_t decode_mp3_json(ble_read_data *buffer_handle)\r
+{\r
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
+ uint16_t datalen = buffer_handle->totalDataLen;\r
+ printf("ota_json_file_save %s\n",data);\r
+\r
+ /**\r
+ MP3文件信息格式\r
+ {\r
+ "type":2, \r
+ "name":"夜曲.mp3",\r
+ "size":3894464\r
+ }\r
+ */\r
+\r
+ cJSON* root = cJSON_Parse((const char *)data);\r
+ \r
+ if(root != NULL)\r
+ { \r
+ cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");\r
+ if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))\r
+ {\r
+ buffer_handle->file_recv_stat.file_type = ota_type_json->valueint;\r
+ }\r
+\r
+ cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");\r
+ if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {\r
+ uint32_t filenamelen=strlen(ota_name_json->valuestring);\r
+ if (filenamelen > 0 && filenamelen < 255)\r
+ {\r
+ buffer_handle->file_recv_stat.file_name = malloc(filenamelen);\r
+ if (buffer_handle->file_recv_stat.file_name!=NULL)\r
+ memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);\r
+ //下载完成再在 cancel download 里 free filename\r
+ }else{\r
+ buffer_handle->file_recv_stat.file_name = NULL;\r
+ }\r
+ }\r
+\r
+ cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");\r
+ if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))\r
+ {\r
+ buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;\r
+ }\r
+ cJSON_Delete(root);\r
+\r
+ printf(" ota_type= %d, ota_name=%s, ota_size=%d \n",\r
+ buffer_handle->file_recv_stat.file_type,\r
+ buffer_handle->file_recv_stat.file_name,\r
+ buffer_handle->file_recv_stat.file_size\r
+ );\r
+ buffer_handle->file_recv_stat.received_size = 0;\r
+ buffer_handle->file_recv_stat.lrcvalue = 0;\r
+ buffer_handle->receive_file_flag = 1;\r
+ return ERRCODE_SUCC;\r
+ }else{\r
+ buffer_handle->receive_file_flag = 0; \r
+ return ERRCODE_FAIL;\r
+ }\r
+}\r
+\r
+errcode_t decode_dial_info(ble_read_data *buffer_handle)\r
+{\r
+\r
+ printf("decode_dial_info \n");\r
+ for(uint8_t i = 0;i<buffer_handle->data_len;i++)\r
+ {\r
+ printf("%x ",buffer_handle->data[i]);\r
+ }\r
+ printf("\n");\r
+ if (buffer_handle->data_len == 6)\r
+ {\r
+\r
+ return ERRCODE_SUCC;\r
+ }\r
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
+ uint16_t datalen = buffer_handle->totalDataLen;\r
+\r
+ msg_recv_dial_info_t dialinfo={0};\r
+ msg_recv_dial_info_t *pdialinfo=(msg_recv_dial_info_t*)data;\r
+\r
+ // dialinfo.dial_count = pdialinfo->dial_count;\r
+ dialinfo.dial_uid = pdialinfo->dial_uid;\r
+ dialinfo.file_name_len = pdialinfo->file_name_len;\r
+ // dialinfo.file_type = pdialinfo->file_type;\r
+\r
+ if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255)\r
+ {\r
+ printf("file name len should in [0,255] \n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+ char * filename = malloc(dialinfo.file_name_len);\r
+ uint8_t file_count = data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len];\r
+ if (filename == NULL)\r
+ {\r
+ printf("file name malloc failed filename_len %d\n",dialinfo.file_name_len);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len);\r
+ buffer_handle->file_recv_stat.file_name = filename;\r
+ \r
+ printf(" dial name = %s, dial file count = %d \n",\r
+ filename,\r
+ file_count\r
+ );\r
+ buffer_handle->file_recv_stat.received_size = 0;\r
+ buffer_handle->file_recv_stat.lrcvalue = 0;\r
+ buffer_handle->receive_file_flag = 0;\r
+\r
+ free(filename);\r
+ return ERRCODE_SUCC;\r
+\r
+}\r
+\r
+errcode_t decode_single_dial_info(ble_read_data *buffer_handle)\r
+{\r
+\r
+ printf("decode_single_dial_info \n");\r
+ for(uint8_t i = 0;i<buffer_handle->data_len;i++)\r
+ {\r
+ printf("%x ",buffer_handle->data[i]);\r
+ }\r
+ printf("\n");\r
+ if (buffer_handle->data_len == 6)\r
+ {\r
+\r
+ return ERRCODE_SUCC;\r
+ }\r
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
+ uint16_t datalen = buffer_handle->totalDataLen;\r
+\r
+ msg_recv_single_dial_info_t dialinfo={0};\r
+ msg_recv_single_dial_info_t *pdialinfo=(msg_recv_single_dial_info_t*)data;\r
+\r
+ dialinfo.dial_count = pdialinfo->dial_count;\r
+ dialinfo.dial_uid = pdialinfo->dial_uid;\r
+ dialinfo.file_name_len = pdialinfo->file_name_len;\r
+ dialinfo.file_type = pdialinfo->file_type;\r
+\r
+ if (dialinfo.file_name_len < 6 || dialinfo.file_name_len >255)\r
+ {\r
+ printf("file name len should in [6,255] \n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ \r
+\r
+ char * filename = malloc(dialinfo.file_name_len+1);\r
+ //下载完成再在 cancel download 里 free filename\r
+\r
+ uint32_t file_size = 0;\r
+ memcpy_s((void*)&file_size,sizeof(uint32_t),(void*)&data[sizeof(msg_recv_single_dial_info_t)+dialinfo.file_name_len],sizeof(uint32_t));\r
+ if (filename == NULL)\r
+ {\r
+ printf("file name malloc failed filename_len %d\n",dialinfo.file_name_len);\r
+ return ERRCODE_FAIL;\r
+ }\r
+ memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_single_dial_info_t),dialinfo.file_name_len);\r
+ filename[dialinfo.file_name_len] ='\0';\r
+ //在runtime中备份一个安装文件名。\r
+ memset_s(get_device_runtime_status()->current_dial_name,sizeof(get_device_runtime_status()->current_dial_name),0,sizeof(get_device_runtime_status()->current_dial_name));\r
+ memcpy_s(get_device_runtime_status()->current_dial_name,sizeof(get_device_runtime_status()->current_dial_name),filename,dialinfo.file_name_len);\r
+\r
+ buffer_handle->file_recv_stat.file_name = filename;\r
+ buffer_handle->file_recv_stat.file_size = file_size;\r
+ buffer_handle->file_recv_stat.file_type = 3;//表盘\r
+ printf(" filetype = %d, file_name=%s, file_size=%d , dial_uid %04X ,dial_count %d, dial_filetype %d\n",\r
+ buffer_handle->file_recv_stat.file_type,\r
+ buffer_handle->file_recv_stat.file_name,\r
+ buffer_handle->file_recv_stat.file_size,\r
+ dialinfo.dial_uid,\r
+ dialinfo.dial_count,\r
+ dialinfo.file_type\r
+\r
+ );\r
+ buffer_handle->file_recv_stat.received_size = 0;\r
+ buffer_handle->file_recv_stat.lrcvalue = 0;\r
+ buffer_handle->receive_file_flag = 1;\r
+\r
+ return ERRCODE_SUCC;\r
+\r
+}\r
+static errcode_t install_dial(void)\r
+{\r
+ printf("install %s\n",get_device_runtime_status()->current_dial_name);\r
+ char *lzmapkgname =(char*)(get_device_runtime_status()->current_dial_name);\r
+ char *lzmaindex = strstr(lzmapkgname,".lzma");\r
+ if (lzmaindex != NULL)\r
+ {\r
+ char dial_basename[64]={0};\r
+ int dial_basenamelen = (lzmaindex - lzmapkgname);\r
+ printf("dial_basenamelen %d\n",dial_basenamelen);\r
+ if (dial_basenamelen>0 )\r
+ {\r
+ memcpy_s(dial_basename,sizeof(dial_basename),get_device_runtime_status()->current_dial_name,dial_basenamelen);\r
+ }\r
+ else{\r
+ return ERRCODE_FAIL;\r
+ }\r
+ printf("dial_basename %s\n",dial_basename);\r
+ char dialbin_filepath[128]={0};\r
+ if (get_dial_file_path(dial_basename,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ printf("dialbin_filepath %s\n",dialbin_filepath);\r
+ char lzma_filepath[128]={0};\r
+ if (get_file_recv_file_path(lzmapkgname,strlen(lzmapkgname),lzma_filepath,sizeof(lzma_filepath)) != ERRCODE_SUCC)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ printf("lzma_filepath %s\n",lzma_filepath);\r
+ errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath,dialbin_filepath);\r
+ printf("decode %s to %s , ret %X \n",lzma_filepath,dialbin_filepath, ret);\r
+ if ( ret == ERRCODE_SUCC)\r
+ return ERRCODE_SUCC;\r
+ else\r
+ return ERRCODE_FAIL;\r
+ }else{\r
+ printf(".lzma not found\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+}\r
void decode_file_checksum(ble_read_data *buffer_handle)\r
{\r
\r
uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);\r
- if (msg_crc == buffer_handle->crcvalue)\r
+ if ((msg_crc == buffer_handle->crcvalue) \r
+ || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID ))\r
{\r
uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue);\r
uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)];\r
- if (file_crc == crc_recv)\r
+#if 0\r
+ if ((file_crc == crc_recv) ||\r
+ (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))\r
+#else\r
+ if (file_crc == crc_recv) \r
+#endif\r
{\r
ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,1);\r
- do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);\r
+ switch(buffer_handle->file_recv_stat.file_type)\r
+ {\r
+ case 1: //ota\r
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);\r
+ break;\r
+ case 2://mp3\r
+\r
+ break;\r
+ case 3://dial\r
+ //TODO: 设置成当前下载的表盘\r
+ if (install_dial() == ERRCODE_SUCC)\r
+ ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);\r
+ else\r
+ ble_reply_cmd(DIAL_INSTALL_REPY_CMD,0);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
}else{\r
- ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2);\r
+ ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2); \r
}\r
}else{\r
ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,0);\r
void type2AE0Data(ble_read_data *buffer_handle)\r
{\r
uint16_t typeID = buffer_handle->cmd_header.cmdtype*256 + buffer_handle->cmd_header.cmdid;\r
- printf("type2AE0Data typeID:0x%x datalen %d\r\n",typeID,buffer_handle->totalDataLen);\r
+ printf("type2AE0Data typeID:0x%04X datalen %d\r\n",typeID,buffer_handle->totalDataLen);\r
bool checkcrc = (get_crc_from_lrc(buffer_handle->lrcvalue) == buffer_handle->crcvalue);\r
- if( checkcrc == true )\r
+ \r
+ if ( (checkcrc == true ) || \r
+ (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))\r
{\r
switch (typeID) //ID\r
{\r
}\r
break;\r
case MP3_FILE_RECV_CMD:\r
-\r
+ {\r
+ if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)\r
+ {\r
+ ble_reply_cmd(MP3_FILE_RECV_CMD,1);\r
+ }else{\r
+ ble_reply_cmd(MP3_FILE_RECV_CMD,2);\r
+ } \r
+ }\r
break;\r
case DIAL_FILE_RECV_CMD:\r
+ {\r
+ if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)\r
+ {\r
+ ble_reply_cmd(DIAL_FILE_RECV_CMD,1);\r
+ }else{\r
+ ble_reply_cmd(DIAL_FILE_RECV_CMD,2);\r
+ } \r
+ }\r
break;\r
case FILE_CHECKSUM_RECV_CMD:\r
decode_file_checksum(buffer_handle);\r
break;\r
- case EPO_DATA_RECV_CMD:\r
- break;\r
case SINGLE_DIAL_FILE_RECV_CMD:\r
+ if (decode_single_dial_info( buffer_handle) == ERRCODE_SUCC)\r
+ {\r
+ ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,1);\r
+ }else{\r
+ ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,2);\r
+ } \r
+ break;\r
+ case EPO_DATA_RECV_CMD:\r
break;\r
default:\r
break; \r
fclose(buffer_handle->file_recv_stat.file);\r
buffer_handle->file_recv_stat.file = NULL;\r
}\r
+ if (buffer_handle->file_recv_stat.file_name != NULL)\r
+ {\r
+ free(buffer_handle->file_recv_stat.file_name);\r
+ buffer_handle->file_recv_stat.file_name=NULL;\r
+ }\r
buffer_handle->file_recv_stat.recv_file_stat = -1;\r
+\r
ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败\r
}\r
return ERRCODE_SUCC;\r
}\r
+\r
+\r
errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)\r
{\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
}else{\r
- buffer_handle->file_recv_stat.file = fopen(buffer_handle->file_recv_stat.file_name,"w+");\r
- printf("create file %s %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
+ char filepath[128]={0};\r
+ if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)\r
+ {\r
+ buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
+ printf("create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
+ }else{\r
+ printf("create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
+ } \r
}\r
if (buffer_handle->file_recv_stat.file == NULL)\r
{\r
fclose(buffer_handle->file_recv_stat.file);\r
buffer_handle->file_recv_stat.file = NULL;\r
}\r
+ if (buffer_handle->file_recv_stat.file_name != NULL)\r
+ {\r
+ free(buffer_handle->file_recv_stat.file_name);\r
+ buffer_handle->file_recv_stat.file_name=NULL;\r
+ }\r
buffer_handle->file_recv_stat.recv_file_stat = 2;\r
buffer_handle->receive_file_flag = 0;\r
printf("handle_recv_file received success \n");\r