-/**\r
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
- * Description: alipay bluetooth module.\r
- * Author:\r
- * Create:\r
- */\r
-\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-#include "common_def.h"\r
-#include "bts_def.h"\r
-#include "bts_gatt_stru.h"\r
-#include "bts_a2dp_source.h"\r
-#include "bts_gatt_server.h"\r
-#include "bts_le_gap.h"\r
-#include "osal_task.h"\r
-#include "securec.h"\r
-#include "wearable_log.h"\r
-#include <stdint.h>\r
-#include <stdio.h>\r
-#include "stdbool.h"\r
-#include "bts_br_gap.h"\r
-\r
-#ifdef SUPPORT_BATTERY_SERVICE\r
-#include "battery_hal.h"\r
-#endif\r
-\r
-#include "bleService.h"\r
-#include "alipay_feature.h"\r
-\r
-// #include "alipay_bluetooth.h"\r
-\r
-#include "bts_a2dp_sink.h"\r
-#include "osal_timer.h"\r
-#include "bleEvent.h"\r
-#include "broadcast_feature.h"\r
-#include <sys/stat.h>\r
-#if 1//#ifdef //SUPPORT_BLE_SERVICE\r
-#include "app_common_api.h"\r
-// #include "hidService.h"\r
-#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"\r
-#include "errcode.h"\r
-#include "sys/statfs.h"\r
-\r
-#ifdef BLE_INSTRUCT\r
-#include "bleInstruct.h"\r
-#endif\r
-\r
-#include "custom_utils.h"\r
-#include "custom_runtime.h"\r
-#include "bleANCS.h"\r
-#ifdef FD230\r
-#include "Bluetooyhpabpserver.h"\r
-#endif\r
-#include "custom_save_runtime.h"\r
-\r
-#define DEBUG_TEST (0)\r
-#define CRC_CHECK_ERR 0 //crc校验失败\r
-#define JSON_CHECK_OK 1 //json解析成功\r
-#define JSON_CHECK_ERR 2 //json解析失败\r
-\r
-#define AI_TXT_BUF_MAX_LEN 1024*3 //json解析失败\r
-\r
-\r
-#define MAX_BLE_EVENT_DIAL_NUM (10) //表盘最大数量\r
-\r
-#include "upg_common_porting.h"\r
-\r
-\r
-uint32_t packdataLen = 0;\r
-uint32_t totalDataLen = 0;\r
-uint8_t totalpack = 0;\r
-uint8_t cmd_data[17];\r
-uint8_t *recvData;\r
-#include "los_memory.h"\r
-\r
-#define MAX_BLE_MSG_PACKAGE_LEN (1024*5) //包缓存最大5k\r
-#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X"\r
-typedef struct \r
-{\r
- int handle;\r
- int data_len ;\r
- int totalDataLen;\r
- int buffer_to_file; //1 buffer to file , 0 buffer to ram\r
- int decode_type; //1 with header , 2 no header\r
- FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle\r
- msg_header_t cmd_header;\r
- uint8_t *data;//if buffer_to_file is 1, than data is the filename , else data is the ram buffer.\r
- uint8_t crcvalue;\r
- uint8_t lrcvalue; //计算crc用的临时变量\r
- uint8_t lrcvalue2; //计算crc用的临时变量\r
- uint32_t last_timestamp;// last package receive time\r
- uint8_t receive_file_flag;//1 接收文件 0 不接收文件\r
- file_recv_stat_t file_recv_stat;\r
- uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。\r
- uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。\r
-} ble_read_data;\r
-\r
-#define MAX_HANDLE_NUM 10\r
-//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)\r
-//根据特征值分开组合读取的数据,并处理\r
-static ble_read_data handle_l[MAX_HANDLE_NUM]={0};\r
-errcode_t cancel_recv_file(uint8_t flag);\r
-\r
-static char app_name[64]={0};\r
-\r
-uint8_t ble_dial_file_count=0;\r
-uint8_t ble_dial_file_index=0;\r
-uint8_t *bigDataBuf = NULL;//大数据buf\r
-uint8_t bigDataBufLen=0;\r
-bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断\r
-bool recvBigDataBufState = false;//接收大数据标志\r
-static bool muiltFlag = 0;//多包数据flag\r
-static bool ANCSBigBufFlag = 0;//ANCS多包数据flag\r
-// static uint16_t data_len = 0;\r
-ble_recv_data_info_t ble_recv_data;\r
-static uint8_t TRANSMIT_DATA;\r
-static osTimerId_t BR_TRANSFER_timer=NULL;\r
-static uint32_t timer_flie_flag=0;\r
-ble_read_data* ble_read_timer_p=NULL;\r
-\r
-#ifdef SINGLE_USER_PARTITION\r
-#define UP_DATE_FWPKG_PATH UPG_FILE_NAME \r
- \r
-#else\r
-#define UP_DATE_FWPKG_PATH UPG_FILE_NAME\r
-#endif\r
-\r
-\r
-//MP3文件重命名\r
-static errcode_t create_mp3_name(char* path,char*dir_path ,char* file_name)\r
-{\r
-\r
- sprintf_s(path,256,"%s/",dir_path);\r
- uint16_t path_len=strlen(path);\r
-\r
-\r
- if(strstr(file_name,".mp3"))\r
- {\r
- //"光-陈粒.128.mp3"\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",file_name);\r
- int len=strlen(file_name)-strlen(".mp3");\r
- for(int i=0;i<len;i++)\r
- {\r
- uint8_t Uintdata=0;\r
- char UintBUF[3]={0};\r
- //sprintf(UintBUF,"%02X",file_name[i]);\r
- memcpy_s((void*)&Uintdata,1,(void*)&file_name[i],1);\r
- sprintf(UintBUF,"%02X",Uintdata);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",UintBUF);\r
- memcpy_s(path+path_len,2,UintBUF,2);\r
- path_len+=2;\r
- }\r
- memcpy_s(path+path_len,strlen(".mp3"),".mp3",strlen(".mp3"));\r
- return ERRCODE_SUCC;\r
- }\r
- else\r
- {\r
- sprintf_s(path,256,"%s/%s.mp3",dir_path,file_name);\r
- }\r
- return ERRCODE_FAIL;\r
- \r
-}\r
-\r
-\r
-#if 1\r
-#include "app_msg_manager.h"\r
-#include "app_tx_process.h"\r
-static int ym_malloc_count = 0,ym_free_count = 0;\r
-static void *ym_malloc(unsigned int size)\r
-{\r
- // app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);\r
-\r
- return malloc(size);\r
-}\r
-static void ym_free(void * p)\r
-{\r
- free(p);\r
-}\r
-void malloc_test(void)\r
-{\r
- for(int i = 0;i<1000;i++)\r
- {\r
- char * temp = ym_malloc(i*10);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"i:%d,addr:%x\r\n",i,temp);\r
- \r
- }\r
- app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);\r
-}\r
-#include "bleService.h"\r
-\r
-static const char* getHandlname(uint16_t handle)\r
-{\r
-\r
- if (data2ae0Cmd == handle) return "data2ae0Cmd";\r
- if (data2ae1Cmd == handle) return "data2ae1Cmd";\r
- if (data2ae3Cmd == handle) return "data2ae3Cmd";\r
- if (data2ae4Cmd == handle) return "data2ae4Cmd";\r
- if (data2ae5Cmd == handle) return "data2ae5Cmd";\r
- if (data2ae6Cmd == handle) return "data2ae6Cmd";\r
- //if (data2ae2Cmd == handle) return "data2ae2Cmd";\r
- \r
- 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
-static errcode_t get_app_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
- uapi_create_dir("/user/app_store");\r
-\r
- int ret = sprintf_s(output_file_path,max_output_size,"/user/app_store/%s",input_filename);\r
- if (ret < 0)\r
- return ERRCODE_FAIL;\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-static errcode_t get_custom_dial_file_path(uint16_t id,char *filename,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
-{\r
- if( id >=5 || output_file_path == NULL || filename == NULL)\r
- {\r
- return ERRCODE_FAIL;\r
- }\r
- char name[64]={0};\r
- ble_get_dial_path(name,id);\r
- int ret;\r
- if(id == 1 && strcmp(filename, "main_bg") == 0) //自定义视频表盘Id 1 只有背景需要是mp4 main_bg\r
- {\r
- ret = sprintf_s(output_file_path,max_output_size,"%s/%s.mp4",name,filename); \r
- }\r
- else\r
- {\r
- ret = sprintf_s(output_file_path,max_output_size,"%s/%s.bin",name,filename);\r
- }\r
- if (ret < 0)\r
- return ERRCODE_FAIL;\r
-\r
- return ERRCODE_SUCC;\r
-\r
-}\r
-\r
-\r
-\r
-\r
-int char_to_dec(char ch)\r
-{\r
- int num = 0;\r
- if(ch >= '0' && ch <= '9') {\r
- num = num * 10 + (ch - '0');\r
- }\r
- return num;\r
-}\r
-void char_to_big(uint8_t *src_str,uint8_t *res_str,uint8_t len)\r
-{\r
- for(uint8_t i = 0;i<len;i++)\r
- {\r
- if(src_str[i] >= 'a' && src_str[i] <= 'z') {\r
- src_str[i] = src_str[i] - 32;\r
- }\r
- }\r
- memcpy(res_str,src_str,len);\r
-}\r
-void cameram_data(void)//拍照发送数据 调用这个接口即可\r
-{\r
- uint8_t data[2]={0x01,0x00};\r
- errcode_t ret = ble_hid_server_send_input_report(&data,2);\r
- osal_msleep(100); /* wait 100 ms */\r
- memset(data,0,2);\r
- (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/\r
-}\r
-\r
-bool bigDataBufState=false;//大数据传输状态\r
-/**\r
- * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算\r
-*/\r
-// uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)\r
-// {\r
-// uint8_t lrcValue = _lrcValue;\r
-// if(data == NULL)\r
-// {\r
-// return false; \r
-// }\r
-// for(uint16_t i = 0; i < len; i++)\r
-// {\r
-// lrcValue =lrcValue+ data[i];\r
-// // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);\r
-// }\r
-// return lrcValue;\r
-// }\r
-\r
-\r
-/***\r
- * 根据求和后的数据计算crc 值 \r
-*/\r
-// uint8_t get_crc_from_lrc(uint8_t lrcValue)\r
-// {\r
-// uint8_t crcbuf = 0;\r
-// crcbuf = lrcValue%256;\r
-// crcbuf = 256-crcbuf;\r
-// crcbuf = crcbuf%256;\r
-// return crcbuf;\r
-// }\r
-\r
-uint8_t calculate_lrc_file(char *file_path)\r
-{\r
- uint8_t lrcValue =0;\r
- FILE * fp = fopen(file_path,"rb+");\r
-\r
- char data[1]={0};\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"calculate_lrc_file %s\r\n",file_path);\r
- uint8_t read_size=0;\r
-\r
- if(fp==NULL)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_path);\r
- return 0;\r
- }\r
- do\r
- {\r
- memset_s(data,1,0,1);\r
- read_size=fread(data,1,1,fp);\r
- lrcValue+=data[0];\r
-\r
- }while(read_size==1);\r
-\r
- fclose(fp);\r
- return lrcValue;\r
-}\r
-\r
-\r
-#define USE_DEMO\r
-static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位\r
-{\r
- uint8_t crcbuf = 0;\r
- uint8_t lrcValue = 0x00;\r
- if(data == NULL)\r
- {\r
- return false; \r
- }\r
- lrcValue = calculate_lrc(data,len,0x00);\r
- \r
- crcbuf = get_crc_from_lrc(lrcValue); \r
-\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC lrc: 0x%x ,ret crc: 0x%x ,crcvalue 0x%x , len:%d\r\n",lrcValue,crcbuf,crcvalue,len);\r
- #endif\r
- if(crcbuf == crcvalue)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");\r
- return true;\r
- }\r
- else{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n");\r
- if(uapi_dev_runtime_get_android_connection_status()==1)\r
- return true;\r
- else\r
- #ifndef USE_DEMO\r
- return false;\r
- #else\r
- return true;\r
- #endif\r
- }\r
- \r
-}\r
-\r
-\r
-// uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte\r
-// {\r
-// uint8_t crcbuf = 0;\r
-// uint8_t lrcValue = 0x00;\r
-// lrcValue = calculate_lrc(data+17,len-17,0x00);\r
-// crcbuf = get_crc_from_lrc(lrcValue);\r
-// return crcbuf;\r
-// }\r
-\r
-uint8_t Calculate_CRC_AI(uint8_t *data,uint16_t len)\r
-{\r
- return Calculate_CRC(data,len);\r
-}\r
-\r
-// uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte\r
-// {\r
-// uint8_t crcbuf = 0;\r
-// uint8_t lrcValue = 0x00;\r
-// lrcValue = calculate_lrc(data,len,0x00);\r
-// crcbuf = get_crc_from_lrc(lrcValue);\r
-// return crcbuf;\r
-// }\r
-\r
-static cJSON *cjson_json_tmp = NULL;\r
-//发送ble数据\r
-errcode_t sendBleData(uint8_t *buf,uint16_t len)\r
-{\r
- errcode_t ret = ERRCODE_FAIL;\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);\r
- #endif\r
- //if(Bleconnect == true )\r
- {\r
- ret = svr_ble_bt_gatts_noyify(buf,len);\r
- }\r
- return ret;\r
- \r
-}\r
-\r
-\r
-errcode_t sendBleData_zhihui(uint8_t *buf,uint16_t len)\r
-{\r
- errcode_t ret = ERRCODE_FAIL;\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);\r
- #endif\r
- //if(Bleconnect == true )\r
- {\r
- ret = svr_ble_bt_gatts_noyify_zhihui(buf,len);\r
- }\r
- return ret;\r
- \r
-}\r
-\r
-\r
-void sendDataNow(uint8_t *buf,uint16_t len)\r
-{\r
- //if(Bleconnect == true )\r
- {\r
- svr_ble_bt_gatts_noyify(buf,len);\r
- }\r
-}\r
-\r
-void send_Data_Now_zh(uint8_t *buf,uint16_t len)\r
-{\r
- {\r
- svr_ble_bt_gatts_noyify_zhihui(buf,len);\r
- }\r
-}\r
-\r
-\r
-\r
-void send_big_data(ble_data_type type,char *data, uint16 datalen)\r
-{\r
- // 动态分配内存空间,防止堆栈溢出\r
- uint8_t *buf =NULL;\r
- buf = ym_malloc(17 + datalen + 1); \r
- memset_s(buf,ble_nus_max_data_len,0,17 + datalen + 1);\r
- if (buf == NULL && datalen!=0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n");\r
- return;\r
- }\r
- if(type.Packet_id>=2)\r
- {\r
- msleep(get_ble_interval()+5);//多包数据发送增加延迟\r
- }\r
- // 设置消息头部信息\r
- buf[0] = 0x72; // 消息头\r
- buf[1] = type.type; // 类型\r
- buf[2] = type.type_id; // 类型ID\r
- memcpy(buf + 3, &type.packet_total, 4); // 总包数\r
- memcpy(buf + 7, &type.total, 4); // 总数据长度\r
- memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID\r
- memcpy(buf + 15, &datalen, 2); // 包数据长度\r
-\r
- // 处理数据和计算CRC\r
- if (data == NULL) {\r
- //数据为空 按照18个字节总长度发送给app\r
- buf[17] = 0x00; // 直接写0x00的校验和\r
- } else {\r
- memcpy(buf + 17, data, datalen); // 复制数据到缓冲区\r
- buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC\r
- }\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n");\r
- \r
- for(int i=0;i<17 + datalen + 1;i++)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n");\r
-\r
- // 根据标志位选择发送数据的方式\r
- if(type.type==6)\r
- {\r
- send_Data_Now_zh(buf, 17 + datalen + 1);\r
- }\r
- else\r
- {\r
- sendDataNow(buf, 17 + datalen + 1); // 判断是否在传输或接收多包数据\r
- }\r
- \r
- \r
-\r
- ym_free(buf); // 释放内存空间\r
-}\r
-\r
-void send_long_data(char *buf, uint32_t pack_size,uint8_t type,uint8_t id)\r
-{\r
- uint32_t data_len = strlen(buf);\r
- uint32_t surplus_len=data_len;\r
- uint32_t pack;\r
- if(data_len%pack_size==0)\r
- {\r
- pack=data_len/pack_size;\r
- }\r
- else\r
- { \r
- pack=data_len/pack_size+1;\r
- }\r
- uint32_t pack_id=1;\r
- uint32_t offset=0;\r
- while (surplus_len!=0)\r
- {\r
- if(surplus_len>=pack_size)\r
- {\r
- surplus_len=surplus_len-pack_size;\r
-\r
- ble_data_type type_={type,id,data_len,pack,pack_id};\r
- send_big_data(type_,buf+offset,pack_size);\r
-\r
- //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);\r
- offset+=pack_size;\r
- }\r
- else\r
- {\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
- ble_data_type type_={type,id,data_len,pack,pack_id};\r
- send_big_data(type_,buf+offset,surplus_len);\r
- //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);\r
- break;\r
- }\r
- pack_id++;\r
- }\r
-}\r
-\r
- \r
-\r
-bool is_free_ota_update(uint32_t size)\r
-{\r
- uint64_t free_size=0;\r
- int i;\r
- struct statfs file_buf = {0};\r
- FILE *fp=NULL;\r
- fp=fopen(UP_DATE_FWPKG_PATH,"rb+");\r
- if(fp)\r
- {\r
- fclose(fp);\r
- remove(UP_DATE_FWPKG_PATH);\r
- }\r
-\r
-#ifdef SINGLE_USER_PARTITION\r
- static const char * const g_volume_names[1] = { "/user/"};\r
- for (i = 0; i < 1; i++) {\r
-#else\r
- static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};\r
- for (i = 0; i < 4; i++) {\r
-#endif\r
- \r
- /* 获取文件系统状态 */\r
- if (statfs(g_volume_names[i], &file_buf) != 0) {\r
- return false ;\r
- }\r
-\r
- #ifdef SINGLE_USER_PARTITION\r
- if(strcmp("/user/",g_volume_names[i])==0)\r
- {\r
- free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);\r
- }\r
- int need_size=size*1.5;\r
- if(need_size>free_size)\r
- {\r
- return false;\r
- }\r
- else\r
- {\r
- return true;\r
- }\r
- #else\r
- //单分区不考虑是否足够空间\r
- return true;\r
- #endif\r
-#ifdef SINGLE_USER_PARTITION\r
- }\r
-#else\r
- }\r
-#endif\r
- return false;\r
-}\r
-\r
-\r
-\r
-//发送训练状态[app发起的运动]\r
-void sendtraningstatedata(uint8_t state ,uint16_t time)\r
-{\r
- char data[3]={0};\r
- uint32_t data_len=3;\r
- data[0]=state;\r
- memcpy(&data[1],&time,2);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);\r
- ble_data_type type={0x05,0x50,data_len,1,1};\r
- send_big_data(type,data,data_len);\r
- \r
-}\r
-\r
-//发送训练结束状态[手表发起]\r
-void sendtraningstateend(void)\r
-{\r
- char data[1]={0};\r
- uint32_t data_len=1;\r
- data[0]=0; //[0 结束]\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态结束%d\r\n",data[0]);\r
- \r
- ble_data_type type={0x05,0x51,data_len,1,1};\r
- send_big_data(type,data,data_len);\r
- //end_big_data(0,data,data_len,data_len,1,1,0x51,5);\r
-}\r
-\r
-void sendtraningdata(msg_get_train_data_info_t *data)\r
-{\r
- cJSON* dataJSON = cJSON_CreateObject();\r
- \r
- if (dataJSON == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n");\r
- return;\r
- }\r
- \r
- cJSON_AddNumberToObject(dataJSON,"st",data->st);\r
- cJSON_AddNumberToObject(dataJSON,"hr",data->hr);\r
- cJSON_AddNumberToObject(dataJSON,"ca",data->ca);\r
- cJSON_AddNumberToObject(dataJSON,"di",data->di);\r
- cJSON_AddNumberToObject(dataJSON,"stp",data->stp);\r
- cJSON_AddNumberToObject(dataJSON,"ti",data->ti);\r
- cJSON_AddNumberToObject(dataJSON,"pc",data->pc);\r
-\r
- char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
- \r
- if (jsonString == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");\r
- cJSON_Delete(dataJSON);\r
- return;\r
- }\r
- \r
- uint32_t data_len = strlen(jsonString);\r
- cJSON_Delete(dataJSON);\r
- \r
- if (data_len == 0) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");\r
- return;\r
- }\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练实时数据 %d %s\n", data_len, jsonString);\r
- ble_data_type type={0x01,0x0f,data_len,1,1};\r
- send_big_data(type,jsonString,data_len);\r
- \r
- cJSON_free(jsonString);\r
-}\r
-\r
-static uint8_t AI_is_end_state=0;\r
-\r
-//查询AI 模型是否可用,结果通过2AE4返回\r
-/*使用模型:\r
-0:文心一言\r
-1:ChatGPT\r
-2:KIMI\r
-3:豆包*/\r
-void inquire_AI_is_ready(uint8_t type)\r
-{\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"查询AI模型,是否准备就绪\r\n");\r
- ble_data_type type_={0x05,0x06,1,1,1};\r
- send_big_data(type_,(char *)&type,1);\r
- //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5);\r
-}\r
-\r
-void watch_synchronization_time(void)\r
-{\r
- ble_data_type type_={0x05,0x02,0,1,1};\r
- send_big_data(type_,NULL,0);\r
-}\r
-\r
-\r
-\r
-//发送ble数据\r
-uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 \r
-uint8_t parie_mac[6];//配对完成之后的的mac地址\r
-uint8_t phoneDataFlag = 0;\r
-//发送配对指令\r
-void sendConfirmParieSucess(void)\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- value[0] = 0x72;\r
- value[1] = 0x05;\r
- value[2] = 0x11;\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] = 0x01;\r
- value[18] = Calculate_CRC(value,1+18);\r
- sendBleData(value,19);\r
-}\r
-\r
-uint8_t phoneType = 0;\r
-\r
-\r
-\r
-\r
-errcode_t UnbindSucessCmd(uint8_t flag)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备 \r
-{\r
- errcode_t sendok = ERRCODE_FAIL;\r
- uint32_t tmp = 1;\r
- uint8_t value[19];\r
- uint8_t crcvalue = 0;\r
- memset(value,0,19);\r
- memset(value,0,19);\r
- value[0] =0x72;\r
- value[1] =0x05;\r
- value[2] =0x12;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp,2);\r
- value[17] = flag;\r
- value[18] = Calculate_CRC(value,18);\r
- sendok = sendBleData(value,19);\r
- msleep(3*get_ble_interval());//增加延时,确保可以成功发送解除绑定\r
-\r
- bd_addr_t addr={0};\r
- get_phone_addr(&addr,g_ble_conn_id);\r
-\r
- bool ret = bt_is_acl_connected(&addr);\r
- if(flag == 1)\r
- { \r
- if(0!=remove(PHONE_WATCH_CONFIG_PATH))\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");\r
- }\r
- gap_ble_remove_all_pairs(); \r
- gap_remove_all_pairs();\r
- }\r
- \r
-\r
-\r
- return sendok;\r
-}\r
-\r
-void watch_clean_pairs(void)\r
-{\r
- if(0!=remove(PHONE_WATCH_CONFIG_PATH))\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");\r
- }\r
- gap_ble_remove_all_pairs(); \r
- gap_remove_all_pairs();\r
-}\r
- \r
-\r
-void getDeviceState(void)//获取设备状态\r
-{\r
- bd_addr_t addr={0};\r
- get_phone_addr(&addr,g_ble_conn_id);\r
-\r
- bool ret = bt_is_acl_connected(&addr);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getDeviceState ret:%d\r\n",ret);\r
-}\r
-\r
-void clearPaireFlag(uint8_t flag)\r
-{\r
- uint8_t value[19];\r
- uint8_t crcvalue = 0;\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- value[0] =0x72;\r
- value[1] =0x01;\r
- value[2] =0x10;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp,2);\r
- value[17] = flag;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- \r
- UnbindSucessCmd(1);//1确认解绑;\r
- \r
- // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂\r
- uint8_t shutdowflag = 2;//恢复出厂\r
- CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag));\r
- //uapi_reboot_device();\r
-}\r
-void clearPaireCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令\r
-{\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败\r
- clearPaireFlag(1);\r
- }\r
- else\r
- {\r
- clearPaireFlag(0);\r
- }\r
-}\r
-uint8_t *savephonename=NULL;\r
-//确认配对指令\r
-uint8_t first_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址\r
-void comfirmPaire(uint8_t flag)\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- value[0] =0x72;\r
- value[1] =0x05;\r
- value[2] =0x11;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp,2);\r
- value[17] = flag;\r
- value[18] = Calculate_CRC(value,1+17);\r
- sendBleData(value,19);\r
- if(flag == 1)\r
- {\r
- first_bond = 1;\r
-\r
- if(get_ble_pair())\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," gap_ble_pair \r\n");\r
-\r
- bd_addr_t addr={0};\r
- get_phone_addr(&addr,g_ble_conn_id);\r
-\r
- errcode_t code = gap_ble_pair_remote_device(&addr);\r
- if(code!=ERRCODE_SUCC)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);\r
- }\r
- }\r
-\r
- \r
- }else{\r
- first_bond = 0;\r
- errcode_t ret = 0;\r
- bd_addr_t addr={0};\r
- get_phone_addr(&addr,g_ble_conn_id);\r
-\r
- ret = gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_disconnect_remote_device %x\r\n",ret);\r
- ret = gap_ble_remove_all_pairs(); \r
- bool ret_ok = gap_remove_all_pairs();\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_remove_all_pairs %x %x\r\n",ret,ret_ok);\r
- if(savephonename != NULL)\r
- {\r
- ym_free(savephonename);\r
- savephonename = NULL;\r
- }\r
- }\r
-}\r
-\r
-// l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接\r
-void alarmData(void)\r
-{\r
-\r
-}\r
-\r
-\r
-void getPhoneNameLen(uint8_t *data,uint8_t *datalen,uint8_t *type)//获取手机设备名称长度\r
-{\r
- uint8_t len = 0;\r
- uint8_t *json = data;\r
- cJSON* root = cJSON_Parse((const char *)json);\r
- \r
- if(root != NULL)\r
- {\r
- cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
- if (pn && cJSON_IsString(pn)) {\r
- len = strlen(pn->valuestring)+1; \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s len:%d\n", pn->valuestring,len);\r
- }\r
- cJSON* tp = cJSON_GetObjectItem(root, "tp");\r
- if(tp && cJSON_IsNumber(tp))\r
- {\r
- *type=tp->valueint;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\r\n",type);\r
- \r
- cJSON* bond=cJSON_GetObjectItem(root, "bond");\r
- if(bond)\r
- {\r
-\r
- }\r
- *datalen = len;\r
- cJSON_Delete(root);\r
- } else{\r
- len = 0;\r
- *datalen = len;\r
- }\r
-}\r
-#define PHONE_NAME_MAX_LEN 50\r
-static uint8_t *getPhoneName(uint8_t *data)//获取手机设备名称\r
-{\r
- uint8_t *json = data;\r
- uint8_t *str = NULL; \r
- cJSON* root = cJSON_Parse((const char *)json);\r
- if(root != NULL)\r
- {\r
- cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
- if (pn && cJSON_IsString(pn)) {\r
- uint8_t datalen = strlen(pn->valuestring)+1; \r
- if(datalen > PHONE_NAME_MAX_LEN) //\r
- {\r
- datalen = PHONE_NAME_MAX_LEN;\r
- }\r
- if(datalen - 1 > 0){\r
- pn->valuestring[datalen]='\0';\r
- str = ym_malloc(sizeof(char)*datalen);\r
- if(str != NULL)\r
- {\r
- memcpy(str,(uint8_t *)pn->valuestring,datalen+1);\r
- }\r
- if(savephonename)\r
- {\r
- ym_free(savephonename);\r
- savephonename=NULL;\r
- }\r
- savephonename = ym_malloc(sizeof(char)*datalen);\r
- if(savephonename != NULL){\r
- memcpy(savephonename,(uint8_t *)pn->valuestring,datalen+1);\r
- }\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s\n", pn->valuestring);\r
- }\r
- cJSON_Delete(root);\r
- } \r
- if (str == NULL){\r
- return NULL;\r
- } \r
- else{\r
- return str;\r
- }\r
- \r
-}\r
-void getPhoneMac(uint8_t *data,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址\r
-{\r
- uint8_t *json = data;\r
- uint8_t phone_tmp[6];\r
- memset(phone_tmp,0,6);\r
- cJSON* root = cJSON_Parse((const char *)json);\r
- uint8_t datalen = 0;\r
- uint8_t count = 5;\r
- if(root != NULL)\r
- {\r
- cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
- if (mac && cJSON_IsArray(mac)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MAC地址: ");\r
- cJSON* macElement = NULL;\r
- cJSON_ArrayForEach(macElement, mac) {\r
- if (cJSON_IsNumber(macElement)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);\r
- if (macElement->prev != NULL) {\r
- phone_tmp[count] = macElement->valueint;\r
- count--;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");\r
- }\r
- }\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");\r
- }\r
-\r
- memcpy(phoneMac,phone_tmp,6);\r
- cJSON_Delete(root);\r
- } \r
- else{\r
- memset(phoneMac,0,6);\r
- }\r
-}\r
-\r
-void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的mac地址和mac地址类型 分共有和私有的\r
-{\r
- uint8_t mac_tmp[6];\r
- memset(mac_tmp,0,6);\r
- uint8_t count = 0;\r
- uint8_t type= 0;\r
- FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
- if (jsfile != NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n");\r
- fseek(jsfile, 0, SEEK_END);\r
- long fileSize = ftell(jsfile);\r
- fseek(jsfile, 0, SEEK_SET);\r
-\r
- char *jsonData = (char *)ym_malloc(fileSize + 1);\r
- fread(jsonData, 1, fileSize, jsfile);\r
- jsonData[fileSize] = '\0';\r
- fclose(jsfile);\r
- // 解析JSON数据\r
- cJSON *root = cJSON_Parse(jsonData);\r
- // 释放资源\r
- ym_free(jsonData);\r
- if (root != NULL) {\r
- cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");\r
- if (cJSON_IsArray(modifiedJson)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"watch MAC地址: ");\r
- cJSON* macElement = NULL;\r
- cJSON_ArrayForEach(macElement, modifiedJson) {\r
- if (cJSON_IsNumber(macElement)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);\r
- if ((macElement->prev != NULL)) {\r
- mac_tmp[count] = macElement->valueint;\r
- count++;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");\r
- }\r
- }\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");\r
- }\r
- cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type");\r
- if(cJSON_IsNumber(mac_type))\r
- {\r
- *mactype = mac_type->valueint;\r
- }\r
- }\r
- if(mac_tmp[0] == 0 && mac_tmp[1] == 0 && mac_tmp[2] == 0 && mac_tmp[3] == 0 && mac_tmp[4] == 0 && mac_tmp[5] == 0){\r
- memset(mac,0,6);\r
- }else\r
- {\r
- memcpy(mac,mac_tmp,6);\r
- }\r
- cJSON_Delete(root);\r
- }else\r
- {\r
- memset(mac_tmp,0,6);\r
- memcpy(mac,mac_tmp,6);\r
- *mactype = 0;\r
- }\r
-}\r
-static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度\r
-{\r
- uint8_t len = 0;\r
- FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
- if (jsfile != NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen opening file\n");\r
- fseek(jsfile, 0, SEEK_END);\r
- long fileSize = ftell(jsfile);\r
- fseek(jsfile, 0, SEEK_SET);\r
-\r
- char *jsonData = (char *)ym_malloc(fileSize + 1);\r
- fread(jsonData, 1, fileSize, jsfile);\r
- jsonData[fileSize] = '\0';\r
- fclose(jsfile);\r
-\r
- // 解析JSON数据\r
- cJSON *root = cJSON_Parse(jsonData);\r
- ym_free(jsonData);\r
- if (root != NULL) {\r
- cJSON *pn = cJSON_GetObjectItem(root,"pn");\r
- if(cJSON_IsString(pn))\r
- {\r
- len = strlen(pn->valuestring)+1;//多加一个加上字符串的结束符\0\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen;%d",len);\r
- }\r
- };\r
- *datalen = len;\r
- // memcpy(datalen,&len,1);\r
- // 释放资源\r
- cJSON_Delete(root);\r
- }else{\r
- len = 0;\r
- *datalen = len;\r
- }\r
-}\r
-static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备名称\r
-{\r
- uint8_t count = 0;\r
- uint8_t *str = NULL;\r
- FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
- if (jsfile != NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n");\r
- fseek(jsfile, 0, SEEK_END);\r
- long fileSize = ftell(jsfile);\r
- fseek(jsfile, 0, SEEK_SET);\r
-\r
- char *jsonData = (char *)ym_malloc(fileSize + 1);\r
- fread(jsonData, 1, fileSize, jsfile);\r
- jsonData[fileSize] = '\0';\r
- fclose(jsfile);\r
-\r
- // 解析JSON数据\r
- cJSON *root = cJSON_Parse(jsonData);\r
- ym_free(jsonData);\r
- // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ym_free ym_malloc_count:%d ym_free_count:%d\r\n",ym_malloc_count,ym_free_count);\r
- if (root != NULL) {\r
- cJSON *pn = cJSON_GetObjectItem(root,"pn");\r
- if(cJSON_IsString(pn))\r
- {\r
- uint8_t showname_len = strlen(pn->valuestring)+1;\r
- if(showname_len > 50)\r
- {\r
- showname_len = PHONE_NAME_MAX_LEN;\r
- }\r
- if(showname_len-1 > 0){\r
- str = ym_malloc(sizeof(char)*showname_len);\r
- if(str != NULL)\r
- {\r
- pn->valuestring[showname_len]='\0';\r
- memcpy(str,(uint8_t *)pn->valuestring,showname_len+1);\r
- }\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveName:%s",pn->valuestring);\r
- }\r
- }\r
- }\r
- // 释放资源\r
- cJSON_Delete(root);\r
- }\r
- if (str == NULL)\r
- {\r
- return NULL;\r
- }else{\r
- return str;\r
- }\r
- \r
-}\r
-\r
-void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- uint16_t tmp_fen= 1;\r
- value[0] =0x72;\r
- value[1] =0x05;\r
- value[2] =0x11;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp_fen,2);\r
- value[17] = 0x03;//\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-\r
- uint8_t MacType = 0;\r
- uint8_t mac_data[6];\r
- memset(mac_data,0,6);\r
- GetwatchSaveMac(&mac_data,&MacType);\r
-\r
- bd_addr_t addr={0};\r
- get_phone_addr(&addr,g_ble_conn_id);\r
-\r
- errcode_t ret1 = gap_disconnect_remote_device(&addr);\r
- gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接\r
-\r
- if (flag == 1){\r
- errcode_t ret= gap_ble_remove_pair(&addr);//清除配对信息\r
- \r
- gap_ble_remove_all_pairs(); \r
- bool ret_flag = gap_remove_all_pairs();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ret_flag:%d ret:%x\r\n",ret_flag,ret);\r
- if(0!=remove(PHONE_WATCH_CONFIG_PATH))\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");\r
- }\r
- set_ble_falg(0);\r
- do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂\r
- //uapi_reboot_device();\r
- }\r
-}\r
-static bool ctkd_flag_ble=false;\r
-\r
-void set_ctkd_flag(bool flag)\r
-{\r
- ctkd_flag_ble=flag;\r
-}\r
-bool get_ctkd_flag(void)\r
-{\r
- return true;//ctkd_flag_ble;\r
-}\r
-void sendBindInfor(uint8_t *data)\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- uint16_t tmp_fen= 1;\r
- value[0] =0x72;\r
- value[1] =0x02;\r
- value[2] =0x10;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp_fen,2);\r
- \r
- uint8_t copare_mac[6];\r
- memset(copare_mac,0,6);\r
- uint8_t datalen=0;\r
- uint8_t *devname = NULL;\r
- uint8_t devnamelen = 0;\r
- uint8_t mac_tmp[6];\r
- memset(mac_tmp,0,6);\r
- uint8_t phone_type;\r
- uint8_t bond = 1;//未与任何手机绑定过\r
- errcode_t ret = 0;\r
- first_bond = 0;\r
- uint8_t save_mac[6];\r
- memset(save_mac,0,6);\r
- uint8_t MacType = 0;\r
- \r
- GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型 \r
- getPhoneMac(data,&copare_mac);\r
-\r
- if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0 && save_mac[3] == 0 && save_mac[4] == 0 && save_mac[5] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定\r
- {\r
- bond = 0x01;//手表未和任何手机绑定过\r
- //未配过使能一键双联\r
-\r
- //清除一次配对\r
- //if(get_ble_pair())\r
- \r
- //\r
- value[17] = bond;//\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-\r
- #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION\r
- #ifdef SUPPORT_A5133_SERVICE_BLE_PAIR\r
- comfirmPaire(1);\r
- #else\r
- devnamelen = 0;\r
- getPhoneNameLen(data,&devnamelen,&phone_type);//获取手机下发的手机设备名称长度\r
-\r
- if(phone_type==0)\r
- {\r
- unsigned int paired_devices_num=0;\r
- bool gap_get_paired =gap_get_paired_devices_num(&paired_devices_num);\r
- if(gap_get_paired!=true ||paired_devices_num!=0 )\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sendBindInfor!!!!!!!!!:gap_remove_all_pairs \r\n");\r
- gap_remove_all_pairs();\r
- }\r
- }\r
- \r
-\r
- if(devnamelen > 0 )\r
- {\r
- \r
- devname = getPhoneName(data);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname!!!!!!!!!:%s devnamelen:%d",devname,devnamelen);\r
- if (devname != NULL){\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is name!!!!!!!!!\r\n");\r
- uint8_t buf[devnamelen+2]; \r
- memset(buf,0,devnamelen+2);\r
- buf[0] = DEVICEBIND ;\r
- buf[1] = devnamelen;//设备名称长度 0不显示\r
- memcpy(buf+2,devname,devnamelen);\r
-\r
- if(phone_type==1)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"IOS\r\n");\r
- ble_set_pair(1);\r
- \r
- errcode_t ret = gap_ble_set_ctkd_enable(true);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iPhone gap_ble_set_ctkd_enable ret = %x", ret);\r
- set_ctkd_flag(true);\r
- }\r
- else\r
- {\r
- ble_set_pair(0);\r
- \r
- errcode_t ret = gap_ble_set_ctkd_enable(true);\r
- \r
- }\r
- \r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);\r
- // comfirmPaire(1);\r
- if(devname)\r
- { \r
- ym_free(devname);\r
- devname = NULL;\r
- }\r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name11111!!!!!!!!!:");\r
- uint8_t buf[2]; \r
- memset(buf,0,2);\r
- buf[0] = DEVICEBIND;\r
- buf[1] = 0;\r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
- // comfirmPaire(1);\r
- \r
- }\r
- }\r
- else{\r
- uint8_t buf[2]; \r
- memset(buf,0,2);\r
- buf[0] = DEVICEBIND;\r
- buf[1] = 0 ;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name!!!!!!!!!:");\r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
- // comfirmPaire(1);\r
- }\r
- #endif\r
- #endif\r
-\r
- return;\r
- \r
- }else\r
- {\r
- if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0) \r
- {\r
- bond = 0x03;//手表和其他手机绑定过\r
- \r
- }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对\r
- int result = memcmp(copare_mac,save_mac,6);\r
- if(result == 0)\r
- {\r
- \r
- if(get_ble_pair())\r
- {\r
- set_ctkd_flag(true);\r
- errcode_t ret = gap_ble_set_ctkd_enable(true);\r
-\r
- }\r
- else\r
- {\r
- errcode_t ret = gap_ble_set_ctkd_enable(true);\r
- }\r
-\r
- \r
- if(get_ble_pair())\r
- {\r
- bd_addr_t addr={0};\r
- get_phone_addr(&addr,g_ble_conn_id);\r
-\r
- errcode_t code = gap_ble_pair_remote_device(&addr);\r
- if(code!=ERRCODE_SUCC)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);\r
- }\r
- }\r
- \r
- bond = 0x02;//手表与该手机绑定过\r
- value[17] = bond;//\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- return;\r
- }else{\r
- bond = 0x03;//手表与其他手机绑定过\r
- }\r
- }\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bond flag:%d first_bond:%d\r\n",bond,first_bond);\r
- \r
- if(bond == 0x03)\r
- {\r
- devnamelen = 0;\r
- GetwatchSaveNameLen(&devnamelen);//获取手表设备保存手机的设备名称长度\r
- if(devnamelen > 0)\r
- { \r
- devname = GetwatchSaveName();\r
- if (devname != NULL){\r
- uint8_t buf[devnamelen+2]; \r
- memset(buf,0,devnamelen+2);\r
- buf[0] = DEVICEUNBIND ;\r
- buf[1] = devnamelen;\r
- memcpy(buf+2,devname,devnamelen);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is no null!!!!!%s\r\n",devname);\r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);\r
- if(devname)\r
- {\r
- ym_free(devname);\r
- devname = NULL;\r
- }\r
- }else{\r
- uint8_t buf[2]; \r
- memset(buf,0,2);\r
- buf[0] = DEVICEUNBIND;\r
- buf[1] = 0;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is null!!!!!");\r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
- }\r
- }else{\r
- uint8_t buf[2]; \r
- memset(buf,0,2);\r
- buf[0] = DEVICEUNBIND;\r
- buf[1] = 0;\r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
- }\r
- }\r
- value[17] = bond;//\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-}\r
-void SetPhoneInfo(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
- uint16_t tmp_fen= 1;\r
- value[0] =0x72;\r
- value[1] =0x02;\r
- value[2] =0x10;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp_fen,2);\r
- phoneDataFlag = 1;\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- sendBindInfor(data);\r
- }else{\r
- value[17] = 0x00;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-\r
-void sendParieSuccess(uint8_t flag,bd_addr_t *addr)//发送配对成功指令to app\r
-{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);\r
- if(g_ble_conn_id==0)\r
- {\r
- return;\r
-\r
- }\r
- if(first_bond == 1 && phoneDataFlag == 1)//第一次连接绑定\r
- {\r
- set_ble_falg(1);\r
- uint8_t value[25];\r
- uint8_t length = 0;\r
- memset(value,0,25);\r
- value[0] = 0x72;\r
- value[1] = 0x05;\r
- value[2] = 0x10;\r
- uint32_t totalpack= 1;//总的包数\r
- uint32_t data_len = 7;//数据长度\r
- uint32_t pack_index= 1;//分包序号Index\r
- uint16_t pack_dataLen = 7;\r
- memcpy(value+3,&totalpack,4);\r
- memcpy(value+7,&data_len,4);\r
- memcpy(value+11,&pack_index,4);\r
- memcpy(value+15,&pack_dataLen,2);\r
- value[17] = flag;//1 配对成功 0 配对失败 \r
- if(flag == 1)//配对成功\r
- {\r
- cJSON *dataJSON = cJSON_CreateObject();\r
- if(dataJSON==NULL)\r
- {\r
- return;\r
- }\r
-\r
- cJSON* arrayJSON = cJSON_CreateArray();\r
- if(arrayJSON==NULL)\r
- {\r
- return;\r
- }\r
- for(uint8_t id = 0;id<6;id++)\r
- {\r
- cJSON_AddNumberToObject(arrayJSON,"id",addr->addr[id]);\r
- }\r
- if(savephonename != NULL)\r
- {\r
- cJSON_AddStringToObject(dataJSON,"pn",(char *)savephonename);\r
- ym_free(savephonename);\r
- savephonename = NULL;\r
- }\r
- cJSON_AddNumberToObject(dataJSON,"phoneType",phoneType);\r
- cJSON_AddNumberToObject(dataJSON,"mac_type",addr->type);\r
- cJSON_AddItemToObject(dataJSON,"mac",arrayJSON);\r
-\r
- char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone %s",jsonString);\r
- FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb");\r
- if (file)\r
- {\r
- if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n");\r
- }\r
- fclose(file);\r
- }\r
- // ym_free(jsonString);\r
- cJSON_free(jsonString);\r
- cJSON_Delete(dataJSON);\r
- // 读取JSON文件\r
-\r
- //memcpy(value+18,addr->addr,6);\r
- value[18]=addr->addr[5];\r
- value[19]=addr->addr[4];\r
- value[20]=addr->addr[3]; \r
- value[21]=addr->addr[2];\r
- value[22]=addr->addr[1];\r
- value[23]=addr->addr[0];\r
-\r
- memcpy(parie_mac,addr->addr,6);\r
- length = 18+6;\r
- uint8_t crcvalue = Calculate_CRC(value,length);\r
- value[length] = crcvalue;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );\r
- sendBleData(value,length+1);\r
- }else{\r
- length = 18;\r
- uint8_t crcvalue = Calculate_CRC(value,length);\r
- value[length] = crcvalue;\r
- length = length+1;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );\r
- sendBleData(value,length);\r
- }\r
- phoneDataFlag = 0;\r
- }\r
-\r
- \r
-}\r
-\r
-\r
-//02类型的指令数据\r
-\r
-void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间\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] = type;\r
- sendBuf[2] = typeID;\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
- sendBuf[17] = crcflag;\r
- sendBuf[18] = Calculate_CRC(sendBuf,18);\r
- sendBleData(sendBuf,19);\r
-\r
-}\r
-//发送查找手机\r
-void senfindphoneSend(uint8_t flag)\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] = 0x05;\r
- sendBuf[2] = 0x01; //3\r
- memcpy(sendBuf+3,&tmp,4);\r
- memcpy(sendBuf+7,&tmp,4);\r
- memcpy(sendBuf+11,&tmp,4); //15\r
- memcpy(sendBuf+15,&tmp_data,2); //17\r
- sendBuf[17] = flag;\r
- sendBuf[18] = Calculate_CRC(sendBuf,18);\r
- sendBleData(sendBuf,19);\r
-}\r
-\r
-static uint8_t jsonCheck_time(uint8_t *buf)//json 格式解析\r
-{\r
- // char time_data[24];\r
- // memset(time_data,0,24);\r
- \r
- uint8_t *json;\r
- json = buf;\r
- cJSON* root = cJSON_Parse((const char *)json);\r
- if (root == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");\r
- return 2;\r
- }\r
- char *locations;\r
- int year = 1970;\r
- uint8_t month = 1;\r
- uint8_t day = 1;\r
- uint8_t week = 4;\r
- uint8_t hour = 0;\r
- uint8_t minute = 0;\r
- uint8_t second = 0;\r
- uint32_t timestamp;\r
- cJSON* time = cJSON_GetObjectItem(root, "time");\r
- if (time && cJSON_IsNumber(time)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);\r
- timestamp = time->valueint;\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);\r
- }\r
- cJSON* jsweek = cJSON_GetObjectItem(root, "week");\r
- if (jsweek && cJSON_IsNumber(jsweek)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"week: %d\n", jsweek->valueint);\r
- week = jsweek->valueint;\r
- }\r
- cJSON* jsyear = cJSON_GetObjectItem(root, "year");\r
- if (jsyear && cJSON_IsNumber(jsyear)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"year: %d\n", jsyear->valueint);\r
- year = jsyear->valueint;\r
- }\r
- cJSON* jsmonth = cJSON_GetObjectItem(root, "month");\r
- if (jsmonth && cJSON_IsNumber(jsmonth)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"month: %d\n", jsmonth->valueint);\r
- month = jsmonth->valueint;\r
- }\r
- cJSON* jsday = cJSON_GetObjectItem(root, "day");\r
- if (jsday && cJSON_IsNumber(jsday)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"day: %d\n", jsday->valueint);\r
- day = jsday->valueint;\r
- }\r
- cJSON* jshour = cJSON_GetObjectItem(root, "hour");\r
- if (jshour && cJSON_IsNumber(jshour)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hour: %d\n", jshour->valueint);\r
- hour = jshour->valueint;\r
- }\r
- cJSON* jsminute = cJSON_GetObjectItem(root, "minute");\r
- if (jsminute && cJSON_IsNumber(jsminute)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"minute: %d\n", jsminute->valueint);\r
- minute = jsminute->valueint;\r
- }\r
- cJSON* jssecond = cJSON_GetObjectItem(root, "second");\r
- if (jssecond && cJSON_IsNumber(jssecond)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"second: %d\n", jssecond->valueint);\r
- second = jssecond->valueint;\r
- }\r
- cJSON* location = cJSON_GetObjectItem(root, "location");\r
- if (location && cJSON_IsString(location)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"location: %s\n", location->valuestring);\r
- locations = location->valuestring;\r
- }\r
- // sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second);\r
- // set_system_time(time_data);\r
- \r
-\r
- /***计算timezone*/\r
- struct tm tmp={0};\r
- tmp.tm_year = year+2000 - 1900;\r
- tmp.tm_mon = month -1;\r
- tmp.tm_mday = day;\r
- tmp.tm_hour = hour;\r
- tmp.tm_min = minute;\r
- tmp.tm_sec = second;\r
- time_t timestamp2 = __tm_to_secs(&tmp);\r
- int16_t timezone = (timestamp2-timestamp)/60/15; \r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"timezone in quarters %d\n",timezone);\r
- uapi_set_timezone(timezone); //要在uaip_sntp_set_time_utc 之前执行才有效\r
- /********/\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"time: %d\n",timestamp );\r
-\r
- uaip_sntp_set_time_utc(timestamp);\r
-\r
- cJSON_Delete(root);\r
- return 1;\r
-}\r
-\r
-\r
-\r
-\r
-void SetUTCtime(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] = 0x02;\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
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- uint8_t set_ok = 1;\r
- set_ok = jsonCheck_time(data);\r
- sendBuf[17] = set_ok;\r
- sendBuf[18] = Calculate_CRC(sendBuf,18);\r
- sendBleData(sendBuf,19);\r
- \r
- }\r
- else\r
- {\r
- sendBuf[17] = 0;\r
- sendBuf[18] = Calculate_CRC(sendBuf,18);\r
- sendBleData(sendBuf,19);\r
- }\r
- \r
-}\r
-static training_ble training_ble_data;\r
-//设置训练目标\r
-static uint8_t jsonCheck_targetparam(uint8_t *buf)\r
-{\r
- uint8_t *json;\r
- json = buf;\r
- cJSON* root = cJSON_Parse((const char *)json);\r
- if (root == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");\r
- return 2;\r
- }\r
-\r
- memset(&training_ble_data, 0, sizeof(training_ble));\r
-\r
- cJSON* ty = cJSON_GetObjectItem(root, "ty");//目标类型\r
- if (cJSON_IsNumber(ty)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ty: %d\n", ty->valueint);\r
- training_ble_data.sportTagType = ty->valueint;\r
- training_ble_data.controlmd = SETGOAL;\r
-\r
- cJSON* targetItem = NULL;\r
- switch (training_ble_data.sportTagType)\r
- {\r
- case 0: // 距离\r
- targetItem = cJSON_GetObjectItem(root, "di");//目标距离\r
- break;\r
- case 1: // 卡路里\r
- targetItem = cJSON_GetObjectItem(root, "ca");//目标卡路里\r
- break;\r
- case 2: // 时间\r
- targetItem = cJSON_GetObjectItem(root, "tm");//目标时间\r
- break;\r
- case 3: // 步数\r
- targetItem = cJSON_GetObjectItem(root, "st");//目标步数\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- if (targetItem && cJSON_IsNumber(targetItem)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s: %d\n", targetItem->string, targetItem->valueint);\r
- training_ble_data.sportTag = targetItem->valueint;\r
- cJSON_Delete(root);\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRAINING, (uint8_t*)&training_ble_data, sizeof(training_ble));\r
- return JSON_CHECK_OK;\r
- }\r
- }\r
-\r
- cJSON_Delete(root);\r
- return JSON_CHECK_ERR;\r
-}\r
-\r
-\r
-void SetTarinTarget(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] = 0x04;\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
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t set_ok = 1;\r
- set_ok = jsonCheck_targetparam(data);\r
- sendBuf[17] = set_ok;\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
-\r
-static void SetOtherTarget(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] = 0x17;\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
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- // 73 2 17 1 0 0 0 8 0 0 0 1 0 0 0 8 0 2c 1 a 8 1e 1 1 1 2\r
-\r
- uint16_t target_kcal = data[0]+data[1]*256;//目标卡路里\r
- uint8_t target_km = data[2];//目标里程\r
- uint8_t target_stand = data[3];//目标站立\r
- uint8_t target_fattime = data[4];//目标燃脂\r
-\r
- uint8_t ring = data[5];//铃声\r
- uint8_t vibratior = data[6];//振动\r
- uint8_t notify = data[7];//通知\r
- if(target_km)\r
- set_goal_discount(target_km);\r
- if(target_stand)\r
- set_goal_standupcount(target_stand);\r
- if(target_fattime)\r
- set_goal_durationcount(target_fattime);\r
- if(target_kcal)\r
- set_goal_caloriescount(target_kcal);\r
-\r
- // set_SilentMode(ring);\r
- // set_vibrationremiander(vibratior);\r
- // set_notify_switch(notify);\r
- if(ring && vibratior && notify)\r
- set_goal_other_notification(1);\r
- else\r
- set_goal_other_notification(0);\r
-\r
-\r
- sendBuf[17] = 1;\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
-static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据\r
-{\r
- uint8_t *json;\r
- json = buf;\r
- cJSON* root = cJSON_Parse((const char *)json);\r
-\r
- if (root == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 JSON解析错误\n");\r
- return;\r
- }\r
- else\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 %s\r\n",json);\r
- }\r
- ble_delet_all_AlarmInfo();\r
-\r
- cJSON* alarms = cJSON_GetObjectItem(root, "alarms");\r
- if(alarms==NULL)\r
- {\r
- return;\r
- }\r
- int alarmCount = cJSON_GetArraySize(alarms);\r
- \r
- for(int i=0;i<alarmCount;i++)\r
- {\r
- uint8_t week=0;\r
- cJSON *data=cJSON_GetArrayItem(alarms,i);\r
- if(data==NULL)\r
- {\r
- return;\r
- }\r
-\r
- cJSON *Id_data =cJSON_GetObjectItem(data,"id");\r
- if(Id_data==NULL)\r
- return;\r
- int id=Id_data->valueint;\r
-\r
- cJSON* repeat=cJSON_GetObjectItem(data,"repeat");\r
- if(repeat==NULL)\r
- return;\r
- \r
- int array_size = cJSON_GetArraySize(repeat);\r
- for(int j=0;j<array_size;j++)\r
- {\r
- int day = cJSON_GetArrayItem(repeat,j)->valueint;\r
- if(day==7)\r
- {\r
- week|=0b00000001;\r
- }\r
- else if(day!=0)\r
- {\r
- week|=0b00000001<<(day);\r
- }\r
- \r
- }\r
- \r
- cJSON* hour_data=cJSON_GetObjectItem(data,"hour");\r
- if(hour_data==NULL)\r
- {\r
- return;\r
- }\r
- int hour=hour_data->valueint;\r
- cJSON* minute_data=cJSON_GetObjectItem(data,"minute");\r
- if(minute_data==NULL)\r
- {\r
- return;\r
- }\r
- int minute=minute_data ->valueint;\r
- cJSON* enable_data=cJSON_GetObjectItem(data,"enable");\r
- if(enable_data==NULL)\r
- {\r
- return;\r
- }\r
- int enable=enable_data ->valueint;\r
-\r
- ble_SetAlarmInfo(hour, minute,week,i,enable);\r
-\r
- }\r
- cJSON_Delete(root);\r
- ble_AlarmClock_refresh();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alarmCount %d\n",alarmCount);\r
- \r
-}\r
-\r
-void SetAlarmDataCmd(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
- uint8_t sendBuf[19];\r
- memset(sendBuf,0,19);\r
- sendBuf[0] = 0x72;\r
- sendBuf[1] = 0x02;\r
- sendBuf[2] = 0x21;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- jsonCheck_alarm(data);\r
- \r
- sendBuf[17] = 1;\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
-\r
-void SetpasswordCmd(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
- uint8_t sendBuf[19];\r
- memset(sendBuf,0,19);\r
- sendBuf[0] = 0x72;\r
- sendBuf[1] = 0x02;\r
- sendBuf[2] = 0x1c;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- char* buf[7]={0};\r
- \r
- sprintf_s(buf,7,"%d%d%d%d%d%d",data[1],data[2],data[3],data[4],data[5],data[6]);\r
- ble_set_password(data[0],buf);\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",buf);\r
- \r
- sendBuf[17] = 1;\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
-\r
-void GetWatchLcdParamCmd(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
- uint8_t sendBuf[19];\r
- memset(sendBuf,0,19);\r
- sendBuf[0] = 0x72;\r
- sendBuf[1] = 0x02;\r
- sendBuf[2] = 0x0e;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t type = data[0];\r
- if(type == 0)//只设置屏幕亮度\r
- {\r
- uint8_t brightness = data[1];\r
- set_brigthness(brightness);\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
- case 0:\r
- screen_time = 5*1000;\r
- break;\r
- case 1:\r
- screen_time = 10*1000;\r
- break;\r
- case 2:\r
- screen_time = 15*1000;\r
- break;\r
- case 3:\r
- screen_time = 30*1000;\r
- break;\r
- case 4:\r
- screen_time = 60*1000;\r
- break;\r
- case 5:\r
- screen_time = 60*5*1000;\r
- break;\r
- default:\r
- break;\r
- }\r
- bool raise = data[2];\r
-\r
- set_ScreenDuration(screen_time);\r
- Set_RaiseToWake(raise);\r
- }\r
- sendBuf[17] = 1;\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
-\r
-\r
-\r
-void GetVoiceVibrateParamCmd(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
- uint8_t sendBuf[19];\r
- memset(sendBuf,0,19);\r
- sendBuf[0] = 0x72;\r
- sendBuf[1] = 0x02;\r
- sendBuf[2] = 0x0f;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- uint8_t type = data[0];\r
- if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数\r
- {\r
- int sys_volume = data[1];\r
- Set_SystemVolume(sys_volume);\r
-\r
- }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数\r
- {\r
- int ring_volume = 0;\r
-\r
- ring_volume = data[1];\r
-\r
- Set_CallVolume(ring_volume);\r
-\r
- }else if(type == 2)//只改变媒体音量\r
- {\r
- int ring_volume = 0;\r
- ring_volume = data[1];\r
- Set_CallVolume(ring_volume);\r
- }\r
- else if(type == 3)//只改变铃声和振动开关\r
- {\r
- int bell_on = data[1];\r
- int vibrate_on = data[2];\r
- set_SilentMode(bell_on);\r
- set_vibrationremiander(vibrate_on);\r
- }\r
-\r
- sendBuf[17] = 1;\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
-\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
- uint8_t sendBuf[19];\r
- memset(sendBuf,0,19);\r
- sendBuf[0] = 0x72;\r
- sendBuf[1] = 0x02;\r
- sendBuf[2] = 0x12;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- msg_get_heart_set_param_info_t set_data;\r
-\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
-\r
- Set_heart_cmd(&set_data);\r
- sendBuf[17] = 1;\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
-\r
-\r
-void GetSpo2SetParamCmd(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] = 0x13;\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
-\r
- if(Check_CRC(data,len,crcvalue))\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
- }\r
- else\r
- {\r
- sendBuf[17] = 0;\r
- sendBuf[18] = Calculate_CRC(sendBuf,18);\r
- sendBleData(sendBuf,19);\r
- }\r
- \r
-}\r
-\r
-void SetsleepSetParamCmd(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] = 0x15;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- msg_get_sleep_param_info_t sleep_info;\r
- sleep_info.schedule = data[0];\r
- if(len>=6)\r
- {\r
- sleep_info.bedtime_hour= data[1];\r
- sleep_info.bedtime_min= data[2];\r
- sleep_info.waketime_hour= data[3];\r
- sleep_info.waketime_min= data[4];\r
- sleep_info.bedtime_alarm= data[5];\r
- }\r
- \r
- ble_set_sleep_remind(sleep_info);\r
-\r
- sendBuf[17] = 1;\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 SetDrinkSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置喝水提醒s设置\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] = 0x14;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- msg_drink_info_t drink_info={0};\r
- drink_info.drink_on = data[0];\r
- if(data[1])\r
- {\r
- drink_info.drink_on=2;\r
- }\r
- // drink_info.drink_on = data[1];\r
- drink_info.goal = data[2]+data[3]*256;\r
- drink_info.time_start = data[4]<<16|data[5];\r
- if(data[1])\r
- {\r
- drink_info.time_end = data[6]<<16|data[7];\r
- drink_info.freq = data[8];\r
- \r
- }\r
- ble_set_drink_remind(drink_info);\r
- \r
- sendBuf[17] = 1;\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
-\r
-void SetsedentarinessSetParamCmd(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] = 0x1D;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- msg_sedent_set_param_info_t sedent_data={0};\r
- sedent_data.sedent_on=data[0];\r
-\r
- // uint32_t sedent_on_time=data[1];\r
- // sedent_data.sedent_time |= sedent_on_time<<24;\r
-\r
- // sedent_on_time=data[2];\r
- // sedent_data.sedent_time |= sedent_on_time<<16;\r
-\r
- // sedent_on_time=data[3];\r
- // sedent_data.sedent_time |= sedent_on_time<<8;\r
-\r
- // sedent_on_time=data[4];\r
- // sedent_data.sedent_time |= sedent_on_time<<0;\r
- memcpy_s( &sedent_data.sedent_time,4,&data[1],4);\r
- \r
-\r
- sedent_data.frequenc = data[5];\r
-\r
- // set_sedent_param(&sedent_data);\r
-\r
- sendBuf[17] = 1;\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 SetmsgfiltrationCmd(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] = 0x1E;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"总长%d\r\n",len);\r
- // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据%s\r\n",data);\r
- uint32_t offset=0;\r
- uint8_t count=0;\r
- while (offset<len)\r
- {\r
- filtration_data data_t={0};\r
- data_t.on=data[offset];\r
- offset++;\r
- data_t.len=data[offset];\r
- offset++;\r
- memcpy_s(data_t.name,filtration_data_max_len,&data[offset],data_t.len);\r
- offset+=data_t.len;\r
- // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%s\r\n",data_t.name);\r
- filtration_file_updata(&data_t,count);\r
- count++;\r
- } \r
- filtration_file_save();\r
- \r
- sendBuf[17] = 1;\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
-\r
-//通过时间戳来获取训练数据\r
-\r
-void SYN_train_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据\r
-{\r
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- if(len==4)\r
- {\r
- uint32_t timetamp=0;\r
- memcpy_s((void*)&timetamp,4,data,4);\r
- cJSON *json_data = ble_get_Trainingdata_by_timetamp(timetamp);\r
- if(json_data==NULL)\r
- {\r
- ble_data_type type_={0x02,0x19,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- return;\r
- }\r
- char *json_str=cJSON_PrintUnformatted(json_data);\r
- uint32_t json_len= strlen(json_str);\r
- cJSON_Delete(json_data);\r
-\r
-\r
- uint32_t surplus_len=json_len;\r
- uint32_t offset=0;\r
-\r
- uint32_t pack;\r
- uint16_t pack_size=(ble_nus_max_data_len-18);\r
- if(pack_size>482)pack_size=482;\r
-\r
- if(json_len%pack_size==0)\r
- {\r
- pack=json_len/pack_size;\r
- }\r
- else\r
- { \r
- pack=json_len/pack_size+1;\r
- }\r
- uint32_t pack_id=1;\r
- while (surplus_len!=0)\r
- {\r
- if(surplus_len>=pack_size)\r
- {\r
- surplus_len=surplus_len-pack_size;\r
-\r
- ble_data_type type_={0x02,0x19,json_len,pack,pack_id};\r
- send_big_data(type_,(char *)json_str+offset,pack_size);\r
- offset+=pack_size;\r
- }\r
- else\r
- {\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",json_len,surplus_len,pack_id,pack);\r
- ble_data_type type_={0x02,0x19,json_len,pack,pack_id};\r
- send_big_data(type_,(char *)json_str+offset,surplus_len);\r
- break;\r
- }\r
- pack_id++;\r
- }\r
-\r
- cJSON_free(json_str);\r
-\r
- }\r
- \r
- }\r
- else\r
- {\r
- ble_data_type type_={0x02,0x19,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- }\r
-}\r
-\r
-\r
-void SYN_train_heart_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据\r
-{\r
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- if(len==4)\r
- {\r
- uint32_t timetamp=0;\r
- memcpy_s((void*)&timetamp,4,data,4);\r
- char path[128]={0};\r
- if(get_training_heart_path(path,timetamp,128))\r
- {\r
- FILE *fp= fopen(path,"rb+");\r
- uint32_t file_size=0;\r
- if(fp==NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
-\r
- ble_data_type type_={0x02,0x4b,0,1,1};\r
- send_big_data(type_,NULL,0);\r
-\r
- return ;\r
- }\r
- fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
- file_size = ftell(fp); // 获取当前文件指针位置,即文件大小\r
- fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
-\r
- int num=(ble_nus_max_data_len-18);\r
- if(num>482)num=482;\r
-\r
- int num_check=file_size%5;//心率数据 5个字节\r
- if(num_check!=0)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);\r
-\r
- ble_data_type type_={0x02,0x4b,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- return ;\r
- }\r
- \r
- char* buf = (char *)ym_malloc(sizeof(char)*num+1);\r
- if(buf==NULL){fclose(fp); return ;}\r
-\r
- uint32_t pack=1;\r
-\r
- if(file_size%num==0)\r
- pack=file_size/num;\r
- else\r
- pack=file_size/num+1;\r
-\r
- uint32_t pack_id=1;\r
- uint32_t read_size=0;\r
- do\r
- {\r
- memset_s(buf,num+1,0,num+1);\r
- read_size=fread(buf,1,num,fp);\r
- if(read_size!=0)\r
- {\r
- ble_data_type type_={0x02,0x4b,file_size,pack,pack_id};\r
- send_big_data(type_,buf,read_size);\r
- }\r
- pack_id++;\r
- } while (read_size==num);\r
- fclose(fp);\r
- free(buf);\r
-\r
- }\r
- }\r
- \r
- }\r
- else\r
- {\r
- ble_data_type type_={0x02,0x4B,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- }\r
-}\r
-\r
-void SYN_train_speed_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据\r
-{\r
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- if(len==4)\r
- {\r
- uint32_t timetamp=0;\r
- memcpy_s((void*)&timetamp,4,data,4);\r
- char path[128]={0};\r
- if(get_training_spead_path(path,timetamp,128))\r
- {\r
- FILE *fp= fopen(path,"rb+");\r
- uint32_t file_size=0;\r
- if(fp==NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
-\r
- ble_data_type type_={0x02,0x18,0,1,1};\r
- send_big_data(type_,NULL,0);\r
-\r
- return ;\r
- }\r
- fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
- file_size = ftell(fp); // 获取当前文件指针位置,即文件大小\r
- fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
-\r
- int num=(ble_nus_max_data_len-18);\r
- if(num>482)num=482;\r
-\r
- int num_check=file_size%6;\r
- if(num_check!=0)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);\r
-\r
- ble_data_type type_={0x02,0x18,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- return ;\r
- }\r
- \r
- char* buf = (char *)ym_malloc(sizeof(char)*num+1);\r
- if(buf==NULL){fclose(fp); return ;}\r
-\r
- uint32_t pack=1;\r
- if(file_size%num==0)\r
- pack=file_size/num;\r
- else\r
- pack=file_size/num+1;\r
- uint32_t pack_id=1;\r
- uint32_t read_size=0;\r
- do\r
- {\r
- memset_s(buf,num+1,0,num+1);\r
- read_size=fread(buf,1,num,fp);\r
- if(read_size!=0)\r
- {\r
- ble_data_type type_={0x02,0x18,file_size,pack,pack_id};\r
- send_big_data(type_,buf,read_size);\r
- }\r
- \r
-\r
- //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);\r
- pack_id++;\r
- } while (read_size==num);\r
-\r
- fclose(fp);\r
- free(buf);\r
-\r
- }\r
- \r
- } \r
- }\r
- else\r
- {\r
- ble_data_type type_={0x02,0x18,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- }\r
-}\r
-\r
-//APP设置步数目标\r
-void SetsteptargetParamCmd(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] = 0x16;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- uint32_t targetStep;\r
- memcpy(&targetStep,data,4);\r
-\r
- uint8_t ringOn=data[4];\r
- uint8_t vibration=data[5];\r
- uint8_t notify=data[6];\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置步数:%d %d %d %d \r\n",targetStep,ringOn,vibration,notify);\r
-\r
- set_goal_stepcount(targetStep);\r
- \r
-\r
- if(ringOn &&vibration && notify)\r
- set_goal_step_notification(1);\r
- else\r
- set_goal_step_notification(0);\r
-\r
-\r
- sendBuf[17] = 1;\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
-\r
-uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据\r
-{\r
- uint8_t *json;\r
- json = buf;\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
- FILE *fp=fopen("/user/userdata/weather.json","wb+");\r
- if(fp != NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
- }\r
- return parse_jsonCheck_weather(buf,check);\r
-}\r
-void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据\r
-{\r
- uint8_t *json;\r
- json = buf;\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
- cJSON* root = cJSON_Parse((const char *)json);\r
- if (root == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
- return ;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");\r
- cJSON *now_cjson = cJSON_GetObjectItem(root, "now");\r
- if(now_cjson == NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
- return ;\r
- }\r
- int humidity=0;\r
- char * windScale=NULL;\r
- char *textNight=NULL;\r
- int uvIndex=0;\r
- int temp=0;\r
- int iconNight=0;\r
-\r
- cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");\r
- if(now_data_humidity)\r
- {\r
- humidity=now_data_humidity->valueint;\r
- }\r
- cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");\r
- if(now_data_windScale)\r
- {\r
- windScale=now_data_windScale->valuestring;\r
- }\r
- cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");\r
- if(now_data_textNight)\r
- {\r
- textNight=now_data_textNight->valuestring;\r
- }\r
- cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");\r
- if(now_data_uvIndex)\r
- {\r
- uvIndex=now_data_uvIndex->valueint;\r
- }\r
- cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");\r
- if(now_data_temp)\r
- {\r
- temp=now_data_temp->valueint;\r
- }\r
- cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");\r
- if(now_data_iconNight)\r
- {\r
- iconNight=now_data_iconNight->valueint;\r
- }\r
- set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);\r
-\r
-\r
- cJSON *address_cjson = cJSON_GetObjectItem(root, "address");\r
-\r
- char*city=NULL;\r
- char*subLocality=NULL;\r
- char*atm=NULL;\r
- int lat=0;\r
- int lon=0;\r
-\r
- cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");\r
- if(address_cjson_)\r
- {\r
- city=address_cjson_->valuestring;\r
- }\r
- \r
- \r
- address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");\r
- if(address_cjson_)\r
- {\r
- subLocality=address_cjson_->valuestring;\r
- } \r
-\r
- address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");\r
- if(address_cjson_)\r
- {\r
- atm=address_cjson_->valuestring;\r
- } \r
- address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");\r
- if(address_cjson_)\r
- {\r
- lat=address_cjson_->valueint;\r
- } \r
-\r
- address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");\r
- if(address_cjson_)\r
- {\r
- lon=address_cjson_->valueint;\r
- } \r
- set_weather_address_data(lat,atm,city,subLocality,lon);\r
- cJSON *daily = cJSON_GetObjectItem(root, "daily");\r
- if(daily==NULL)\r
- {\r
- return ;\r
- }\r
- int count= cJSON_GetArraySize(daily);\r
- for(int i=0;i<count;i++)\r
- { \r
- //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},\r
- cJSON *data=cJSON_GetArrayItem(daily,i);\r
-\r
- int tempMin=0;\r
- int iconDay=0;\r
- int fxDate=0;\r
- char * textDay=NULL;\r
- int tempMax=0;\r
-\r
-\r
- cJSON *data_=cJSON_GetObjectItem(data,"tempMin");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- tempMin=data_->valueint;\r
- }\r
- \r
- data_=cJSON_GetObjectItem(data,"iconDay");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- iconDay=data_->valueint;\r
- }\r
- \r
- data_=cJSON_GetObjectItem(data,"fxDate");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- fxDate=data_->valueint;\r
- }\r
- \r
- data_=cJSON_GetObjectItem(data,"textDay");\r
- if(data_&& cJSON_IsString(data_) )\r
- {\r
- textDay=data_->valuestring;\r
- }\r
- data_=cJSON_GetObjectItem(data,"tempMax");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- tempMax=data_->valueint;\r
- }\r
- set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);\r
-\r
- }\r
- ble_UpdateMainWeatherData();\r
- cJSON_Delete(root);\r
- return ;\r
-}\r
-\r
-uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据\r
-{\r
- uint8_t flag = 0;\r
- // flag = 2;\r
- // memcpy(check,&flag,1);\r
- // return 0;\r
- uint8_t *json;\r
- json = buf;\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
- cJSON* root = cJSON_Parse((const char *)json);\r
- if (root == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
- flag = 2;\r
- memcpy(check,&flag,1);\r
- return 0;\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");\r
- cJSON *now_cjson = cJSON_GetObjectItem(root, "now");\r
- if(now_cjson == NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
- return 0;\r
- }\r
- int humidity=0;\r
- char * windScale=NULL;\r
- char *textNight=NULL;\r
- int uvIndex=0;\r
- int temp=0;\r
- int iconNight=0;\r
-\r
- cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");\r
- if(now_data_humidity)\r
- {\r
- humidity=now_data_humidity->valueint;\r
- }\r
- cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");\r
- if(now_data_windScale)\r
- {\r
- windScale=now_data_windScale->valuestring;\r
- }\r
- cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");\r
- if(now_data_textNight)\r
- {\r
- textNight=now_data_textNight->valuestring;\r
- }\r
- cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");\r
- if(now_data_uvIndex)\r
- {\r
- uvIndex=now_data_uvIndex->valueint;\r
- }\r
- cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");\r
- if(now_data_temp)\r
- {\r
- temp=now_data_temp->valueint;\r
- }\r
- cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");\r
- if(now_data_iconNight)\r
- {\r
- iconNight=now_data_iconNight->valueint;\r
- }\r
- set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);\r
-\r
-\r
- cJSON *address_cjson = cJSON_GetObjectItem(root, "address");\r
-\r
- char*city=NULL;\r
- char*subLocality=NULL;\r
- char*atm=NULL;\r
- int lat=0;\r
- int lon=0;\r
-\r
- cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");\r
- if(address_cjson_)\r
- {\r
- city=address_cjson_->valuestring;\r
- }\r
- \r
- \r
- address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");\r
- if(address_cjson_)\r
- {\r
- subLocality=address_cjson_->valuestring;\r
- } \r
-\r
- address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");\r
- if(address_cjson_)\r
- {\r
- atm=address_cjson_->valuestring;\r
- } \r
- address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");\r
- if(address_cjson_)\r
- {\r
- lat=address_cjson_->valueint;\r
- } \r
-\r
- address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");\r
- if(address_cjson_)\r
- {\r
- lon=address_cjson_->valueint;\r
- } \r
- set_weather_address_data(lat,atm,city,subLocality,lon);\r
- cJSON *daily = cJSON_GetObjectItem(root, "daily");\r
- if(daily==NULL)\r
- {\r
- return 0;\r
- }\r
- int count= cJSON_GetArraySize(daily);\r
- for(int i=0;i<count;i++)\r
- { \r
- //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},\r
- cJSON *data=cJSON_GetArrayItem(daily,i);\r
-\r
- int tempMin=0;\r
- int iconDay=0;\r
- int fxDate=0;\r
- char * textDay=NULL;\r
- int tempMax=0;\r
-\r
-\r
- cJSON *data_=cJSON_GetObjectItem(data,"tempMin");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- tempMin=data_->valueint;\r
- }\r
- \r
- data_=cJSON_GetObjectItem(data,"iconDay");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- iconDay=data_->valueint;\r
- }\r
- \r
- data_=cJSON_GetObjectItem(data,"fxDate");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- fxDate=data_->valueint;\r
- }\r
- \r
- data_=cJSON_GetObjectItem(data,"textDay");\r
- if(data_&& cJSON_IsString(data_) )\r
- {\r
- textDay=data_->valuestring;\r
- }\r
- data_=cJSON_GetObjectItem(data,"tempMax");\r
- if(data_&& cJSON_IsNumber(data_) )\r
- {\r
- tempMax=data_->valueint;\r
- }\r
- set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);\r
-\r
- }\r
-\r
- if( uapi_dev_runtime_get_bt_powerstat() && cm_get_HFP_switch())\r
- uapi_pbap_cmd_start_client();\r
-\r
- bd_addr_t bdaddr={0};\r
- #ifdef FD230\r
- uapi_get_br_address(&bdaddr);\r
- if( uapi_dev_runtime_get_bt_powerstat() && (cm_get_HFP_switch()||cm_get_A2DP_switch()))\r
- {\r
- \r
- if(cm_get_A2DP_switch() && cm_get_A2DP_switch() && false==bt_is_acl_connected(&bdaddr) && !(bdaddr.addr[0]==0 && bdaddr.addr[1]==0 && bdaddr.addr[2]==0 && bdaddr.addr[3]==0 \r
- && bdaddr.addr[4]==0 && bdaddr.addr[5]==0))\r
- {\r
- gap_reconnect_media_device(&bdaddr);\r
- }\r
- else if(cm_get_A2DP_switch())\r
- {\r
- uapi_a2dp_snk_connect();\r
- }\r
- else if(cm_get_HFP_switch())\r
- {\r
- uapi_hfp_connect();\r
- }\r
- \r
- }\r
- \r
- #endif\r
-\r
- ble_UpdateMainWeatherData();\r
- cJSON_Delete(root);\r
- *check = 1;\r
- return 1;\r
-}\r
-/*读取天气历史数据*/\r
-uint8_t read_jsonHistory_weather(void)\r
-{\r
- uint8_t *buf = NULL;\r
- FILE *fp=fopen("/user/userdata/weather.json","rb");\r
- if(fp == NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"read_jsonHistory_weather:fopen error\r\n");\r
- return 0;\r
- }\r
- fseek(fp, 0, SEEK_END);\r
- long size = ftell(fp);\r
- fseek(fp, 0, SEEK_SET);\r
- if (size == 0)\r
- {\r
- fclose(fp);\r
- return 0;\r
- }\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file size = %d\r\n",size);\r
- buf = (uint8_t*)malloc(size + 1);\r
- if(buf == NULL)\r
- {\r
- fclose(fp);\r
- return 0;\r
- }\r
-\r
- char *str = fgets((char *)buf,size + 1,fp);\r
- if(str!=NULL)\r
- {\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file str = %s\r\n",str);\r
- }\r
-\r
- fclose(fp);\r
-\r
- parse_jsonCheck_weather_post(buf);\r
-\r
- free(buf);\r
- \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
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
- #if 0\r
- FILE *fp=fopen("user/AI.txt","wb+");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI len %d\r\n",len);\r
- fwrite((void*)buf,1,len,fp);\r
- //fputs((char *)buf,fp);\r
- fclose(fp);\r
- #endif\r
-\r
- uint16_t offset=0;\r
-\r
- while (len>offset)\r
- {\r
- if(buf[offset]==1)\r
- {\r
- offset++;\r
- if(offset>=len)break;\r
- uint16_t txt_len;\r
- memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
- offset+=2;\r
- if(offset>=len)break;\r
-\r
- char txt_buf[256]={0};\r
- memcpy_s(txt_buf,256,&buf[offset],txt_len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",txt_buf,txt_len);\r
- ble_set_ai_Question_str(txt_buf);\r
- offset+=txt_len;\r
- //offset+=1;\r
- }\r
- if(offset>=len)break;\r
- \r
- if(buf[offset]==2)\r
- {\r
- offset++;\r
- if(offset>=len)break;\r
-\r
- uint16_t txt_len;\r
- memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
- offset+=2;\r
- if(offset>=len)break;\r
-\r
- if(txt_len>=AI_TXT_BUF_MAX_LEN)\r
- txt_len=AI_TXT_BUF_MAX_LEN;\r
-\r
- char *txt_buf=(char*)malloc(txt_len+1);\r
- if(txt_buf==NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf malloc fail\r\n");\r
- ble_set_ai_Answer_str("手表缓存不足",0);\r
- return 0;\r
- }\r
-\r
- txt_buf[txt_len]=0;\r
- memcpy_s((char *)txt_buf,1024*3,&buf[offset],txt_len);\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf Answer %s %d\r\n",txt_buf,txt_len);\r
- ble_set_ai_Answer_str(txt_buf,2);\r
- free(txt_buf);\r
-\r
- offset+=txt_len;\r
- //offset+=1;\r
- }\r
- if(offset>=len)break;\r
-\r
- if(buf[offset]==0)\r
- {\r
- offset++;\r
- if(offset>=len)break;\r
-\r
- uint16_t txt_len;\r
- memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
- offset+=2;\r
- if(offset>=len)break;\r
-\r
- char error_buf[256]={0};\r
- memcpy_s(error_buf,256,&buf[offset],txt_len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
- ble_set_ai_Answer_str(error_buf,0);\r
- offset+=txt_len;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");\r
-\r
- }\r
- if(offset>=len)break;\r
-\r
- if(buf[offset]==3)\r
- {\r
- offset++;\r
- if(offset>=len)break;\r
-\r
- uint16_t txt_len;\r
- memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
- offset+=2;\r
- if(offset>=len)break;\r
-\r
- char error_buf[256]={0};\r
- memcpy_s(error_buf,256,&buf[offset],txt_len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
- ble_set_ai_Answer_str(error_buf,3);\r
- offset+=txt_len;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 回应错误\r\n");\r
-\r
- }\r
- if(offset>=len)break;\r
-\r
- if(buf[offset]==4)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 结束\r\n");\r
- // if(AI_is_end_state)\r
- // {\r
- // AI_is_end_state=0;\r
- // }\r
- offset++;\r
- if(offset>=len)\r
- {\r
- ble_set_ai_Answer_str("",4);\r
- break;\r
- }\r
-\r
- uint16_t txt_len;\r
- memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
- offset+=2;\r
- if(offset>=len)break;\r
-\r
- char error_buf[256]={0};\r
- memcpy_s(error_buf,256,&buf[offset],txt_len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
- ble_set_ai_Answer_str(error_buf,4);\r
-\r
- offset+=txt_len;\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");\r
-\r
- }\r
- if(offset>=len)break;\r
- offset++;\r
- }\r
- \r
- *check = 1;\r
- return 1;\r
-}\r
-\r
-\r
-void SetWeatherCmd(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
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- // uint32_t y=(0xff00);\r
- // uint32_t x =(0xff00& 0Xff00)>>16;\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd %u\r\n",x);\r
- uint8_t check = 1;\r
- jsonCheck_weather(data,&check);\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
-\r
-void SetAiResultCmd(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] = 0x1f;\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
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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 APP_reply_AI_is_ready(uint8_t *data,uint16_t len)\r
-{\r
- if(data[0])\r
- {\r
- if(len>1)\r
- {\r
- //更新chatgptKEY\r
- FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");\r
- if(fp)\r
- {\r
- fwrite(data+1,1,len-1,fp);\r
- fclose(fp);\r
- }\r
- }\r
- }\r
- ble_app_reply(data[0]);\r
-}\r
-void SaveChatGPTCmd(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] = 0x23;\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
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
- //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");\r
- if(fp)\r
- {\r
- fwrite(data,1,len,fp);\r
- fclose(fp);\r
- sendBuf[17] = 1;\r
- }\r
- else\r
- {\r
- sendBuf[17] = 2;\r
- }\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
-\r
-bool bin_Check_schedule(uint8_t *data,uint16_t len)\r
-{\r
- uint16_t offset = 0;\r
- uint16_t buf_len = 0;\r
- uint16_t id_ = 1;\r
- \r
- // 打印函数开始及总长度信息\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule start, total len: %d", len);\r
-\r
- while (offset < len)\r
- {\r
- uint16_t id;\r
- // 解析ID\r
- memcpy_s(&id, 2, &data[offset], 2);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsing ID: 0x%04X at offset: %d", id, offset);\r
- offset += 2;\r
- if (offset >= len)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing ID, break");\r
- break;\r
- }\r
-\r
- // 解析标题长度\r
- memcpy_s(&buf_len, 2, &data[offset], 2);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title length: %d at offset: %d", buf_len, offset);\r
- offset += 2;\r
- if (offset >= len)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title length, break");\r
- break;\r
- }\r
-\r
- // 解析标题内容\r
- char *title = (char*)malloc(buf_len + 1);\r
- if (!title)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for title");\r
- break;\r
- }\r
- memset_s(title, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小\r
- memcpy_s(title, buf_len + 1, &data[offset], buf_len);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed title: [%s] (length: %d) at offset: %d", title, buf_len, offset);\r
-\r
- offset += buf_len;\r
-\r
- if (offset >= len)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title, free title and break");\r
- free(title);\r
- break;\r
- }\r
-\r
- // 解析开始时间\r
- uint32_t timetemp_begin = 0;\r
- memcpy_s(&timetemp_begin, 4, &data[offset], 4);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Start time: %u at offset: %d", timetemp_begin, offset);\r
- offset += 4;\r
- if (offset >= len)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing start time, free title and break");\r
- free(title);\r
- break;\r
- }\r
-\r
- // 解析结束时间\r
- uint32_t timetemp_end = 0;\r
- memcpy_s(&timetemp_end, 4, &data[offset], 4);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "End time: %u at offset: %d", timetemp_end, offset);\r
- offset += 4;\r
- if (offset >= len)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing end time, free title and break");\r
- free(title);\r
- break;\r
- }\r
-\r
- // 解析附加信息长度\r
- memcpy_s(&buf_len, 2, &data[offset], 2);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Additional info length: %d at offset: %d", buf_len, offset);\r
- offset += 2;\r
-\r
- if (buf_len == 0)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No additional info, offset: %d, len: %d", offset, len);\r
- // 调用设置函数\r
- if (offset == len)\r
- {\r
- Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", true);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (complete), id_: %d", id_);\r
- }\r
- else\r
- {\r
- Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", false);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (incomplete), id_: %d", id_);\r
- }\r
- \r
- id_++;\r
- free(title);\r
- continue;\r
- }\r
-\r
- if (offset >= len)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len before parsing additional info, free title and break");\r
- free(title);\r
- break;\r
- }\r
-\r
- // 解析附加信息\r
- char *str_ = (char*)malloc(buf_len + 1);\r
- if (!str_)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for additional info");\r
- free(title);\r
- break;\r
- }\r
- memset_s(str_, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小\r
- memcpy_s(str_, buf_len + 1, &data[offset], buf_len);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed additional info: [%s] (length: %d) at offset: %d", str_, buf_len, offset);\r
-\r
- offset += buf_len;\r
- \r
- // 调用设置函数\r
- if (offset == len)\r
- {\r
- Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, true);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (complete), id_: %d", id_);\r
- }\r
- else\r
- {\r
- Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, false);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (incomplete), id_: %d", id_);\r
- }\r
-\r
- id_++;\r
-\r
- // 释放内存\r
- free(title);\r
- free(str_);\r
- \r
- if (offset >= len)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "All data parsed, exit loop");\r
- break;\r
- }\r
- }\r
- \r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule end, total parsed id count: %d", id_ - 1);\r
- return true;\r
-}\r
-void APP_send_schedule_Cmd(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] = 0x24;\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
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
- //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- printf("11111111111111111\n");\r
- bool val = bin_Check_schedule(data,len);\r
- printf("222222222222222222222\n");\r
- if(val)\r
- {\r
- sendBuf[17] = 1;\r
- }\r
- else\r
- {\r
- sendBuf[17] = 2;\r
- }\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
-bool bin_Check_sos(uint8_t *data,uint16_t len)\r
-{\r
- uint8_t SOS_num=data[0];\r
- uint32_t offset=1;\r
- char *name=NULL;\r
- char *number=NULL;\r
- ble_sos_number_clean();\r
-\r
- while (SOS_num)\r
- {\r
- SOS_num--;\r
- uint8_t sex=data[offset];\r
- offset++;\r
- if(offset>=len)\r
- break;\r
- uint8_t name_len=data[offset];\r
- offset++;\r
- if(offset>=len)\r
- break;\r
- char *name=(char *)malloc(name_len+1);\r
- if(name==NULL)\r
- break;\r
- memset_s(name,255,0,name_len+1);\r
- memcpy_s(name,255,&data[offset],name_len);\r
- offset+=name_len;\r
- if(offset>=len)\r
- break;\r
- uint8_t number_len=data[offset];\r
- offset++;\r
- if(offset>=len)\r
- break;\r
- char *number=(char *)malloc(number_len);\r
- if(number==NULL)\r
- break;\r
- memset_s(number,255,0,number_len+1);\r
- memcpy_s(number,255,&data[offset],number_len);\r
- offset+=number_len;\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sex:%d,name:%s,number:%s;\r\n",sex,name,number);\r
-\r
- ble_add_sos_number(sex,name,number);\r
-\r
- free(number);\r
- number==NULL;\r
- free(name);\r
- name==NULL;\r
-\r
- if(offset>=len)\r
- break;\r
-\r
-\r
- }\r
- if(number)\r
- {\r
- free(number);\r
- }\r
- if(name)\r
- {\r
- free(name);\r
- }\r
-\r
- ble_sos_data_save();\r
-\r
- return true;\r
-}\r
-\r
-void APP_send_sos_Cmd(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] = 0x25;\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
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- if(bin_Check_sos(data,len))\r
- {\r
- sendBuf[17] = 1;\r
- }\r
- else\r
- {\r
- sendBuf[17] = 2;\r
- }\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
-\r
-void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
-{\r
- ble_data_type type_={0x02,0x4f,0,1,1};\r
- send_big_data(type_,NULL,0);\r
-\r
- //send_big_data(1,NULL,0,0,1,1,0x4f,2);\r
-}\r
-\r
-void App_delete_file(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
- uint8_t count=data[0];\r
- uint8_t type=data[1];\r
- if(type==2)\r
- {\r
- if(len-2!=count*2)\r
- {\r
- ble_reply_cmdarr(cmd,reply,1);//crc error\r
- }\r
- else\r
- {\r
- int offest=2;\r
- for(int i=0;i<count;i++)\r
- {\r
- uint16_t id=0;\r
- memcpy_s(&id,2,&data[offest],2);\r
- bool ret = delete_MP3_file_By_ID(id);\r
- if(ret==false)\r
- {\r
- reply[0]=2;\r
- ble_reply_cmdarr(cmd,reply,1);//crc error\r
- return;\r
- }\r
- else\r
- {\r
- offest+=2;\r
- }\r
- }\r
- reply[0]=1;\r
- ble_mp3_list_update();\r
- ble_reply_cmdarr(cmd,reply,1);\r
- }\r
-\r
- }\r
- else\r
- {\r
- reply[0]=2;\r
- ble_reply_cmdarr(cmd,reply,1);\r
- }\r
-\r
- \r
- \r
- }else{\r
- ble_reply_cmdarr(cmd,reply,1);//crc error\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"query dial 0x%04X installed !!!!!!!!\r\n",dial_uid);\r
-\r
- if(!ble_is_dial_install_by_id(dial_uid))\r
- reply[0]=2; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装\r
- else\r
- reply[0]=1; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装\r
- \r
-\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 SetUserInfo(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
-{\r
-\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo ");\r
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- ble_reply_cmd(USER_INFOR_CMD,1);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!!!!!!!\r\n");\r
- msg_user_info_t *p_userinfo = (msg_user_info_t*)data;\r
-\r
- msg_user_info_t msg_userinfo = {0};\r
- msg_userinfo.age = p_userinfo->age;\r
- msg_userinfo.fat_time = p_userinfo->fat_time;\r
- msg_userinfo.gender = p_userinfo->gender;\r
- msg_userinfo.height = p_userinfo->height;\r
- msg_userinfo.target_stand = p_userinfo->target_stand;\r
- msg_userinfo.target_step = p_userinfo->target_step;\r
- msg_userinfo.timeformat = p_userinfo->timeformat;\r
- msg_userinfo.weight = p_userinfo->weight;\r
- msg_userinfo.calorie=p_userinfo->calorie;\r
- msg_userinfo.distance=p_userinfo->distance;\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n",\r
- p_userinfo->age,\r
- p_userinfo->fat_time,\r
- p_userinfo->gender,\r
- p_userinfo->height,\r
- p_userinfo->target_stand,\r
- p_userinfo->target_step,\r
- p_userinfo->timeformat,\r
- p_userinfo->weight\r
- );\r
- \r
- set_user_data(&msg_userinfo);\r
- \r
- }else{\r
- ble_reply_cmd(USER_INFOR_CMD,0);//crc error\r
- }\r
-}\r
-\r
-//APP下发快捷辅助功能参数\r
-void Set_auxil_fun_parm(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
- uint16_t packtmp = 1;\r
- value[0] =0x72;\r
- value[1] =0x02;\r
- value[2] =0x11;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&packtmp,2);\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t paramCnt = data[0];//快捷辅助功能 按照协议文档要区分\r
- set_quick_auxiliary_paramters(paramCnt);\r
- value[17] = 1;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else{\r
- value[17] = 0x00;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-void getTRAIN_TARGETInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
-{\r
-\r
-}\r
-// #include "phoneaddressmodel.h"\r
-//电话薄解析函数\r
-void Parse_addressbook_bin(uint8_t *data,uint16_t len)\r
-{\r
- int num=data[0];//人数\r
- int offset=1;\r
- while (num)\r
- {\r
- uint8 sex = data[offset];\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"性别: %d\r\n",sex);\r
- offset=offset+1;\r
- uint8 name_len=data[offset];\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"name_len %d\r\n",name_len);\r
- char name[32]={0};\r
- if(name_len==0)\r
- {\r
- name_len=strlen("未知");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"未知\r\n");\r
- }\r
- else\r
- {\r
- memcpy(name,&data[offset+1],name_len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"姓名: %s\r\n",name);\r
- // for(int i=0;i<name_len;i++)\r
- // {\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",name[i]);\r
- // }\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");\r
- }\r
- offset=offset+name_len+1;\r
- uint8 phone_num=data[offset]; \r
- offset=offset+1;\r
- for(int i=0;i<phone_num;i++)\r
- { \r
-\r
- uint8 phonen_len=data[offset];\r
- char phonen_name[32]={0};\r
- memcpy(phonen_name,&data[offset+1],phonen_len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"号码: %s\r\n",phonen_name);\r
- // for(int i=0;i<phonen_len;i++)\r
- // {\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",phonen_name[i]);\r
- // }\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");\r
-\r
- offset=offset+phonen_len+1;\r
- }\r
- for(int i=0;i<phone_num;i++)\r
- {\r
- uint8 add = data[offset];\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地长度: %d\r\n",add);\r
- memcpy(name,&data[offset+1],add);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地: %s\r\n",name);\r
- offset=offset+add+1;\r
- uint8 yun = data[offset];\r
- memcpy(name,&data[offset+1],yun);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运营商: %s\r\n",name);\r
- offset=offset+yun+1;\r
- }\r
- \r
- num--;\r
- }\r
- \r
-}\r
-void SetAPPaddressbook(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
- value[0] =0x72;\r
- value[1] =0x02;\r
- value[2] =0x0b;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp,2);\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- addressbookToRead((char*)data);\r
- //同步完就写一次\r
- addressbookTowrite();\r
- value[17] = 0x01;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else{\r
- value[17] = 0x00;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-\r
-}\r
-\r
-//02 类型\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
-\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE4Data typeID:0x%04X\r\n",typeID);\r
- switch (typeID) //ID\r
- {\r
- case USER_INFOR_CMD://app下发的获取用户信息\r
- SetUserInfo(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_PHONE_INFOR_CMD://app下发的下发的手机信息\r
- SetPhoneInfo(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_WATCH_AUXIL_FUN_PARAM_CMD://app下发快捷辅助功能参数\r
- Set_auxil_fun_parm(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case CURR_TIME_CMD:\r
- SetUTCtime(typeID,data,datalen,totalData,crcvalue);//获取时间app下发的时间进行解析\r
- break;\r
- case SET_BLE_NAME_CMD:\r
- getPhoneInfo_test();\r
- break;\r
- case SET_TRAIN_TARGET_CMD://训练目标\r
- SetTarinTarget(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_address_book_CMD:\r
- SetAPPaddressbook(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_ALARM_DATA_CMD:\r
- SetAlarmDataCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_OTHER_TARGET_CMD:\r
- SetOtherTarget(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_PASSWORD_CMD:\r
- SetpasswordCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_SEDENTARINESS_PARAM_CMD:\r
- SetsedentarinessSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_ANCS_MSG_FILTRATION_CMD:\r
- SetmsgfiltrationCmd(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
- App_delete_file(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SYN_BASIC_REAL_HEATR_CMD:\r
- SYN_train_heart_datatCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SYN_TRAIN_DATA_CMD:\r
- SYN_train_datatCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SYN_TRAIN_SPEED_CMD:\r
- SYN_train_speed_datatCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- \r
- case SYN_TODAY_BASIC_TRAIN_TXT_CMD:\r
- break;\r
- case SYN_WATCH_LCD_PARAM_CMD://app下发的同步屏幕参数到手表\r
- GetWatchLcdParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SYN_VOICE_VIBRATION_PARAM_CMD://app下发声音与振动参数\r
- GetVoiceVibrateParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_WATCH_HR_SET_PARAM_CMD://app下发设置心率参数\r
- GetHrSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_WATCH_SPO2_SET_PARAM_CMD:\r
- GetSpo2SetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_DRINK_PARAM_CMD://app下发的喝水提醒设置\r
- SetDrinkSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_SLEEP_PARAM_CMD://app下发的喝水提醒设置\r
- SetsleepSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_STEP_TARGET_CMD://app下发的步数目标设置\r
- SetsteptargetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- \r
- case SET_WEATHER_DATA_CMD://app下发的天气数据\r
- SetWeatherCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case SET_APP_AI_TXT_CMD://app下发的AI数据\r
- SetAiResultCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- \r
- case SYN_APP_GET_GPS_DATA_CMD://app获取GPS数据\r
- GetGPSCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case APP_SEND_CHATGPT_KEY_CMD:\r
- SaveChatGPTCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case APP_SEND_AI_KEY_IS_AVAILABLE_CMD:\r
- APP_reply_AI_is_ready(data,datalen);\r
- break;\r
- case SYN_APP_SCHEDULE_DATA_CMD:\r
- APP_send_schedule_Cmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- case APP_SEND_SOS_DATA_CMD:\r
- APP_send_sos_Cmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- \r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-void reply_app_send_switchDialCmd(bool flag)\r
-{\r
- uint8_t data;\r
- if(flag)\r
- {\r
- data=1;\r
- ble_reply_cmdarr(0x0102,&data,1);\r
- }\r
- else\r
- {\r
- data=3;\r
- ble_reply_cmdarr(0x0102,&data,1);\r
- }\r
-}\r
-\r
-//切换表盘\r
-static void switchDialCmd(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
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x02;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint16_t daila_type = 0;\r
- memcpy(&daila_type,&data[0],2);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"switchDialCmd %d !!!!!!!!!!\r\n",daila_type,data,len);\r
-\r
- ble_set_dial_by_id(daila_type);\r
-\r
- // if(ble_get_dial_id()==daila_type)\r
- // {\r
- // value[17] = 1;//切换成功\r
- // }\r
- // else\r
- // {\r
- // value[17] = 3;//切换失败\r
- // }\r
- \r
- // value[18] = Calculate_CRC(value,18);\r
- // sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;//校验失败\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-\r
-//关于本机内容\r
-static void aboutDeviceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-\r
- uint8_t _major,_mid,_minor;\r
- uapi_get_fw_version(&_major,&_mid,&_minor);\r
- cJSON *dataJSON = cJSON_CreateObject();\r
- cJSON_AddNumberToObject(dataJSON,"code",1);\r
- cJSON_AddNumberToObject(dataJSON,"major",_major);\r
- cJSON_AddNumberToObject(dataJSON,"mid",_mid);\r
- cJSON_AddNumberToObject(dataJSON,"minor",_minor);\r
- unsigned char addr[6];\r
- bluetooth_get_local_addr(&addr[0],6);\r
- char mac_data[24];\r
- memset(mac_data,0,24);\r
- sprintf(mac_data,"%02X:%02X:%02X:%02X:%02X:%02X",addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);\r
- cJSON_AddStringToObject(dataJSON, "macAddress",mac_data);\r
-\r
- char *json_format = cJSON_PrintUnformatted(dataJSON);\r
- cJSON_Delete(dataJSON);\r
- uint32_t data_len = strlen(json_format);\r
- uint8_t value[data_len+19];\r
- memset(value,0,data_len+19);\r
- uint32_t tmp = 1;\r
- uint16_t tmp_data = (uint16_t)data_len;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x03;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&data_len,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- memcpy(value+17,(uint8_t *)json_format,data_len);//17+69 = 86\r
- \r
- value[data_len+17] = Calculate_CRC(value,data_len+17);//\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data_len:%d %x %d!!!!!\r\n",data_len,value[data_len+17],data_len+17);\r
- sendBleData(value,data_len+18);\r
- }else\r
- {\r
- value[17] = 0;\r
- uint8_t lrc = Calculate_CRC(value,18);\r
- value[18] = lrc;\r
- sendBleData(value,19);\r
- }\r
- cJSON_free(json_format);\r
-}\r
-//查找手表 01 04\r
-//设置查找手表的状态,1 校验成 2手表已找到,停止查找手表\r
-void setFindWatchFlag(uint8_t flag)\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x04;\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] = flag;//校验标志\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-}\r
-static void findWatchCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t findFlag = data[0];\r
- CustomEventPublish(TOPIC_EVENT_FIND_WATCH,&findFlag,sizeof(findFlag));//查找手表\r
- setFindWatchFlag(1);\r
- }else\r
- {\r
- setFindWatchFlag(0);\r
- } \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[28];\r
- memset(value,0,28);\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x05;\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\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
-#ifdef SINGLE_USER_PARTITION\r
- static const char * const g_volume_names[1] = { "/user/"};\r
- for (i = 0; i < 1; i++) {\r
-#else\r
- static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};\r
- \r
- for (i = 0; i < 4; i++) {\r
-#endif\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
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);\r
- }\r
- }\r
- if(sdFlag == 1)// 1获取失败 2 获取成功 \r
- {\r
- value[17] = 1;//校验标志\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
- } \r
-}\r
-//获取当前数据\r
-void GetCurDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- // if(!Check_CRC(data,len,crcvalue))\r
- // {\r
- // int data_len=0;\r
- // ble_data_type type_={0x01,0x06,data_len,1,1};\r
- // send_big_data(type_,NULL,0);\r
- // return;\r
- // }\r
- // cJSON *dataJSON = cJSON_CreateObject();\r
- // const char *string_value[7]={"hr","spo2","steps","duration","standup","calories","distance"};\r
- // for(uint8_t i = 0;i<7;i++)\r
- // {\r
- // cJSON* data_arryJSON = cJSON_CreateObject();\r
- // if(data_arryJSON==NULL)\r
- // {\r
- // return;\r
- // }\r
- // uint32_t value=0;\r
- // if(i==0)\r
- // {\r
- // // value=ble_get_heart_data();\r
- // }\r
- // else if(i==1)\r
- // {\r
- // value=ble_get_oxygen_data();\r
- // }\r
- // else if(i==2)\r
- // {\r
- // // value=cywee_get_step_data();\r
- // }\r
- // else if(i==3)\r
- // {\r
- // value=cywee_get_fat_time_data();\r
- // }\r
- // else if(i==4)\r
- // {\r
- // value=1;\r
- // }\r
- // else if(i==5)\r
- // {\r
- // value=cywee_get_calories_data();\r
- // }\r
- // else if(i==6)\r
- // {\r
- // value=cywee_get_distance_data();\r
- // }\r
-\r
-\r
- // cJSON_AddNumberToObject(data_arryJSON,"value",value);\r
- // uint32_t creationTime;\r
- // int ret =uapi_get_timestampe_ss(&creationTime);\r
- // cJSON_AddNumberToObject(data_arryJSON,"time",creationTime);\r
-\r
- // cJSON_AddItemToObject(dataJSON,string_value[i],data_arryJSON);\r
- // }\r
- // cJSON *recJSON= ble_get_recs_data();\r
- // cJSON_AddItemToObject(dataJSON,"recs",recJSON);\r
- // char *json_format = cJSON_PrintUnformatted(dataJSON);\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetCurDataCmd %d %s\n",strlen(json_format),json_format);\r
- // cJSON_Delete(dataJSON);\r
-\r
- // uint32_t data_len = strlen(json_format);\r
- // uint32_t surplus_len=data_len;\r
- // uint32_t pack;\r
- // uint16_t pack_size=(ble_nus_max_data_len-18);\r
- // if(pack_size>482)pack_size=482;\r
-\r
- // if(data_len%pack_size==0)\r
- // {\r
- // pack=data_len/pack_size;\r
- // }\r
- // else\r
- // { \r
- // pack=data_len/pack_size+1;\r
- // }\r
- // uint32_t pack_id=1;\r
- // uint32_t offset=0;\r
- // while (surplus_len!=0)\r
- // {\r
- // if(surplus_len>=pack_size)\r
- // {\r
- // surplus_len=surplus_len-pack_size;\r
-\r
-\r
- // ble_data_type type_={0x01,0x06,data_len,pack,pack_id};\r
- // send_big_data(type_,json_format+offset,pack_size);\r
-\r
- // //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1);\r
- // offset+=pack_size;\r
- // }\r
- // else\r
- // {\r
- \r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
- // ble_data_type type_={0x01,0x06,data_len,pack,pack_id};\r
- // send_big_data(type_,json_format+offset,surplus_len);\r
- // //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1);\r
- // break;\r
- // }\r
- // pack_id++;\r
- // }\r
- // cJSON_free(json_format);\r
- \r
-}\r
-//获取当手表电池电量\r
-static void GetBatteryLevelCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x07;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- float voltage = 0.0F;\r
- uint8_t power = 0;\r
- power = battery_get_voltage(&voltage);\r
- value[17] = power;\r
- value[18] = Calculate_CRC(value,18);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//设置开关//(弃)\r
-static void SetSwitchMessCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x08;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t switch_on = data[0];//0 关闭 1 开启\r
- if(switch_on)\r
- {\r
- //ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);\r
- }\r
- else\r
- {\r
- //ble_ancs_client_subscribe_notify(g_ble_conn_id,0);\r
- }\r
-\r
- value[17] = 1;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟\r
-static void RemoveFileCmd(ble_read_data *buffer_handle,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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x20;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t file_type= data[0];//1 ota 2 MP3\r
-\r
- // TRANSMIT_DATA=TRANS_FREE;\r
- // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- value[17] = 1; //\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-\r
- cancel_recv_file(0);\r
-\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-//获取指定类型文件目录\r
-static void GetFileTypeCmd(uint8_t *data,uint16_t len)\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x21;\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
- if(Check_CRC(data,len,1))\r
- {\r
- uint8_t fileType = data[17];//2 mp3 3 表盘\r
-\r
- value[17] = 1; //1 操作成功 2 操作失败\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//删除指定类型所有的文件\r
-static void DeleteFileTypeCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x22;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- value[17] = 1; //1 操作成功 2 操作失败\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//开启指定运动模式\r
-void reply_APP_OpenSportModeCmd(bool falg)\r
-{\r
-\r
- ble_data_type type_={0x01,0x0A,1,1,1};\r
- char data[1]={0};\r
- if(falg)\r
- data[0]=1;\r
- else\r
- data[0]=2;\r
- send_big_data(type_,data,1);\r
-\r
-}\r
-\r
-\r
-static void OpenSportModeCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x0A;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- training_ble_data.sportType= data[0];//运动类型 0 健走 1跑步 2骑行 3\r
- training_ble_data.controlmd= START;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"开启指定运动%d\r\n",data[0]);\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-\r
- // value[17] = 1; //1 操作成功 2 操作失败\r
- // value[18] = Calculate_CRC(value,18);\r
- // sendBleData(value,19);\r
- }\r
- else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-void reply_APP_SportStopModeCmd(uint16_t time)\r
-{\r
- char data[3]={0};\r
- uint32_t data_len=3;\r
- data[0]=1;\r
- memcpy(&data[1],&time,2);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);\r
- ble_data_type type={0x01,0x0B,data_len,1,1};\r
- send_big_data(type,data,data_len);\r
-}\r
-//结束运动模式\r
-static void StopSportModeCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x0B;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
- training_ble_data.controlmd= END;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"结束运动\r\n");\r
-\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
- // value[17] = 1; //1 操作成功 2 操作失败\r
- // value[18] = Calculate_CRC(value,18);\r
- // sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//设置语言\r
-static void SetLanguageCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x0E;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t language = data[0];\r
- set_languaage(language);\r
- value[17] = 1; //1 操作成功 2 操作失败\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//开启/关闭获取实时训练数据\r
-static void SetRealTimeDataCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x11;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t autoSportData = data[0];//开关 1开启 0关闭\r
- /*进行开启关闭操作*/\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进行开启关闭操作 %d\r\n", autoSportData);\r
- set_traning_updata_auto( autoSportData);\r
-\r
- value[17] = 1; //1 操作成功 2 操作失败\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//设置训练数据采集频率\r
-static void SetRTDataFreCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x14;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t Frequence = data[0];//频率单位是s\r
- /*设置获取频率*/\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置获取频率 %d\r\n", Frequence);\r
- set_traning_updata_freq(Frequence);\r
-\r
- value[17] = 1; //1 操作成功 2 操作失败\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//获取实时训练数据\r
-// void getSportData(char *buf)\r
-// {\r
-// cJSON *dataJSON = cJSON_CreateObject();\r
-// cJSON_AddNumberToObject(dataJSON,"st",1637825067);\r
-// cJSON_AddNumberToObject(dataJSON,"hr",120);\r
-// cJSON_AddNumberToObject(dataJSON,"ca",3657);\r
-// cJSON_AddNumberToObject(dataJSON,"di",5274);\r
-// cJSON_AddNumberToObject(dataJSON,"stp",1234);\r
-// cJSON_AddNumberToObject(dataJSON,"ti",3);\r
-// char *json_format = cJSON_PrintUnformatted(dataJSON);\r
-// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s",json_format);\r
-// cJSON_Delete(dataJSON);\r
-// int dataLen = strlen(json_format);\r
-// memcpy(buf,json_format,dataLen);\r
-// return;\r
-// }\r
-void sendRealTimeDataToAPP(uint8_t flag)\r
-{\r
- if(flag == 0)//校验失败\r
- {\r
- ble_data_type type_={0x01,0x0f,0,1,1};\r
- send_big_data(type_,NULL,0);\r
-\r
- //send_big_data(0,NULL,0,0,1,1,0x0f,1);\r
-\r
- }else \r
- {\r
- training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
- training_ble_data.controlmd= SENDDATA;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送运动实时数据\r\n");\r
-\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
- \r
- }\r
- \r
-}\r
-//获取实时训练数据\r
-static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- sendRealTimeDataToAPP(1);\r
- }else\r
- {\r
- sendRealTimeDataToAPP(0);\r
- }\r
-}\r
-//设置最高心率提醒\r
-static void SetMaxHrRemindCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x15;\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
- if(Check_CRC(data,len,crcvalue))//\r
- {\r
- uint8_t maxHr = data[0];\r
- if(maxHr > 250)maxHr = 250;//最高心率是250\r
- else if(maxHr <= 0) maxHr = 0;\r
- set_traning_heart_max(maxHr);\r
- //设置255 表示心率提醒关闭\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"设置最高心率提醒 %d\r\n",maxHr);\r
- value[17] = 1;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
-}\r
-\r
-void reply_APP_SportPasueResetCmd(uint16_t time)\r
-{\r
- char data[3]={0};\r
- uint32_t data_len=3;\r
- data[0]=1;\r
- memcpy(&data[1],&time,2);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);\r
- ble_data_type type={0x01,0x16,data_len,1,1};\r
- send_big_data(type,data,data_len);\r
-}\r
-\r
-\r
-//训练暂停/恢复\r
-static void GetSportPasueResetCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x16;\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
- if(Check_CRC(data,len,crcvalue))//\r
- {\r
- uint8_t PauseStop = data[0];//0 暂停 1恢复\r
- if(PauseStop==0)\r
- {\r
- training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
- training_ble_data.controlmd= STOP;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动暂停\r\n");\r
-\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
- }\r
- else\r
- {\r
- training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
- training_ble_data.controlmd= RECOVER;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动恢复\r\n");\r
-\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-\r
- }\r
- // value[17] = 1;\r
- // value[18] = Calculate_CRC(value,18);\r
- // sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
-}\r
-//发送当前表盘到app\r
-\r
-void Watch_SendDial_ToAppCmd(void)\r
-{\r
- \r
- uint16_t dialNum =ble_get_dial_id();\r
- ble_data_type type_={0x01,0x17,2,1,1};\r
- send_big_data(type_,(char *)&dialNum,2);\r
-}\r
-\r
-static void SendDialToAppCmd(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
- uint32_t tmp = 1;\r
- uint32_t datalen = 2;\r
- uint16_t tmp_data = 2;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x17;\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
- if(Check_CRC(data,len,crcvalue))//\r
- {\r
- uint16_t dialNum =ble_get_dial_id();\r
- memcpy(&value[17],&dialNum,2);\r
- value[19] = Calculate_CRC(value,19);\r
- sendBleData(value,20);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
-}\r
-//获取手表当前状态\r
-static void GetWatchStatusCmd(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
- uint32_t tmp = 1;\r
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x19;\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
- //0空闲状态 9 usb状态 10 运动训练状态\r
- uint8_t watchStatus = 0;\r
- \r
- if(uapi_dev_runtime_get_train_status())\r
- watchStatus=10;\r
- \r
- value[17] = watchStatus;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-}\r
-//获取手表屏幕参数\r
-static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[21];\r
- memset(value,0,21);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 3;\r
- uint16_t tmp_data = 3;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x1a;\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
-\r
- int brigntess = get_brigthness();\r
- int screen_time =get_ScreenDuration();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time);\r
- switch (get_ScreenDuration()/1000)\r
- {\r
- case 5:\r
- screen_time = 0;\r
- break;\r
- case 10:\r
- screen_time = 1;\r
- break;\r
- case 15:\r
- screen_time = 2;\r
- break;\r
- case 30:\r
- screen_time = 3;\r
- break;\r
- case 60:\r
- screen_time = 4;\r
- break;\r
- case 60*5:\r
- screen_time = 5;\r
- break;\r
- default:\r
- screen_time = 0;\r
- break;\r
- }\r
- bool wrist_on = Get_RaiseToWake();\r
- value[17] = brigntess;\r
- value[18] = screen_time;\r
- value[19] = wrist_on;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd %d %d %d \r\n",brigntess,screen_time,wrist_on);\r
- value[20] = Calculate_CRC(value,20);\r
- sendBleData(value,21);\r
-}\r
-\r
-//App删除表盘 (仅W4手表)\r
-static void DeleteDialUidCmd(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
- uint32_t tmp = 1;\r
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x1b;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint16_t deleteDial = 0;//删除的表盘UID \r
- deleteDial=data[0]+data[1]*256;\r
- \r
- if(ble_delete_dial(deleteDial))\r
- value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败\r
- else\r
- value[17] = 2;// 1删除成功 2 没有改资源 0指令校验失败\r
-\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- \r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
- \r
-}\r
-\r
-//获取手表声音与振动参数 Sound and Vibration\r
-static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[23];\r
- memset(value,0,23);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 5;\r
- uint16_t tmp_data = 5;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x1c;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- int sys_volume = Get_SystemVolume();\r
- int ring_volume = Get_CallVolume();\r
- int media_volume = Get_CallVolume();\r
- uint8_t vibrate_on = get_vibrationremiander();\r
-\r
- bool bell_on = get_SilentMode();\r
-\r
- value[17] = sys_volume;// \r
- value[18] = ring_volume;// \r
- value[19] = media_volume;// \r
- value[20] = bell_on;//\r
- value[21] = vibrate_on;// \r
- value[22] = Calculate_CRC(value,22);\r
- sendBleData(value,23);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
- \r
-}\r
-\r
-//APP获取手表辅助功能参数Auxiliary functions\r
-static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[23];\r
- memset(value,0,23);\r
- uint32_t tmp = 1;\r
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x1d;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t paramCmt = 0;//辅助功能 0\r
- paramCmt = get_quick_auxiliary_paramters();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"paramCmt:%d\r\n",paramCmt);\r
- value[17] = paramCmt;// \r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
- \r
-}\r
-//APP获取手表心率设置\r
-static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[22];\r
- memset(value,0,22);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 4;\r
- uint16_t tmp_data = 4;\r
-\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x1e;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- msg_get_heart_set_param_info_t heart_param;\r
- Get_heart_cmd(&heart_param);\r
-\r
- value[17] = heart_param.frequence;//\r
- value[18] = heart_param.remind_on;//\r
- value[19] = heart_param.max_min;//\r
- value[20] = heart_param.heart;// \r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d ",value[17],value[18],value[19],value[20]);\r
-\r
- value[21] = Calculate_CRC(value,21);\r
- sendBleData(value,22);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
- \r
-}\r
-//APP获取手表血氧设置\r
-static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[21];\r
- memset(value,0,21);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 3;\r
- uint16_t tmp_data = 3;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x1f;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\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
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
- \r
- \r
-}\r
-void cameraSend(uint8_t flag)//2进行手势拍照 3退出拍照界面\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x23;\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] = flag;// \r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-}\r
-//手势拍照协议\r
-static void carmeraCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x23;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t carmera_on = data[0]; //0退出拍照界面 1进入拍照界面\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");\r
- //需要加界面弹窗提示\r
- if(carmera_on == 1)//进入拍照界面\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");\r
- CustomEventPublish(TOPIC_EVENT_ENTER_CMAERA,NULL,0);\r
- }else{//退出拍照弹窗界面\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"退出拍照\r\n");\r
- CustomEventPublish(TOPIC_EVENT_CANCEL_CMAERA,NULL,0);\r
- }\r
- value[17] = 1;// \r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-//APP获取手表喝水提醒设置\r
-static void GetDrinkParamCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x24;\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
- if(1)\r
- {\r
- msg_drink_info_t drink_on_;\r
- ble_get_drink_remind(&drink_on_);\r
- value[17] = drink_on_.drink_on;// \r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-//APP发送恢复出厂设置\r
-static void GetFactoryCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x25;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- value[17] = 1;// \r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\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
-static void GetResetCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x26;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- value[17] = 1;// \r
- value[18] = Calculate_CRC(value,18);\r
- power_buf[0]=REBOOT;\r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);\r
- sendBleData(value,19);\r
-\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-//APP发送关机\r
-static void GetPowerOffCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x27;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- value[17] = 1;// \r
- value[18] = Calculate_CRC(value,18);\r
- power_buf[0]=SHUTDOWN;\r
- CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-\r
-//app发送公英制单位\r
-static void GetMetricCmd(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
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x28;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- uint8_t kmileter = data[0];//公英制单位 0 是公英制 1英制单位\r
- value[17] = 1;// \r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-//app获取久坐设置\r
-static void GetSedentParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[24];\r
- memset(value,0,24);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 6;\r
- uint16_t tmp_data =6;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x31;\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
- if(1)\r
- {\r
- msg_sedent_set_param_info_t data;\r
- get_sedent_param( &data);\r
-\r
- uint8_t on = data.sedent_on;//作息时间设定 0关闭 1开启 1\r
- uint32_t time = data.sedent_time;//时间 4\r
- uint8_t frequenc = data.frequenc;//间隔 1\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%04X %d %d\r\n",time,frequenc,on);\r
- value[17] = on;\r
- memcpy_s(&value[18],4,&time,4);\r
- \r
- value[22] = frequenc;\r
- value[23] = Calculate_CRC(value,23);\r
- sendBleData(value,24);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-\r
-static void GetSleepParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[24];\r
- memset(value,0,24);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 6;\r
- uint16_t tmp_data =6;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x29;\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
- if(1)\r
- {\r
- msg_get_sleep_param_info_t data;\r
-\r
- ble_get_sleep_remind(&data);\r
- uint8_t sleepTime = data.schedule;//作息时间设定 0关闭 1开启\r
- uint8_t bedTimeHour = data.bedtime_hour;//就寝时间\r
- uint8_t bedTimeMin = data.bedtime_min;//就寝时间\r
- uint8_t wakeTimeHour = data.waketime_hour;//起床时间\r
- uint8_t wakeTimeMin = data.waketime_min;//起床时间\r
- uint8_t bedTimeOn = data.bedtime_alarm;//就寝前20分钟提醒时间\r
-\r
- value[17] = sleepTime;\r
- value[18] = bedTimeHour;\r
- value[19] = bedTimeMin;\r
- value[20] = wakeTimeHour;\r
- value[21] = wakeTimeMin;\r
- value[22] = bedTimeOn;\r
- value[23] = Calculate_CRC(value,23);\r
- sendBleData(value,24);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-//app获取所有表盘UID\r
-static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- \r
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- int dial_num=ble_get_dial_num();\r
- \r
- uint16_t data_size=1+dial_num*2;\r
- uint32_t temp_data_size=data_size;\r
- char *dail_uid_buf=(char *)ym_malloc(data_size);\r
- dail_uid_buf[0]=(uint8_t)dial_num;\r
-\r
- if(dial_num *2 !=get_all_dial_id(dail_uid_buf+1,dial_num*2))\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd dial_num %d err\r\n",dial_num);\r
- }\r
- else\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n");\r
-\r
- }\r
- ble_data_type type_={0x01,0x2a,temp_data_size,1,1};\r
- send_big_data(type_,dail_uid_buf,data_size);\r
- //send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1);\r
-\r
- free(dail_uid_buf);\r
- \r
- }else\r
- {\r
- ble_reply_cmd(cmd,0);\r
- }\r
-}\r
-//app获取目标步数设置\r
-static void GetTargetStepCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[25];\r
- memset(value,0,25);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 7;\r
- uint16_t tmp_data = 7;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x2b;\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
- if(1)\r
- {\r
- uint32_t targetStep = get_goal_stepcount();//目标步数 4字节\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"目标步数:%d\r\n",targetStep);\r
-\r
- uint8_t ringOn = get_step_goal_notify_switch();//铃声提醒\r
- uint8_t vibration = get_step_goal_notify_switch();//振动提醒\r
- uint8_t notify = get_step_goal_notify_switch();//通知提醒\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"提醒开关:%d %d %d \r\n",ringOn,vibration,notify);\r
-\r
- memcpy(&value[17],&targetStep,4);//目标步数\r
-\r
- value[21] = ringOn;//铃声提醒\r
- value[22] = vibration;//振动提醒\r
- value[23] = notify;//通知提醒\r
-\r
- value[24] = Calculate_CRC(value,24);\r
- sendBleData(value,25);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-//app其他目标设置\r
-static void GetTargetOtherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[26];\r
- memset(value,0,26);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 8;\r
- uint16_t tmp_data = 8;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x2c;\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
- if(1)\r
- {\r
- uint16_t targetKcal = 0;//目标卡路里\r
- uint8_t targetKm = 0;//目标里程\r
- uint8_t targetstand = 0;//目标站立\r
- uint8_t targetfat = 0;//目标燃脂时间\r
- uint8_t ringTime = 0;//铃声提醒\r
- uint8_t vibration = 0;//振动提醒\r
- uint8_t notify = 0;//通知提醒\r
-\r
- targetKcal = get_goal_caloriescount();\r
- targetKm = get_goal_discount();\r
- targetstand =get_goal_standupcount();\r
- targetfat = get_goal_durationcount();\r
-\r
- ringTime = get_other_goal_notify_switch ();\r
- vibration = get_other_goal_notify_switch();\r
- notify = get_other_goal_notify_switch();\r
- \r
- memcpy(&value[17],&targetKcal,2);//目标卡路里\r
- value[19] = targetKm;//\r
- value[20] = targetstand;//\r
- value[21] = targetfat;//\r
-\r
- value[22] = ringTime;//\r
- value[23] = vibration;//\r
- value[24] = notify;//通知提醒\r
- value[25] = Calculate_CRC(value,25);\r
- sendBleData(value,26);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-} \r
-\r
-static void GetPasswordCmd(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
- if(1)\r
- {\r
- uint8_t data=ble_get_password();\r
- memcpy(&value[17],&data,1);//\r
- \r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-static void GetmsgconfigCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[36];\r
- memset(value,0,36);\r
- uint32_t tmp = 1;\r
- uint32_t datalen = 18;\r
- uint16_t tmp_data = 18;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x33;\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
- if(1)\r
- {\r
- uint8_t data_buf[filtration_data_count];\r
- uint8_t data_buf_len=0;\r
- // memset(data,1,18);\r
- filtration_on_get((uint8_t*)data_buf,&data_buf_len);\r
- // printf("data_buf_len %d\r\n",data_buf_len);\r
- memcpy(&value[17],data_buf,data_buf_len);//\r
- value[17+data_buf_len] = Calculate_CRC(value,17+data_buf_len);\r
- sendBleData(value,18+data_buf_len);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-\r
-\r
-\r
-bool get_AI_PATH_and_size(char *path,uint32_t *size)\r
-{\r
-\r
- memcpy((void*)path,ble_get_ai_audio_path_str(),strlen(ble_get_ai_audio_path_str()));\r
-\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
-#define SEND_AIVOICE_PACKAGE_DELAY 15\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
- uint32_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
-\r
- char *data= (char *)malloc(num+1);\r
- \r
- uint16_t read_size=0;\r
- FILE *fp=fopen(file_name,"rb+");\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetAiRecordCmd size %d\r\n",file_size);\r
- uint32_t pack=file_size/num+1;\r
- uint32_t pack_id=1;\r
- if(fp==NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
- if(read_size!=0)\r
- {\r
- ble_data_type type_={0x01,0x34,file_size,pack,pack_id};\r
- send_big_data(type_,data,read_size);\r
- }\r
- pack_id++;\r
- \r
-\r
- } while (read_size==num);\r
- free(data);\r
- fclose(fp);\r
- }else\r
- {\r
- GetAiRecordFail:\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-static void GetSOSDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint32_t data_len=0;\r
- uint8_t *bin_data = ble_get_sos_all_data_malloc(&data_len);\r
- if(bin_data==NULL)\r
- {\r
- ble_data_type type_={0x01,0x36,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- return;\r
- }\r
- uint32_t surplus_len=data_len;\r
- uint32_t offset=0;\r
-\r
- uint32_t pack;\r
- uint16_t pack_size=(ble_nus_max_data_len-18);\r
- if(pack_size>482)pack_size=482;\r
-\r
- if(data_len%pack_size==0)\r
- {\r
- pack=data_len/pack_size;\r
- }\r
- else\r
- { \r
- pack=data_len/pack_size+1;\r
- }\r
- uint32_t pack_id=1;\r
- while (surplus_len!=0)\r
- {\r
- if(surplus_len>=pack_size)\r
- {\r
- surplus_len=surplus_len-pack_size;\r
-\r
- ble_data_type type_={0x01,0x36,data_len,pack,pack_id};\r
- send_big_data(type_,(char *)bin_data+offset,pack_size);\r
- offset+=pack_size;\r
- }\r
- else\r
- {\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
- ble_data_type type_={0x01,0x36,data_len,pack,pack_id};\r
- send_big_data(type_,(char *)bin_data+offset,surplus_len);\r
- break;\r
- }\r
- pack_id++;\r
- }\r
- free(bin_data);\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd succ\r\n"); \r
- }else\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
- 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] = 0x2d;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- value[17] = 1;//\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-uint8_t is_connect_synchronization_time=0;\r
-\r
-//app发送同步数据结束消息\r
-static void GetSynDataEndCmd(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] = 0x2e;\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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- value[17] = 1;//\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_SYN_END);\r
-\r
- if(is_connect_synchronization_time)\r
- {\r
- watch_synchronization_time();\r
- }\r
- else\r
- {\r
- if(g_ble_conn_id)\r
- {\r
- is_connect_synchronization_time=1;\r
- }\r
- \r
- }\r
- \r
-\r
-\r
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-//同步基础训练历史数据 training history data\r
-static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id)\r
-{\r
-\r
- \r
- char *json_format = NULL;\r
- switch (id)\r
- {\r
- case 0x49:\r
- json_format=struct_to_json_buf_malloc_(day);\r
- break;\r
- case 0x01:\r
- json_format=struct_to_json_buf_malloc_Alarm();\r
- break;\r
- case 0x21:\r
- json_format=dir_to_json_buf_malloc(day);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- \r
- if(json_format == NULL) return ;\r
-\r
- uint32_t data_len = strlen(json_format);\r
- uint32_t surplus_len=data_len;\r
- uint32_t pack;\r
- if(data_len%pack_size==0)\r
- {\r
- pack=data_len/pack_size;\r
- }\r
- else\r
- { \r
- pack=data_len/pack_size+1;\r
- }\r
- uint32_t pack_id=1;\r
- uint32_t offset=0;\r
- while (surplus_len!=0)\r
- {\r
- if(surplus_len>=pack_size)\r
- {\r
- surplus_len=surplus_len-pack_size;\r
-\r
- ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
- send_big_data(type_,json_format+offset,pack_size);\r
-\r
- //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);\r
- offset+=pack_size;\r
- }\r
- else\r
- {\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
- ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
- send_big_data(type_,json_format+offset,surplus_len);\r
- //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);\r
- break;\r
- }\r
- pack_id++;\r
- }\r
- cJSON_free(json_format);\r
-}\r
-\r
-//同步数据结束完成\r
-static void synEndDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint8_t value[18+1];\r
- memset(value,0,18+1);\r
- uint32_t tmp = 1;\r
- uint32_t tmpToall = 0;\r
- uint16_t tmp_data = 0;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x2e;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmpToall,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- value[17] = 1;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
-\r
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
- }else\r
- {\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-\r
-\r
-\r
-//01类型 \r
-/*\r
-cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘\r
-*data:数据,不包含前面17个字节的包头和最后一位的校验和\r
-len 就是data的长度\r
-*totaldata:总的数据内容 包含包头和校验预览做接口是用 如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和\r
-crcvalue;数据的校验和 不包含包头和校验和的计算结果\r
-*/\r
-// 73 01 31 01 00 00 00 01 00 00 00 01 00 00 00 00 00 2 FE\r
-void SetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置入库模式 0关闭 1电信 2-255移动\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- value[0] =0x72;\r
- value[1] =0x01;\r
- value[2] =0x31;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp,2);\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- \r
- int state = 0;\r
- state = data[0];\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data[0];%d state:%d\r\n",data[0],state);\r
- Set_DmpChangeMode(state);\r
- value[17] = 1;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else{\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-// 73 01 32 01 00 00 00 00 00 00 00 01 00 00 00 00 00 crc\r
-\r
-void GetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取入库模式 0关闭 1电信 2-255移动\r
-{\r
- uint8_t value[19];\r
- memset(value,0,19);\r
- uint32_t tmp = 1;\r
- value[0] =0x72;\r
- value[1] =0x01;\r
- value[2] =0x32;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp,2);\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- int state = Get_DmpChangeMode();\r
- value[17] = state;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else{\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];\r
- #ifdef BLE_LOG\r
- \r
- #endif\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE3Data:0x%04X\r\n",cmd);\r
- // uint8_t typeID = cmd_buf[2];\r
- switch (cmd)\r
- {\r
- case SEND_UPPAIR_CMD://清除配对指令\r
- clearPaireCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SWITCH_DIAL_CMD://表盘切换\r
- switchDialCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case ABOUT_DEV_CMD://关于本机内容\r
- aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case FIND_WATCH_CMD://查找手表\r
- findWatchCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_SD_SPACE_CMD://获取sdk的剩余空间\r
- GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_CURR_DATA_CMD://获取当前数据 卡路里 \r
- GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_BATTERY_LEVEL_CMD://获取手表电池电量 \r
- GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SWITCH_MESS_CMD://开关消息推送功能 \r
- SetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
- RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件\r
- DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SWITCH_SPORT_MODE_CMD://开启指定运动模式\r
- OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case STOP_SPORT_MODE_CMD://结束运动模式\r
- StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SET_LANGUGAE_CMD://设置语言\r
- SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_REAL_HEART_CMD://获取实时训练数据\r
- GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据\r
- SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率\r
- SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
-\r
- case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭\r
- SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SPORT_PAUSE_RESET_CMD://训练暂停/恢复\r
- GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘\r
- SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SEND_CURR_STATUS_CMD: //获取手表当前状态\r
- GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数\r
- GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case DELETE_DIAL_CMD://删除表盘UID\r
- DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数\r
- GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数 \r
- GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置\r
- GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置\r
- GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_GESTURE_CARMERA_CMD://获取手势拍照\r
- carmeraCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_DRINK_SWITCH_CMD://获取喝水提醒设置\r
- GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case FACTORY_SET_CMD://app发送恢复出厂设置\r
- GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case RESET_WATCH_CMD://app发送重启指令\r
- GetResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case POWER_OFF_CMD://app发送关机\r
- GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case KM_MILE_CMD://app设置手表公英制单位\r
- GetMetricCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SLEEP_GET_CMD://app获取睡眠设置\r
- GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_SEDENT_CMD:\r
- GetSedentParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case DELETE_ALL_DILA_CMD://app所有表盘UID\r
- GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_TARGET_STEP_CMD://app获取目标步数设置\r
- GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_OTHER_TARGET_CMD://app获取其他目标\r
- GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_UNPAIR_CMD://发送解除配对消息\r
- UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SYN_DATA_END_CMD: //app发送同步数据结束消息\r
- GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_PASSWORD_CMD: //获取手表密码\r
- GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SYN_GET_MSG_CONFIG_CMD: //获取手表消息设置\r
- GetmsgconfigCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- \r
- case APP_GET_AI_PCM_DATA_CMD:\r
- GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case APP_GET_SOS_DATA_CMD:\r
- GetSOSDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- \r
- case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
- case AI_IS_READ_DATA_CMD:\r
- case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据\r
- case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据\r
- case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据\r
- case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据\r
- case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据\r
- case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据\r
- case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据\r
- case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据\r
- case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据\r
- case ALARM_CMD://获取手表闹钟//同步闹钟\r
-\r
- readDevDataBle(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case SET_DMP_MODE_CMD://0X0131\r
- SetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- case GET_DMP_MODE_CMD://0X0132\r
- GetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-//05 类型\r
-void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)\r
-{\r
- uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
- switch (typeID) //ID\r
- {\r
- case FIND_PHONE_CMD://查找手机\r
- // (data,datalen);\r
- break;\r
- case GET_CURR_TIME_CMD://手表获取系统时间\r
- // getPhoneInfo(data,datalen);\r
- break;\r
- case SEND_PARI_SUCESS_CMD:\r
- // GetUTCtime(data,datalen);//获取时间app下发的时间进行解析\r
- break;\r
- case GET_TRANS_END_CMD:\r
- // getPhoneInfo_test();\r
- break;\r
- case SEND_FACTORY_RECORD_CMD:\r
- break;\r
- case REQUEST_EPO_FILE_CMD:\r
- break;\r
- case SEND_TRAIN_STATUS_CMD:\r
- break;\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-\r
-#define STEP_DATA_LEN 8\r
-#define KCAL_DATA_LEN 8\r
-#define DIS_DATA_LEN 8\r
-#define STAND_DATA_LEN 8\r
-#define FATTIME_DATA_LEN 6\r
-#define HEART_DATA_LEN 5\r
-#define SPO2_DATA_LEN 5\r
-uint8_t bleSendTypeID=0; //发送的数据类型\r
-//发送读出来的设备数据to APP\r
-uint16_t max_mtu_szie_data_len = 200;\r
-uint32_t EACH_DATA_LEN=0;//每种数据类型的的长度\r
-\r
-\r
-void Send_Sleep_Bin_Data(uint8_t day, uint16_t num)\r
-{\r
- \r
- char *data=NULL;\r
- uint32_t file_size=1;\r
- uint8_t sleep_count = ble_get_sleep_data_dir(&file_size,day);\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Send_Sleep_Bin_Data file_size : %d \r\n",file_size);\r
-\r
- data=(char *)malloc(file_size);\r
-\r
- if(data==NULL)\r
- {\r
- return;\r
- }\r
-\r
- memset(data,0,file_size);\r
-\r
- data[0]=sleep_count;\r
-\r
- if(data==NULL)\r
- {\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"malloc\r\n");\r
- #endif\r
-\r
- return;\r
- }\r
- ble_get_sleep_data(file_size,day,(uint8_t*)data+1);\r
-\r
-\r
- if(data==NULL || file_size==1)\r
- {\r
- ble_data_type type_={0x01,0x4b,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- //send_big_data(1,NULL,0,0,1,1,0x4b,1);\r
- return;\r
- }\r
- \r
- uint32_t surplus_len=file_size;\r
- uint32_t pack;\r
- if(file_size%num==0)\r
- {\r
- pack=file_size/num;\r
- }\r
- else\r
- { \r
- pack=file_size/num+1;\r
- }\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
- uint32_t pack_id=1;\r
- uint32_t offset=0;\r
- while (surplus_len!=0)\r
- {\r
- if(surplus_len>=num)\r
- {\r
- surplus_len=surplus_len-num;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",num,file_size,pack_id,pack);\r
-\r
- ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};\r
- send_big_data(type_,data+offset,num);\r
- offset+=num;\r
- }\r
- else\r
- {\r
- //#ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",surplus_len,file_size,pack_id,pack);\r
- //#endif\r
- ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};\r
- send_big_data(type_,data+offset,surplus_len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始\r\n");\r
- for(int i=0;i<surplus_len;i++)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02X ",(uint8_t)data[i]);\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"结束\r\n");\r
- break;\r
- }\r
- pack_id++;\r
- }\r
- free(data);\r
- \r
-}\r
-\r
-\r
-bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t id)\r
-{\r
- \r
- // send_big_data(1,NULL,0,0,1,1,id,1);\r
- // return;\r
- char *buf=NULL;\r
- char path[128]={0};\r
- switch (id)\r
- {\r
- case 0x40://同步心率历史数据\r
- get_health_HEART_data_path(path,day,128);\r
- break;\r
- case 0x41://同步血氧历史数据\r
- get_health_OXYGEN_data_path(path,day,128);\r
- break;\r
- }\r
- uint32_t file_size=0;\r
- FILE *fp= fopen(path,"r+");\r
- if(fp==NULL)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
- return false;\r
- }\r
- fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
- file_size = ftell(fp); // 获取当前文件指针位置,即文件大小\r
- fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
-\r
- int num_check=file_size%5;\r
- if(num_check!=0)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "数据有误 %d %d \r\n", file_size, num);\r
- fclose(fp);\r
- return false;\r
- }\r
- \r
- buf = (char *)ym_malloc(sizeof(char)*num+1);\r
- if(buf==NULL){fclose(fp); return false;}\r
-\r
- uint32_t pack=1;\r
- if(file_size%num==0)\r
- pack=file_size/num;\r
- else\r
- pack=file_size/num+1;\r
- uint32_t pack_id=1;\r
- uint32_t read_size=0;\r
- do\r
- {\r
- memset_s(buf,num+1,0,num+1);\r
- read_size=fread(buf,1,num,fp);\r
- if(read_size!=0)\r
- {\r
- ble_data_type type_={0x01,id,file_size,pack,pack_id};\r
- send_big_data(type_, buf, read_size);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%d %d %d %d %d\r\n",read_size,file_size,pack_id,pack);\r
- }\r
- \r
-\r
- //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);\r
- pack_id++;\r
- } while (read_size==num);\r
-\r
- fclose(fp);\r
- free(buf);\r
- return true;\r
-}\r
-\r
-void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)\r
-{\r
-\r
- const char *data=NULL;\r
- uint32_t data_len = 0;\r
- \r
- data=ble_sywee_history(day,&data_len,id);\r
-\r
- if(data==NULL)\r
- {\r
- ble_data_type type_={0x01,id,0,1,1};\r
- send_big_data(type_,NULL,0);\r
-\r
- //send_big_data(1,NULL,0,0,1,1,id,1);\r
- return;\r
- }\r
- uint8_t single_data=8;\r
- if(id==0x44)\r
- {\r
- single_data=6;\r
- }\r
- else if (id==0x45)\r
- {\r
- single_data=4;\r
- }\r
- int check_num=data_len%single_data;\r
- if(check_num!=0)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id);\r
- free(data);\r
- ble_data_type type_={0x01,id,0,1,1};\r
- send_big_data(type_,NULL,0);\r
-\r
- return ;\r
- }\r
-\r
- uint32_t surplus_len=data_len;\r
- uint32_t pack;\r
- if(data_len%pack_size==0)\r
- {\r
- pack=data_len/pack_size;\r
- }\r
- else\r
- { \r
- pack=data_len/pack_size+1;\r
- }\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
- uint32_t pack_id=1;\r
- uint32_t offset=0;\r
- while (surplus_len!=0)\r
- {\r
- if(surplus_len>=pack_size)\r
- {\r
- surplus_len=surplus_len-pack_size;\r
- ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
- send_big_data(type_,data+offset,pack_size);\r
- //send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1);\r
- offset+=pack_size;\r
- }\r
- else\r
- {\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
- #endif\r
-\r
- ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
- send_big_data(type_,data+offset,surplus_len);\r
-\r
- //send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1);\r
- break;\r
- }\r
- pack_id++;\r
- }\r
- free(data);\r
- \r
-}\r
-\r
-//手机app下发读设备数据指令\r
-void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
-{\r
- \r
- uint8_t sendBuf[19];\r
- memset(sendBuf,0,19);\r
- uint8_t type = cmd/256;\r
- uint8_t typeID = cmd-((cmd/256)*256);\r
- uint32_t totaldata_pack = 1;\r
- uint32_t totaldata_packlen = 0;\r
- uint32_t pack_count = 0;\r
- uint16_t pack_datalen = 0;\r
- sendBuf[0]=0x72;\r
- sendBuf[1]=type;\r
- sendBuf[2]=typeID;\r
- memcpy(sendBuf+3,&totaldata_pack,4);//总的数据包\r
- memcpy(sendBuf+7,&totaldata_packlen,4);//总的数据包长度\r
- memcpy(sendBuf+11,&pack_count,4);//分包索引号\r
-\r
- memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度\r
-\r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- bleSendTypeID=cmd-((cmd/256)*256);\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步第%d天的数据\r\n",data[0]);\r
- int num;\r
-\r
- switch (bleSendTypeID)\r
- {\r
- case 0x40://同步心率历史数据\r
- if(uapi_dev_runtime_get_heartrate_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_HEART_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)num=482;\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步心率数据,每包最多:%d 数据 data:%d %d\r\n",num,data[0],len);\r
- #endif\r
- uapi_dev_runtime_set_heartrate_storage_status(1);\r
- if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x40))\r
- {\r
- ble_data_type type_={0x01,0x40,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- }\r
- uapi_dev_runtime_set_heartrate_storage_status(0);\r
- //send_big_data(1,NULL,0,0,1,1,0x40,1);\r
-\r
- break;\r
- case 0x41://同步血氧历史数据\r
- if(uapi_dev_runtime_get_bloodoxygen_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_SPO2_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
-\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)num=482;\r
- uapi_dev_runtime_set_bloodoxygen_storage_status(1);\r
- if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x41))\r
- {\r
- ble_data_type type_={0x01,0x41,0,1,1};\r
- send_big_data(type_,NULL,0);\r
- }\r
- uapi_dev_runtime_set_bloodoxygen_storage_status(0);\r
-\r
- break;\r
- case 0x43: //同步步数历史数据\r
-\r
- if(uapi_dev_runtime_get_goal_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_STEP_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
- \r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)num=482;\r
- uapi_dev_runtime_set_goal_storage_status(1);\r
- Read_BIN_file_buf_send_bin_Data(data[0],num,0x43);\r
- uapi_dev_runtime_set_goal_storage_status(0);\r
-\r
- break;\r
- case 0x44://同步燃脂时间数据\r
-\r
- if(uapi_dev_runtime_get_goal_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_FAT_BURN_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)num=482;\r
- uapi_dev_runtime_set_goal_storage_status(1);\r
- Read_BIN_file_buf_send_bin_Data(data[0],num,0x44);\r
- uapi_dev_runtime_set_goal_storage_status(0);\r
- break;\r
- case 0x45://同步站立历史数据\r
-\r
- if(uapi_dev_runtime_get_goal_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_STAND_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
-\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)\r
- {\r
- num=482;\r
- }\r
- uapi_dev_runtime_set_goal_storage_status(1);\r
- Read_BIN_file_buf_send_bin_Data(data[0],num,0x45);\r
- uapi_dev_runtime_set_goal_storage_status(0);\r
-\r
- break;\r
- case 0x46://同步卡路里历史数据\r
- if(uapi_dev_runtime_get_goal_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_KCAL_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)\r
- {\r
- num=482;\r
- }\r
- uapi_dev_runtime_set_goal_storage_status(1);\r
- Read_BIN_file_buf_send_bin_Data(data[0],num,0x46);\r
- uapi_dev_runtime_set_goal_storage_status(0);\r
- break;\r
- case 0x47://同步距离历史数据\r
-\r
- if(uapi_dev_runtime_get_goal_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_DIS_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)\r
- {\r
- num=482;\r
- }\r
- uapi_dev_runtime_set_goal_storage_status(1);\r
- Read_BIN_file_buf_send_bin_Data(data[0],num,0x47);\r
- uapi_dev_runtime_set_goal_storage_status(0);\r
- break;\r
- case 0x49://同步基础训练历史数据\r
-\r
- if(uapi_dev_runtime_get_train_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_BASIC_TRANIN_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
- EACH_DATA_LEN = DIS_DATA_LEN;\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)\r
- {\r
- num=482;\r
- }\r
- uapi_dev_runtime_set_train_storage_status(1);\r
- Send_json_Data_Cmd(data[0],num,0x49);\r
- uapi_dev_runtime_set_train_storage_status(0);\r
- break;\r
- case 0x01://同步闹钟\r
- EACH_DATA_LEN = DIS_DATA_LEN;\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)\r
- {\r
- num=482;\r
- }\r
- Send_json_Data_Cmd(data[0],num,0x01);\r
- break;\r
- case 0x4b://睡眠历史数据\r
-\r
- if(uapi_dev_runtime_get_sleep_storage_status())\r
- {\r
- ble_reply_cmdarr(SYN_SLEEP_HISTORY_DATA_CMD,NULL,0);\r
- return;\r
- }\r
-\r
- EACH_DATA_LEN = DIS_DATA_LEN;\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)num=482;\r
- uapi_dev_runtime_set_sleep_storage_status(1);\r
- Send_Sleep_Bin_Data(data[0],num);\r
- uapi_dev_runtime_set_sleep_storage_status(0);\r
- break;\r
- case 0x21://文件目录\r
- EACH_DATA_LEN = DIS_DATA_LEN;\r
- num=(ble_nus_max_data_len-18);\r
- if(num>482)\r
- {\r
- num=482;\r
- }\r
- Send_json_Data_Cmd(data[0],num,0x21);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- //sendReadData();\r
- }else{\r
- sendBuf[18] = 0;\r
- sendBleData(sendBuf,19);\r
- }\r
-}\r
-\r
-\r
-\r
-\r
-void getPhoneInfo_test(void)\r
-{\r
- /*\r
- cJSON *dataJSON = cJSON_CreateObject();\r
- cJSON* data_arryJSON = cJSON_CreateArray();\r
- cJSON_AddNumberToObject(dataJSON,"code",1);\r
- \r
- for(uint8_t i =0;i<3;i++)\r
- {\r
- cJSON* itemJSON = cJSON_CreateObject();\r
- cJSON* arrayJSON = cJSON_CreateArray();\r
- for(uint8_t id = 0;id<7;id++)\r
- {\r
- cJSON_AddNumberToObject(arrayJSON,"id",id);\r
- }\r
- \r
- cJSON_AddNumberToObject(itemJSON,"id",i);\r
- cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON);\r
- cJSON_AddNumberToObject(itemJSON,"hour",2+20*i);\r
- cJSON_AddNumberToObject(itemJSON,"minute",30+i*0);\r
- cJSON_AddNumberToObject(itemJSON,"enable",1);\r
- cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON);\r
- }\r
- cJSON_AddItemToObject(dataJSON,"alarm",data_arryJSON);\r
-\r
- char *json_format = cJSON_PrintUnformatted(dataJSON);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\n",strlen(json_format));\r
- cJSON_Delete(dataJSON);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\n",json_format);\r
- uint32_t data_len = strlen(json_format);\r
- uint8_t value[data_len+18];\r
- uint32_t tmp = 1;\r
- uint16_t tmp_data = 1;\r
- value[0] = 0x72;\r
- value[1] = 0x01;\r
- value[2] = 0x01;\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
- memcpy(value+17,(uint8_t *)json_format,data_len);\r
- unsigned char lrc = Calculate_CRC(value,data_len+17);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lrc:%d",lrc);\r
- value[data_len+18] = lrc;\r
- sendBleData(value,data_len+18);\r
- */\r
-\r
- // uint8_t value[128];\r
- // memset(value,0,128);\r
- \r
- // value[0] = 0x72;\r
- // value[1] = 0x01;\r
- // value[2] = 0x0f;\r
- // char buf[128];\r
- // memset(buf,0,128);\r
- // getSportData(&buf);\r
- // uint32_t tmp = 1;\r
- // uint32_t datalen = 1;\r
- // uint16_t tmp_data = 1;\r
- // datalen = strlen(buf);\r
- // tmp_data = datalen;\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
- // memcpy(&value[17],buf,strlen(buf));\r
-\r
- // comfirmPaire(0);\r
-\r
-}\r
-\r
-bool creatMessageDir(void)//创建消息文件夹\r
-{\r
- struct stat info;\r
- if (stat(ANCS_DATA_CONFIG_DIR, &info) != 0)\r
- {\r
- if (mkdir(ANCS_DATA_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)\r
- {\r
- return false; // Failed to create folder\r
- }\r
- }\r
- return true;\r
-}\r
-char *get_message_dir_path(void)//获取信息的文件夹路径\r
-{\r
- return ANCS_DATA_CONFIG_DIR;\r
-}\r
-\r
-void message_data(int uid,int appid,char *title,char *msg,int hasCode)\r
-{\r
-\r
- uint32_t timestampe = 0;\r
- if (uapi_get_timestampe_ss(×tampe) != ERRCODE_SUCC)\r
- {\r
- timestampe = 0;\r
- }\r
- ancs_data_info_t data;\r
- data.title=malloc(strlen(title)+1);\r
- data.msg = malloc(strlen(msg) + 1);\r
- memset_s(data.title, TITLE_BUF_LEN, 0, strlen(title) + 1);\r
- memset_s(data.msg, MSG_BUF_LEN, 0, strlen(msg) + 1);\r
- memcpy_s(data.title, TITLE_BUF_LEN + 1, title, strlen(title));\r
- memcpy_s(data.msg, MSG_BUF_LEN + 1, msg, strlen(msg));\r
-\r
-\r
- data.appid = appid;\r
- data.uid=uid;\r
- data.time=timestampe;\r
- data.read=0;\r
- data.hasCode = hasCode;\r
-\r
- data.msglen = strlen(msg);\r
- data.titlelen = strlen(title);\r
- \r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"message_data %p %p\r\n", data.title, data.msg);\r
-\r
- CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(&data);\r
- return ;\r
-\r
-}\r
-int uft8_check(char *chinese_string,int length)\r
-{\r
- int i = 0;\r
- for (i = 0; i < length;) {\r
- // 判断是否为ASCII字符\r
- if ((unsigned char)chinese_string[i] < 0x80) {\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ASCII character: %d\n", (int)(unsigned char)chinese_string[i]);\r
- i++;\r
- } else {\r
- // 假设这里我们只处理3字节的UTF-8字符\r
- // 实际上,中文字符通常是4字节\r
- if ((unsigned char)chinese_string[i] >= 0xF0) {\r
- // 这里应处理4字节UTF-8字符的逻辑\r
- // 例如: return (chinese_string[i] << 24) | (chinese_string[i + 1] << 16) | (chinese_string[i + 2] << 8) | chinese_string[i + 3];\r
- i += 4; // 跳过4个字节\r
- } else if ((unsigned char)chinese_string[i] >= 0xE0) {\r
- // 这里应处理3字节UTF-8字符的逻辑\r
- // 例如: return (chinese_string[i] << 16) | (chinese_string[i + 1] << 8) | chinese_string[i + 2];\r
- i += 3; // 跳过3个字节\r
- } else {\r
- // 这里应处理2字节UTF-8字符的逻辑\r
- // 例如: return (chinese_string[i] << 8) | chinese_string[i + 1];\r
- i += 2; // 跳过2个字节\r
- }\r
- }\r
- if(i+4 > length)\r
- break;\r
- }\r
- return i;\r
-}\r
-\r
-\r
-//安卓消息接收解析数据 //ANCS 2AE1\r
-uint8_t jscheck_ancs(uint8_t *data)\r
-{\r
- uint8_t *json;\r
- json = data;\r
- cJSON* root = cJSON_Parse((const char *)json);\r
- if (root == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"信息解析 JSON解析 失败\n");\r
- return 2;\r
- }\r
-\r
- int uid_t = 0;\r
- int appid_t = 0;\r
- int hasCode_t = 0;\r
- char *titleBuf;\r
- char *msgBuf;\r
- titleBuf = ym_malloc(TITLE_BUF_LEN+1);\r
- msgBuf = ym_malloc(MSG_BUF_LEN+1);\r
- if(titleBuf == NULL || msgBuf == NULL)//申请内存失败不在申请\r
- {\r
- return 2;\r
- }\r
- memset(titleBuf,0,TITLE_BUF_LEN+1);\r
- memset(msgBuf,0,MSG_BUF_LEN+1);\r
- cJSON* uid = cJSON_GetObjectItem(root, "uid");\r
- if (uid && cJSON_IsNumber(uid)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"uid_t: %d\n", uid->valueint);\r
- uid_t = uid->valueint;\r
- }\r
- cJSON* appid = cJSON_GetObjectItem(root, "appid");\r
- if (appid && cJSON_IsNumber(appid)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"appid_t: %d\n", appid->valueint);\r
- appid_t = appid->valueint;\r
- }\r
- cJSON* title_c = cJSON_GetObjectItem(root, "title");\r
- if (title_c && cJSON_IsString(title_c)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"titleBuf: %s\n", title_c->valuestring);\r
- int len = strlen(title_c->valuestring);\r
- if(len >= TITLE_BUF_LEN){\r
- len = uft8_check(title_c->valuestring,TITLE_BUF_LEN-4);\r
- title_c->valuestring[len++] ='.';\r
- title_c->valuestring[len++] = '.';\r
- title_c->valuestring[len++] = '.';\r
- title_c->valuestring[len++] = 0;\r
- }\r
- memcpy_s(titleBuf,TITLE_BUF_LEN,(uint8_t *)title_c->valuestring,len);\r
- }\r
- cJSON* msg = cJSON_GetObjectItem(root, "msg");\r
- if (msg && cJSON_IsString(msg)) {\r
- int len = strlen(msg->valuestring);\r
- if(len >= MSG_BUF_LEN-4){\r
- len = uft8_check(msg->valuestring,MSG_BUF_LEN-4);\r
- msg->valuestring[len++] ='.';\r
- msg->valuestring[len++] = '.';\r
- msg->valuestring[len++] = '.';\r
- msg->valuestring[len++] = 0;\r
- }\r
- memcpy_s(msgBuf,MSG_BUF_LEN,(uint8_t *)msg->valuestring,len);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msgBuf: %s\n",msgBuf);\r
- }\r
- cJSON* time = cJSON_GetObjectItem(root, "time");\r
- if (time && cJSON_IsString(time)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %s\n", time->valuestring);\r
- // timeBuf = time->valueint;\r
- }\r
- cJSON* hasCode = cJSON_GetObjectItem(root, "hasCode");\r
- if (hasCode && cJSON_IsNumber(hasCode)) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hasCode_t: %d\n", hasCode->valueint);\r
- hasCode_t = hasCode->valueint;\r
- }\r
- cJSON_Delete(root);\r
-\r
- // if(ancs_msg_data!=NULL)\r
- // {\r
- // free(ancs_msg_data);\r
- // ancs_msg_data=NULL;\r
- // }\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message\r\n");\r
- message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message ok\r\n");\r
-\r
- if(titleBuf != NULL){\r
- ym_free(titleBuf);\r
- titleBuf = NULL;\r
- }\r
- if(msgBuf != NULL){\r
- ym_free(msgBuf);\r
- msgBuf = NULL;\r
- }\r
- return 1;\r
-}\r
-\r
-void ancsDataShowCmd(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
- value[0] =0x72;\r
- value[1] =0x02;\r
- value[2] =0x01;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp,2);\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- //解析ancs数据并且显示出来\r
- uint8_t check_ok= 1;\r
- check_ok = jscheck_ancs(data);\r
- value[17] = 1;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }else{\r
- value[17] = 0;\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- }\r
-}\r
-\r
-void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void *data)\r
-{\r
- CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA,(uint8_t*)data,sizeof(ancs_data_info_t));\r
-}\r
-\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
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE1Data typeID:0x%4X\r\n",typeID);\r
- #endif\r
- switch (typeID) //ID\r
- {\r
- case ANDROID_ANCS_CMD://\r
- ancsDataShowCmd(typeID,data,datalen,totalData,crcvalue);\r
- break;\r
- }\r
-}\r
-\r
-void bleRecvANCSData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据\r
-{\r
- uint8_t type = buf_cmd[1];\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%d crcvalue:%x\r\n",buf_cmd[0],type,data_size,data[0],crcvalue);\r
- switch (type)\r
- {\r
- case 0x03://\r
- type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);\r
- break;\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-/**\r
- * less than 20bytes msg reply\r
-*/\r
-errcode_t ble_reply_msgarr(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t *replydata,uint16_t replydata_len)\r
-{\r
-\r
- //发送校验失败\r
-\r
- if (replydata_len > 20)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"datalen is larger than 20, please send with other api !\n");\r
- return ERRCODE_FAIL;\r
- }\r
- uint16_t replybuflen=sizeof(msg_header_t)+replydata_len+1;\r
- uint8_t *replybuf=malloc(replybuflen);\r
- if(replybuf != NULL)\r
- {\r
- msg_header_t *reply_cmd_header=(msg_header_t*)replybuf;\r
- reply_cmd_header->direction = MSG_DIRECTION_SEND;\r
- reply_cmd_header->cmdtype =msg_cmdtype;\r
- reply_cmd_header->cmdid = msg_cmdid;\r
- reply_cmd_header->package_count = 1;\r
- reply_cmd_header->package_index = 1;\r
- reply_cmd_header->package_len = replydata_len;\r
- reply_cmd_header->total_data_len = replydata_len;\r
- memcpy_s(replybuf+sizeof(msg_header_t),replydata_len,replydata,replydata_len); \r
- uint8_t crc_value = Calculate_CRC( replybuf, replybuflen - 1);\r
- replybuf[ replybuflen - 1 ] = crc_value ; //CRC\r
- errcode_t ret=0;\r
- if(msg_cmdtype==6)\r
- {\r
- ret=sendBleData_zhihui(replybuf,replybuflen);\r
-\r
- }else\r
- {\r
- ret= sendBleData(replybuf,replybuflen);\r
- }\r
- \r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ble_reply_msgarr cmdtype %02X cmdid %02X package %d/%d , len %d,total len %d , data[0] %02X crc %02X\n",\r
- reply_cmd_header->cmdtype,\r
- reply_cmd_header->cmdid,\r
- reply_cmd_header->package_index,\r
- reply_cmd_header->package_count,\r
- reply_cmd_header->package_len,\r
- reply_cmd_header->total_data_len,\r
- (replybuf+sizeof(msg_header_t))[0],\r
- crc_value\r
- );\r
- free(replybuf);\r
- return ret;\r
- }else{\r
- return ERRCODE_MALLOC;\r
- }\r
-}\r
-\r
-errcode_t ble_reply_cmdarr(uint16_t msg_cmd,uint8_t *replydata,uint16_t replydata_len)\r
-{\r
-\r
- uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);\r
- uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);\r
- \r
- return ble_reply_msgarr(cmdtype,cmdid,replydata,replydata_len);\r
-\r
-}\r
-errcode_t ble_reply_cmd(uint16_t msg_cmd,uint8_t replydata)\r
-{\r
- uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);\r
- uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msg_cmd %04X cmdtype %02X cmdid %02X\n",msg_cmd,cmdtype,cmdid);\r
- return ble_reply_msg(cmdtype,cmdid,replydata);\r
-}\r
-errcode_t ble_reply_msg(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t replydata)\r
-{\r
- return ble_reply_msgarr(msg_cmdtype,msg_cmdid,&replydata,1);\r
-}\r
-\r
-static uint32_t last_package_id=0;\r
-static void ble_transfer_Timer_CallBack(int data)\r
-{\r
- timer_flie_flag--;\r
-\r
- if(timer_flie_flag==0)\r
- {\r
- cancel_recv_file(1);\r
- }\r
-}\r
-uint8_t OTA_FILE_value=0;\r
-\r
-errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue)\r
-{\r
- if(datalen<sizeof(msg_header_t))\r
- {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- msg_header_t *header = (msg_header_t*)data; \r
-\r
- if(header->cmdtype!=0x06)\r
- {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- uint8_t* data_=data+sizeof(msg_header_t);\r
- //datalen-=18;\r
- datalen=header->package_len;\r
-\r
- if(header->cmdid==0x0B)\r
- { \r
- //取消文件传输\r
- if(Check_CRC(data_,datalen,crcvalue))\r
- {\r
- cancel_recv_file(0);\r
- uint8_t replydata= 1;\r
- ble_reply_msgarr(6,0x0B,&replydata,1);\r
- }\r
- else\r
- {\r
- cancel_recv_file(0);\r
- uint8_t replydata= 0;\r
- ble_reply_msgarr(6,0x0B,&replydata,1);\r
- }\r
-\r
- }\r
- else if(header->cmdid==0x02)\r
- {\r
-\r
- uint32_t package_id=header->package_index;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package_id: %d \r\n",package_id);\r
- if(Check_CRC(data_,datalen,crcvalue))\r
- {\r
- \r
- if(package_id==0)\r
- {\r
- last_package_id=package_id;\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
- {\r
-\r
- buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);\r
-\r
-\r
- }\r
- else if (buffer_handle->file_recv_stat.file_type == 2)\r
- {\r
- char musicpath[64]={0};\r
- get_music_path(musicpath,64);\r
- //"/user/userdata/music"\r
- char filepath[256]={0};\r
- create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);\r
-\r
- buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
- }\r
- else if (buffer_handle->file_recv_stat.file_type == 4)\r
- {\r
- char filepath[128]={0};\r
- if (get_app_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
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
- } \r
- }\r
- else\r
- {\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
- } \r
- }\r
-\r
-\r
-\r
- if (buffer_handle->file_recv_stat.file == NULL)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file \n");\r
- return ERRCODE_FAIL;\r
- }\r
- size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);\r
- if(writtensize == datalen)\r
- {\r
- timer_flie_flag=10;\r
-\r
- buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);\r
- buffer_handle->file_recv_stat.received_size += datalen;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);\r
- OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
-\r
-\r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
-\r
- buffer_handle->file_recv_stat.recv_file_stat = 1;\r
- ////////////////创建文件传输超时定时器//////////////////\r
- uint32_t tick;\r
- osStatus_t retTimer;\r
- if(BR_TRANSFER_timer!=NULL)\r
- {\r
- osTimerDelete(BR_TRANSFER_timer);\r
- BR_TRANSFER_timer = NULL;\r
- }\r
- ble_read_timer_p=buffer_handle;\r
- timer_flie_flag=10;\r
-\r
- BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);\r
- tick =1000;// osMs2Tick(1000);\r
- retTimer = osTimerStart(BR_TRANSFER_timer, tick);\r
- if (retTimer != osOK && BR_TRANSFER_timer != NULL) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);\r
- osTimerDelete(BR_TRANSFER_timer);\r
- BR_TRANSFER_timer = NULL;\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- {\r
- if(buffer_handle->file_recv_stat.file_type==3)\r
- TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;\r
- \r
- if(buffer_handle->file_recv_stat.file_type==1)\r
- TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;\r
- \r
- if(buffer_handle->file_recv_stat.file_type==2)\r
- TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
-\r
- if(buffer_handle->file_recv_stat.file_type==4)\r
- TRANSMIT_DATA=TRANS_BIN_TRANSMITTING;\r
- \r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- }\r
- }\r
- ///////////////////////////////////////////////////////////\r
- }\r
- else if ((last_package_id+1)==package_id)\r
- {\r
- last_package_id=package_id;\r
- if (buffer_handle->file_recv_stat.file == NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n");\r
- return ERRCODE_FAIL;\r
- }\r
- //写入文件\r
- size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);\r
- if(writtensize == datalen)\r
- {\r
- timer_flie_flag=10;\r
-\r
- buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);\r
- buffer_handle->file_recv_stat.received_size += datalen;\r
- OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size\r
- ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size);\r
-\r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- //检查文件是否写完\r
- if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");\r
-\r
- if(BR_TRANSFER_timer)\r
- {\r
- osTimerStop(BR_TRANSFER_timer);\r
- osTimerDelete(BR_TRANSFER_timer);\r
- BR_TRANSFER_timer = NULL;\r
- }\r
- ble_read_timer_p=NULL;\r
-\r
- TRANSMIT_DATA=FILE_IS_DONE;\r
- \r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-\r
- ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功\r
- }\r
-\r
- }\r
- else if (last_package_id==package_id)\r
- {\r
- uint32_t replydata=0xffffffff;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"0xffffffff 包重复\r\n");\r
- //ble_reply_msgarr(6,4,&replydata,4);\r
- }\r
- else if (last_package_id!=package_id)\r
- {\r
- uint32_t replydata= last_package_id+1;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"包错漏\r\n");\r
- \r
-\r
- ble_reply_msgarr(0x06,0x04,&replydata,4);\r
- }\r
- return ERRCODE_SUCC;\r
- }\r
- else\r
- {\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
- return ERRCODE_FAIL;\r
-}\r
-\r
-\r
-\r
-\r
-errcode_t decode_ota_json(ble_read_data *buffer_handle) {\r
-\r
- if (uapi_dev_runtime_get_train_status() == 1) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
- uint16_t datalen = buffer_handle->totalDataLen;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ota_json_file_save %s\n",data);\r
-\r
- cJSON* root = cJSON_Parse((const char *)data);\r
- if(root != NULL)\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
- if(is_free_ota_update(ota_size_json->valueint)==false)\r
- {\r
- TRANSMIT_DATA=TRANS_OTA_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- cJSON_Delete(root);\r
-\r
- return ERRCODE_FAIL;\r
- }\r
- }\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)+1;\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_major_json = cJSON_GetObjectItem(root, "major");\r
- if(ota_major_json != NULL && cJSON_IsNumber(ota_major_json))\r
- {\r
- buffer_handle->file_recv_stat.ota_major = ota_major_json->valueint;\r
- }\r
- cJSON* ota_mid_json = cJSON_GetObjectItem(root, "mid");\r
- if(ota_mid_json != NULL && cJSON_IsNumber(ota_mid_json))\r
- {\r
- buffer_handle->file_recv_stat.ota_mid = ota_mid_json->valueint;\r
- }\r
- cJSON* ota_minor_json = cJSON_GetObjectItem(root, "minor");\r
- if(ota_minor_json != NULL && cJSON_IsNumber(ota_minor_json))\r
- {\r
- buffer_handle->file_recv_stat.ota_minor = ota_minor_json->valueint;\r
- }\r
- cJSON* ota_isforced_json = cJSON_GetObjectItem(root, "isForced");\r
- if(ota_isforced_json != NULL && cJSON_IsNumber(ota_isforced_json))\r
- {\r
- buffer_handle->file_recv_stat.ota_isforced = ota_isforced_json->valueint;\r
- }\r
- cJSON_Delete(root);\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," ota_type= %d, ota_name=%s, ota_size=%d, ota_major=%d, ota_mid=%d, ota_minor=%d, ota_isforced=%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
- buffer_handle->file_recv_stat.ota_major,\r
- buffer_handle->file_recv_stat.ota_mid,\r
- buffer_handle->file_recv_stat.ota_minor,\r
- buffer_handle->file_recv_stat.ota_isforced\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
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
- //进入特殊UI\r
- TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- return ERRCODE_SUCC;\r
- }else{\r
- buffer_handle->receive_file_flag = 0; \r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-\r
-\r
-errcode_t decode_mp3_json(ble_read_data *buffer_handle)\r
-{\r
- if (uapi_dev_runtime_get_train_status() == 1) {\r
- return ERRCODE_FAIL;\r
- }\r
- \r
- uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
- uint16_t datalen = buffer_handle->totalDataLen;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MP3_file_save %s\n",data);\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)+1;\r
-\r
- if (filenamelen > 0 && filenamelen < 255)\r
- {\r
- if(buffer_handle->file_recv_stat.file_name)\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.file_name = malloc(filenamelen);\r
- if (buffer_handle->file_recv_stat.file_name!=NULL)\r
- {\r
- memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);\r
- memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);\r
- }\r
- \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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," MP3_type= %d, MP3_name=%s, MP3_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
- // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
- // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
- // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- if(IS_free_save_Mp3(ota_size_json->valueint)==false)\r
- {\r
- free(buffer_handle->file_recv_stat.file_name);\r
- buffer_handle->file_recv_stat.file_name=NULL;\r
-\r
- TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- return ERRCODE_FAIL;\r
- }\r
- else\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
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-\r
- return ERRCODE_SUCC;\r
- }\r
-\r
- }else{\r
- buffer_handle->receive_file_flag = 0; \r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-\r
-\r
-errcode_t decode_bin_json(ble_read_data *buffer_handle)\r
-{\r
- if (uapi_dev_runtime_get_train_status() == 1) {\r
- return ERRCODE_FAIL;\r
- }\r
- \r
- uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
- uint16_t datalen = buffer_handle->totalDataLen;\r
- // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"decode_bin_json %s\n",data);\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)+1;\r
-\r
- if (filenamelen > 0 && filenamelen < 255)\r
- {\r
- if(buffer_handle->file_recv_stat.file_name)\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.file_name = malloc(filenamelen);\r
- if (buffer_handle->file_recv_stat.file_name!=NULL)\r
- {\r
- memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);\r
- memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);\r
- }\r
- \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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," bin type = %d, bin name =%s, bin 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
- // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
- // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
- // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- if(IS_free_save_Mp3(ota_size_json->valueint)==false)\r
- {\r
- free(buffer_handle->file_recv_stat.file_name);\r
- buffer_handle->file_recv_stat.file_name=NULL;\r
-\r
- TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- return ERRCODE_FAIL;\r
- }\r
- else\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
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-\r
- memset_s(app_name,64,0,64);\r
- memcpy_s(app_name,64, buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name));\r
- \r
-\r
- return ERRCODE_SUCC;\r
- }\r
-\r
- }else{\r
- buffer_handle->receive_file_flag = 0; \r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-static uint16_t ble_dial_uid=0;\r
-\r
-errcode_t decode_dial_info(ble_read_data *buffer_handle)\r
-{\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_dial_info \n");\r
- for(uint8_t i = 0;i<buffer_handle->data_len;i++)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\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
- if(dialinfo.dial_uid<=4)\r
- {\r
- \r
- msg_recv_custom_dial_info_t *custom_dial_info=(msg_recv_custom_dial_info_t*)data;\r
- custom_dial_info->dial_uid+=1;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"custom_dial_info %d %d %d %d",\r
- custom_dial_info->dial_uid,\r
- custom_dial_info->battery,\r
- custom_dial_info->time,\r
- custom_dial_info->time_font);\r
-\r
- ble_save_dial_custom(custom_dial_info);\r
- ble_dial_file_count=*(data+sizeof(msg_recv_custom_dial_info_t));\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," custom_dial file_count %d\r\n",ble_dial_file_count);\r
- \r
- }\r
- else\r
- {\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [0,255] \n");\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- char * filename = malloc(dialinfo.file_name_len);\r
-\r
- ble_dial_file_count= data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len];\r
- if (filename == NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
-\r
- buffer_handle->file_recv_stat.file_name = filename;\r
- \r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," dial name = %s, dial file count = %d \n",\r
- filename,ble_dial_file_count);\r
-\r
- free(filename);\r
- buffer_handle->file_recv_stat.file_name=NULL;\r
- }\r
-\r
- ble_dial_uid = dialinfo.dial_uid;\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
- return ERRCODE_SUCC;\r
-\r
-}\r
-\r
-errcode_t decode_single_dial_info(ble_read_data *buffer_handle)\r
-{\r
-\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_single_dial_info \n");\r
- for(uint8_t i = 0;i<buffer_handle->data_len;i++)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");\r
- if (buffer_handle->data_len == 6)\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
-\r
- ble_dial_file_index= dialinfo.dial_count;\r
-\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [6,255] \n");\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- if (uapi_dev_runtime_get_train_status() == 1) {\r
- return ERRCODE_FAIL;\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
- uapi_dev_runtime_set_dialname(filename);\r
- \r
- if (check_dial_freespace(dialinfo.dial_uid, file_size) == false)\r
- {\r
- free(filename);\r
- filename=NULL;\r
-\r
- TRANSMIT_DATA=TRANS_DIAL_MAX_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- //存表盘id\r
- ble_dial_uid = dialinfo.dial_uid;\r
- // if(ble_dial_uid<=4)\r
- // ble_dial_uid++;\r
-\r
- if(buffer_handle->file_recv_stat.file_name)\r
- {\r
- free(buffer_handle->file_recv_stat.file_name);\r
- buffer_handle->file_recv_stat.file_name=NULL;\r
- }\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
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," 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
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-\r
- // TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;\r
- // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- return ERRCODE_SUCC;\r
- \r
-\r
- \r
-\r
- \r
-\r
-}\r
-static errcode_t install_dial(void)\r
-{\r
- char *lzmapkgname = uapi_dev_runtime_get_dialname();\r
- // 增加初始参数校验打印\r
- if (lzmapkgname == NULL) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n");\r
- return ERRCODE_FAIL;\r
- }\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname);\r
-\r
- // 检查是否为lzma格式包\r
- char *lzmaindex = strstr(lzmapkgname, ".lzma");\r
- if (lzmaindex == NULL) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n");\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- // 创建表盘目录(若不存在)\r
- struct stat info;\r
- if (stat(get_dial_path(), &info) != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n");\r
- if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n");\r
- return ERRCODE_FAIL;\r
- }\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n");\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n");\r
- }\r
-\r
- // 解析表盘基础名称(去除.lzma后缀)\r
- char dial_basename[64] = {0};\r
- int dial_basenamelen = lzmaindex - lzmapkgname;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen);\r
- if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen);\r
- return ERRCODE_FAIL;\r
- }\r
- memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename);\r
-\r
- // 确定解压后bin文件路径\r
- char dialbin_filepath[128] = {0};\r
- if (ble_dial_uid > 5) {\r
- if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n");\r
- return ERRCODE_FAIL;\r
- }\r
- } else {\r
- if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n");\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath);\r
-\r
- // 确定源lzma文件路径\r
- char lzma_filepath[128] = {0};\r
- if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n");\r
- return ERRCODE_FAIL;\r
- }\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath);\r
-\r
- // 执行解压操作\r
- errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret, \r
- (ret == ERRCODE_SUCC) ? "成功" : "失败");\r
-\r
- // 关键:检查解压后bin文件是否存在及大小\r
- struct stat bin_info;\r
- if (stat(dialbin_filepath, &bin_info) != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath);\r
- ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败\r
- } else {\r
- if (bin_info.st_size <= 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size);\r
- ret = ERRCODE_FAIL; // 大小为空视为失败\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size);\r
- }\r
- }\r
-\r
- // 若解压失败,直接返回\r
- if (ret != ERRCODE_SUCC) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n");\r
- return ret;\r
- }\r
-\r
- // 注册并设置表盘\r
- char *namebuf = strtok(lzmapkgname, ".");\r
- if (ble_dial_uid > 5) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid);\r
- install_Register_dial(namebuf, ble_dial_uid);\r
- ble_set_dial_by_id(ble_dial_uid);\r
- } else {\r
- if (ble_dial_file_index == ble_dial_file_count) {\r
- char name_str[32] = {0};\r
- ble_get_custom_dial(ble_dial_uid, name_str);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid);\r
- install_Register_dial(name_str, ble_dial_uid);\r
- ble_set_dial_by_id(ble_dial_uid);\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n", \r
- ble_dial_file_index, ble_dial_file_count);\r
- }\r
- }\r
-\r
- // 删除源lzma文件\r
- #if 1\r
- if (remove(lzma_filepath) != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath);\r
- // 此处不返回失败,仅警告,因为核心安装已完成\r
- } else {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n");\r
- }\r
- #endif\r
-\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n");\r
- return ERRCODE_SUCC;\r
-}\r
-static char file_name[128]={0};\r
-static uint32_t file_size=0;\r
-\r
-bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id)\r
-{\r
-\r
- char *data= (char *)malloc(pack_size+1);\r
- uint16_t read_size=0;\r
- FILE *fp=fopen(file_name,"rb+");\r
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size);\r
-\r
- uint32_t pack=file_size/pack_size+1;\r
- uint32_t pack_id=1;\r
- if(fp==NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);\r
- free(data);\r
- return false;\r
- }\r
-\r
- do\r
- {\r
- memset_s(data,pack_size+1,0,pack_size+1);\r
- read_size=fread(data,1,pack_size,fp);\r
- if(read_size!=0)\r
- {\r
- ble_data_type type_={0x05,id,file_size,pack,pack_id};\r
- send_big_data(type_,(char *)data,read_size);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size);\r
- }\r
- \r
-\r
- //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);\r
- pack_id++;\r
- \r
- } while (read_size==pack_size);\r
- free(data);\r
- fclose(fp);\r
- sendbigDataBufState = false;\r
- return true;\r
-}\r
-\r
-\r
-void delete_app(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)\r
-{\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- if(ble_app_delete(data))\r
- {\r
- ble_reply_cmd(cmd,1);\r
- }\r
- else\r
- {\r
- ble_reply_cmd(cmd,2);\r
- }\r
-\r
- }\r
- else\r
- {\r
- ble_reply_cmd(cmd,0);\r
- }\r
- \r
-}\r
-\r
-void get_app_list(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)\r
-{\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- cJSON *jdata=ble_app_list();\r
-\r
- if(jdata)\r
- {\r
- \r
- char *jsonString = cJSON_PrintUnformatted(jdata);\r
- \r
- if (jsonString == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");\r
- cJSON_Delete(jdata);\r
- return;\r
- }\r
- \r
- uint32_t data_len = strlen(jsonString);\r
- cJSON_Delete(jdata);\r
- \r
- if (data_len == 0) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");\r
- return;\r
- }\r
- int num=(ble_nus_max_data_len-18); \r
- if(num>482)num=482;\r
-\r
- send_long_data(jsonString,num,0x06,0x0E);\r
-\r
- cJSON_free(jsonString);\r
- }\r
-\r
-\r
- }\r
- else\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC ERROR!");\r
- ble_reply_cmd(cmd,0);\r
- }\r
- \r
-}\r
-\r
-void get_watch_msg(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)\r
-{\r
- \r
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- cJSON *jdata=ble_get_watch_msg();\r
-\r
- if(jdata)\r
- {\r
- \r
- char *jsonString = cJSON_PrintUnformatted(jdata);\r
- \r
- if (jsonString == NULL) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");\r
- cJSON_Delete(jdata);\r
- return;\r
- }\r
- \r
- uint32_t data_len = strlen(jsonString);\r
- cJSON_Delete(jdata);\r
- \r
- if (data_len == 0) {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");\r
- return;\r
- }\r
- int num=(ble_nus_max_data_len-18); \r
- if(num>482)num=482;\r
-\r
- send_long_data(jsonString,num,0x06,0x0F);\r
-\r
- cJSON_free(jsonString);\r
- }\r
-\r
-\r
- }\r
- else\r
- {\r
- ble_reply_cmd(cmd,0);\r
- }\r
- \r
-}\r
-\r
-\r
-bool read_dir_send_json()\r
-{\r
- \r
- char *send_buf=NULL;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json xxxxxxxx\r\n");\r
- memset_s(file_name,128,0,128);\r
- send_buf=tar_dir_to_json_buf_malloc_(file_name,&file_size);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json end\r\n");\r
- if( send_buf!=NULL)\r
- {\r
- //send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04);\r
-\r
- ble_data_type type_={0x04,0x26,strlen(send_buf),1,1};\r
- \r
- send_big_data(type_,(char *)send_buf,strlen(send_buf));\r
-\r
- free(send_buf);\r
- return true;\r
- }\r
- else\r
- {\r
- return false;\r
- }\r
-}\r
-\r
-void decode_file_checksum_2AE6(ble_read_data *buffer_handle)\r
-{\r
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
- uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);\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 1\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_ZHIHUI,1);\r
- switch(buffer_handle->file_recv_stat.file_type)\r
- {\r
- case 1: //ota\r
- ble_reply_cmd(FILE_SUCC_TRANSFER,1);\r
- do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);\r
- TRANSMIT_DATA=TRANS_OTA_SUCC;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- \r
- break;\r
- case 2://mp3\r
- TRANSMIT_DATA=TRANS_MP3_SUCC;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- \r
- ble_reply_cmd(FILE_SUCC_TRANSFER,1);\r
- ble_mp3_list_update();\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
-\r
- if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count)\r
- {\r
- TRANSMIT_DATA= TRANS_DIAL_SUCC;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- //0504\r
- ble_reply_cmd(DIAL_SUCC_INSTALL,1);\r
- }\r
- \r
-\r
-\r
- // ble_reply_cmd(GET_TRANS_END_CMD,1);\r
- \r
- }\r
- else\r
- {\r
- TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- ble_reply_cmd(DIAL_SUCC_INSTALL,0);\r
-\r
- }\r
- break;\r
- case 4://dial\r
- TRANSMIT_DATA=TRANS_BIN_SUCC;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- if( ble_bin_install(app_name))\r
- ble_reply_cmd(FILE_SUCC_TRANSFER,1);\r
- else\r
- ble_reply_cmd(FILE_SUCC_TRANSFER,0);\r
-\r
- // ble_mp3_list_update();\r
-\r
- break;\r
- default:\r
- break;\r
- }\r
- }else{\r
- ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,2);\r
- switch (buffer_handle->file_recv_stat.file_type)\r
- {\r
- case 1: //ota\r
- TRANSMIT_DATA=TRANS_OTA_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
- case 2://mp3\r
- TRANSMIT_DATA=TRANS_MP3_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- break;\r
- case 3://dial\r
- TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
-\r
- case 4://dial\r
- TRANSMIT_DATA= TRANS_BIN_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- \r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- }\r
- }else{\r
- ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,0);\r
- switch (buffer_handle->file_recv_stat.file_type)\r
- {\r
- case 1: //ota\r
- TRANSMIT_DATA=TRANS_OTA_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
- case 2://mp3\r
- TRANSMIT_DATA=TRANS_MP3_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- break;\r
- case 3://dial\r
- TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
- case 4://dial\r
- TRANSMIT_DATA= TRANS_BIN_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
- buffer_handle->file_recv_stat.recv_file_stat=0; \r
-}\r
-\r
-void decode_file_checksum(ble_read_data *buffer_handle)\r
-{\r
- uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
- uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);\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 1\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
- 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
- \r
- TRANSMIT_DATA=TRANS_OTA_SUCC;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- \r
-\r
- break;\r
- case 2://mp3\r
- TRANSMIT_DATA=TRANS_MP3_SUCC;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- \r
- ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);\r
- ble_mp3_list_update();\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
-\r
- if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count)\r
- {\r
- TRANSMIT_DATA= TRANS_DIAL_SUCC;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- //0504\r
- ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);\r
- }\r
- \r
-\r
-\r
- // ble_reply_cmd(GET_TRANS_END_CMD,1);\r
- \r
- }\r
- else\r
- {\r
- TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- ble_reply_cmd(DIAL_INSTALL_REPY_CMD,0);\r
-\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
- }else{\r
- ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2);\r
- switch (buffer_handle->file_recv_stat.file_type)\r
- {\r
- case 1: //ota\r
- TRANSMIT_DATA=TRANS_OTA_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
- case 2://mp3\r
- TRANSMIT_DATA=TRANS_MP3_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- break;\r
- case 3://dial\r
- TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- \r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- }\r
- }else{\r
- ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,0);\r
- switch (buffer_handle->file_recv_stat.file_type)\r
- {\r
- case 1: //ota\r
- TRANSMIT_DATA=TRANS_OTA_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
- case 2://mp3\r
- TRANSMIT_DATA=TRANS_MP3_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
- break;\r
- case 3://dial\r
- TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
- buffer_handle->file_recv_stat.recv_file_stat=0; \r
- \r
-}\r
-\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
- \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data typeID:0x%04X datalen %d\r\n",typeID,buffer_handle->totalDataLen);\r
- \r
- bool checkcrc = (get_crc_from_lrc(buffer_handle->lrcvalue) == buffer_handle->crcvalue);\r
-\r
- uint32_t num;\r
- if ( (checkcrc == true ) || \r
- (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))\r
- {\r
- switch (typeID) //ID\r
- {\r
- case OTA_FILE_RECV_CMD://\r
- {\r
- if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)\r
- {\r
- ble_reply_cmd(OTA_FILE_RECV_CMD,1);\r
- }else{\r
- ble_reply_cmd(OTA_FILE_RECV_CMD,2);\r
- } \r
- }\r
- break;\r
- case MP3_FILE_RECV_CMD:\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
- \r
- //if(ble_dial_uid >=5 && \r
- // if(get_dial_num()>=MAX_BLE_EVENT_DIAL_NUM)\r
- // {\r
- // ble_reply_cmd(DIAL_FILE_RECV_CMD,3);\r
-\r
- // }\r
- //else\r
- {\r
- \r
- ble_reply_cmd(DIAL_FILE_RECV_CMD,1);\r
- }\r
- \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 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
- case APP_INAUIRE_EXC_FILE_CMD:\r
- get_tar_dir_file_count();\r
-\r
- if(!read_dir_send_json())\r
- {\r
- ble_reply_cmd(APP_INAUIRE_EXC_FILE_CMD,2);\r
- }\r
- break;\r
- \r
- case APP_START_SEND_EXC_FILE_CMD:\r
- num=(ble_nus_max_data_len-18); \r
- if(num>482)num=482;\r
- if(!Read_tar_file_buf_send_Data(num,0x63))\r
- {\r
- ble_reply_cmd(APP_START_SEND_EXC_FILE_CMD,2);\r
- }\r
- break;\r
- case APP_SEND_EXC_FILE_END_CMD:\r
- if(!tar_rmove(file_name))\r
- {\r
- ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);\r
- }\r
- if(!read_dir_send_json())\r
- {\r
- ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);\r
- }\r
- break;\r
- \r
-\r
- default:\r
- break; \r
- }\r
- \r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data CRC failed!\n");\r
- }\r
- \r
-}\r
-//\r
-void type2AE6Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
- uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];\r
- #ifdef BLE_LOG\r
- \r
- #endif\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE6Data:0x%04X\r\n",cmd);\r
- // uint8_t typeID = cmd_buf[2];\r
- switch (cmd)\r
- {\r
- case OTA_FILE_MSG_CMD :\r
- {\r
- if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)\r
- {\r
- ble_reply_cmd(OTA_FILE_MSG_CMD,1);\r
- }else{\r
- ble_reply_cmd(OTA_FILE_MSG_CMD,2);\r
- } \r
- }\r
- break;\r
-\r
- case OTA_FILE_RECV_CMD://\r
- {\r
- if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)\r
- {\r
- ble_reply_cmd(OTA_FILE_RECV_CMD,1);\r
- }else{\r
- ble_reply_cmd(OTA_FILE_RECV_CMD,2);\r
- } \r
- }\r
- break;\r
-\r
-\r
- case DIAL_COLLECT_FILE_CMD :\r
- {\r
- if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)\r
- {\r
- ble_reply_cmd(DIAL_COLLECT_FILE_CMD,1);\r
- }else{\r
- ble_reply_cmd(DIAL_COLLECT_FILE_CMD,2);\r
- }\r
- break; \r
- }\r
-\r
- case DIAL_SINGEL_FILE_CMD :\r
- {\r
- if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)\r
- {\r
- ble_reply_cmd(DIAL_SINGEL_FILE_CMD,1);\r
-\r
- } else {\r
-\r
- ble_reply_cmd(DIAL_SINGEL_FILE_CMD,2);\r
-\r
- } \r
- break; \r
- }\r
- case MP3_FILE_CMD :\r
- {\r
- if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)\r
- {\r
- ble_reply_cmd(MP3_FILE_CMD,1);\r
- }else{\r
- ble_reply_cmd(MP3_FILE_CMD,2);\r
- } \r
- }\r
- break;\r
- case BIN_FILE_CMD :\r
- {\r
- if (decode_bin_json( buffer_handle) == ERRCODE_SUCC)\r
- {\r
- ble_reply_cmd(BIN_FILE_CMD,1);\r
- }else{\r
- ble_reply_cmd(BIN_FILE_CMD,2);\r
- } \r
- }\r
- break;\r
-\r
- \r
- case FILE_CHECKSUM_RECV_CMD:\r
- decode_file_checksum(buffer_handle);\r
- break;\r
- // case OTA_FILE_DATA_CMD :\r
- // {\r
- // if (decode_ota_data( buffer_handle,data,datalen, crcvalue) == ERRCODE_SUCC)\r
- // {\r
-\r
- // }else{\r
- // ble_reply_cmd(OTA_FILE_DATA_CMD,0);\r
- // } \r
- // }\r
-\r
- case FILE_CHECKSUM_RECV_CMD_ZHIHUI :\r
- decode_file_checksum_2AE6(buffer_handle);\r
- break;\r
- \r
- case OTA_FILE_FAIL_CMD :\r
-\r
- break;\r
-\r
- case APP_DELETE_CMD :\r
- delete_app( cmd, data,datalen,crcvalue);\r
- break; \r
- case GET_LIST_CMD :\r
-\r
- get_app_list( cmd, data,datalen,crcvalue);\r
-\r
- break; \r
- case GET_APP_MSG_CMD:\r
- get_watch_msg( cmd, data,datalen,crcvalue);\r
-\r
- break; \r
- default:\r
- break;\r
- }\r
-}\r
- \r
-\r
-\r
-\r
-void dumpHeader(msg_header_t *msgheader)\r
-{\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dumpHeader(%d) direction %02X, type %02X, id %02X, package_count %d, total_data_len %d,package_index %d , package_len %d\n",\r
- sizeof(msg_header_t),\r
- msgheader->direction, \r
- msgheader->cmdtype, \r
- msgheader->cmdid, \r
- msgheader->package_count,\r
- msgheader->total_data_len, \r
- msgheader->package_index, \r
- msgheader->package_len \r
- );\r
- #endif\r
-}\r
-\r
-errcode_t check_header(msg_header_t *header )\r
-{\r
- if( (header->direction == MSG_DIRECTION_RECV || header->direction == MSG_DIRECTION_RECV_ANDROID) \r
- && (header->cmdtype > 0 && header->cmdtype <= 6 )\r
- && (header->cmdid > 0 && header->cmdid <= 0x50 )\r
- )\r
- {\r
- // 这个是合理的值,可以当做header来处理\r
- dumpHeader(header);\r
- return ERRCODE_SUCC;\r
- }else{\r
- //非header\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"not first package , no header!\n");\r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-\r
-\r
-errcode_t cancel_recv_file(uint8_t flag)\r
-{\r
- if(BR_TRANSFER_timer)\r
- {\r
- timer_flie_flag=0;\r
- osTimerStop(BR_TRANSFER_timer);\r
- osTimerDelete(BR_TRANSFER_timer);\r
- BR_TRANSFER_timer = NULL;\r
- }\r
-\r
- if(ble_read_timer_p)\r
- {\r
- if(flag)\r
- {\r
- if(ble_read_timer_p->file_recv_stat.file_type==1)\r
- {\r
- TRANSMIT_DATA=TRANS_OTA_FAIL;\r
- }\r
- else if (ble_read_timer_p->file_recv_stat.file_type==3)\r
- {\r
- TRANSMIT_DATA=TRANS_DIAL_FAIL;\r
- }\r
- else if(ble_read_timer_p->file_recv_stat.file_type==2)\r
- {\r
- TRANSMIT_DATA=TRANS_MP3_FAIL;\r
- }\r
- else if(ble_read_timer_p->file_recv_stat.file_type==4)\r
- {\r
- TRANSMIT_DATA=TRANS_BIN_FAIL;\r
- }\r
-\r
- else\r
- {\r
- TRANSMIT_DATA=TRANS_FREE;\r
- }\r
- ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败\r
- }\r
- else\r
- {\r
- TRANSMIT_DATA=TRANS_FREE;\r
- }\r
-\r
- ble_read_timer_p->receive_file_flag = 0;\r
-\r
- if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。\r
- {\r
- if (ble_read_timer_p->file_recv_stat.file!=NULL)\r
- {\r
- fclose(ble_read_timer_p->file_recv_stat.file);\r
- ble_read_timer_p->file_recv_stat.file = NULL;\r
- }\r
-\r
- if (ble_read_timer_p->file_recv_stat.file_type == 2)\r
- {\r
- char musicpath[64]={0};\r
- get_music_path(musicpath,64);\r
- //"/user/userdata/music"\r
- char filepath[256]={0};\r
- create_mp3_name(filepath,musicpath,ble_read_timer_p->file_recv_stat.file_name);\r
- remove(filepath);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
- }\r
- else if (ble_read_timer_p->file_recv_stat.file_type == 3)\r
- {\r
- char filepath[128]={0};\r
- if (get_file_recv_file_path(ble_read_timer_p->file_recv_stat.file_name,strlen(ble_read_timer_p->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)\r
- {\r
- remove(filepath);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
- }\r
- }\r
-\r
- if (ble_read_timer_p->file_recv_stat.file_name != NULL)\r
- {\r
- free(ble_read_timer_p->file_recv_stat.file_name);\r
- ble_read_timer_p->file_recv_stat.file_name=NULL;\r
- }\r
- ble_read_timer_p->file_recv_stat.recv_file_stat = -1;\r
- //ble_read_timer_p=NULL;\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- }\r
- // else\r
- // {\r
- // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- // }\r
- ble_read_timer_p=NULL;\r
- \r
- }\r
- \r
- \r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint8_t get_OTA_recv_value()\r
-{\r
- return OTA_FILE_value;\r
-}\r
-\r
-void Set_OTA_recv_value()\r
-{\r
- OTA_FILE_value=0;\r
- return;\r
-}\r
-\r
-static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)\r
-{\r
-\r
- //保存前 4 bytes + 最后 1 byte\r
- int save_len = 4;\r
- uint8_t last_byte = calculate_lrc(data,event_size,0x00);\r
- if (event_size < 4)\r
- {\r
- save_len = event_size;\r
- }\r
- memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample));\r
- buffer_handle->last_data_size = event_size;\r
- memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,save_len);\r
- buffer_handle->last_data_sample[4]=last_byte;\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size)\r
-{\r
-\r
-\r
- //对比前 4 bytes + 最后 1 byte \r
- int save_len = 4;\r
- uint8_t current_sample_data[5];\r
- uint8_t last_byte = calculate_lrc(newdata,cmp_size,0x00);\r
- if (cmp_size < 4)\r
- {\r
- save_len = cmp_size;\r
- }\r
- memset(current_sample_data,0,sizeof(current_sample_data)); \r
- memcpy_s(current_sample_data,sizeof(current_sample_data),newdata,save_len);\r
- current_sample_data[4]=last_byte;\r
- \r
- if (memcmp(lastdata,newdata,5)==0)\r
- {\r
- return ERRCODE_SUCC;\r
- }else{\r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-\r
-errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)\r
-{\r
-\r
- if( event_size == 0 || data == NULL ) return ERRCODE_FAIL;\r
- \r
- if (buffer_handle->last_data_size == event_size)\r
- {\r
- if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error handle_recv_file recve same package header 0x%02X%02X%02X%02X end 0x%02X skip \n"\r
- ,buffer_handle->last_data_sample[0]\r
- ,buffer_handle->last_data_sample[1]\r
- ,buffer_handle->last_data_sample[2]\r
- ,buffer_handle->last_data_sample[3]\r
- ,buffer_handle->last_data_sample[4]);\r
- // return ERRCODE_FAIL;\r
- }\r
- }\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file %d\n",event_size);\r
- save_package_sample(buffer_handle,data,event_size);\r
-\r
-\r
- //第一帧要创建文件\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
- {\r
-\r
- buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);\r
-\r
- }\r
- else if (buffer_handle->file_recv_stat.file_type == 2)\r
- {\r
- char musicpath[64]={0};\r
- get_music_path(musicpath,64);\r
- //"/user/userdata/music"\r
- char filepath[256]={0};\r
- create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);\r
-\r
- buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
- }\r
- else\r
- {\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file NULL\n");\r
- return ERRCODE_FAIL;\r
- }\r
- buffer_handle->file_recv_stat.recv_file_stat = 1;\r
- OTA_FILE_value=0;\r
- ////////////////创建文件传输超时定时器//////////////////\r
- uint32_t tick;\r
- osStatus_t retTimer;\r
- if(BR_TRANSFER_timer!=NULL)\r
- {\r
- osTimerDelete(BR_TRANSFER_timer);\r
- BR_TRANSFER_timer = NULL;\r
- }\r
- ble_read_timer_p=buffer_handle;\r
- timer_flie_flag=10;\r
-\r
- BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);\r
- tick =1000;// osMs2Tick(1000);\r
- retTimer = osTimerStart(BR_TRANSFER_timer, tick);\r
- if (retTimer != osOK && BR_TRANSFER_timer != NULL) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);\r
- osTimerDelete(BR_TRANSFER_timer);\r
- BR_TRANSFER_timer = NULL;\r
- return ERRCODE_FAIL;\r
- }\r
- // if(buffer_handle->file_recv_stat.received_size==0)\r
- {\r
- if(buffer_handle->file_recv_stat.file_type==3)\r
- TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;\r
- \r
- if(buffer_handle->file_recv_stat.file_type==1)\r
- TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;\r
- \r
- if(buffer_handle->file_recv_stat.file_type==2)\r
- TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
-\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- }\r
- \r
- ///////////////////////////////////////////////////////////\r
- }\r
- if (buffer_handle->file_recv_stat.file == NULL)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n");\r
- return ERRCODE_FAIL;\r
- }\r
- //写入文件\r
- size_t writtensize = fwrite(data,1,event_size,buffer_handle->file_recv_stat.file);\r
- if(writtensize == event_size)\r
- {\r
- timer_flie_flag=10;\r
-\r
- buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,event_size,buffer_handle->file_recv_stat.lrcvalue);\r
- buffer_handle->file_recv_stat.received_size += event_size;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);\r
- OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
-\r
-\r
- }else{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,event_size);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- //检查文件是否写完\r
- if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)\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
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");\r
-\r
- if(BR_TRANSFER_timer)\r
- {\r
- osTimerStop(BR_TRANSFER_timer);\r
- osTimerDelete(BR_TRANSFER_timer);\r
- BR_TRANSFER_timer = NULL;\r
- }\r
- ble_read_timer_p=NULL;\r
- TRANSMIT_DATA=FILE_IS_DONE;\r
-\r
- CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
- \r
- ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,1);//接收成功\r
- }\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-//长数据解析\r
-void bleLongRecvData(ble_read_data *buffer_handle,uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据\r
-{\r
- uint8_t type=buf_cmd[1];\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%x crcvalue:%x\r\n",\r
- buffer_handle->cmd_header.cmdtype,\r
- buffer_handle->cmd_header.cmdid,\r
- data_size,\r
- data,\r
- crcvalue);\r
- #endif\r
-\r
- if(buffer_handle->handle==data2ae4Cmd)\r
- {\r
- type2AE4Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);\r
- }\r
- else if (buffer_handle->handle==data2ae3Cmd)\r
- {\r
- type2AE3Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);\r
- }\r
- else if (buffer_handle->handle==data2ae1Cmd)\r
- {\r
- type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);\r
- }\r
- else if (buffer_handle->handle==data2ae0Cmd)\r
- {\r
- type2AE0Data(buffer_handle);\r
- }\r
- else if (buffer_handle->handle==data2ae6Cmd)\r
- {\r
- type2AE6Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);\r
- }\r
-}\r
-\r
-\r
-/// @brief 解码收到的msg\r
-/// @param buffer_handle \r
-/// @return \r
-static errcode_t handle_ble_msg(ble_read_data *buffer_handle)\r
-{\r
-\r
- if(buffer_handle->buffer_to_file == 0)\r
- {\r
- bleLongRecvData(buffer_handle,buffer_handle->data+sizeof(msg_header_t),buffer_handle->totalDataLen,(uint8_t*)(&buffer_handle->cmd_header),buffer_handle->data,buffer_handle->crcvalue);\r
-\r
- }else{\r
- //处理缓存成文件的 \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle ble msg file buffer! not implement\n");\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-/*****\r
- * 组包函数\r
- * 组包校验完成,在分发给对应的handler去解码协议。\r
- * \r
-*/\r
-errcode_t combine_data_internal(ble_read_data *buffer_handle,uint8_t *totalData, uint16_t event_size)\r
-{\r
-\r
-\r
- if(buffer_handle->receive_file_flag == 1 )\r
- {\r
- //接收文件\r
- if(buffer_handle->handle==data2ae6Cmd)\r
- return decode_ota_data( buffer_handle,totalData,event_size,totalData[event_size-1]);\r
- else\r
- return handle_recv_file(buffer_handle,totalData,event_size);\r
- }\r
-\r
- msg_header_t *header = (msg_header_t*)totalData; \r
- //第一帧\r
- if (event_size > sizeof(msg_header_t) && check_header(header) == ERRCODE_SUCC )\r
- {\r
-\r
- if (header->direction == MSG_DIRECTION_RECV_ANDROID)\r
- {\r
- //uapi_dev_runtime_set_android_connection_status(1);\r
- }else{\r
- // uapi_dev_runtime_set_android_connection_status(0);\r
- }\r
- buffer_handle->cmd_header.direction = header->direction;\r
- buffer_handle->cmd_header.cmdtype = header->cmdtype;\r
- buffer_handle->cmd_header.cmdid = header->cmdid;\r
- buffer_handle->cmd_header.package_count = header->package_count;\r
- buffer_handle->cmd_header.total_data_len = header->total_data_len;\r
- buffer_handle->cmd_header.package_len = header->package_len;\r
- buffer_handle->cmd_header.package_index = header->package_index;\r
- //如果有历史数据,没有被清空,可能是历史错误数据,则清空内存。\r
- if (buffer_handle->data!=NULL && buffer_handle->data_len > 0)\r
- {\r
- free(buffer_handle->data);\r
- buffer_handle->data = NULL;\r
- }\r
- if (buffer_handle->tmpfilehandle!=NULL && buffer_handle->data_len>0)\r
- {\r
- fclose(buffer_handle->tmpfilehandle);\r
- buffer_handle->tmpfilehandle = NULL;\r
- }\r
- buffer_handle->data_len = 0;\r
- buffer_handle->crcvalue = 0;\r
- buffer_handle->lrcvalue = 0;\r
- buffer_handle->buffer_to_file = 0;\r
- buffer_handle->decode_type = 0;\r
- buffer_handle->tmpfilehandle = NULL;\r
- uint32_t timestamp_ble=0;\r
- uapi_get_timestampe_ss(×tamp_ble);\r
- buffer_handle->last_timestamp = timestamp_ble;\r
- buffer_handle->totalDataLen = buffer_handle->cmd_header.total_data_len;\r
- if (buffer_handle->totalDataLen > MAX_BLE_MSG_PACKAGE_LEN || buffer_handle->totalDataLen < 0 )\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package is too lardge (%d) than (%d) or too small !\n",buffer_handle->totalDataLen,MAX_BLE_MSG_PACKAGE_LEN);\r
- return ERRCODE_FAIL;\r
- }\r
- if(buffer_handle->totalDataLen+sizeof(msg_header_t)+1 > MAX_BLE_MSG_PACKAGE_LEN)\r
- {\r
- //如果总长度超过限定大小,则写入文件做缓存。\r
- buffer_handle->buffer_to_file = 1;\r
- int filelen = strlen(BLE_MSG_TMP_FILE_NAME);\r
- buffer_handle->data = malloc(filelen);\r
- if (buffer_handle->data== NULL) \r
- {\r
- return ERRCODE_MALLOC;\r
- }\r
- //生成临时文件名\r
- sprintf_s((char*)buffer_handle->data,filelen,BLE_MSG_TMP_FILE_NAME,buffer_handle->handle);\r
- buffer_handle->tmpfilehandle = fopen((const char*)buffer_handle->data,"w+");\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create ble protocol tmpfile %s handle %X\n",buffer_handle->data,buffer_handle->tmpfilehandle);\r
- if (buffer_handle->tmpfilehandle != NULL)\r
- {\r
- //写buffer到文件\r
- size_t ret =fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);\r
- buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"write %d to buffer file!\n",ret);\r
- }\r
- buffer_handle->data_len += event_size;\r
- \r
- }else{\r
- //如果长度在限定大小之内。则写入内存中缓存。\r
- buffer_handle->buffer_to_file = 0;\r
- buffer_handle->data = malloc(buffer_handle->totalDataLen+sizeof(msg_header_t)+1);\r
- if (buffer_handle->data== NULL) \r
- {\r
- return ERRCODE_MALLOC;\r
- }\r
- //创建缓存开始存储包数据\r
- if(buffer_handle->cmd_header.package_len >=0)\r
- {\r
- memcpy_s(buffer_handle->data,buffer_handle->totalDataLen+sizeof(msg_header_t)+1,totalData,event_size);\r
- buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);\r
- buffer_handle->data_len += event_size;\r
- }\r
-\r
- //单一包\r
- if(event_size == sizeof(msg_header_t)+buffer_handle->totalDataLen+1)\r
- {\r
- buffer_handle->crcvalue = totalData[event_size-1];\r
- }\r
- } \r
- \r
- }else{\r
- //处理第二包以后的数据\r
-\r
- //经过第一包处理,仍然data==NULL证明第一帧就是错的,要退出解析。\r
- if (buffer_handle->data== NULL) \r
- {\r
- return ERRCODE_MALLOC;\r
- }\r
- //此处是最后一帧 event_size = (buffer_handle->totalDataLen-buffer_handle->data_len) + 1\r
- if (event_size == (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 -buffer_handle->data_len ))\r
- {\r
- if(buffer_handle->buffer_to_file == 1)\r
- {\r
- fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);\r
- \r
- }else{\r
- memcpy_s(buffer_handle->data+buffer_handle->data_len,buffer_handle->totalDataLen,totalData,event_size);\r
- \r
- }\r
- buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);\r
- buffer_handle->data_len += event_size; \r
- }else if (event_size < (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len)) //中间帧\r
- {\r
- if(buffer_handle->buffer_to_file == 1)\r
- {\r
- fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);\r
- \r
- }else{\r
- memcpy_s(buffer_handle->data+buffer_handle->data_len,(buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len),totalData,event_size);\r
- \r
- }\r
- buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);\r
- buffer_handle->data_len += event_size; \r
- }else{ //异常帧\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"error event_size %d , should <= %d\n",event_size, (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len) );\r
- \r
- }\r
- \r
- }\r
- //如果包完整接收,进行crc校验\r
- if( (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 ) == buffer_handle->data_len )\r
- {\r
- //我们认为最后一个包,应该不包含其他包,因此其最后一位,应当就是crc值,因此可直接获取crc值\r
- buffer_handle->crcvalue = buffer_handle->data[buffer_handle->data_len - 1];//获取crc\r
- //最后一位校验位清0,方便字符串处理\r
- buffer_handle->data[buffer_handle->data_len - 1] = 0;\r
-\r
- //缓存到文件的,处理方法会不同因此单独解决\r
- if(buffer_handle->buffer_to_file == 1)\r
- {\r
- //先关闭临时文件,然后把文件名给协议解析函数即可。\r
- if (buffer_handle->tmpfilehandle != NULL)\r
- {\r
- fclose(buffer_handle->tmpfilehandle);\r
- buffer_handle->tmpfilehandle=NULL;\r
- }\r
- }\r
- // #define COMMON_CRC_MSG \r
- //通用回复crc校验结果,不是所有指令都一致,暂时取消,在每个指令内部进行回复\r
- #ifdef COMMON_CRC_MSG \r
- if (get_crc_from_lrc(buffer_handle->lrcvalue) != buffer_handle->crcvalue)\r
- {\r
- //发送校验失败\r
- ble_reply_msg(buffer_handle->cmd_header.cmdtype,buffer_handle->cmd_header.cmdid,0);\r
-\r
- }else \r
- #endif \r
- {\r
- //协议解析指令\r
- handle_ble_msg(buffer_handle);\r
- }\r
- //所有操作都完成,要释放 data \r
- if(buffer_handle->data != NULL)\r
- {\r
- free(buffer_handle->data);\r
- buffer_handle->data=NULL;\r
- }\r
- \r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-\r
-\r
-void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)\r
-{\r
-\r
- if (event_size < sizeof(msg_header_t))\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"event size (%d) is less than msg_header_t (%d) ",event_size,sizeof(msg_header_t));\r
- // return ;\r
- }\r
- #ifdef BLE_LOG\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bleDataRecv handle:%d\r\n",handle); \r
- #endif\r
- int last_unused_handle_index = -1;\r
- int handle_index_found = -1;\r
- for(int i = 0;i<MAX_HANDLE_NUM;i++)\r
- { \r
- if(handle_l[i].handle == 0 && last_unused_handle_index == -1)\r
- {\r
- last_unused_handle_index = i; \r
- }\r
- if(handle_l[i].handle == handle)\r
- {\r
- //找到当前handle的缓存数据 ,进行组包\r
- handle_index_found = i;\r
- break;\r
- }\r
- }\r
- //如果没找到已经用到的handle_l,就用第一个空的handle_l\r
- if(last_unused_handle_index >=0 && handle_index_found == -1)\r
- {\r
- handle_index_found = last_unused_handle_index; \r
- }\r
-\r
- if(handle_index_found>=0)\r
- {\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_index_found:index %d addr %X\r\n",handle_index_found,&handle_l[handle_index_found]); \r
- handle_l[handle_index_found].handle = handle;\r
- combine_data_internal(&handle_l[handle_index_found],totalData,event_size);\r
- }\r
- else\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"no empty handle_l found! skip this msg!\n");\r
-\r
- \r
-}\r
-\r
-void free_ble_data(void)//以防断开蓝牙没有释放数据类型\r
-{\r
- blesrv_service_recv_msg_handler(0xff,(uint8_t*)"clean",6);\r
- return;\r
- \r
-}\r
-\r
-\r
-void cancel_AI_cur_chat(void)\r
-{\r
- blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_cancel_AI",13);\r
- return;\r
- //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
-}\r
-\r
-void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型\r
-{\r
- \r
- totalpack = 0;\r
- muiltFlag = 0; \r
- packdataLen = 0;\r
- totalDataLen = 0;\r
- ANCSBigBufFlag = 0;\r
-\r
- recvBigDataBufState = false;\r
- sendbigDataBufState = false;\r
-\r
- is_connect_synchronization_time=0;\r
-\r
-\r
- cancel_recv_file(1);\r
-\r
- for (int i = 0 ; i < MAX_HANDLE_NUM ; i++)\r
- {\r
- if (handle_l[i].data != NULL)\r
- {\r
- free(handle_l[i].data);\r
- handle_l[i].data=NULL;\r
- }\r
- memset((void*)&handle_l[i],0,sizeof(ble_read_data));\r
- }\r
- return;\r
- \r
-}\r
-\r
-//发送AI录音准备就绪国内/\r
-/*使用模型:\r
-0:文心一言\r
-1:ChatGPT\r
-2:KIMI\r
-3:豆包*/\r
-bool send_AI_is_ready_(uint8_t type)\r
-{\r
- \r
- if(AI_is_end_state==0)\r
- { \r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");\r
- ble_data_type type_={0x05,0x05,1,1,1};\r
- send_big_data(type_,(char *)&type,1);\r
- AI_is_end_state=1;\r
- return true;\r
- }\r
- else\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪失败,没有正确回复结束\r\n");\r
- return false;\r
- }\r
- //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);\r
-}\r
-\r
-static uint8_t AI_is_ready_type=0;\r
-\r
-bool send_AI_is_ready(uint8_t type)\r
-{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");\r
- AI_is_ready_type=type;\r
- blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_is_ready",12);\r
- return true;\r
-}\r
-\r
-void cancel_AI_cur_chat_(void)\r
-{\r
- //if(AI_is_end_state)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"取消当前AI对话\r\n");\r
- uint8_t data=1;\r
- ble_data_type type_={0x05,0x07,1,1,1};\r
- send_big_data(type_,(char *)&data,1);\r
- AI_is_end_state=0;\r
- \r
- }\r
- //else\r
- // {\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"已经取消当前AI对话无需再次取消\r\n");\r
- // }\r
- \r
-\r
- //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
-}\r
-\r
-//接收app下发的原始数据 \r
-void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小\r
-{\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size);\r
- if(handle==0xff)\r
- {\r
- if(strcmp("AI_cancel_AI",(char *)buf)==0)\r
- {\r
- cancel_AI_cur_chat_();\r
- }\r
- else if(strcmp("AI_is_ready",(char *)buf)==0)\r
- {\r
- send_AI_is_ready_(AI_is_ready_type);\r
- }\r
- else\r
- {\r
- free_ble_data_Event();\r
- }\r
- \r
- return;\r
- }\r
-\r
- bleDataRecv(buf,event_size,handle);\r
-}\r
-#endif\r
-#endif\r
-#ifdef __cplusplus\r
-}\r
+/**
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.
+ * Description: alipay bluetooth module.
+ * Author:
+ * Create:
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "common_def.h"
+#include "bts_def.h"
+#include "bts_gatt_stru.h"
+#include "bts_a2dp_source.h"
+#include "bts_gatt_server.h"
+#include "bts_le_gap.h"
+#include "osal_task.h"
+#include "securec.h"
+#include "wearable_log.h"
+#include <stdint.h>
+#include <stdio.h>
+#include "stdbool.h"
+#include "bts_br_gap.h"
+
+#ifdef SUPPORT_BATTERY_SERVICE
+#include "battery_hal.h"
+#endif
+
+#include "bleService.h"
+#include "alipay_feature.h"
+
+// #include "alipay_bluetooth.h"
+
+#include "bts_a2dp_sink.h"
+#include "osal_timer.h"
+#include "bleEvent.h"
+#include "broadcast_feature.h"
+#include <sys/stat.h>
+#if 1//#ifdef //SUPPORT_BLE_SERVICE
+#include "app_common_api.h"
+// #include "hidService.h"
+#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"
+#include "errcode.h"
+#include "sys/statfs.h"
+
+#ifdef BLE_INSTRUCT
+#include "bleInstruct.h"
+#endif
+
+#include "custom_utils.h"
+#include "custom_runtime.h"
+#include "bleANCS.h"
+#ifdef FD230
+#include "Bluetooyhpabpserver.h"
+#endif
+#include "custom_save_runtime.h"
+
+#define DEBUG_TEST (0)
+#define CRC_CHECK_ERR 0 //crc校验失败
+#define JSON_CHECK_OK 1 //json解析成功
+#define JSON_CHECK_ERR 2 //json解析失败
+
+#define AI_TXT_BUF_MAX_LEN 1024*3 //json解析失败
+
+
+#define MAX_BLE_EVENT_DIAL_NUM (10) //表盘最大数量
+
+#include "upg_common_porting.h"
+
+
+uint32_t packdataLen = 0;
+uint32_t totalDataLen = 0;
+uint8_t totalpack = 0;
+uint8_t cmd_data[17];
+uint8_t *recvData;
+#include "los_memory.h"
+
+#define MAX_BLE_MSG_PACKAGE_LEN (1024*5) //包缓存最大5k
+#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X"
+typedef struct
+{
+ int handle;
+ int data_len ;
+ int totalDataLen;
+ int buffer_to_file; //1 buffer to file , 0 buffer to ram
+ int decode_type; //1 with header , 2 no header
+ FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle
+ msg_header_t cmd_header;
+ uint8_t *data;//if buffer_to_file is 1, than data is the filename , else data is the ram buffer.
+ uint8_t crcvalue;
+ uint8_t lrcvalue; //计算crc用的临时变量
+ uint8_t lrcvalue2; //计算crc用的临时变量
+ uint32_t last_timestamp;// last package receive time
+ uint8_t receive_file_flag;//1 接收文件 0 不接收文件
+ file_recv_stat_t file_recv_stat;
+ uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。
+ uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。
+} ble_read_data;
+
+#define MAX_HANDLE_NUM 10
+//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)
+//根据特征值分开组合读取的数据,并处理
+static ble_read_data handle_l[MAX_HANDLE_NUM]={0};
+errcode_t cancel_recv_file(uint8_t flag);
+
+static char app_name[64]={0};
+
+uint8_t ble_dial_file_count=0;
+uint8_t ble_dial_file_index=0;
+uint8_t *bigDataBuf = NULL;//大数据buf
+uint8_t bigDataBufLen=0;
+bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断
+bool recvBigDataBufState = false;//接收大数据标志
+static bool muiltFlag = 0;//多包数据flag
+static bool ANCSBigBufFlag = 0;//ANCS多包数据flag
+// static uint16_t data_len = 0;
+ble_recv_data_info_t ble_recv_data;
+static uint8_t TRANSMIT_DATA;
+static osTimerId_t BR_TRANSFER_timer=NULL;
+static uint32_t timer_flie_flag=0;
+ble_read_data* ble_read_timer_p=NULL;
+
+#ifdef SINGLE_USER_PARTITION
+#define UP_DATE_FWPKG_PATH UPG_FILE_NAME
+
+#else
+#define UP_DATE_FWPKG_PATH UPG_FILE_NAME
+#endif
+
+
+//MP3文件重命名
+static errcode_t create_mp3_name(char* path,char*dir_path ,char* file_name)
+{
+
+ sprintf_s(path,256,"%s/",dir_path);
+ uint16_t path_len=strlen(path);
+
+
+ if(strstr(file_name,".mp3"))
+ {
+ //"光-陈粒.128.mp3"
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",file_name);
+ int len=strlen(file_name)-strlen(".mp3");
+ for(int i=0;i<len;i++)
+ {
+ uint8_t Uintdata=0;
+ char UintBUF[3]={0};
+ //sprintf(UintBUF,"%02X",file_name[i]);
+ memcpy_s((void*)&Uintdata,1,(void*)&file_name[i],1);
+ sprintf(UintBUF,"%02X",Uintdata);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",UintBUF);
+ memcpy_s(path+path_len,2,UintBUF,2);
+ path_len+=2;
+ }
+ memcpy_s(path+path_len,strlen(".mp3"),".mp3",strlen(".mp3"));
+ return ERRCODE_SUCC;
+ }
+ else
+ {
+ sprintf_s(path,256,"%s/%s.mp3",dir_path,file_name);
+ }
+ return ERRCODE_FAIL;
+
+}
+
+
+#if 1
+#include "app_msg_manager.h"
+#include "app_tx_process.h"
+static int ym_malloc_count = 0,ym_free_count = 0;
+static void *ym_malloc(unsigned int size)
+{
+ // app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);
+
+ return malloc(size);
+}
+static void ym_free(void * p)
+{
+ free(p);
+}
+void malloc_test(void)
+{
+ for(int i = 0;i<1000;i++)
+ {
+ char * temp = ym_malloc(i*10);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"i:%d,addr:%x\r\n",i,temp);
+
+ }
+ app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);
+}
+#include "bleService.h"
+
+static const char* getHandlname(uint16_t handle)
+{
+
+ if (data2ae0Cmd == handle) return "data2ae0Cmd";
+ if (data2ae1Cmd == handle) return "data2ae1Cmd";
+ if (data2ae3Cmd == handle) return "data2ae3Cmd";
+ if (data2ae4Cmd == handle) return "data2ae4Cmd";
+ if (data2ae5Cmd == handle) return "data2ae5Cmd";
+ if (data2ae6Cmd == handle) return "data2ae6Cmd";
+ //if (data2ae2Cmd == handle) return "data2ae2Cmd";
+
+ return "unknown handle";
+
+}
+static errcode_t get_file_recv_file_path(char* input_filename ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)
+{
+ if(input_filename == NULL || output_file_path == NULL)
+ {
+ return ERRCODE_FAIL;
+ }
+
+ int ret = sprintf_s(output_file_path,max_output_size,"/user/userdata/%s",input_filename);
+ if (ret < 0)
+ return ERRCODE_FAIL;
+
+ return ERRCODE_SUCC;
+}
+static errcode_t get_app_file_path(char* input_filename ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)
+{
+ if(input_filename == NULL || output_file_path == NULL)
+ {
+ return ERRCODE_FAIL;
+ }
+
+ uapi_create_dir("/user/app_store");
+
+ int ret = sprintf_s(output_file_path,max_output_size,"/user/app_store/%s",input_filename);
+ if (ret < 0)
+ return ERRCODE_FAIL;
+
+ return ERRCODE_SUCC;
+}
+static errcode_t get_custom_dial_file_path(uint16_t id,char *filename,uint32_t input_size, char* output_file_path , uint32_t max_output_size)
+{
+ if( id >=5 || output_file_path == NULL || filename == NULL)
+ {
+ return ERRCODE_FAIL;
+ }
+ char name[64]={0};
+ ble_get_dial_path(name,id);
+ int ret;
+ if(id == 1 && strcmp(filename, "main_bg") == 0) //自定义视频表盘Id 1 只有背景需要是mp4 main_bg
+ {
+ ret = sprintf_s(output_file_path,max_output_size,"%s/%s.mp4",name,filename);
+ }
+ else
+ {
+ ret = sprintf_s(output_file_path,max_output_size,"%s/%s.bin",name,filename);
+ }
+ if (ret < 0)
+ return ERRCODE_FAIL;
+
+ return ERRCODE_SUCC;
+
+}
+
+
+
+
+int char_to_dec(char ch)
+{
+ int num = 0;
+ if(ch >= '0' && ch <= '9') {
+ num = num * 10 + (ch - '0');
+ }
+ return num;
+}
+void char_to_big(uint8_t *src_str,uint8_t *res_str,uint8_t len)
+{
+ for(uint8_t i = 0;i<len;i++)
+ {
+ if(src_str[i] >= 'a' && src_str[i] <= 'z') {
+ src_str[i] = src_str[i] - 32;
+ }
+ }
+ memcpy(res_str,src_str,len);
+}
+void cameram_data(void)//拍照发送数据 调用这个接口即可
+{
+ uint8_t data[2]={0x01,0x00};
+ errcode_t ret = ble_hid_server_send_input_report(&data,2);
+ osal_msleep(100); /* wait 100 ms */
+ memset(data,0,2);
+ (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/
+}
+
+bool bigDataBufState=false;//大数据传输状态
+/**
+ * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算
+*/
+// uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)
+// {
+// uint8_t lrcValue = _lrcValue;
+// if(data == NULL)
+// {
+// return false;
+// }
+// for(uint16_t i = 0; i < len; i++)
+// {
+// lrcValue =lrcValue+ data[i];
+// // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);
+// }
+// return lrcValue;
+// }
+
+
+/***
+ * 根据求和后的数据计算crc 值
+*/
+// uint8_t get_crc_from_lrc(uint8_t lrcValue)
+// {
+// uint8_t crcbuf = 0;
+// crcbuf = lrcValue%256;
+// crcbuf = 256-crcbuf;
+// crcbuf = crcbuf%256;
+// return crcbuf;
+// }
+
+uint8_t calculate_lrc_file(char *file_path)
+{
+ uint8_t lrcValue =0;
+ FILE * fp = fopen(file_path,"rb+");
+
+ char data[1]={0};
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"calculate_lrc_file %s\r\n",file_path);
+ uint8_t read_size=0;
+
+ if(fp==NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_path);
+ return 0;
+ }
+ do
+ {
+ memset_s(data,1,0,1);
+ read_size=fread(data,1,1,fp);
+ lrcValue+=data[0];
+
+ }while(read_size==1);
+
+ fclose(fp);
+ return lrcValue;
+}
+
+
+#define USE_DEMO
+static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位
+{
+ uint8_t crcbuf = 0;
+ uint8_t lrcValue = 0x00;
+ if(data == NULL)
+ {
+ return false;
+ }
+ lrcValue = calculate_lrc(data,len,0x00);
+
+ crcbuf = get_crc_from_lrc(lrcValue);
+
+ #ifdef BLE_LOG
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC lrc: 0x%x ,ret crc: 0x%x ,crcvalue 0x%x , len:%d\r\n",lrcValue,crcbuf,crcvalue,len);
+ #endif
+ if(crcbuf == crcvalue)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");
+ return true;
+ }
+ else{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n");
+ if(uapi_dev_runtime_get_android_connection_status()==1)
+ return true;
+ else
+ #ifndef USE_DEMO
+ return false;
+ #else
+ return true;
+ #endif
+ }
+
+}
+
+
+// uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte
+// {
+// uint8_t crcbuf = 0;
+// uint8_t lrcValue = 0x00;
+// lrcValue = calculate_lrc(data+17,len-17,0x00);
+// crcbuf = get_crc_from_lrc(lrcValue);
+// return crcbuf;
+// }
+
+uint8_t Calculate_CRC_AI(uint8_t *data,uint16_t len)
+{
+ return Calculate_CRC(data,len);
+}
+
+// uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte
+// {
+// uint8_t crcbuf = 0;
+// uint8_t lrcValue = 0x00;
+// lrcValue = calculate_lrc(data,len,0x00);
+// crcbuf = get_crc_from_lrc(lrcValue);
+// return crcbuf;
+// }
+
+static cJSON *cjson_json_tmp = NULL;
+//发送ble数据
+errcode_t sendBleData(uint8_t *buf,uint16_t len)
+{
+ errcode_t ret = ERRCODE_FAIL;
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);
+ #endif
+ //if(Bleconnect == true )
+ {
+ ret = svr_ble_bt_gatts_noyify(buf,len);
+ }
+ return ret;
+
+}
+
+
+errcode_t sendBleData_zhihui(uint8_t *buf,uint16_t len)
+{
+ errcode_t ret = ERRCODE_FAIL;
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);
+ #endif
+ //if(Bleconnect == true )
+ {
+ ret = svr_ble_bt_gatts_noyify_zhihui(buf,len);
+ }
+ return ret;
+
+}
+
+
+void sendDataNow(uint8_t *buf,uint16_t len)
+{
+ //if(Bleconnect == true )
+ {
+ svr_ble_bt_gatts_noyify(buf,len);
+ }
+}
+
+void send_Data_Now_zh(uint8_t *buf,uint16_t len)
+{
+ {
+ svr_ble_bt_gatts_noyify_zhihui(buf,len);
+ }
+}
+
+
+
+void send_big_data(ble_data_type type,char *data, uint16 datalen)
+{
+ // 动态分配内存空间,防止堆栈溢出
+ uint8_t *buf =NULL;
+ buf = ym_malloc(17 + datalen + 1);
+ memset_s(buf,ble_nus_max_data_len,0,17 + datalen + 1);
+ if (buf == NULL && datalen!=0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n");
+ return;
+ }
+ if(type.Packet_id>=2)
+ {
+ msleep(get_ble_interval()+5);//多包数据发送增加延迟
+ }
+ // 设置消息头部信息
+ buf[0] = 0x72; // 消息头
+ buf[1] = type.type; // 类型
+ buf[2] = type.type_id; // 类型ID
+ memcpy(buf + 3, &type.packet_total, 4); // 总包数
+ memcpy(buf + 7, &type.total, 4); // 总数据长度
+ memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID
+ memcpy(buf + 15, &datalen, 2); // 包数据长度
+
+ // 处理数据和计算CRC
+ if (data == NULL) {
+ //数据为空 按照18个字节总长度发送给app
+ buf[17] = 0x00; // 直接写0x00的校验和
+ } else {
+ memcpy(buf + 17, data, datalen); // 复制数据到缓冲区
+ buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n");
+
+ for(int i=0;i<17 + datalen + 1;i++)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n");
+
+ // 根据标志位选择发送数据的方式
+ if(type.type==6)
+ {
+ send_Data_Now_zh(buf, 17 + datalen + 1);
+ }
+ else
+ {
+ sendDataNow(buf, 17 + datalen + 1); // 判断是否在传输或接收多包数据
+ }
+
+
+
+ ym_free(buf); // 释放内存空间
+}
+
+void send_long_data(char *buf, uint32_t pack_size,uint8_t type,uint8_t id)
+{
+ uint32_t data_len = strlen(buf);
+ uint32_t surplus_len=data_len;
+ uint32_t pack;
+ if(data_len%pack_size==0)
+ {
+ pack=data_len/pack_size;
+ }
+ else
+ {
+ pack=data_len/pack_size+1;
+ }
+ uint32_t pack_id=1;
+ uint32_t offset=0;
+ while (surplus_len!=0)
+ {
+ if(surplus_len>=pack_size)
+ {
+ surplus_len=surplus_len-pack_size;
+
+ ble_data_type type_={type,id,data_len,pack,pack_id};
+ send_big_data(type_,buf+offset,pack_size);
+
+ //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);
+ offset+=pack_size;
+ }
+ else
+ {
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+ ble_data_type type_={type,id,data_len,pack,pack_id};
+ send_big_data(type_,buf+offset,surplus_len);
+ //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);
+ break;
+ }
+ pack_id++;
+ }
+}
+
+
+
+bool is_free_ota_update(uint32_t size)
+{
+ uint64_t free_size=0;
+ int i;
+ struct statfs file_buf = {0};
+ FILE *fp=NULL;
+ fp=fopen(UP_DATE_FWPKG_PATH,"rb+");
+ if(fp)
+ {
+ fclose(fp);
+ remove(UP_DATE_FWPKG_PATH);
+ }
+
+#ifdef SINGLE_USER_PARTITION
+ static const char * const g_volume_names[1] = { "/user/"};
+ for (i = 0; i < 1; i++) {
+#else
+ static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};
+ for (i = 0; i < 4; i++) {
+#endif
+
+ /* 获取文件系统状态 */
+ if (statfs(g_volume_names[i], &file_buf) != 0) {
+ return false ;
+ }
+
+ #ifdef SINGLE_USER_PARTITION
+ if(strcmp("/user/",g_volume_names[i])==0)
+ {
+ free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);
+ }
+ int need_size=size*1.5;
+ if(need_size>free_size)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ #else
+ //单分区不考虑是否足够空间
+ return true;
+ #endif
+#ifdef SINGLE_USER_PARTITION
+ }
+#else
+ }
+#endif
+ return false;
+}
+
+
+
+//发送训练状态[app发起的运动]
+void sendtraningstatedata(uint8_t state ,uint16_t time)
+{
+ char data[3]={0};
+ uint32_t data_len=3;
+ data[0]=state;
+ memcpy(&data[1],&time,2);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);
+ ble_data_type type={0x05,0x50,data_len,1,1};
+ send_big_data(type,data,data_len);
+
+}
+
+//发送训练结束状态[手表发起]
+void sendtraningstateend(void)
+{
+ char data[1]={0};
+ uint32_t data_len=1;
+ data[0]=0; //[0 结束]
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态结束%d\r\n",data[0]);
+
+ ble_data_type type={0x05,0x51,data_len,1,1};
+ send_big_data(type,data,data_len);
+ //end_big_data(0,data,data_len,data_len,1,1,0x51,5);
+}
+
+void sendtraningdata(msg_get_train_data_info_t *data)
+{
+ cJSON* dataJSON = cJSON_CreateObject();
+
+ if (dataJSON == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n");
+ return;
+ }
+
+ cJSON_AddNumberToObject(dataJSON,"st",data->st);
+ cJSON_AddNumberToObject(dataJSON,"hr",data->hr);
+ cJSON_AddNumberToObject(dataJSON,"ca",data->ca);
+ cJSON_AddNumberToObject(dataJSON,"di",data->di);
+ cJSON_AddNumberToObject(dataJSON,"stp",data->stp);
+ cJSON_AddNumberToObject(dataJSON,"ti",data->ti);
+ cJSON_AddNumberToObject(dataJSON,"pc",data->pc);
+
+ char *jsonString = cJSON_PrintUnformatted(dataJSON);
+
+ if (jsonString == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");
+ cJSON_Delete(dataJSON);
+ return;
+ }
+
+ uint32_t data_len = strlen(jsonString);
+ cJSON_Delete(dataJSON);
+
+ if (data_len == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");
+ return;
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练实时数据 %d %s\n", data_len, jsonString);
+ ble_data_type type={0x01,0x0f,data_len,1,1};
+ send_big_data(type,jsonString,data_len);
+
+ cJSON_free(jsonString);
+}
+
+static uint8_t AI_is_end_state=0;
+
+//查询AI 模型是否可用,结果通过2AE4返回
+/*使用模型:
+0:文心一言
+1:ChatGPT
+2:KIMI
+3:豆包*/
+void inquire_AI_is_ready(uint8_t type)
+{
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"查询AI模型,是否准备就绪\r\n");
+ ble_data_type type_={0x05,0x06,1,1,1};
+ send_big_data(type_,(char *)&type,1);
+ //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5);
+}
+
+void watch_synchronization_time(void)
+{
+ ble_data_type type_={0x05,0x02,0,1,1};
+ send_big_data(type_,NULL,0);
+}
+
+
+
+//发送ble数据
+uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空
+uint8_t parie_mac[6];//配对完成之后的的mac地址
+uint8_t phoneDataFlag = 0;
+//发送配对指令
+void sendConfirmParieSucess(void)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ value[0] = 0x72;
+ value[1] = 0x05;
+ value[2] = 0x11;
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ value[17] = 0x01;
+ value[18] = Calculate_CRC(value,1+18);
+ sendBleData(value,19);
+}
+
+uint8_t phoneType = 0;
+
+
+
+
+errcode_t UnbindSucessCmd(uint8_t flag)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备
+{
+ errcode_t sendok = ERRCODE_FAIL;
+ uint32_t tmp = 1;
+ uint8_t value[19];
+ uint8_t crcvalue = 0;
+ memset(value,0,19);
+ memset(value,0,19);
+ value[0] =0x72;
+ value[1] =0x05;
+ value[2] =0x12;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp,2);
+ value[17] = flag;
+ value[18] = Calculate_CRC(value,18);
+ sendok = sendBleData(value,19);
+ msleep(3*get_ble_interval());//增加延时,确保可以成功发送解除绑定
+
+ bd_addr_t addr={0};
+ get_phone_addr(&addr,g_ble_conn_id);
+
+ bool ret = bt_is_acl_connected(&addr);
+ if(flag == 1)
+ {
+ if(0!=remove(PHONE_WATCH_CONFIG_PATH))
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");
+ }
+ gap_ble_remove_all_pairs();
+ gap_remove_all_pairs();
+ }
+
+
+
+ return sendok;
+}
+
+void watch_clean_pairs(void)
+{
+ if(0!=remove(PHONE_WATCH_CONFIG_PATH))
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");
+ }
+ gap_ble_remove_all_pairs();
+ gap_remove_all_pairs();
+}
+
+
+void getDeviceState(void)//获取设备状态
+{
+ bd_addr_t addr={0};
+ get_phone_addr(&addr,g_ble_conn_id);
+
+ bool ret = bt_is_acl_connected(&addr);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getDeviceState ret:%d\r\n",ret);
+}
+
+void clearPaireFlag(uint8_t flag)
+{
+ uint8_t value[19];
+ uint8_t crcvalue = 0;
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ value[0] =0x72;
+ value[1] =0x01;
+ value[2] =0x10;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp,2);
+ value[17] = flag;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+
+ UnbindSucessCmd(1);//1确认解绑;
+
+ // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂
+ uint8_t shutdowflag = 2;//恢复出厂
+ CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag));
+ //uapi_reboot_device();
+}
+void clearPaireCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令
+{
+ if(Check_CRC(data,len,crcvalue))
+ {
+ //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败
+ clearPaireFlag(1);
+ }
+ else
+ {
+ clearPaireFlag(0);
+ }
+}
+uint8_t *savephonename=NULL;
+//确认配对指令
+uint8_t first_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址
+void comfirmPaire(uint8_t flag)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ value[0] =0x72;
+ value[1] =0x05;
+ value[2] =0x11;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp,2);
+ value[17] = flag;
+ value[18] = Calculate_CRC(value,1+17);
+ sendBleData(value,19);
+ if(flag == 1)
+ {
+ first_bond = 1;
+
+ if(get_ble_pair())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," gap_ble_pair \r\n");
+
+ bd_addr_t addr={0};
+ get_phone_addr(&addr,g_ble_conn_id);
+
+ errcode_t code = gap_ble_pair_remote_device(&addr);
+ if(code!=ERRCODE_SUCC)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);
+ }
+ }
+
+
+ }else{
+ first_bond = 0;
+ errcode_t ret = 0;
+ bd_addr_t addr={0};
+ get_phone_addr(&addr,g_ble_conn_id);
+
+ ret = gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_disconnect_remote_device %x\r\n",ret);
+ ret = gap_ble_remove_all_pairs();
+ bool ret_ok = gap_remove_all_pairs();
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_remove_all_pairs %x %x\r\n",ret,ret_ok);
+ if(savephonename != NULL)
+ {
+ ym_free(savephonename);
+ savephonename = NULL;
+ }
+ }
+}
+
+// l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接
+void alarmData(void)
+{
+
+}
+
+
+void getPhoneNameLen(uint8_t *data,uint8_t *datalen,uint8_t *type)//获取手机设备名称长度
+{
+ uint8_t len = 0;
+ uint8_t *json = data;
+ cJSON* root = cJSON_Parse((const char *)json);
+
+ if(root != NULL)
+ {
+ cJSON* pn = cJSON_GetObjectItem(root, "pn");
+ if (pn && cJSON_IsString(pn)) {
+ len = strlen(pn->valuestring)+1;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s len:%d\n", pn->valuestring,len);
+ }
+ cJSON* tp = cJSON_GetObjectItem(root, "tp");
+ if(tp && cJSON_IsNumber(tp))
+ {
+ *type=tp->valueint;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\r\n",type);
+
+ cJSON* bond=cJSON_GetObjectItem(root, "bond");
+ if(bond)
+ {
+
+ }
+ *datalen = len;
+ cJSON_Delete(root);
+ } else{
+ len = 0;
+ *datalen = len;
+ }
+}
+#define PHONE_NAME_MAX_LEN 50
+static uint8_t *getPhoneName(uint8_t *data)//获取手机设备名称
+{
+ uint8_t *json = data;
+ uint8_t *str = NULL;
+ cJSON* root = cJSON_Parse((const char *)json);
+ if(root != NULL)
+ {
+ cJSON* pn = cJSON_GetObjectItem(root, "pn");
+ if (pn && cJSON_IsString(pn)) {
+ uint8_t datalen = strlen(pn->valuestring)+1;
+ if(datalen > PHONE_NAME_MAX_LEN) //
+ {
+ datalen = PHONE_NAME_MAX_LEN;
+ }
+ if(datalen - 1 > 0){
+ pn->valuestring[datalen]='\0';
+ str = ym_malloc(sizeof(char)*datalen);
+ if(str != NULL)
+ {
+ memcpy(str,(uint8_t *)pn->valuestring,datalen+1);
+ }
+ if(savephonename)
+ {
+ ym_free(savephonename);
+ savephonename=NULL;
+ }
+ savephonename = ym_malloc(sizeof(char)*datalen);
+ if(savephonename != NULL){
+ memcpy(savephonename,(uint8_t *)pn->valuestring,datalen+1);
+ }
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s\n", pn->valuestring);
+ }
+ cJSON_Delete(root);
+ }
+ if (str == NULL){
+ return NULL;
+ }
+ else{
+ return str;
+ }
+
+}
+void getPhoneMac(uint8_t *data,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址
+{
+ uint8_t *json = data;
+ uint8_t phone_tmp[6];
+ memset(phone_tmp,0,6);
+ cJSON* root = cJSON_Parse((const char *)json);
+ uint8_t datalen = 0;
+ uint8_t count = 5;
+ if(root != NULL)
+ {
+ cJSON* mac = cJSON_GetObjectItem(root, "mac");
+ if (mac && cJSON_IsArray(mac)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MAC地址: ");
+ cJSON* macElement = NULL;
+ cJSON_ArrayForEach(macElement, mac) {
+ if (cJSON_IsNumber(macElement)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);
+ if (macElement->prev != NULL) {
+ phone_tmp[count] = macElement->valueint;
+ count--;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");
+ }
+ }
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+ }
+
+ memcpy(phoneMac,phone_tmp,6);
+ cJSON_Delete(root);
+ }
+ else{
+ memset(phoneMac,0,6);
+ }
+}
+
+void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的mac地址和mac地址类型 分共有和私有的
+{
+ uint8_t mac_tmp[6];
+ memset(mac_tmp,0,6);
+ uint8_t count = 0;
+ uint8_t type= 0;
+ FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");
+ if (jsfile != NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n");
+ fseek(jsfile, 0, SEEK_END);
+ long fileSize = ftell(jsfile);
+ fseek(jsfile, 0, SEEK_SET);
+
+ char *jsonData = (char *)ym_malloc(fileSize + 1);
+ fread(jsonData, 1, fileSize, jsfile);
+ jsonData[fileSize] = '\0';
+ fclose(jsfile);
+ // 解析JSON数据
+ cJSON *root = cJSON_Parse(jsonData);
+ // 释放资源
+ ym_free(jsonData);
+ if (root != NULL) {
+ cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");
+ if (cJSON_IsArray(modifiedJson)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"watch MAC地址: ");
+ cJSON* macElement = NULL;
+ cJSON_ArrayForEach(macElement, modifiedJson) {
+ if (cJSON_IsNumber(macElement)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);
+ if ((macElement->prev != NULL)) {
+ mac_tmp[count] = macElement->valueint;
+ count++;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");
+ }
+ }
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+ }
+ cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type");
+ if(cJSON_IsNumber(mac_type))
+ {
+ *mactype = mac_type->valueint;
+ }
+ }
+ if(mac_tmp[0] == 0 && mac_tmp[1] == 0 && mac_tmp[2] == 0 && mac_tmp[3] == 0 && mac_tmp[4] == 0 && mac_tmp[5] == 0){
+ memset(mac,0,6);
+ }else
+ {
+ memcpy(mac,mac_tmp,6);
+ }
+ cJSON_Delete(root);
+ }else
+ {
+ memset(mac_tmp,0,6);
+ memcpy(mac,mac_tmp,6);
+ *mactype = 0;
+ }
+}
+static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度
+{
+ uint8_t len = 0;
+ FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");
+ if (jsfile != NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen opening file\n");
+ fseek(jsfile, 0, SEEK_END);
+ long fileSize = ftell(jsfile);
+ fseek(jsfile, 0, SEEK_SET);
+
+ char *jsonData = (char *)ym_malloc(fileSize + 1);
+ fread(jsonData, 1, fileSize, jsfile);
+ jsonData[fileSize] = '\0';
+ fclose(jsfile);
+
+ // 解析JSON数据
+ cJSON *root = cJSON_Parse(jsonData);
+ ym_free(jsonData);
+ if (root != NULL) {
+ cJSON *pn = cJSON_GetObjectItem(root,"pn");
+ if(cJSON_IsString(pn))
+ {
+ len = strlen(pn->valuestring)+1;//多加一个加上字符串的结束符\0
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen;%d",len);
+ }
+ };
+ *datalen = len;
+ // memcpy(datalen,&len,1);
+ // 释放资源
+ cJSON_Delete(root);
+ }else{
+ len = 0;
+ *datalen = len;
+ }
+}
+static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备名称
+{
+ uint8_t count = 0;
+ uint8_t *str = NULL;
+ FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");
+ if (jsfile != NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n");
+ fseek(jsfile, 0, SEEK_END);
+ long fileSize = ftell(jsfile);
+ fseek(jsfile, 0, SEEK_SET);
+
+ char *jsonData = (char *)ym_malloc(fileSize + 1);
+ fread(jsonData, 1, fileSize, jsfile);
+ jsonData[fileSize] = '\0';
+ fclose(jsfile);
+
+ // 解析JSON数据
+ cJSON *root = cJSON_Parse(jsonData);
+ ym_free(jsonData);
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ym_free ym_malloc_count:%d ym_free_count:%d\r\n",ym_malloc_count,ym_free_count);
+ if (root != NULL) {
+ cJSON *pn = cJSON_GetObjectItem(root,"pn");
+ if(cJSON_IsString(pn))
+ {
+ uint8_t showname_len = strlen(pn->valuestring)+1;
+ if(showname_len > 50)
+ {
+ showname_len = PHONE_NAME_MAX_LEN;
+ }
+ if(showname_len-1 > 0){
+ str = ym_malloc(sizeof(char)*showname_len);
+ if(str != NULL)
+ {
+ pn->valuestring[showname_len]='\0';
+ memcpy(str,(uint8_t *)pn->valuestring,showname_len+1);
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveName:%s",pn->valuestring);
+ }
+ }
+ }
+ // 释放资源
+ cJSON_Delete(root);
+ }
+ if (str == NULL)
+ {
+ return NULL;
+ }else{
+ return str;
+ }
+
+}
+
+void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_fen= 1;
+ value[0] =0x72;
+ value[1] =0x05;
+ value[2] =0x11;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_fen,2);
+ value[17] = 0x03;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+
+ uint8_t MacType = 0;
+ uint8_t mac_data[6];
+ memset(mac_data,0,6);
+ GetwatchSaveMac(&mac_data,&MacType);
+
+ bd_addr_t addr={0};
+ get_phone_addr(&addr,g_ble_conn_id);
+
+ errcode_t ret1 = gap_disconnect_remote_device(&addr);
+ gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接
+
+ if (flag == 1){
+ errcode_t ret= gap_ble_remove_pair(&addr);//清除配对信息
+
+ gap_ble_remove_all_pairs();
+ bool ret_flag = gap_remove_all_pairs();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ret_flag:%d ret:%x\r\n",ret_flag,ret);
+ if(0!=remove(PHONE_WATCH_CONFIG_PATH))
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");
+ }
+ set_ble_falg(0);
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂
+ //uapi_reboot_device();
+ }
+}
+static bool ctkd_flag_ble=false;
+
+void set_ctkd_flag(bool flag)
+{
+ ctkd_flag_ble=flag;
+}
+bool get_ctkd_flag(void)
+{
+ return true;//ctkd_flag_ble;
+}
+void sendBindInfor(uint8_t *data)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_fen= 1;
+ value[0] =0x72;
+ value[1] =0x02;
+ value[2] =0x10;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_fen,2);
+
+ uint8_t copare_mac[6];
+ memset(copare_mac,0,6);
+ uint8_t datalen=0;
+ uint8_t *devname = NULL;
+ uint8_t devnamelen = 0;
+ uint8_t mac_tmp[6];
+ memset(mac_tmp,0,6);
+ uint8_t phone_type;
+ uint8_t bond = 1;//未与任何手机绑定过
+ errcode_t ret = 0;
+ first_bond = 0;
+ uint8_t save_mac[6];
+ memset(save_mac,0,6);
+ uint8_t MacType = 0;
+
+ GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型
+ getPhoneMac(data,&copare_mac);
+
+ if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0 && save_mac[3] == 0 && save_mac[4] == 0 && save_mac[5] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定
+ {
+ bond = 0x01;//手表未和任何手机绑定过
+ //未配过使能一键双联
+
+ //清除一次配对
+ //if(get_ble_pair())
+
+ //
+ value[17] = bond;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+
+ #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION
+ #ifdef SUPPORT_A5133_SERVICE_BLE_PAIR
+ comfirmPaire(1);
+ #else
+ devnamelen = 0;
+ getPhoneNameLen(data,&devnamelen,&phone_type);//获取手机下发的手机设备名称长度
+
+ if(phone_type==0)
+ {
+ unsigned int paired_devices_num=0;
+ bool gap_get_paired =gap_get_paired_devices_num(&paired_devices_num);
+ if(gap_get_paired!=true ||paired_devices_num!=0 )
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sendBindInfor!!!!!!!!!:gap_remove_all_pairs \r\n");
+ gap_remove_all_pairs();
+ }
+ }
+
+
+ if(devnamelen > 0 )
+ {
+
+ devname = getPhoneName(data);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname!!!!!!!!!:%s devnamelen:%d",devname,devnamelen);
+ if (devname != NULL){
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is name!!!!!!!!!\r\n");
+ uint8_t buf[devnamelen+2];
+ memset(buf,0,devnamelen+2);
+ buf[0] = DEVICEBIND ;
+ buf[1] = devnamelen;//设备名称长度 0不显示
+ memcpy(buf+2,devname,devnamelen);
+
+ if(phone_type==1)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"IOS\r\n");
+ ble_set_pair(1);
+
+ errcode_t ret = gap_ble_set_ctkd_enable(true);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iPhone gap_ble_set_ctkd_enable ret = %x", ret);
+ set_ctkd_flag(true);
+ }
+ else
+ {
+ ble_set_pair(0);
+
+ errcode_t ret = gap_ble_set_ctkd_enable(true);
+
+ }
+
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);
+ // comfirmPaire(1);
+ if(devname)
+ {
+ ym_free(devname);
+ devname = NULL;
+ }
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name11111!!!!!!!!!:");
+ uint8_t buf[2];
+ memset(buf,0,2);
+ buf[0] = DEVICEBIND;
+ buf[1] = 0;
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+ // comfirmPaire(1);
+
+ }
+ }
+ else{
+ uint8_t buf[2];
+ memset(buf,0,2);
+ buf[0] = DEVICEBIND;
+ buf[1] = 0 ;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name!!!!!!!!!:");
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+ // comfirmPaire(1);
+ }
+ #endif
+ #endif
+
+ return;
+
+ }else
+ {
+ if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0)
+ {
+ bond = 0x03;//手表和其他手机绑定过
+
+ }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对
+ int result = memcmp(copare_mac,save_mac,6);
+ if(result == 0)
+ {
+
+ if(get_ble_pair())
+ {
+ set_ctkd_flag(true);
+ errcode_t ret = gap_ble_set_ctkd_enable(true);
+
+ }
+ else
+ {
+ errcode_t ret = gap_ble_set_ctkd_enable(true);
+ }
+
+
+ if(get_ble_pair())
+ {
+ bd_addr_t addr={0};
+ get_phone_addr(&addr,g_ble_conn_id);
+
+ errcode_t code = gap_ble_pair_remote_device(&addr);
+ if(code!=ERRCODE_SUCC)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);
+ }
+ }
+
+ bond = 0x02;//手表与该手机绑定过
+ value[17] = bond;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ return;
+ }else{
+ bond = 0x03;//手表与其他手机绑定过
+ }
+ }
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bond flag:%d first_bond:%d\r\n",bond,first_bond);
+
+ if(bond == 0x03)
+ {
+ devnamelen = 0;
+ GetwatchSaveNameLen(&devnamelen);//获取手表设备保存手机的设备名称长度
+ if(devnamelen > 0)
+ {
+ devname = GetwatchSaveName();
+ if (devname != NULL){
+ uint8_t buf[devnamelen+2];
+ memset(buf,0,devnamelen+2);
+ buf[0] = DEVICEUNBIND ;
+ buf[1] = devnamelen;
+ memcpy(buf+2,devname,devnamelen);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is no null!!!!!%s\r\n",devname);
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);
+ if(devname)
+ {
+ ym_free(devname);
+ devname = NULL;
+ }
+ }else{
+ uint8_t buf[2];
+ memset(buf,0,2);
+ buf[0] = DEVICEUNBIND;
+ buf[1] = 0;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is null!!!!!");
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+ }
+ }else{
+ uint8_t buf[2];
+ memset(buf,0,2);
+ buf[0] = DEVICEUNBIND;
+ buf[1] = 0;
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+ }
+ }
+ value[17] = bond;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+}
+void SetPhoneInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_fen= 1;
+ value[0] =0x72;
+ value[1] =0x02;
+ value[2] =0x10;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_fen,2);
+ phoneDataFlag = 1;
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ sendBindInfor(data);
+ }else{
+ value[17] = 0x00;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+
+void sendParieSuccess(uint8_t flag,bd_addr_t *addr)//发送配对成功指令to app
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);
+ if(g_ble_conn_id==0)
+ {
+ return;
+
+ }
+ if(first_bond == 1 && phoneDataFlag == 1)//第一次连接绑定
+ {
+ set_ble_falg(1);
+ uint8_t value[25];
+ uint8_t length = 0;
+ memset(value,0,25);
+ value[0] = 0x72;
+ value[1] = 0x05;
+ value[2] = 0x10;
+ uint32_t totalpack= 1;//总的包数
+ uint32_t data_len = 7;//数据长度
+ uint32_t pack_index= 1;//分包序号Index
+ uint16_t pack_dataLen = 7;
+ memcpy(value+3,&totalpack,4);
+ memcpy(value+7,&data_len,4);
+ memcpy(value+11,&pack_index,4);
+ memcpy(value+15,&pack_dataLen,2);
+ value[17] = flag;//1 配对成功 0 配对失败
+ if(flag == 1)//配对成功
+ {
+ cJSON *dataJSON = cJSON_CreateObject();
+ if(dataJSON==NULL)
+ {
+ return;
+ }
+
+ cJSON* arrayJSON = cJSON_CreateArray();
+ if(arrayJSON==NULL)
+ {
+ return;
+ }
+ for(uint8_t id = 0;id<6;id++)
+ {
+ cJSON_AddNumberToObject(arrayJSON,"id",addr->addr[id]);
+ }
+ if(savephonename != NULL)
+ {
+ cJSON_AddStringToObject(dataJSON,"pn",(char *)savephonename);
+ ym_free(savephonename);
+ savephonename = NULL;
+ }
+ cJSON_AddNumberToObject(dataJSON,"phoneType",phoneType);
+ cJSON_AddNumberToObject(dataJSON,"mac_type",addr->type);
+ cJSON_AddItemToObject(dataJSON,"mac",arrayJSON);
+
+ char *jsonString = cJSON_PrintUnformatted(dataJSON);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone %s",jsonString);
+ FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb");
+ if (file)
+ {
+ if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n");
+ }
+ fclose(file);
+ }
+ // ym_free(jsonString);
+ cJSON_free(jsonString);
+ cJSON_Delete(dataJSON);
+ // 读取JSON文件
+
+ //memcpy(value+18,addr->addr,6);
+ value[18]=addr->addr[5];
+ value[19]=addr->addr[4];
+ value[20]=addr->addr[3];
+ value[21]=addr->addr[2];
+ value[22]=addr->addr[1];
+ value[23]=addr->addr[0];
+
+ memcpy(parie_mac,addr->addr,6);
+ length = 18+6;
+ uint8_t crcvalue = Calculate_CRC(value,length);
+ value[length] = crcvalue;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );
+ sendBleData(value,length+1);
+ }else{
+ length = 18;
+ uint8_t crcvalue = Calculate_CRC(value,length);
+ value[length] = crcvalue;
+ length = length+1;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );
+ sendBleData(value,length);
+ }
+ phoneDataFlag = 0;
+ }
+
+
+}
+
+
+//02类型的指令数据
+
+void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = type;
+ sendBuf[2] = typeID;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+ sendBuf[17] = crcflag;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+
+}
+//发送查找手机
+void senfindphoneSend(uint8_t flag)
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x05;
+ sendBuf[2] = 0x01; //3
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4); //15
+ memcpy(sendBuf+15,&tmp_data,2); //17
+ sendBuf[17] = flag;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+}
+
+static uint8_t jsonCheck_time(uint8_t *buf)//json 格式解析
+{
+ // char time_data[24];
+ // memset(time_data,0,24);
+
+ uint8_t *json;
+ json = buf;
+ cJSON* root = cJSON_Parse((const char *)json);
+ if (root == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");
+ return 2;
+ }
+ char *locations;
+ int year = 1970;
+ uint8_t month = 1;
+ uint8_t day = 1;
+ uint8_t week = 4;
+ uint8_t hour = 0;
+ uint8_t minute = 0;
+ uint8_t second = 0;
+ uint32_t timestamp;
+ cJSON* time = cJSON_GetObjectItem(root, "time");
+ if (time && cJSON_IsNumber(time)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);
+ timestamp = time->valueint;
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);
+ }
+ cJSON* jsweek = cJSON_GetObjectItem(root, "week");
+ if (jsweek && cJSON_IsNumber(jsweek)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"week: %d\n", jsweek->valueint);
+ week = jsweek->valueint;
+ }
+ cJSON* jsyear = cJSON_GetObjectItem(root, "year");
+ if (jsyear && cJSON_IsNumber(jsyear)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"year: %d\n", jsyear->valueint);
+ year = jsyear->valueint;
+ }
+ cJSON* jsmonth = cJSON_GetObjectItem(root, "month");
+ if (jsmonth && cJSON_IsNumber(jsmonth)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"month: %d\n", jsmonth->valueint);
+ month = jsmonth->valueint;
+ }
+ cJSON* jsday = cJSON_GetObjectItem(root, "day");
+ if (jsday && cJSON_IsNumber(jsday)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"day: %d\n", jsday->valueint);
+ day = jsday->valueint;
+ }
+ cJSON* jshour = cJSON_GetObjectItem(root, "hour");
+ if (jshour && cJSON_IsNumber(jshour)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hour: %d\n", jshour->valueint);
+ hour = jshour->valueint;
+ }
+ cJSON* jsminute = cJSON_GetObjectItem(root, "minute");
+ if (jsminute && cJSON_IsNumber(jsminute)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"minute: %d\n", jsminute->valueint);
+ minute = jsminute->valueint;
+ }
+ cJSON* jssecond = cJSON_GetObjectItem(root, "second");
+ if (jssecond && cJSON_IsNumber(jssecond)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"second: %d\n", jssecond->valueint);
+ second = jssecond->valueint;
+ }
+ cJSON* location = cJSON_GetObjectItem(root, "location");
+ if (location && cJSON_IsString(location)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"location: %s\n", location->valuestring);
+ locations = location->valuestring;
+ }
+ // sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second);
+ // set_system_time(time_data);
+
+
+ /***计算timezone*/
+ struct tm tmp={0};
+ tmp.tm_year = year+2000 - 1900;
+ tmp.tm_mon = month -1;
+ tmp.tm_mday = day;
+ tmp.tm_hour = hour;
+ tmp.tm_min = minute;
+ tmp.tm_sec = second;
+ time_t timestamp2 = __tm_to_secs(&tmp);
+ int16_t timezone = (timestamp2-timestamp)/60/15;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"timezone in quarters %d\n",timezone);
+ uapi_set_timezone(timezone); //要在uaip_sntp_set_time_utc 之前执行才有效
+ /********/
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"time: %d\n",timestamp );
+
+ uaip_sntp_set_time_utc(timestamp);
+
+ cJSON_Delete(root);
+ return 1;
+}
+
+
+
+
+void SetUTCtime(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x02;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ uint8_t set_ok = 1;
+ set_ok = jsonCheck_time(data);
+ sendBuf[17] = set_ok;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+static training_ble training_ble_data;
+//设置训练目标
+static uint8_t jsonCheck_targetparam(uint8_t *buf)
+{
+ uint8_t *json;
+ json = buf;
+ cJSON* root = cJSON_Parse((const char *)json);
+ if (root == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");
+ return 2;
+ }
+
+ memset(&training_ble_data, 0, sizeof(training_ble));
+
+ cJSON* ty = cJSON_GetObjectItem(root, "ty");//目标类型
+ if (cJSON_IsNumber(ty)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ty: %d\n", ty->valueint);
+ training_ble_data.sportTagType = ty->valueint;
+ training_ble_data.controlmd = SETGOAL;
+
+ cJSON* targetItem = NULL;
+ switch (training_ble_data.sportTagType)
+ {
+ case 0: // 距离
+ targetItem = cJSON_GetObjectItem(root, "di");//目标距离
+ break;
+ case 1: // 卡路里
+ targetItem = cJSON_GetObjectItem(root, "ca");//目标卡路里
+ break;
+ case 2: // 时间
+ targetItem = cJSON_GetObjectItem(root, "tm");//目标时间
+ break;
+ case 3: // 步数
+ targetItem = cJSON_GetObjectItem(root, "st");//目标步数
+ break;
+ default:
+ break;
+ }
+
+ if (targetItem && cJSON_IsNumber(targetItem)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s: %d\n", targetItem->string, targetItem->valueint);
+ training_ble_data.sportTag = targetItem->valueint;
+ cJSON_Delete(root);
+ CustomEventPublish(TOPIC_EVENT_BLE_TRAINING, (uint8_t*)&training_ble_data, sizeof(training_ble));
+ return JSON_CHECK_OK;
+ }
+ }
+
+ cJSON_Delete(root);
+ return JSON_CHECK_ERR;
+}
+
+
+void SetTarinTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置训练目标
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x04;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t set_ok = 1;
+ set_ok = jsonCheck_targetparam(data);
+ sendBuf[17] = set_ok;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+
+static void SetOtherTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取其他目标
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x17;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ // 73 2 17 1 0 0 0 8 0 0 0 1 0 0 0 8 0 2c 1 a 8 1e 1 1 1 2
+
+ uint16_t target_kcal = data[0]+data[1]*256;//目标卡路里
+ uint8_t target_km = data[2];//目标里程
+ uint8_t target_stand = data[3];//目标站立
+ uint8_t target_fattime = data[4];//目标燃脂
+
+ uint8_t ring = data[5];//铃声
+ uint8_t vibratior = data[6];//振动
+ uint8_t notify = data[7];//通知
+ if(target_km)
+ set_goal_discount(target_km);
+ if(target_stand)
+ set_goal_standupcount(target_stand);
+ if(target_fattime)
+ set_goal_durationcount(target_fattime);
+ if(target_kcal)
+ set_goal_caloriescount(target_kcal);
+
+ // set_SilentMode(ring);
+ // set_vibrationremiander(vibratior);
+ // set_notify_switch(notify);
+ if(ring && vibratior && notify)
+ set_goal_other_notification(1);
+ else
+ set_goal_other_notification(0);
+
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据
+{
+ uint8_t *json;
+ json = buf;
+ cJSON* root = cJSON_Parse((const char *)json);
+
+ if (root == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 JSON解析错误\n");
+ return;
+ }
+ else
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 %s\r\n",json);
+ }
+ ble_delet_all_AlarmInfo();
+
+ cJSON* alarms = cJSON_GetObjectItem(root, "alarms");
+ if(alarms==NULL)
+ {
+ return;
+ }
+ int alarmCount = cJSON_GetArraySize(alarms);
+
+ for(int i=0;i<alarmCount;i++)
+ {
+ uint8_t week=0;
+ cJSON *data=cJSON_GetArrayItem(alarms,i);
+ if(data==NULL)
+ {
+ return;
+ }
+
+ cJSON *Id_data =cJSON_GetObjectItem(data,"id");
+ if(Id_data==NULL)
+ return;
+ int id=Id_data->valueint;
+
+ cJSON* repeat=cJSON_GetObjectItem(data,"repeat");
+ if(repeat==NULL)
+ return;
+
+ int array_size = cJSON_GetArraySize(repeat);
+ for(int j=0;j<array_size;j++)
+ {
+ int day = cJSON_GetArrayItem(repeat,j)->valueint;
+ if(day==7)
+ {
+ week|=0b00000001;
+ }
+ else if(day!=0)
+ {
+ week|=0b00000001<<(day);
+ }
+
+ }
+
+ cJSON* hour_data=cJSON_GetObjectItem(data,"hour");
+ if(hour_data==NULL)
+ {
+ return;
+ }
+ int hour=hour_data->valueint;
+ cJSON* minute_data=cJSON_GetObjectItem(data,"minute");
+ if(minute_data==NULL)
+ {
+ return;
+ }
+ int minute=minute_data ->valueint;
+ cJSON* enable_data=cJSON_GetObjectItem(data,"enable");
+ if(enable_data==NULL)
+ {
+ return;
+ }
+ int enable=enable_data ->valueint;
+
+ ble_SetAlarmInfo(hour, minute,week,i,enable);
+
+ }
+ cJSON_Delete(root);
+ ble_AlarmClock_refresh();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alarmCount %d\n",alarmCount);
+
+}
+
+void SetAlarmDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x21;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ jsonCheck_alarm(data);
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+
+void SetpasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x1c;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ char* buf[7]={0};
+
+ sprintf_s(buf,7,"%d%d%d%d%d%d",data[1],data[2],data[3],data[4],data[5],data[6]);
+ ble_set_password(data[0],buf);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",buf);
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+
+void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x0e;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t type = data[0];
+ if(type == 0)//只设置屏幕亮度
+ {
+ uint8_t brightness = data[1];
+ set_brigthness(brightness);
+ }else if(type == 1)//设置亮屏时长 抬碗亮屏
+ {
+ uint8_t screen_type = data[1];//ms级别
+
+ int screen_time = 5*1000;
+ switch (screen_type)
+ {
+ case 0:
+ screen_time = 5*1000;
+ break;
+ case 1:
+ screen_time = 10*1000;
+ break;
+ case 2:
+ screen_time = 15*1000;
+ break;
+ case 3:
+ screen_time = 30*1000;
+ break;
+ case 4:
+ screen_time = 60*1000;
+ break;
+ case 5:
+ screen_time = 60*5*1000;
+ break;
+ default:
+ break;
+ }
+ bool raise = data[2];
+
+ set_ScreenDuration(screen_time);
+ Set_RaiseToWake(raise);
+ }
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+
+
+
+void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x0f;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ uint8_t type = data[0];
+ if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数
+ {
+ int sys_volume = data[1];
+ Set_SystemVolume(sys_volume);
+
+ }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数
+ {
+ int ring_volume = 0;
+
+ ring_volume = data[1];
+
+ Set_CallVolume(ring_volume);
+
+ }else if(type == 2)//只改变媒体音量
+ {
+ int ring_volume = 0;
+ ring_volume = data[1];
+ Set_CallVolume(ring_volume);
+ }
+ else if(type == 3)//只改变铃声和振动开关
+ {
+ int bell_on = data[1];
+ int vibrate_on = data[2];
+ set_SilentMode(bell_on);
+ set_vibrationremiander(vibrate_on);
+ }
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+
+void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//app设置心率参数
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x12;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ msg_get_heart_set_param_info_t set_data;
+
+ set_data.frequence = data[0];
+ set_data.remind_on=data[1];
+ set_data.max_min=data[2];
+ set_data.heart=data[3];
+
+ Set_heart_cmd(&set_data);
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+
+
+void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x13;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ msg_get_spo2_set_param_info_t set_data;
+ set_data.frequence = data[0];
+ set_data.remind_on=data[1];
+ set_data.spo2=data[2];
+
+ Set_oxygen_cmd(&set_data);
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+
+void SetsleepSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置睡眠
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x15;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ msg_get_sleep_param_info_t sleep_info;
+ sleep_info.schedule = data[0];
+ if(len>=6)
+ {
+ sleep_info.bedtime_hour= data[1];
+ sleep_info.bedtime_min= data[2];
+ sleep_info.waketime_hour= data[3];
+ sleep_info.waketime_min= data[4];
+ sleep_info.bedtime_alarm= data[5];
+ }
+
+ ble_set_sleep_remind(sleep_info);
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置喝水提醒s设置
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x14;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ msg_drink_info_t drink_info={0};
+ drink_info.drink_on = data[0];
+ if(data[1])
+ {
+ drink_info.drink_on=2;
+ }
+ // drink_info.drink_on = data[1];
+ drink_info.goal = data[2]+data[3]*256;
+ drink_info.time_start = data[4]<<16|data[5];
+ if(data[1])
+ {
+ drink_info.time_end = data[6]<<16|data[7];
+ drink_info.freq = data[8];
+
+ }
+ ble_set_drink_remind(drink_info);
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+
+void SetsedentarinessSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x1D;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ msg_sedent_set_param_info_t sedent_data={0};
+ sedent_data.sedent_on=data[0];
+
+ // uint32_t sedent_on_time=data[1];
+ // sedent_data.sedent_time |= sedent_on_time<<24;
+
+ // sedent_on_time=data[2];
+ // sedent_data.sedent_time |= sedent_on_time<<16;
+
+ // sedent_on_time=data[3];
+ // sedent_data.sedent_time |= sedent_on_time<<8;
+
+ // sedent_on_time=data[4];
+ // sedent_data.sedent_time |= sedent_on_time<<0;
+ memcpy_s( &sedent_data.sedent_time,4,&data[1],4);
+
+
+ sedent_data.frequenc = data[5];
+
+ // set_sedent_param(&sedent_data);
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+void SetmsgfiltrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x1E;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"总长%d\r\n",len);
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据%s\r\n",data);
+ uint32_t offset=0;
+ uint8_t count=0;
+ while (offset<len)
+ {
+ filtration_data data_t={0};
+ data_t.on=data[offset];
+ offset++;
+ data_t.len=data[offset];
+ offset++;
+ memcpy_s(data_t.name,filtration_data_max_len,&data[offset],data_t.len);
+ offset+=data_t.len;
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%s\r\n",data_t.name);
+ filtration_file_updata(&data_t,count);
+ count++;
+ }
+ filtration_file_save();
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+
+//通过时间戳来获取训练数据
+
+void SYN_train_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据
+{
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ if(len==4)
+ {
+ uint32_t timetamp=0;
+ memcpy_s((void*)&timetamp,4,data,4);
+ cJSON *json_data = ble_get_Trainingdata_by_timetamp(timetamp);
+ if(json_data==NULL)
+ {
+ ble_data_type type_={0x02,0x19,0,1,1};
+ send_big_data(type_,NULL,0);
+ return;
+ }
+ char *json_str=cJSON_PrintUnformatted(json_data);
+ uint32_t json_len= strlen(json_str);
+ cJSON_Delete(json_data);
+
+
+ uint32_t surplus_len=json_len;
+ uint32_t offset=0;
+
+ uint32_t pack;
+ uint16_t pack_size=(ble_nus_max_data_len-18);
+ if(pack_size>482)pack_size=482;
+
+ if(json_len%pack_size==0)
+ {
+ pack=json_len/pack_size;
+ }
+ else
+ {
+ pack=json_len/pack_size+1;
+ }
+ uint32_t pack_id=1;
+ while (surplus_len!=0)
+ {
+ if(surplus_len>=pack_size)
+ {
+ surplus_len=surplus_len-pack_size;
+
+ ble_data_type type_={0x02,0x19,json_len,pack,pack_id};
+ send_big_data(type_,(char *)json_str+offset,pack_size);
+ offset+=pack_size;
+ }
+ else
+ {
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",json_len,surplus_len,pack_id,pack);
+ ble_data_type type_={0x02,0x19,json_len,pack,pack_id};
+ send_big_data(type_,(char *)json_str+offset,surplus_len);
+ break;
+ }
+ pack_id++;
+ }
+
+ cJSON_free(json_str);
+
+ }
+
+ }
+ else
+ {
+ ble_data_type type_={0x02,0x19,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+}
+
+
+void SYN_train_heart_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据
+{
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ if(len==4)
+ {
+ uint32_t timetamp=0;
+ memcpy_s((void*)&timetamp,4,data,4);
+ char path[128]={0};
+ if(get_training_heart_path(path,timetamp,128))
+ {
+ FILE *fp= fopen(path,"rb+");
+ uint32_t file_size=0;
+ if(fp==NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+
+ ble_data_type type_={0x02,0x4b,0,1,1};
+ send_big_data(type_,NULL,0);
+
+ return ;
+ }
+ fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+ file_size = ftell(fp); // 获取当前文件指针位置,即文件大小
+ fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+ int num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+
+ int num_check=file_size%5;//心率数据 5个字节
+ if(num_check!=0)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);
+
+ ble_data_type type_={0x02,0x4b,0,1,1};
+ send_big_data(type_,NULL,0);
+ return ;
+ }
+
+ char* buf = (char *)ym_malloc(sizeof(char)*num+1);
+ if(buf==NULL){fclose(fp); return ;}
+
+ uint32_t pack=1;
+
+ if(file_size%num==0)
+ pack=file_size/num;
+ else
+ pack=file_size/num+1;
+
+ uint32_t pack_id=1;
+ uint32_t read_size=0;
+ do
+ {
+ memset_s(buf,num+1,0,num+1);
+ read_size=fread(buf,1,num,fp);
+ if(read_size!=0)
+ {
+ ble_data_type type_={0x02,0x4b,file_size,pack,pack_id};
+ send_big_data(type_,buf,read_size);
+ }
+ pack_id++;
+ } while (read_size==num);
+ fclose(fp);
+ free(buf);
+
+ }
+ }
+
+ }
+ else
+ {
+ ble_data_type type_={0x02,0x4B,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+}
+
+void SYN_train_speed_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据
+{
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ if(len==4)
+ {
+ uint32_t timetamp=0;
+ memcpy_s((void*)&timetamp,4,data,4);
+ char path[128]={0};
+ if(get_training_spead_path(path,timetamp,128))
+ {
+ FILE *fp= fopen(path,"rb+");
+ uint32_t file_size=0;
+ if(fp==NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+
+ ble_data_type type_={0x02,0x18,0,1,1};
+ send_big_data(type_,NULL,0);
+
+ return ;
+ }
+ fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+ file_size = ftell(fp); // 获取当前文件指针位置,即文件大小
+ fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+ int num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+
+ int num_check=file_size%6;
+ if(num_check!=0)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);
+
+ ble_data_type type_={0x02,0x18,0,1,1};
+ send_big_data(type_,NULL,0);
+ return ;
+ }
+
+ char* buf = (char *)ym_malloc(sizeof(char)*num+1);
+ if(buf==NULL){fclose(fp); return ;}
+
+ uint32_t pack=1;
+ if(file_size%num==0)
+ pack=file_size/num;
+ else
+ pack=file_size/num+1;
+ uint32_t pack_id=1;
+ uint32_t read_size=0;
+ do
+ {
+ memset_s(buf,num+1,0,num+1);
+ read_size=fread(buf,1,num,fp);
+ if(read_size!=0)
+ {
+ ble_data_type type_={0x02,0x18,file_size,pack,pack_id};
+ send_big_data(type_,buf,read_size);
+ }
+
+
+ //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);
+ pack_id++;
+ } while (read_size==num);
+
+ fclose(fp);
+ free(buf);
+
+ }
+
+ }
+ }
+ else
+ {
+ ble_data_type type_={0x02,0x18,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+}
+
+//APP设置步数目标
+void SetsteptargetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x16;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ uint32_t targetStep;
+ memcpy(&targetStep,data,4);
+
+ uint8_t ringOn=data[4];
+ uint8_t vibration=data[5];
+ uint8_t notify=data[6];
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置步数:%d %d %d %d \r\n",targetStep,ringOn,vibration,notify);
+
+ set_goal_stepcount(targetStep);
+
+
+ if(ringOn &&vibration && notify)
+ set_goal_step_notification(1);
+ else
+ set_goal_step_notification(0);
+
+
+ sendBuf[17] = 1;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+
+}
+
+uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据
+{
+ uint8_t *json;
+ json = buf;
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+ FILE *fp=fopen("/user/userdata/weather.json","wb+");
+ if(fp != NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather len %d",strlen((char *)buf)+1);
+ //fwrite((void*)buf,1,strlen((char *)buf)+1,fp);
+ fputs((char *)buf,fp);
+ fclose(fp);
+ }
+ return parse_jsonCheck_weather(buf,check);
+}
+void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据
+{
+ uint8_t *json;
+ json = buf;
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+ cJSON* root = cJSON_Parse((const char *)json);
+ if (root == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+ return ;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");
+ cJSON *now_cjson = cJSON_GetObjectItem(root, "now");
+ if(now_cjson == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+ return ;
+ }
+ int humidity=0;
+ char * windScale=NULL;
+ char *textNight=NULL;
+ int uvIndex=0;
+ int temp=0;
+ int iconNight=0;
+
+ cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");
+ if(now_data_humidity)
+ {
+ humidity=now_data_humidity->valueint;
+ }
+ cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");
+ if(now_data_windScale)
+ {
+ windScale=now_data_windScale->valuestring;
+ }
+ cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");
+ if(now_data_textNight)
+ {
+ textNight=now_data_textNight->valuestring;
+ }
+ cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");
+ if(now_data_uvIndex)
+ {
+ uvIndex=now_data_uvIndex->valueint;
+ }
+ cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");
+ if(now_data_temp)
+ {
+ temp=now_data_temp->valueint;
+ }
+ cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");
+ if(now_data_iconNight)
+ {
+ iconNight=now_data_iconNight->valueint;
+ }
+ set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);
+
+
+ cJSON *address_cjson = cJSON_GetObjectItem(root, "address");
+
+ char*city=NULL;
+ char*subLocality=NULL;
+ char*atm=NULL;
+ int lat=0;
+ int lon=0;
+
+ cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");
+ if(address_cjson_)
+ {
+ city=address_cjson_->valuestring;
+ }
+
+
+ address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");
+ if(address_cjson_)
+ {
+ subLocality=address_cjson_->valuestring;
+ }
+
+ address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");
+ if(address_cjson_)
+ {
+ atm=address_cjson_->valuestring;
+ }
+ address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");
+ if(address_cjson_)
+ {
+ lat=address_cjson_->valueint;
+ }
+
+ address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");
+ if(address_cjson_)
+ {
+ lon=address_cjson_->valueint;
+ }
+ set_weather_address_data(lat,atm,city,subLocality,lon);
+ cJSON *daily = cJSON_GetObjectItem(root, "daily");
+ if(daily==NULL)
+ {
+ return ;
+ }
+ int count= cJSON_GetArraySize(daily);
+ for(int i=0;i<count;i++)
+ {
+ //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},
+ cJSON *data=cJSON_GetArrayItem(daily,i);
+
+ int tempMin=0;
+ int iconDay=0;
+ int fxDate=0;
+ char * textDay=NULL;
+ int tempMax=0;
+
+
+ cJSON *data_=cJSON_GetObjectItem(data,"tempMin");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ tempMin=data_->valueint;
+ }
+
+ data_=cJSON_GetObjectItem(data,"iconDay");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ iconDay=data_->valueint;
+ }
+
+ data_=cJSON_GetObjectItem(data,"fxDate");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ fxDate=data_->valueint;
+ }
+
+ data_=cJSON_GetObjectItem(data,"textDay");
+ if(data_&& cJSON_IsString(data_) )
+ {
+ textDay=data_->valuestring;
+ }
+ data_=cJSON_GetObjectItem(data,"tempMax");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ tempMax=data_->valueint;
+ }
+ set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);
+
+ }
+ ble_UpdateMainWeatherData();
+ cJSON_Delete(root);
+ return ;
+}
+
+uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据
+{
+ uint8_t flag = 0;
+ // flag = 2;
+ // memcpy(check,&flag,1);
+ // return 0;
+ uint8_t *json;
+ json = buf;
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+ cJSON* root = cJSON_Parse((const char *)json);
+ if (root == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+ flag = 2;
+ memcpy(check,&flag,1);
+ return 0;
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");
+ cJSON *now_cjson = cJSON_GetObjectItem(root, "now");
+ if(now_cjson == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+ return 0;
+ }
+ int humidity=0;
+ char * windScale=NULL;
+ char *textNight=NULL;
+ int uvIndex=0;
+ int temp=0;
+ int iconNight=0;
+
+ cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");
+ if(now_data_humidity)
+ {
+ humidity=now_data_humidity->valueint;
+ }
+ cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");
+ if(now_data_windScale)
+ {
+ windScale=now_data_windScale->valuestring;
+ }
+ cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");
+ if(now_data_textNight)
+ {
+ textNight=now_data_textNight->valuestring;
+ }
+ cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");
+ if(now_data_uvIndex)
+ {
+ uvIndex=now_data_uvIndex->valueint;
+ }
+ cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");
+ if(now_data_temp)
+ {
+ temp=now_data_temp->valueint;
+ }
+ cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");
+ if(now_data_iconNight)
+ {
+ iconNight=now_data_iconNight->valueint;
+ }
+ set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);
+
+
+ cJSON *address_cjson = cJSON_GetObjectItem(root, "address");
+
+ char*city=NULL;
+ char*subLocality=NULL;
+ char*atm=NULL;
+ int lat=0;
+ int lon=0;
+
+ cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");
+ if(address_cjson_)
+ {
+ city=address_cjson_->valuestring;
+ }
+
+
+ address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");
+ if(address_cjson_)
+ {
+ subLocality=address_cjson_->valuestring;
+ }
+
+ address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");
+ if(address_cjson_)
+ {
+ atm=address_cjson_->valuestring;
+ }
+ address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");
+ if(address_cjson_)
+ {
+ lat=address_cjson_->valueint;
+ }
+
+ address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");
+ if(address_cjson_)
+ {
+ lon=address_cjson_->valueint;
+ }
+ set_weather_address_data(lat,atm,city,subLocality,lon);
+ cJSON *daily = cJSON_GetObjectItem(root, "daily");
+ if(daily==NULL)
+ {
+ return 0;
+ }
+ int count= cJSON_GetArraySize(daily);
+ for(int i=0;i<count;i++)
+ {
+ //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},
+ cJSON *data=cJSON_GetArrayItem(daily,i);
+
+ int tempMin=0;
+ int iconDay=0;
+ int fxDate=0;
+ char * textDay=NULL;
+ int tempMax=0;
+
+
+ cJSON *data_=cJSON_GetObjectItem(data,"tempMin");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ tempMin=data_->valueint;
+ }
+
+ data_=cJSON_GetObjectItem(data,"iconDay");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ iconDay=data_->valueint;
+ }
+
+ data_=cJSON_GetObjectItem(data,"fxDate");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ fxDate=data_->valueint;
+ }
+
+ data_=cJSON_GetObjectItem(data,"textDay");
+ if(data_&& cJSON_IsString(data_) )
+ {
+ textDay=data_->valuestring;
+ }
+ data_=cJSON_GetObjectItem(data,"tempMax");
+ if(data_&& cJSON_IsNumber(data_) )
+ {
+ tempMax=data_->valueint;
+ }
+ set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);
+
+ }
+
+ if( uapi_dev_runtime_get_bt_powerstat() && cm_get_HFP_switch())
+ uapi_pbap_cmd_start_client();
+
+ bd_addr_t bdaddr={0};
+ #ifdef FD230
+ uapi_get_br_address(&bdaddr);
+ if( uapi_dev_runtime_get_bt_powerstat() && (cm_get_HFP_switch()||cm_get_A2DP_switch()))
+ {
+
+ if(cm_get_A2DP_switch() && cm_get_A2DP_switch() && false==bt_is_acl_connected(&bdaddr) && !(bdaddr.addr[0]==0 && bdaddr.addr[1]==0 && bdaddr.addr[2]==0 && bdaddr.addr[3]==0
+ && bdaddr.addr[4]==0 && bdaddr.addr[5]==0))
+ {
+ gap_reconnect_media_device(&bdaddr);
+ }
+ else if(cm_get_A2DP_switch())
+ {
+ uapi_a2dp_snk_connect();
+ }
+ else if(cm_get_HFP_switch())
+ {
+ uapi_hfp_connect();
+ }
+
+ }
+
+ #endif
+
+ ble_UpdateMainWeatherData();
+ cJSON_Delete(root);
+ *check = 1;
+ return 1;
+}
+/*读取天气历史数据*/
+uint8_t read_jsonHistory_weather(void)
+{
+ uint8_t *buf = NULL;
+ FILE *fp=fopen("/user/userdata/weather.json","rb");
+ if(fp == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"read_jsonHistory_weather:fopen error\r\n");
+ return 0;
+ }
+ fseek(fp, 0, SEEK_END);
+ long size = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+ if (size == 0)
+ {
+ fclose(fp);
+ return 0;
+ }
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file size = %d\r\n",size);
+ buf = (uint8_t*)malloc(size + 1);
+ if(buf == NULL)
+ {
+ fclose(fp);
+ return 0;
+ }
+
+ char *str = fgets((char *)buf,size + 1,fp);
+ if(str!=NULL)
+ {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file str = %s\r\n",str);
+ }
+
+ fclose(fp);
+
+ parse_jsonCheck_weather_post(buf);
+
+ free(buf);
+
+ return 1;
+}
+
+uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析 天气数据
+{
+ uint8_t flag = 0;
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+ #if 0
+ FILE *fp=fopen("user/AI.txt","wb+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI len %d\r\n",len);
+ fwrite((void*)buf,1,len,fp);
+ //fputs((char *)buf,fp);
+ fclose(fp);
+ #endif
+
+ uint16_t offset=0;
+
+ while (len>offset)
+ {
+ if(buf[offset]==1)
+ {
+ offset++;
+ if(offset>=len)break;
+ uint16_t txt_len;
+ memcpy_s(&txt_len,2,&buf[offset],2);
+
+ offset+=2;
+ if(offset>=len)break;
+
+ char txt_buf[256]={0};
+ memcpy_s(txt_buf,256,&buf[offset],txt_len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",txt_buf,txt_len);
+ ble_set_ai_Question_str(txt_buf);
+ offset+=txt_len;
+ //offset+=1;
+ }
+ if(offset>=len)break;
+
+ if(buf[offset]==2)
+ {
+ offset++;
+ if(offset>=len)break;
+
+ uint16_t txt_len;
+ memcpy_s(&txt_len,2,&buf[offset],2);
+
+ offset+=2;
+ if(offset>=len)break;
+
+ if(txt_len>=AI_TXT_BUF_MAX_LEN)
+ txt_len=AI_TXT_BUF_MAX_LEN;
+
+ char *txt_buf=(char*)malloc(txt_len+1);
+ if(txt_buf==NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf malloc fail\r\n");
+ ble_set_ai_Answer_str("手表缓存不足",0);
+ return 0;
+ }
+
+ txt_buf[txt_len]=0;
+ memcpy_s((char *)txt_buf,1024*3,&buf[offset],txt_len);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf Answer %s %d\r\n",txt_buf,txt_len);
+ ble_set_ai_Answer_str(txt_buf,2);
+ free(txt_buf);
+
+ offset+=txt_len;
+ //offset+=1;
+ }
+ if(offset>=len)break;
+
+ if(buf[offset]==0)
+ {
+ offset++;
+ if(offset>=len)break;
+
+ uint16_t txt_len;
+ memcpy_s(&txt_len,2,&buf[offset],2);
+
+ offset+=2;
+ if(offset>=len)break;
+
+ char error_buf[256]={0};
+ memcpy_s(error_buf,256,&buf[offset],txt_len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);
+ ble_set_ai_Answer_str(error_buf,0);
+ offset+=txt_len;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");
+
+ }
+ if(offset>=len)break;
+
+ if(buf[offset]==3)
+ {
+ offset++;
+ if(offset>=len)break;
+
+ uint16_t txt_len;
+ memcpy_s(&txt_len,2,&buf[offset],2);
+
+ offset+=2;
+ if(offset>=len)break;
+
+ char error_buf[256]={0};
+ memcpy_s(error_buf,256,&buf[offset],txt_len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);
+ ble_set_ai_Answer_str(error_buf,3);
+ offset+=txt_len;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 回应错误\r\n");
+
+ }
+ if(offset>=len)break;
+
+ if(buf[offset]==4)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 结束\r\n");
+ // if(AI_is_end_state)
+ // {
+ // AI_is_end_state=0;
+ // }
+ offset++;
+ if(offset>=len)
+ {
+ ble_set_ai_Answer_str("",4);
+ break;
+ }
+
+ uint16_t txt_len;
+ memcpy_s(&txt_len,2,&buf[offset],2);
+
+ offset+=2;
+ if(offset>=len)break;
+
+ char error_buf[256]={0};
+ memcpy_s(error_buf,256,&buf[offset],txt_len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);
+ ble_set_ai_Answer_str(error_buf,4);
+
+ offset+=txt_len;
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");
+
+ }
+ if(offset>=len)break;
+ offset++;
+ }
+
+ *check = 1;
+ return 1;
+}
+
+
+void SetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x20;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ // uint32_t y=(0xff00);
+ // uint32_t x =(0xff00& 0Xff00)>>16;
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd %u\r\n",x);
+ uint8_t check = 1;
+ jsonCheck_weather(data,&check);
+ sendBuf[17] = check;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+
+void SetAiResultCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x1f;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t check = 1;
+ binCheck_AI(data,&check,len);
+
+ sendBuf[17] = check;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+void APP_reply_AI_is_ready(uint8_t *data,uint16_t len)
+{
+ if(data[0])
+ {
+ if(len>1)
+ {
+ //更新chatgptKEY
+ FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");
+ if(fp)
+ {
+ fwrite(data+1,1,len-1,fp);
+ fclose(fp);
+ }
+ }
+ }
+ ble_app_reply(data[0]);
+}
+void SaveChatGPTCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x23;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+ //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");
+ if(fp)
+ {
+ fwrite(data,1,len,fp);
+ fclose(fp);
+ sendBuf[17] = 1;
+ }
+ else
+ {
+ sendBuf[17] = 2;
+ }
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+
+bool bin_Check_schedule(uint8_t *data,uint16_t len)
+{
+ uint16_t offset = 0;
+ uint16_t buf_len = 0;
+ uint16_t id_ = 1;
+
+ // 打印函数开始及总长度信息
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule start, total len: %d", len);
+
+ while (offset < len)
+ {
+ uint16_t id;
+ // 解析ID
+ memcpy_s(&id, 2, &data[offset], 2);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsing ID: 0x%04X at offset: %d", id, offset);
+ offset += 2;
+ if (offset >= len)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing ID, break");
+ break;
+ }
+
+ // 解析标题长度
+ memcpy_s(&buf_len, 2, &data[offset], 2);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title length: %d at offset: %d", buf_len, offset);
+ offset += 2;
+ if (offset >= len)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title length, break");
+ break;
+ }
+
+ // 解析标题内容
+ char *title = (char*)malloc(buf_len + 1);
+ if (!title)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for title");
+ break;
+ }
+ memset_s(title, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小
+ memcpy_s(title, buf_len + 1, &data[offset], buf_len);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed title: [%s] (length: %d) at offset: %d", title, buf_len, offset);
+
+ offset += buf_len;
+
+ if (offset >= len)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title, free title and break");
+ free(title);
+ break;
+ }
+
+ // 解析开始时间
+ uint32_t timetemp_begin = 0;
+ memcpy_s(&timetemp_begin, 4, &data[offset], 4);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Start time: %u at offset: %d", timetemp_begin, offset);
+ offset += 4;
+ if (offset >= len)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing start time, free title and break");
+ free(title);
+ break;
+ }
+
+ // 解析结束时间
+ uint32_t timetemp_end = 0;
+ memcpy_s(&timetemp_end, 4, &data[offset], 4);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "End time: %u at offset: %d", timetemp_end, offset);
+ offset += 4;
+ if (offset >= len)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing end time, free title and break");
+ free(title);
+ break;
+ }
+
+ // 解析附加信息长度
+ memcpy_s(&buf_len, 2, &data[offset], 2);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Additional info length: %d at offset: %d", buf_len, offset);
+ offset += 2;
+
+ if (buf_len == 0)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No additional info, offset: %d, len: %d", offset, len);
+ // 调用设置函数
+ if (offset == len)
+ {
+ Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", true);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (complete), id_: %d", id_);
+ }
+ else
+ {
+ Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", false);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (incomplete), id_: %d", id_);
+ }
+
+ id_++;
+ free(title);
+ continue;
+ }
+
+ if (offset >= len)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len before parsing additional info, free title and break");
+ free(title);
+ break;
+ }
+
+ // 解析附加信息
+ char *str_ = (char*)malloc(buf_len + 1);
+ if (!str_)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for additional info");
+ free(title);
+ break;
+ }
+ memset_s(str_, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小
+ memcpy_s(str_, buf_len + 1, &data[offset], buf_len);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed additional info: [%s] (length: %d) at offset: %d", str_, buf_len, offset);
+
+ offset += buf_len;
+
+ // 调用设置函数
+ if (offset == len)
+ {
+ Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, true);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (complete), id_: %d", id_);
+ }
+ else
+ {
+ Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, false);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (incomplete), id_: %d", id_);
+ }
+
+ id_++;
+
+ // 释放内存
+ free(title);
+ free(str_);
+
+ if (offset >= len)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "All data parsed, exit loop");
+ break;
+ }
+ }
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule end, total parsed id count: %d", id_ - 1);
+ return true;
+}
+void APP_send_schedule_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x24;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+ //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ printf("11111111111111111\n");
+ bool val = bin_Check_schedule(data,len);
+ printf("222222222222222222222\n");
+ if(val)
+ {
+ sendBuf[17] = 1;
+ }
+ else
+ {
+ sendBuf[17] = 2;
+ }
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+bool bin_Check_sos(uint8_t *data,uint16_t len)
+{
+ uint8_t SOS_num=data[0];
+ uint32_t offset=1;
+ char *name=NULL;
+ char *number=NULL;
+ ble_sos_number_clean();
+
+ while (SOS_num)
+ {
+ SOS_num--;
+ uint8_t sex=data[offset];
+ offset++;
+ if(offset>=len)
+ break;
+ uint8_t name_len=data[offset];
+ offset++;
+ if(offset>=len)
+ break;
+ char *name=(char *)malloc(name_len+1);
+ if(name==NULL)
+ break;
+ memset_s(name,255,0,name_len+1);
+ memcpy_s(name,255,&data[offset],name_len);
+ offset+=name_len;
+ if(offset>=len)
+ break;
+ uint8_t number_len=data[offset];
+ offset++;
+ if(offset>=len)
+ break;
+ char *number=(char *)malloc(number_len);
+ if(number==NULL)
+ break;
+ memset_s(number,255,0,number_len+1);
+ memcpy_s(number,255,&data[offset],number_len);
+ offset+=number_len;
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sex:%d,name:%s,number:%s;\r\n",sex,name,number);
+
+ ble_add_sos_number(sex,name,number);
+
+ free(number);
+ number==NULL;
+ free(name);
+ name==NULL;
+
+ if(offset>=len)
+ break;
+
+
+ }
+ if(number)
+ {
+ free(number);
+ }
+ if(name)
+ {
+ free(name);
+ }
+
+ ble_sos_data_save();
+
+ return true;
+}
+
+void APP_send_sos_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ sendBuf[0] = 0x72;
+ sendBuf[1] = 0x02;
+ sendBuf[2] = 0x25;
+ memcpy(sendBuf+3,&tmp,4);
+ memcpy(sendBuf+7,&tmp,4);
+ memcpy(sendBuf+11,&tmp,4);
+ memcpy(sendBuf+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ if(bin_Check_sos(data,len))
+ {
+ sendBuf[17] = 1;
+ }
+ else
+ {
+ sendBuf[17] = 2;
+ }
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+ else
+ {
+ sendBuf[17] = 0;
+ sendBuf[18] = Calculate_CRC(sendBuf,18);
+ sendBleData(sendBuf,19);
+ }
+}
+
+void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+ {
+ if(Check_CRC(data,len,crcvalue))
+ {
+ if(len==4)
+ {
+ uint32_t timetamp=0;
+ memcpy_s((void*)&timetamp,4,data,4);
+ char path[128]={0};
+ if(get_training_gps_path(path,timetamp,128))
+ {
+ FILE *fp= fopen(path,"rb+");
+ uint32_t file_size=0;
+ if(fp==NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+ ble_data_type type_={0x02,0x4f,0,1,1};
+ send_big_data(type_,NULL,0);
+ return ;
+ }
+ fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+ file_size = ftell(fp); // 获取当前文件指针位置,即文件大小
+ fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+ fclose(fp);
+
+ int num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+
+ char* buf = (char *)ym_malloc( file_size );
+ if(buf==NULL){fclose(fp); return ;}
+
+ int data_size= read_GPS_DATA(path,buf);
+
+ uint32_t surplus_len=data_size;
+ uint32_t offset=0;
+
+ uint32_t pack;
+ uint16_t pack_size=(ble_nus_max_data_len-18);
+ if(pack_size>482)pack_size=482;
+
+ if(data_size%pack_size==0)
+ {
+ pack=data_size/pack_size;
+ }
+ else
+ {
+ pack=data_size/pack_size+1;
+ }
+ uint32_t pack_id=1;
+ while (surplus_len!=0)
+ {
+ if(surplus_len>=pack_size)
+ {
+ surplus_len=surplus_len-pack_size;
+
+ ble_data_type type_={0x02,0x4f,data_size,pack,pack_id};
+ send_big_data(type_,(char *)buf+offset,pack_size);
+ offset+=pack_size;
+ }
+ else
+ {
+
+ ble_data_type type_={0x02,0x4f,data_size,pack,pack_id};
+ send_big_data(type_,(char *)buf+offset,surplus_len);
+ break;
+ }
+ pack_id++;
+ }
+
+
+ free(buf);
+
+ }
+ else
+ {
+ ble_data_type type_={0x02,0x4f,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+
+ }
+ else
+ {
+ ble_data_type type_={0x02,0x4f,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+ }
+ else
+ {
+ ble_data_type type_={0x02,0x4f,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+
+ //send_big_data(1,NULL,0,0,1,1,,2);
+}
+ //send_big_data(1,NULL,0,0,1,1,0x4f,2);
+}
+void App_delete_file(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+ uint8_t reply[2]={0};
+ if (len<=2)
+ {
+ ble_reply_cmdarr(cmd,reply,2);//crc error
+ }
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t count=data[0];
+ uint8_t type=data[1];
+ if(type==2)
+ {
+ if(len-2!=count*2)
+ {
+ ble_reply_cmdarr(cmd,reply,1);//crc error
+ }
+ else
+ {
+ int offest=2;
+ for(int i=0;i<count;i++)
+ {
+ uint16_t id=0;
+ memcpy_s(&id,2,&data[offest],2);
+ bool ret = delete_MP3_file_By_ID(id);
+ if(ret==false)
+ {
+ reply[0]=2;
+ ble_reply_cmdarr(cmd,reply,1);//crc error
+ return;
+ }
+ else
+ {
+ offest+=2;
+ }
+ }
+ reply[0]=1;
+ ble_mp3_list_update();
+ ble_reply_cmdarr(cmd,reply,1);
+ }
+
+ }
+ else
+ {
+ reply[0]=2;
+ ble_reply_cmdarr(cmd,reply,1);
+ }
+
+
+
+ }else{
+ ble_reply_cmdarr(cmd,reply,1);//crc error
+ }
+
+}
+
+void query_dial_installed(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+ uint8_t reply[2]={0};
+ if (len != 2)
+ {
+ ble_reply_cmdarr(cmd,reply,2);//crc error
+ }
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint16_t dial_uid = *(uint16_t*)data;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"query dial 0x%04X installed !!!!!!!!\r\n",dial_uid);
+
+ if(!ble_is_dial_install_by_id(dial_uid))
+ reply[0]=2; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装
+ else
+ reply[0]=1; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装
+
+
+ reply[1]=0; //表盘列表是否已满 0:未满 1:已满
+ ble_reply_cmdarr(cmd,reply,2);
+
+ }else{
+ ble_reply_cmdarr(cmd,reply,2);//crc error
+ }
+
+}
+
+void SetUserInfo(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo ");
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ ble_reply_cmd(USER_INFOR_CMD,1);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!!!!!!!\r\n");
+ msg_user_info_t *p_userinfo = (msg_user_info_t*)data;
+
+ msg_user_info_t msg_userinfo = {0};
+ msg_userinfo.age = p_userinfo->age;
+ msg_userinfo.fat_time = p_userinfo->fat_time;
+ msg_userinfo.gender = p_userinfo->gender;
+ msg_userinfo.height = p_userinfo->height;
+ msg_userinfo.target_stand = p_userinfo->target_stand;
+ msg_userinfo.target_step = p_userinfo->target_step;
+ msg_userinfo.timeformat = p_userinfo->timeformat;
+ msg_userinfo.weight = p_userinfo->weight;
+ msg_userinfo.calorie=p_userinfo->calorie;
+ msg_userinfo.distance=p_userinfo->distance;
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n",
+ p_userinfo->age,
+ p_userinfo->fat_time,
+ p_userinfo->gender,
+ p_userinfo->height,
+ p_userinfo->target_stand,
+ p_userinfo->target_step,
+ p_userinfo->timeformat,
+ p_userinfo->weight
+ );
+
+ set_user_data(&msg_userinfo);
+
+ }else{
+ ble_reply_cmd(USER_INFOR_CMD,0);//crc error
+ }
+}
+
+//APP下发快捷辅助功能参数
+void Set_auxil_fun_parm(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t packtmp = 1;
+ value[0] =0x72;
+ value[1] =0x02;
+ value[2] =0x11;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&packtmp,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t paramCnt = data[0];//快捷辅助功能 按照协议文档要区分
+ set_quick_auxiliary_paramters(paramCnt);
+ value[17] = 1;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else{
+ value[17] = 0x00;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+void getTRAIN_TARGETInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+}
+// #include "phoneaddressmodel.h"
+//电话薄解析函数
+void Parse_addressbook_bin(uint8_t *data,uint16_t len)
+{
+ int num=data[0];//人数
+ int offset=1;
+ while (num)
+ {
+ uint8 sex = data[offset];
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"性别: %d\r\n",sex);
+ offset=offset+1;
+ uint8 name_len=data[offset];
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"name_len %d\r\n",name_len);
+ char name[32]={0};
+ if(name_len==0)
+ {
+ name_len=strlen("未知");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"未知\r\n");
+ }
+ else
+ {
+ memcpy(name,&data[offset+1],name_len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"姓名: %s\r\n",name);
+ // for(int i=0;i<name_len;i++)
+ // {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",name[i]);
+ // }
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");
+ }
+ offset=offset+name_len+1;
+ uint8 phone_num=data[offset];
+ offset=offset+1;
+ for(int i=0;i<phone_num;i++)
+ {
+
+ uint8 phonen_len=data[offset];
+ char phonen_name[32]={0};
+ memcpy(phonen_name,&data[offset+1],phonen_len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"号码: %s\r\n",phonen_name);
+ // for(int i=0;i<phonen_len;i++)
+ // {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",phonen_name[i]);
+ // }
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");
+
+ offset=offset+phonen_len+1;
+ }
+ for(int i=0;i<phone_num;i++)
+ {
+ uint8 add = data[offset];
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地长度: %d\r\n",add);
+ memcpy(name,&data[offset+1],add);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地: %s\r\n",name);
+ offset=offset+add+1;
+ uint8 yun = data[offset];
+ memcpy(name,&data[offset+1],yun);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"运营商: %s\r\n",name);
+ offset=offset+yun+1;
+ }
+
+ num--;
+ }
+
+}
+void SetAPPaddressbook(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ value[0] =0x72;
+ value[1] =0x02;
+ value[2] =0x0b;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ addressbookToRead((char*)data);
+ //同步完就写一次
+ addressbookTowrite();
+ value[17] = 0x01;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else{
+ value[17] = 0x00;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+}
+
+//02 类型
+void type2AE4Data(ble_read_data *buffer_handle,uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE4Data typeID:0x%04X\r\n",typeID);
+ switch (typeID) //ID
+ {
+ case USER_INFOR_CMD://app下发的获取用户信息
+ SetUserInfo(buffer_handle,typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_PHONE_INFOR_CMD://app下发的下发的手机信息
+ SetPhoneInfo(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_WATCH_AUXIL_FUN_PARAM_CMD://app下发快捷辅助功能参数
+ Set_auxil_fun_parm(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case CURR_TIME_CMD:
+ SetUTCtime(typeID,data,datalen,totalData,crcvalue);//获取时间app下发的时间进行解析
+ break;
+ case SET_BLE_NAME_CMD:
+ getPhoneInfo_test();
+ break;
+ case SET_TRAIN_TARGET_CMD://训练目标
+ SetTarinTarget(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_address_book_CMD:
+ SetAPPaddressbook(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_ALARM_DATA_CMD:
+ SetAlarmDataCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_OTHER_TARGET_CMD:
+ SetOtherTarget(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_PASSWORD_CMD:
+ SetpasswordCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_SEDENTARINESS_PARAM_CMD:
+ SetsedentarinessSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_ANCS_MSG_FILTRATION_CMD:
+ SetmsgfiltrationCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case QUERY_DIAL_INSTALLED_PARAM_CMD:
+ query_dial_installed(buffer_handle,typeID,data,datalen,totalData,crcvalue);
+ break;
+ case DELETE_FILE_CMD:
+ App_delete_file(buffer_handle,typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SYN_BASIC_REAL_HEATR_CMD:
+ SYN_train_heart_datatCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SYN_TRAIN_DATA_CMD:
+ SYN_train_datatCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SYN_TRAIN_SPEED_CMD:
+ SYN_train_speed_datatCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+
+ case SYN_TODAY_BASIC_TRAIN_TXT_CMD:
+ break;
+ case SYN_WATCH_LCD_PARAM_CMD://app下发的同步屏幕参数到手表
+ GetWatchLcdParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SYN_VOICE_VIBRATION_PARAM_CMD://app下发声音与振动参数
+ GetVoiceVibrateParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_WATCH_HR_SET_PARAM_CMD://app下发设置心率参数
+ GetHrSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_WATCH_SPO2_SET_PARAM_CMD:
+ GetSpo2SetParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_DRINK_PARAM_CMD://app下发的喝水提醒设置
+ SetDrinkSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_SLEEP_PARAM_CMD://app下发的喝水提醒设置
+ SetsleepSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_STEP_TARGET_CMD://app下发的步数目标设置
+ SetsteptargetParamCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+
+ case SET_WEATHER_DATA_CMD://app下发的天气数据
+ SetWeatherCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case SET_APP_AI_TXT_CMD://app下发的AI数据
+ SetAiResultCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+
+ case SYN_APP_GET_GPS_DATA_CMD://app获取GPS数据
+ GetGPSCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case APP_SEND_CHATGPT_KEY_CMD:
+ SaveChatGPTCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case APP_SEND_AI_KEY_IS_AVAILABLE_CMD:
+ APP_reply_AI_is_ready(data,datalen);
+ break;
+ case SYN_APP_SCHEDULE_DATA_CMD:
+ APP_send_schedule_Cmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ case APP_SEND_SOS_DATA_CMD:
+ APP_send_sos_Cmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+
+
+ default:
+ break;
+ }
+}
+
+void reply_app_send_switchDialCmd(bool flag)
+{
+ uint8_t data;
+ if(flag)
+ {
+ data=1;
+ ble_reply_cmdarr(0x0102,&data,1);
+ }
+ else
+ {
+ data=3;
+ ble_reply_cmdarr(0x0102,&data,1);
+ }
+}
+
+//切换表盘
+static void switchDialCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x02;
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint16_t daila_type = 0;
+ memcpy(&daila_type,&data[0],2);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"switchDialCmd %d !!!!!!!!!!\r\n",daila_type,data,len);
+
+ ble_set_dial_by_id(daila_type);
+
+ // if(ble_get_dial_id()==daila_type)
+ // {
+ // value[17] = 1;//切换成功
+ // }
+ // else
+ // {
+ // value[17] = 3;//切换失败
+ // }
+
+ // value[18] = Calculate_CRC(value,18);
+ // sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;//校验失败
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+
+//关于本机内容
+static void aboutDeviceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+
+ uint8_t _major,_mid,_minor;
+ uapi_get_fw_version(&_major,&_mid,&_minor);
+ cJSON *dataJSON = cJSON_CreateObject();
+ cJSON_AddNumberToObject(dataJSON,"code",1);
+ cJSON_AddNumberToObject(dataJSON,"major",_major);
+ cJSON_AddNumberToObject(dataJSON,"mid",_mid);
+ cJSON_AddNumberToObject(dataJSON,"minor",_minor);
+ unsigned char addr[6];
+ bluetooth_get_local_addr(&addr[0],6);
+ char mac_data[24];
+ memset(mac_data,0,24);
+ sprintf(mac_data,"%02X:%02X:%02X:%02X:%02X:%02X",addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);
+ cJSON_AddStringToObject(dataJSON, "macAddress",mac_data);
+
+ char *json_format = cJSON_PrintUnformatted(dataJSON);
+ cJSON_Delete(dataJSON);
+ uint32_t data_len = strlen(json_format);
+ uint8_t value[data_len+19];
+ memset(value,0,data_len+19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = (uint16_t)data_len;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x03;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&data_len,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ memcpy(value+17,(uint8_t *)json_format,data_len);//17+69 = 86
+
+ value[data_len+17] = Calculate_CRC(value,data_len+17);//
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data_len:%d %x %d!!!!!\r\n",data_len,value[data_len+17],data_len+17);
+ sendBleData(value,data_len+18);
+ }else
+ {
+ value[17] = 0;
+ uint8_t lrc = Calculate_CRC(value,18);
+ value[18] = lrc;
+ sendBleData(value,19);
+ }
+ cJSON_free(json_format);
+}
+//查找手表 01 04
+//设置查找手表的状态,1 校验成 2手表已找到,停止查找手表
+void setFindWatchFlag(uint8_t flag)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x04;
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ value[17] = flag;//校验标志
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+}
+static void findWatchCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t findFlag = data[0];
+ CustomEventPublish(TOPIC_EVENT_FIND_WATCH,&findFlag,sizeof(findFlag));//查找手表
+ setFindWatchFlag(1);
+ }else
+ {
+ setFindWatchFlag(0);
+ }
+}
+//获取sd卡剩余空间
+static void GetSDSpaceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[28];
+ memset(value,0,28);
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x05;
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint32_t tmp_ = 1;
+ uint32_t tmp = 9;
+ uint16_t tmp_data = 9;
+ memcpy(value+3,&tmp_,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp_,4);
+ memcpy(value+15,&tmp_data,2);
+
+ uint8_t sdFlag = 1;
+
+ uint64_t free_size=0;
+ int i;
+ struct statfs file_buf = {0};
+#ifdef SINGLE_USER_PARTITION
+ static const char * const g_volume_names[1] = { "/user/"};
+ for (i = 0; i < 1; i++) {
+#else
+ static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};
+
+ for (i = 0; i < 4; i++) {
+#endif
+ /* 获取文件系统状态 */
+ if (statfs(g_volume_names[i], &file_buf) != 0) {
+ return ;
+ }
+ if(strcmp("/user/",g_volume_names[i])==0)
+ {
+ free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);
+ }
+ }
+ if(sdFlag == 1)// 1获取失败 2 获取成功
+ {
+ value[17] = 1;//校验标志
+ memcpy_s(value+18,8,&free_size,8);
+
+ value[26] = Calculate_CRC(value,26);
+ sendBleData(value,27);
+ }else{
+
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ value[17] = 2;//校验标志
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+ }else
+ {
+
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+
+ value[17] = 0;//校验标志
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//获取当前数据
+void GetCurDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ // if(!Check_CRC(data,len,crcvalue))
+ // {
+ // int data_len=0;
+ // ble_data_type type_={0x01,0x06,data_len,1,1};
+ // send_big_data(type_,NULL,0);
+ // return;
+ // }
+ // cJSON *dataJSON = cJSON_CreateObject();
+ // const char *string_value[7]={"hr","spo2","steps","duration","standup","calories","distance"};
+ // for(uint8_t i = 0;i<7;i++)
+ // {
+ // cJSON* data_arryJSON = cJSON_CreateObject();
+ // if(data_arryJSON==NULL)
+ // {
+ // return;
+ // }
+ // uint32_t value=0;
+ // if(i==0)
+ // {
+ // // value=ble_get_heart_data();
+ // }
+ // else if(i==1)
+ // {
+ // value=ble_get_oxygen_data();
+ // }
+ // else if(i==2)
+ // {
+ // // value=cywee_get_step_data();
+ // }
+ // else if(i==3)
+ // {
+ // value=cywee_get_fat_time_data();
+ // }
+ // else if(i==4)
+ // {
+ // value=1;
+ // }
+ // else if(i==5)
+ // {
+ // value=cywee_get_calories_data();
+ // }
+ // else if(i==6)
+ // {
+ // value=cywee_get_distance_data();
+ // }
+
+
+ // cJSON_AddNumberToObject(data_arryJSON,"value",value);
+ // uint32_t creationTime;
+ // int ret =uapi_get_timestampe_ss(&creationTime);
+ // cJSON_AddNumberToObject(data_arryJSON,"time",creationTime);
+
+ // cJSON_AddItemToObject(dataJSON,string_value[i],data_arryJSON);
+ // }
+ // cJSON *recJSON= ble_get_recs_data();
+ // cJSON_AddItemToObject(dataJSON,"recs",recJSON);
+ // char *json_format = cJSON_PrintUnformatted(dataJSON);
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetCurDataCmd %d %s\n",strlen(json_format),json_format);
+ // cJSON_Delete(dataJSON);
+
+ // uint32_t data_len = strlen(json_format);
+ // uint32_t surplus_len=data_len;
+ // uint32_t pack;
+ // uint16_t pack_size=(ble_nus_max_data_len-18);
+ // if(pack_size>482)pack_size=482;
+
+ // if(data_len%pack_size==0)
+ // {
+ // pack=data_len/pack_size;
+ // }
+ // else
+ // {
+ // pack=data_len/pack_size+1;
+ // }
+ // uint32_t pack_id=1;
+ // uint32_t offset=0;
+ // while (surplus_len!=0)
+ // {
+ // if(surplus_len>=pack_size)
+ // {
+ // surplus_len=surplus_len-pack_size;
+
+
+ // ble_data_type type_={0x01,0x06,data_len,pack,pack_id};
+ // send_big_data(type_,json_format+offset,pack_size);
+
+ // //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1);
+ // offset+=pack_size;
+ // }
+ // else
+ // {
+
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+ // ble_data_type type_={0x01,0x06,data_len,pack,pack_id};
+ // send_big_data(type_,json_format+offset,surplus_len);
+ // //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1);
+ // break;
+ // }
+ // pack_id++;
+ // }
+ // cJSON_free(json_format);
+
+}
+//获取当手表电池电量
+static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x07;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ float voltage = 0.0F;
+ uint8_t power = 0;
+ power = battery_get_voltage(&voltage);
+ value[17] = power;
+ value[18] = Calculate_CRC(value,18);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//设置开关//(弃)
+static void SetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x08;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t switch_on = data[0];//0 关闭 1 开启
+ if(switch_on)
+ {
+ //ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);
+ }
+ else
+ {
+ //ble_ancs_client_subscribe_notify(g_ble_conn_id,0);
+ }
+
+ value[17] = 1;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟
+static void RemoveFileCmd(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x20;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t file_type= data[0];//1 ota 2 MP3
+
+ // TRANSMIT_DATA=TRANS_FREE;
+ // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ value[17] = 1; //
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+
+ cancel_recv_file(0);
+
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+//获取指定类型文件目录
+static void GetFileTypeCmd(uint8_t *data,uint16_t len)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x21;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,1))
+ {
+ uint8_t fileType = data[17];//2 mp3 3 表盘
+
+ value[17] = 1; //1 操作成功 2 操作失败
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//删除指定类型所有的文件
+static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x22;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ value[17] = 1; //1 操作成功 2 操作失败
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//开启指定运动模式
+void reply_APP_OpenSportModeCmd(bool falg)
+{
+
+ ble_data_type type_={0x01,0x0A,1,1,1};
+ char data[1]={0};
+ if(falg)
+ data[0]=1;
+ else
+ data[0]=2;
+ send_big_data(type_,data,1);
+
+}
+
+
+static void OpenSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x0A;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ training_ble_data.sportType= data[0];//运动类型 0 健走 1跑步 2骑行 3
+ training_ble_data.controlmd= START;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"开启指定运动%d\r\n",data[0]);
+ CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+
+ // value[17] = 1; //1 操作成功 2 操作失败
+ // value[18] = Calculate_CRC(value,18);
+ // sendBleData(value,19);
+ }
+ else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+void reply_APP_SportStopModeCmd(uint16_t time)
+{
+ char data[3]={0};
+ uint32_t data_len=3;
+ data[0]=1;
+ memcpy(&data[1],&time,2);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);
+ ble_data_type type={0x01,0x0B,data_len,1,1};
+ send_big_data(type,data,data_len);
+}
+//结束运动模式
+static void StopSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x0B;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+ training_ble_data.controlmd= END;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"结束运动\r\n");
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+ // value[17] = 1; //1 操作成功 2 操作失败
+ // value[18] = Calculate_CRC(value,18);
+ // sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//设置语言
+static void SetLanguageCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x0E;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t language = data[0];
+ set_languaage(language);
+ value[17] = 1; //1 操作成功 2 操作失败
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//开启/关闭获取实时训练数据
+static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x11;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t autoSportData = data[0];//开关 1开启 0关闭
+ /*进行开启关闭操作*/
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进行开启关闭操作 %d\r\n", autoSportData);
+ set_traning_updata_auto( autoSportData);
+
+ value[17] = 1; //1 操作成功 2 操作失败
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//设置训练数据采集频率
+static void SetRTDataFreCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x14;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t Frequence = data[0];//频率单位是s
+ /*设置获取频率*/
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置获取频率 %d\r\n", Frequence);
+ set_traning_updata_freq(Frequence);
+
+ value[17] = 1; //1 操作成功 2 操作失败
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//获取实时训练数据
+// void getSportData(char *buf)
+// {
+// cJSON *dataJSON = cJSON_CreateObject();
+// cJSON_AddNumberToObject(dataJSON,"st",1637825067);
+// cJSON_AddNumberToObject(dataJSON,"hr",120);
+// cJSON_AddNumberToObject(dataJSON,"ca",3657);
+// cJSON_AddNumberToObject(dataJSON,"di",5274);
+// cJSON_AddNumberToObject(dataJSON,"stp",1234);
+// cJSON_AddNumberToObject(dataJSON,"ti",3);
+// char *json_format = cJSON_PrintUnformatted(dataJSON);
+// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s",json_format);
+// cJSON_Delete(dataJSON);
+// int dataLen = strlen(json_format);
+// memcpy(buf,json_format,dataLen);
+// return;
+// }
+void sendRealTimeDataToAPP(uint8_t flag)
+{
+ if(flag == 0)//校验失败
+ {
+ ble_data_type type_={0x01,0x0f,0,1,1};
+ send_big_data(type_,NULL,0);
+
+ //send_big_data(0,NULL,0,0,1,1,0x0f,1);
+
+ }else
+ {
+ training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+ training_ble_data.controlmd= SENDDATA;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送运动实时数据\r\n");
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+
+ }
+
+}
+//获取实时训练数据
+static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ sendRealTimeDataToAPP(1);
+ }else
+ {
+ sendRealTimeDataToAPP(0);
+ }
+}
+//设置最高心率提醒
+static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x15;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))//
+ {
+ uint8_t maxHr = data[0];
+ if(maxHr > 250)maxHr = 250;//最高心率是250
+ else if(maxHr <= 0) maxHr = 0;
+ set_traning_heart_max(maxHr);
+ //设置255 表示心率提醒关闭
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"设置最高心率提醒 %d\r\n",maxHr);
+ value[17] = 1;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+}
+
+void reply_APP_SportPasueResetCmd(uint16_t time)
+{
+ char data[3]={0};
+ uint32_t data_len=3;
+ data[0]=1;
+ memcpy(&data[1],&time,2);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);
+ ble_data_type type={0x01,0x16,data_len,1,1};
+ send_big_data(type,data,data_len);
+}
+
+
+//训练暂停/恢复
+static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x16;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))//
+ {
+ uint8_t PauseStop = data[0];//0 暂停 1恢复
+ if(PauseStop==0)
+ {
+ training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+ training_ble_data.controlmd= STOP;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动暂停\r\n");
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+ }
+ else
+ {
+ training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+ training_ble_data.controlmd= RECOVER;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动恢复\r\n");
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+
+ }
+ // value[17] = 1;
+ // value[18] = Calculate_CRC(value,18);
+ // sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+}
+//发送当前表盘到app
+
+void Watch_SendDial_ToAppCmd(void)
+{
+
+ uint16_t dialNum =ble_get_dial_id();
+ ble_data_type type_={0x01,0x17,2,1,1};
+ send_big_data(type_,(char *)&dialNum,2);
+}
+
+static void SendDialToAppCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[20];
+ memset(value,0,20);
+ uint32_t tmp = 1;
+ uint32_t datalen = 2;
+ uint16_t tmp_data = 2;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x17;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))//
+ {
+ uint16_t dialNum =ble_get_dial_id();
+ memcpy(&value[17],&dialNum,2);
+ value[19] = Calculate_CRC(value,19);
+ sendBleData(value,20);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+}
+//获取手表当前状态
+static void GetWatchStatusCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[20];
+ memset(value,0,20);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x19;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+
+ //0空闲状态 9 usb状态 10 运动训练状态
+ uint8_t watchStatus = 0;
+
+ if(uapi_dev_runtime_get_train_status())
+ watchStatus=10;
+
+ value[17] = watchStatus;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+}
+//获取手表屏幕参数
+static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[21];
+ memset(value,0,21);
+ uint32_t tmp = 1;
+ uint32_t datalen = 3;
+ uint16_t tmp_data = 3;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x1a;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+
+ int brigntess = get_brigthness();
+ int screen_time =get_ScreenDuration();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time);
+ switch (get_ScreenDuration()/1000)
+ {
+ case 5:
+ screen_time = 0;
+ break;
+ case 10:
+ screen_time = 1;
+ break;
+ case 15:
+ screen_time = 2;
+ break;
+ case 30:
+ screen_time = 3;
+ break;
+ case 60:
+ screen_time = 4;
+ break;
+ case 60*5:
+ screen_time = 5;
+ break;
+ default:
+ screen_time = 0;
+ break;
+ }
+ bool wrist_on = Get_RaiseToWake();
+ value[17] = brigntess;
+ value[18] = screen_time;
+ value[19] = wrist_on;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd %d %d %d \r\n",brigntess,screen_time,wrist_on);
+ value[20] = Calculate_CRC(value,20);
+ sendBleData(value,21);
+}
+
+//App删除表盘 (仅W4手表)
+static void DeleteDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[20];
+ memset(value,0,20);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x1b;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint16_t deleteDial = 0;//删除的表盘UID
+ deleteDial=data[0]+data[1]*256;
+
+ if(ble_delete_dial(deleteDial))
+ value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败
+ else
+ value[17] = 2;// 1删除成功 2 没有改资源 0指令校验失败
+
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+
+}
+
+//获取手表声音与振动参数 Sound and Vibration
+static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[23];
+ memset(value,0,23);
+ uint32_t tmp = 1;
+ uint32_t datalen = 5;
+ uint16_t tmp_data = 5;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x1c;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ int sys_volume = Get_SystemVolume();
+ int ring_volume = Get_CallVolume();
+ int media_volume = Get_CallVolume();
+ uint8_t vibrate_on = get_vibrationremiander();
+
+ bool bell_on = get_SilentMode();
+
+ value[17] = sys_volume;//
+ value[18] = ring_volume;//
+ value[19] = media_volume;//
+ value[20] = bell_on;//
+ value[21] = vibrate_on;//
+ value[22] = Calculate_CRC(value,22);
+ sendBleData(value,23);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+
+}
+
+//APP获取手表辅助功能参数Auxiliary functions
+static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[23];
+ memset(value,0,23);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x1d;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t paramCmt = 0;//辅助功能 0
+ paramCmt = get_quick_auxiliary_paramters();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"paramCmt:%d\r\n",paramCmt);
+ value[17] = paramCmt;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+
+}
+//APP获取手表心率设置
+static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[22];
+ memset(value,0,22);
+ uint32_t tmp = 1;
+ uint32_t datalen = 4;
+ uint16_t tmp_data = 4;
+
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x1e;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ msg_get_heart_set_param_info_t heart_param;
+ Get_heart_cmd(&heart_param);
+
+ value[17] = heart_param.frequence;//
+ value[18] = heart_param.remind_on;//
+ value[19] = heart_param.max_min;//
+ value[20] = heart_param.heart;//
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d ",value[17],value[18],value[19],value[20]);
+
+ value[21] = Calculate_CRC(value,21);
+ sendBleData(value,22);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+
+}
+//APP获取手表血氧设置
+static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[21];
+ memset(value,0,21);
+ uint32_t tmp = 1;
+ uint32_t datalen = 3;
+ uint16_t tmp_data = 3;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x1f;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ msg_get_spo2_set_param_info_t SO2_param;
+ Get_oxygen_cmd(&SO2_param);
+
+ uint8_t spo2freq = SO2_param.frequence;//监测频率
+ uint8_t spo2Switch = SO2_param.remind_on;//心率提醒开关
+ uint8_t spo2MaxMin = SO2_param.spo2;//高于或低于
+
+ value[17] = spo2freq;//
+ value[18] = spo2Switch;//
+ value[19] = spo2MaxMin;//
+
+ value[20] = Calculate_CRC(value,20);
+ sendBleData(value,21);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+
+
+}
+void cameraSend(uint8_t flag)//2进行手势拍照 3退出拍照界面
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x23;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ value[17] = flag;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+}
+//手势拍照协议
+static void carmeraCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x23;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t carmera_on = data[0]; //0退出拍照界面 1进入拍照界面
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");
+ //需要加界面弹窗提示
+ if(carmera_on == 1)//进入拍照界面
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");
+ CustomEventPublish(TOPIC_EVENT_ENTER_CMAERA,NULL,0);
+ }else{//退出拍照弹窗界面
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"退出拍照\r\n");
+ CustomEventPublish(TOPIC_EVENT_CANCEL_CMAERA,NULL,0);
+ }
+ value[17] = 1;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+//APP获取手表喝水提醒设置
+static void GetDrinkParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x24;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(1)
+ {
+ msg_drink_info_t drink_on_;
+ ble_get_drink_remind(&drink_on_);
+ value[17] = drink_on_.drink_on;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+//APP发送恢复出厂设置
+static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x25;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ value[17] = 1;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+ if( value[17])
+ {
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);
+ }
+}
+//APP发送重新启动
+static uint8_t power_buf[2]={0};
+static void GetResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x26;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ value[17] = 1;//
+ value[18] = Calculate_CRC(value,18);
+ power_buf[0]=REBOOT;
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);
+ sendBleData(value,19);
+
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+//APP发送关机
+static void GetPowerOffCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x27;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ value[17] = 1;//
+ value[18] = Calculate_CRC(value,18);
+ power_buf[0]=SHUTDOWN;
+ CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+
+//app发送公英制单位
+static void GetMetricCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x28;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ uint8_t kmileter = data[0];//公英制单位 0 是公英制 1英制单位
+ value[17] = 1;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+//app获取久坐设置
+static void GetSedentParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[24];
+ memset(value,0,24);
+ uint32_t tmp = 1;
+ uint32_t datalen = 6;
+ uint16_t tmp_data =6;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x31;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(1)
+ {
+ msg_sedent_set_param_info_t data;
+ get_sedent_param( &data);
+
+ uint8_t on = data.sedent_on;//作息时间设定 0关闭 1开启 1
+ uint32_t time = data.sedent_time;//时间 4
+ uint8_t frequenc = data.frequenc;//间隔 1
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%04X %d %d\r\n",time,frequenc,on);
+ value[17] = on;
+ memcpy_s(&value[18],4,&time,4);
+
+ value[22] = frequenc;
+ value[23] = Calculate_CRC(value,23);
+ sendBleData(value,24);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+
+static void GetSleepParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[24];
+ memset(value,0,24);
+ uint32_t tmp = 1;
+ uint32_t datalen = 6;
+ uint16_t tmp_data =6;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x29;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(1)
+ {
+ msg_get_sleep_param_info_t data;
+
+ ble_get_sleep_remind(&data);
+ uint8_t sleepTime = data.schedule;//作息时间设定 0关闭 1开启
+ uint8_t bedTimeHour = data.bedtime_hour;//就寝时间
+ uint8_t bedTimeMin = data.bedtime_min;//就寝时间
+ uint8_t wakeTimeHour = data.waketime_hour;//起床时间
+ uint8_t wakeTimeMin = data.waketime_min;//起床时间
+ uint8_t bedTimeOn = data.bedtime_alarm;//就寝前20分钟提醒时间
+
+ value[17] = sleepTime;
+ value[18] = bedTimeHour;
+ value[19] = bedTimeMin;
+ value[20] = wakeTimeHour;
+ value[21] = wakeTimeMin;
+ value[22] = bedTimeOn;
+ value[23] = Calculate_CRC(value,23);
+ sendBleData(value,24);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+//app获取所有表盘UID
+static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ int dial_num=ble_get_dial_num();
+
+ uint16_t data_size=1+dial_num*2;
+ uint32_t temp_data_size=data_size;
+ char *dail_uid_buf=(char *)ym_malloc(data_size);
+ dail_uid_buf[0]=(uint8_t)dial_num;
+
+ if(dial_num *2 !=get_all_dial_id(dail_uid_buf+1,dial_num*2))
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd dial_num %d err\r\n",dial_num);
+ }
+ else
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n");
+
+ }
+ ble_data_type type_={0x01,0x2a,temp_data_size,1,1};
+ send_big_data(type_,dail_uid_buf,data_size);
+ //send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1);
+
+ free(dail_uid_buf);
+
+ }else
+ {
+ ble_reply_cmd(cmd,0);
+ }
+}
+//app获取目标步数设置
+static void GetTargetStepCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[25];
+ memset(value,0,25);
+ uint32_t tmp = 1;
+ uint32_t datalen = 7;
+ uint16_t tmp_data = 7;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x2b;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(1)
+ {
+ uint32_t targetStep = get_goal_stepcount();//目标步数 4字节
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"目标步数:%d\r\n",targetStep);
+
+ uint8_t ringOn = get_step_goal_notify_switch();//铃声提醒
+ uint8_t vibration = get_step_goal_notify_switch();//振动提醒
+ uint8_t notify = get_step_goal_notify_switch();//通知提醒
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"提醒开关:%d %d %d \r\n",ringOn,vibration,notify);
+
+ memcpy(&value[17],&targetStep,4);//目标步数
+
+ value[21] = ringOn;//铃声提醒
+ value[22] = vibration;//振动提醒
+ value[23] = notify;//通知提醒
+
+ value[24] = Calculate_CRC(value,24);
+ sendBleData(value,25);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+//app其他目标设置
+static void GetTargetOtherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[26];
+ memset(value,0,26);
+ uint32_t tmp = 1;
+ uint32_t datalen = 8;
+ uint16_t tmp_data = 8;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x2c;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(1)
+ {
+ uint16_t targetKcal = 0;//目标卡路里
+ uint8_t targetKm = 0;//目标里程
+ uint8_t targetstand = 0;//目标站立
+ uint8_t targetfat = 0;//目标燃脂时间
+ uint8_t ringTime = 0;//铃声提醒
+ uint8_t vibration = 0;//振动提醒
+ uint8_t notify = 0;//通知提醒
+
+ targetKcal = get_goal_caloriescount();
+ targetKm = get_goal_discount();
+ targetstand =get_goal_standupcount();
+ targetfat = get_goal_durationcount();
+
+ ringTime = get_other_goal_notify_switch ();
+ vibration = get_other_goal_notify_switch();
+ notify = get_other_goal_notify_switch();
+
+ memcpy(&value[17],&targetKcal,2);//目标卡路里
+ value[19] = targetKm;//
+ value[20] = targetstand;//
+ value[21] = targetfat;//
+
+ value[22] = ringTime;//
+ value[23] = vibration;//
+ value[24] = notify;//通知提醒
+ value[25] = Calculate_CRC(value,25);
+ sendBleData(value,26);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint32_t datalen = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x2f;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(1)
+ {
+ uint8_t data=ble_get_password();
+ memcpy(&value[17],&data,1);//
+
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+static void GetmsgconfigCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[36];
+ memset(value,0,36);
+ uint32_t tmp = 1;
+ uint32_t datalen = 18;
+ uint16_t tmp_data = 18;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x33;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(1)
+ {
+ uint8_t data_buf[filtration_data_count];
+ uint8_t data_buf_len=0;
+ // memset(data,1,18);
+ filtration_on_get((uint8_t*)data_buf,&data_buf_len);
+ // printf("data_buf_len %d\r\n",data_buf_len);
+ memcpy(&value[17],data_buf,data_buf_len);//
+ value[17+data_buf_len] = Calculate_CRC(value,17+data_buf_len);
+ sendBleData(value,18+data_buf_len);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+
+
+
+bool get_AI_PATH_and_size(char *path,uint32_t *size)
+{
+
+ memcpy((void*)path,ble_get_ai_audio_path_str(),strlen(ble_get_ai_audio_path_str()));
+
+ FILE *fp= fopen(path,"r+");
+ if(fp)
+ {
+ fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+ *size = ftell(fp); // 获取当前文件指针位置,即文件大小
+ fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+ fclose(fp);
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+#define SEND_AIVOICE_PACKAGE_DELAY 15
+//APP获取录音文件,录音文件上传
+static void GetAiRecordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint32_t datalen = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x2f;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ char file_name[64]={0};
+ uint32_t file_size=0;
+ if(get_AI_PATH_and_size(file_name,&file_size))
+ {
+ int num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+
+ char *data= (char *)malloc(num+1);
+
+ uint16_t read_size=0;
+ FILE *fp=fopen(file_name,"rb+");
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetAiRecordCmd size %d\r\n",file_size);
+ uint32_t pack=file_size/num+1;
+ uint32_t pack_id=1;
+ if(fp==NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);
+ goto GetAiRecordFail;
+ }
+ do
+ {
+ memset_s(data,num+1,0,num+1);
+ read_size=fread(data,1,num,fp);
+
+ if(read_size!=0)
+ {
+ ble_data_type type_={0x01,0x34,file_size,pack,pack_id};
+ send_big_data(type_,data,read_size);
+ }
+ pack_id++;
+
+
+ } while (read_size==num);
+ free(data);
+ fclose(fp);
+ }else
+ {
+ GetAiRecordFail:
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+static void GetSOSDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint32_t data_len=0;
+ uint8_t *bin_data = ble_get_sos_all_data_malloc(&data_len);
+ if(bin_data==NULL)
+ {
+ ble_data_type type_={0x01,0x36,0,1,1};
+ send_big_data(type_,NULL,0);
+ return;
+ }
+ uint32_t surplus_len=data_len;
+ uint32_t offset=0;
+
+ uint32_t pack;
+ uint16_t pack_size=(ble_nus_max_data_len-18);
+ if(pack_size>482)pack_size=482;
+
+ if(data_len%pack_size==0)
+ {
+ pack=data_len/pack_size;
+ }
+ else
+ {
+ pack=data_len/pack_size+1;
+ }
+ uint32_t pack_id=1;
+ while (surplus_len!=0)
+ {
+ if(surplus_len>=pack_size)
+ {
+ surplus_len=surplus_len-pack_size;
+
+ ble_data_type type_={0x01,0x36,data_len,pack,pack_id};
+ send_big_data(type_,(char *)bin_data+offset,pack_size);
+ offset+=pack_size;
+ }
+ else
+ {
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+ ble_data_type type_={0x01,0x36,data_len,pack,pack_id};
+ send_big_data(type_,(char *)bin_data+offset,surplus_len);
+ break;
+ }
+ pack_id++;
+ }
+ free(bin_data);
+
+
+}
+//AI录音已经就绪
+static void AiIsReadyCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+
+ if(data[0])
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd succ\r\n");
+ }else
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd fail\r\n");
+ }
+}
+//app发送解除配对消息
+static void UnpairMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint32_t datalen = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x2d;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ value[17] = 1;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+uint8_t is_connect_synchronization_time=0;
+
+//app发送同步数据结束消息
+static void GetSynDataEndCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ uint32_t datalen = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x2e;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&datalen,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ value[17] = 1;//
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_SYN_END);
+
+ if(is_connect_synchronization_time)
+ {
+ watch_synchronization_time();
+ }
+ else
+ {
+ if(g_ble_conn_id)
+ {
+ is_connect_synchronization_time=1;
+ }
+
+ }
+
+
+
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+//同步基础训练历史数据 training history data
+static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id)
+{
+
+
+ char *json_format = NULL;
+ switch (id)
+ {
+ case 0x49:
+ json_format=struct_to_json_buf_malloc_(day);
+ break;
+ case 0x01:
+ json_format=struct_to_json_buf_malloc_Alarm();
+ break;
+ case 0x21:
+ json_format=dir_to_json_buf_malloc(day);
+ break;
+
+ default:
+ break;
+ }
+
+ if(json_format == NULL) return ;
+
+ uint32_t data_len = strlen(json_format);
+ uint32_t surplus_len=data_len;
+ uint32_t pack;
+ if(data_len%pack_size==0)
+ {
+ pack=data_len/pack_size;
+ }
+ else
+ {
+ pack=data_len/pack_size+1;
+ }
+ uint32_t pack_id=1;
+ uint32_t offset=0;
+ while (surplus_len!=0)
+ {
+ if(surplus_len>=pack_size)
+ {
+ surplus_len=surplus_len-pack_size;
+
+ ble_data_type type_={0x01,id,data_len,pack,pack_id};
+ send_big_data(type_,json_format+offset,pack_size);
+
+ //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);
+ offset+=pack_size;
+ }
+ else
+ {
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+ ble_data_type type_={0x01,id,data_len,pack,pack_id};
+ send_big_data(type_,json_format+offset,surplus_len);
+ //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);
+ break;
+ }
+ pack_id++;
+ }
+ cJSON_free(json_format);
+}
+
+//同步数据结束完成
+static void synEndDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint8_t value[18+1];
+ memset(value,0,18+1);
+ uint32_t tmp = 1;
+ uint32_t tmpToall = 0;
+ uint16_t tmp_data = 0;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x2e;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmpToall,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ if(Check_CRC(data,len,crcvalue))
+ {
+ value[17] = 1;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+ }else
+ {
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+
+
+
+//01类型
+/*
+cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘
+*data:数据,不包含前面17个字节的包头和最后一位的校验和
+len 就是data的长度
+*totaldata:总的数据内容 包含包头和校验预览做接口是用 如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和
+crcvalue;数据的校验和 不包含包头和校验和的计算结果
+*/
+// 73 01 31 01 00 00 00 01 00 00 00 01 00 00 00 00 00 2 FE
+void SetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置入库模式 0关闭 1电信 2-255移动
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ value[0] =0x72;
+ value[1] =0x01;
+ value[2] =0x31;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+
+ int state = 0;
+ state = data[0];
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data[0];%d state:%d\r\n",data[0],state);
+ Set_DmpChangeMode(state);
+ value[17] = 1;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else{
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+// 73 01 32 01 00 00 00 00 00 00 00 01 00 00 00 00 00 crc
+
+void GetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取入库模式 0关闭 1电信 2-255移动
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ value[0] =0x72;
+ value[1] =0x01;
+ value[2] =0x32;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ int state = Get_DmpChangeMode();
+ value[17] = state;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else{
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];
+ #ifdef BLE_LOG
+
+ #endif
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE3Data:0x%04X\r\n",cmd);
+ // uint8_t typeID = cmd_buf[2];
+ switch (cmd)
+ {
+ case SEND_UPPAIR_CMD://清除配对指令
+ clearPaireCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SWITCH_DIAL_CMD://表盘切换
+ switchDialCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case ABOUT_DEV_CMD://关于本机内容
+ aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case FIND_WATCH_CMD://查找手表
+ findWatchCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_SD_SPACE_CMD://获取sdk的剩余空间
+ GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_CURR_DATA_CMD://获取当前数据 卡路里
+ GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_BATTERY_LEVEL_CMD://获取手表电池电量
+ GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SWITCH_MESS_CMD://开关消息推送功能
+ SetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输
+ RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件
+ DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SWITCH_SPORT_MODE_CMD://开启指定运动模式
+ OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case STOP_SPORT_MODE_CMD://结束运动模式
+ StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SET_LANGUGAE_CMD://设置语言
+ SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_REAL_HEART_CMD://获取实时训练数据
+ GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据
+ SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率
+ SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+
+ case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭
+ SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SPORT_PAUSE_RESET_CMD://训练暂停/恢复
+ GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘
+ SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SEND_CURR_STATUS_CMD: //获取手表当前状态
+ GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数
+ GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case DELETE_DIAL_CMD://删除表盘UID
+ DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数
+ GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数
+ GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置
+ GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置
+ GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_GESTURE_CARMERA_CMD://获取手势拍照
+ carmeraCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_DRINK_SWITCH_CMD://获取喝水提醒设置
+ GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case FACTORY_SET_CMD://app发送恢复出厂设置
+ GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case RESET_WATCH_CMD://app发送重启指令
+ GetResetCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case POWER_OFF_CMD://app发送关机
+ GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case KM_MILE_CMD://app设置手表公英制单位
+ GetMetricCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SLEEP_GET_CMD://app获取睡眠设置
+ GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_SEDENT_CMD:
+ GetSedentParamCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case DELETE_ALL_DILA_CMD://app所有表盘UID
+ GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_TARGET_STEP_CMD://app获取目标步数设置
+ GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_OTHER_TARGET_CMD://app获取其他目标
+ GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_UNPAIR_CMD://发送解除配对消息
+ UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SYN_DATA_END_CMD: //app发送同步数据结束消息
+ GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_PASSWORD_CMD: //获取手表密码
+ GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SYN_GET_MSG_CONFIG_CMD: //获取手表消息设置
+ GetmsgconfigCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+
+ case APP_GET_AI_PCM_DATA_CMD:
+ GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case APP_GET_SOS_DATA_CMD:
+ GetSOSDataCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+
+ case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录
+ case AI_IS_READ_DATA_CMD:
+ case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据
+ case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据
+ case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据
+ case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据
+ case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据
+ case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据
+ case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据
+ case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据
+ case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据
+ case ALARM_CMD://获取手表闹钟//同步闹钟
+
+ readDevDataBle(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case SET_DMP_MODE_CMD://0X0131
+ SetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ case GET_DMP_MODE_CMD://0X0132
+ GetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);
+ break;
+ default:
+ break;
+ }
+
+
+}
+
+
+//05 类型
+void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)
+{
+ uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];
+ switch (typeID) //ID
+ {
+ case FIND_PHONE_CMD://查找手机
+ // (data,datalen);
+ break;
+ case GET_CURR_TIME_CMD://手表获取系统时间
+ // getPhoneInfo(data,datalen);
+ break;
+ case SEND_PARI_SUCESS_CMD:
+ // GetUTCtime(data,datalen);//获取时间app下发的时间进行解析
+ break;
+ case GET_TRANS_END_CMD:
+ // getPhoneInfo_test();
+ break;
+ case SEND_FACTORY_RECORD_CMD:
+ break;
+ case REQUEST_EPO_FILE_CMD:
+ break;
+ case SEND_TRAIN_STATUS_CMD:
+ break;
+ default:
+ break;
+ }
+}
+
+
+#define STEP_DATA_LEN 8
+#define KCAL_DATA_LEN 8
+#define DIS_DATA_LEN 8
+#define STAND_DATA_LEN 8
+#define FATTIME_DATA_LEN 6
+#define HEART_DATA_LEN 5
+#define SPO2_DATA_LEN 5
+uint8_t bleSendTypeID=0; //发送的数据类型
+//发送读出来的设备数据to APP
+uint16_t max_mtu_szie_data_len = 200;
+uint32_t EACH_DATA_LEN=0;//每种数据类型的的长度
+
+
+void Send_Sleep_Bin_Data(uint8_t day, uint16_t num)
+{
+
+ char *data=NULL;
+ uint32_t file_size=1;
+ uint8_t sleep_count = ble_get_sleep_data_dir(&file_size,day);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Send_Sleep_Bin_Data file_size : %d \r\n",file_size);
+
+ data=(char *)malloc(file_size);
+
+ if(data==NULL)
+ {
+ return;
+ }
+
+ memset(data,0,file_size);
+
+ data[0]=sleep_count;
+
+ if(data==NULL)
+ {
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"malloc\r\n");
+ #endif
+
+ return;
+ }
+ ble_get_sleep_data(file_size,day,(uint8_t*)data+1);
+
+
+ if(data==NULL || file_size==1)
+ {
+ ble_data_type type_={0x01,0x4b,0,1,1};
+ send_big_data(type_,NULL,0);
+ //send_big_data(1,NULL,0,0,1,1,0x4b,1);
+ return;
+ }
+
+ uint32_t surplus_len=file_size;
+ uint32_t pack;
+ if(file_size%num==0)
+ {
+ pack=file_size/num;
+ }
+ else
+ {
+ pack=file_size/num+1;
+ }
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+ uint32_t pack_id=1;
+ uint32_t offset=0;
+ while (surplus_len!=0)
+ {
+ if(surplus_len>=num)
+ {
+ surplus_len=surplus_len-num;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",num,file_size,pack_id,pack);
+
+ ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};
+ send_big_data(type_,data+offset,num);
+ offset+=num;
+ }
+ else
+ {
+ //#ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",surplus_len,file_size,pack_id,pack);
+ //#endif
+ ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};
+ send_big_data(type_,data+offset,surplus_len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始\r\n");
+ for(int i=0;i<surplus_len;i++)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02X ",(uint8_t)data[i]);
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"结束\r\n");
+ break;
+ }
+ pack_id++;
+ }
+ free(data);
+
+}
+
+
+bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t id)
+{
+
+ // send_big_data(1,NULL,0,0,1,1,id,1);
+ // return;
+ char *buf=NULL;
+ char path[128]={0};
+ switch (id)
+ {
+ case 0x40://同步心率历史数据
+ get_health_HEART_data_path(path,day,128);
+ break;
+ case 0x41://同步血氧历史数据
+ get_health_OXYGEN_data_path(path,day,128);
+ break;
+ }
+ uint32_t file_size=0;
+ FILE *fp= fopen(path,"r+");
+ if(fp==NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+ return false;
+ }
+ fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+ file_size = ftell(fp); // 获取当前文件指针位置,即文件大小
+ fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+ int num_check=file_size%5;
+ if(num_check!=0)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "数据有误 %d %d \r\n", file_size, num);
+ fclose(fp);
+ return false;
+ }
+
+ buf = (char *)ym_malloc(sizeof(char)*num+1);
+ if(buf==NULL){fclose(fp); return false;}
+
+ uint32_t pack=1;
+ if(file_size%num==0)
+ pack=file_size/num;
+ else
+ pack=file_size/num+1;
+ uint32_t pack_id=1;
+ uint32_t read_size=0;
+ do
+ {
+ memset_s(buf,num+1,0,num+1);
+ read_size=fread(buf,1,num,fp);
+ if(read_size!=0)
+ {
+ ble_data_type type_={0x01,id,file_size,pack,pack_id};
+ send_big_data(type_, buf, read_size);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%d %d %d %d %d\r\n",read_size,file_size,pack_id,pack);
+ }
+
+
+ //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);
+ pack_id++;
+ } while (read_size==num);
+
+ fclose(fp);
+ free(buf);
+ return true;
+}
+
+void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)
+{
+
+ const char *data=NULL;
+ uint32_t data_len = 0;
+
+ data=ble_sywee_history(day,&data_len,id);
+
+ if(data==NULL)
+ {
+ ble_data_type type_={0x01,id,0,1,1};
+ send_big_data(type_,NULL,0);
+
+ //send_big_data(1,NULL,0,0,1,1,id,1);
+ return;
+ }
+ uint8_t single_data=8;
+ if(id==0x44)
+ {
+ single_data=6;
+ }
+ else if (id==0x45)
+ {
+ single_data=4;
+ }
+ int check_num=data_len%single_data;
+ if(check_num!=0)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id);
+ free(data);
+ ble_data_type type_={0x01,id,0,1,1};
+ send_big_data(type_,NULL,0);
+
+ return ;
+ }
+
+ uint32_t surplus_len=data_len;
+ uint32_t pack;
+ if(data_len%pack_size==0)
+ {
+ pack=data_len/pack_size;
+ }
+ else
+ {
+ pack=data_len/pack_size+1;
+ }
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+ uint32_t pack_id=1;
+ uint32_t offset=0;
+ while (surplus_len!=0)
+ {
+ if(surplus_len>=pack_size)
+ {
+ surplus_len=surplus_len-pack_size;
+ ble_data_type type_={0x01,id,data_len,pack,pack_id};
+ send_big_data(type_,data+offset,pack_size);
+ //send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1);
+ offset+=pack_size;
+ }
+ else
+ {
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+ #endif
+
+ ble_data_type type_={0x01,id,data_len,pack,pack_id};
+ send_big_data(type_,data+offset,surplus_len);
+
+ //send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1);
+ break;
+ }
+ pack_id++;
+ }
+ free(data);
+
+}
+
+//手机app下发读设备数据指令
+void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+
+ uint8_t sendBuf[19];
+ memset(sendBuf,0,19);
+ uint8_t type = cmd/256;
+ uint8_t typeID = cmd-((cmd/256)*256);
+ uint32_t totaldata_pack = 1;
+ uint32_t totaldata_packlen = 0;
+ uint32_t pack_count = 0;
+ uint16_t pack_datalen = 0;
+ sendBuf[0]=0x72;
+ sendBuf[1]=type;
+ sendBuf[2]=typeID;
+ memcpy(sendBuf+3,&totaldata_pack,4);//总的数据包
+ memcpy(sendBuf+7,&totaldata_packlen,4);//总的数据包长度
+ memcpy(sendBuf+11,&pack_count,4);//分包索引号
+
+ memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ bleSendTypeID=cmd-((cmd/256)*256);
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步第%d天的数据\r\n",data[0]);
+ int num;
+
+ switch (bleSendTypeID)
+ {
+ case 0x40://同步心率历史数据
+ if(uapi_dev_runtime_get_heartrate_storage_status())
+ {
+ ble_reply_cmdarr(SYN_HEART_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+ num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步心率数据,每包最多:%d 数据 data:%d %d\r\n",num,data[0],len);
+ #endif
+ uapi_dev_runtime_set_heartrate_storage_status(1);
+ if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x40))
+ {
+ ble_data_type type_={0x01,0x40,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+ uapi_dev_runtime_set_heartrate_storage_status(0);
+ //send_big_data(1,NULL,0,0,1,1,0x40,1);
+
+ break;
+ case 0x41://同步血氧历史数据
+ if(uapi_dev_runtime_get_bloodoxygen_storage_status())
+ {
+ ble_reply_cmdarr(SYN_SPO2_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+
+ num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+ uapi_dev_runtime_set_bloodoxygen_storage_status(1);
+ if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x41))
+ {
+ ble_data_type type_={0x01,0x41,0,1,1};
+ send_big_data(type_,NULL,0);
+ }
+ uapi_dev_runtime_set_bloodoxygen_storage_status(0);
+
+ break;
+ case 0x43: //同步步数历史数据
+
+ if(uapi_dev_runtime_get_goal_storage_status())
+ {
+ ble_reply_cmdarr(SYN_STEP_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+ num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+ uapi_dev_runtime_set_goal_storage_status(1);
+ Read_BIN_file_buf_send_bin_Data(data[0],num,0x43);
+ uapi_dev_runtime_set_goal_storage_status(0);
+
+ break;
+ case 0x44://同步燃脂时间数据
+
+ if(uapi_dev_runtime_get_goal_storage_status())
+ {
+ ble_reply_cmdarr(SYN_FAT_BURN_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+ num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+ uapi_dev_runtime_set_goal_storage_status(1);
+ Read_BIN_file_buf_send_bin_Data(data[0],num,0x44);
+ uapi_dev_runtime_set_goal_storage_status(0);
+ break;
+ case 0x45://同步站立历史数据
+
+ if(uapi_dev_runtime_get_goal_storage_status())
+ {
+ ble_reply_cmdarr(SYN_STAND_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+
+ num=(ble_nus_max_data_len-18);
+ if(num>482)
+ {
+ num=482;
+ }
+ uapi_dev_runtime_set_goal_storage_status(1);
+ Read_BIN_file_buf_send_bin_Data(data[0],num,0x45);
+ uapi_dev_runtime_set_goal_storage_status(0);
+
+ break;
+ case 0x46://同步卡路里历史数据
+ if(uapi_dev_runtime_get_goal_storage_status())
+ {
+ ble_reply_cmdarr(SYN_KCAL_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+ num=(ble_nus_max_data_len-18);
+ if(num>482)
+ {
+ num=482;
+ }
+ uapi_dev_runtime_set_goal_storage_status(1);
+ Read_BIN_file_buf_send_bin_Data(data[0],num,0x46);
+ uapi_dev_runtime_set_goal_storage_status(0);
+ break;
+ case 0x47://同步距离历史数据
+
+ if(uapi_dev_runtime_get_goal_storage_status())
+ {
+ ble_reply_cmdarr(SYN_DIS_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+ num=(ble_nus_max_data_len-18);
+ if(num>482)
+ {
+ num=482;
+ }
+ uapi_dev_runtime_set_goal_storage_status(1);
+ Read_BIN_file_buf_send_bin_Data(data[0],num,0x47);
+ uapi_dev_runtime_set_goal_storage_status(0);
+ break;
+ case 0x49://同步基础训练历史数据
+
+ if(uapi_dev_runtime_get_train_storage_status())
+ {
+ ble_reply_cmdarr(SYN_BASIC_TRANIN_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+ EACH_DATA_LEN = DIS_DATA_LEN;
+ num=(ble_nus_max_data_len-18);
+ if(num>482)
+ {
+ num=482;
+ }
+ uapi_dev_runtime_set_train_storage_status(1);
+ Send_json_Data_Cmd(data[0],num,0x49);
+ uapi_dev_runtime_set_train_storage_status(0);
+ break;
+ case 0x01://同步闹钟
+ EACH_DATA_LEN = DIS_DATA_LEN;
+ num=(ble_nus_max_data_len-18);
+ if(num>482)
+ {
+ num=482;
+ }
+ Send_json_Data_Cmd(data[0],num,0x01);
+ break;
+ case 0x4b://睡眠历史数据
+
+ if(uapi_dev_runtime_get_sleep_storage_status())
+ {
+ ble_reply_cmdarr(SYN_SLEEP_HISTORY_DATA_CMD,NULL,0);
+ return;
+ }
+
+ EACH_DATA_LEN = DIS_DATA_LEN;
+ num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+ uapi_dev_runtime_set_sleep_storage_status(1);
+ Send_Sleep_Bin_Data(data[0],num);
+ uapi_dev_runtime_set_sleep_storage_status(0);
+ break;
+ case 0x21://文件目录
+ EACH_DATA_LEN = DIS_DATA_LEN;
+ num=(ble_nus_max_data_len-18);
+ if(num>482)
+ {
+ num=482;
+ }
+ Send_json_Data_Cmd(data[0],num,0x21);
+ break;
+
+ default:
+ break;
+ }
+ //sendReadData();
+ }else{
+ sendBuf[18] = 0;
+ sendBleData(sendBuf,19);
+ }
+}
+
+
+
+
+void getPhoneInfo_test(void)
+{
+ /*
+ cJSON *dataJSON = cJSON_CreateObject();
+ cJSON* data_arryJSON = cJSON_CreateArray();
+ cJSON_AddNumberToObject(dataJSON,"code",1);
+
+ for(uint8_t i =0;i<3;i++)
+ {
+ cJSON* itemJSON = cJSON_CreateObject();
+ cJSON* arrayJSON = cJSON_CreateArray();
+ for(uint8_t id = 0;id<7;id++)
+ {
+ cJSON_AddNumberToObject(arrayJSON,"id",id);
+ }
+
+ cJSON_AddNumberToObject(itemJSON,"id",i);
+ cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON);
+ cJSON_AddNumberToObject(itemJSON,"hour",2+20*i);
+ cJSON_AddNumberToObject(itemJSON,"minute",30+i*0);
+ cJSON_AddNumberToObject(itemJSON,"enable",1);
+ cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON);
+ }
+ cJSON_AddItemToObject(dataJSON,"alarm",data_arryJSON);
+
+ char *json_format = cJSON_PrintUnformatted(dataJSON);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\n",strlen(json_format));
+ cJSON_Delete(dataJSON);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\n",json_format);
+ uint32_t data_len = strlen(json_format);
+ uint8_t value[data_len+18];
+ uint32_t tmp = 1;
+ uint16_t tmp_data = 1;
+ value[0] = 0x72;
+ value[1] = 0x01;
+ value[2] = 0x01;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp_data,2);
+ memcpy(value+17,(uint8_t *)json_format,data_len);
+ unsigned char lrc = Calculate_CRC(value,data_len+17);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lrc:%d",lrc);
+ value[data_len+18] = lrc;
+ sendBleData(value,data_len+18);
+ */
+
+ // uint8_t value[128];
+ // memset(value,0,128);
+
+ // value[0] = 0x72;
+ // value[1] = 0x01;
+ // value[2] = 0x0f;
+ // char buf[128];
+ // memset(buf,0,128);
+ // getSportData(&buf);
+ // uint32_t tmp = 1;
+ // uint32_t datalen = 1;
+ // uint16_t tmp_data = 1;
+ // datalen = strlen(buf);
+ // tmp_data = datalen;
+ // memcpy(value+3,&tmp,4);
+ // memcpy(value+7,&datalen,4);
+ // memcpy(value+11,&tmp,4);
+ // memcpy(value+15,&tmp_data,2);
+ // memcpy(&value[17],buf,strlen(buf));
+
+ // comfirmPaire(0);
+
+}
+
+bool creatMessageDir(void)//创建消息文件夹
+{
+ struct stat info;
+ if (stat(ANCS_DATA_CONFIG_DIR, &info) != 0)
+ {
+ if (mkdir(ANCS_DATA_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
+ {
+ return false; // Failed to create folder
+ }
+ }
+ return true;
+}
+char *get_message_dir_path(void)//获取信息的文件夹路径
+{
+ return ANCS_DATA_CONFIG_DIR;
+}
+
+void message_data(int uid,int appid,char *title,char *msg,int hasCode)
+{
+
+ uint32_t timestampe = 0;
+ if (uapi_get_timestampe_ss(×tampe) != ERRCODE_SUCC)
+ {
+ timestampe = 0;
+ }
+ ancs_data_info_t data;
+ data.title=malloc(strlen(title)+1);
+ data.msg = malloc(strlen(msg) + 1);
+ memset_s(data.title, TITLE_BUF_LEN, 0, strlen(title) + 1);
+ memset_s(data.msg, MSG_BUF_LEN, 0, strlen(msg) + 1);
+ memcpy_s(data.title, TITLE_BUF_LEN + 1, title, strlen(title));
+ memcpy_s(data.msg, MSG_BUF_LEN + 1, msg, strlen(msg));
+
+
+ data.appid = appid;
+ data.uid=uid;
+ data.time=timestampe;
+ data.read=0;
+ data.hasCode = hasCode;
+
+ data.msglen = strlen(msg);
+ data.titlelen = strlen(title);
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"message_data %p %p\r\n", data.title, data.msg);
+
+ CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(&data);
+ return ;
+
+}
+int uft8_check(char *chinese_string,int length)
+{
+ int i = 0;
+ for (i = 0; i < length;) {
+ // 判断是否为ASCII字符
+ if ((unsigned char)chinese_string[i] < 0x80) {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ASCII character: %d\n", (int)(unsigned char)chinese_string[i]);
+ i++;
+ } else {
+ // 假设这里我们只处理3字节的UTF-8字符
+ // 实际上,中文字符通常是4字节
+ if ((unsigned char)chinese_string[i] >= 0xF0) {
+ // 这里应处理4字节UTF-8字符的逻辑
+ // 例如: return (chinese_string[i] << 24) | (chinese_string[i + 1] << 16) | (chinese_string[i + 2] << 8) | chinese_string[i + 3];
+ i += 4; // 跳过4个字节
+ } else if ((unsigned char)chinese_string[i] >= 0xE0) {
+ // 这里应处理3字节UTF-8字符的逻辑
+ // 例如: return (chinese_string[i] << 16) | (chinese_string[i + 1] << 8) | chinese_string[i + 2];
+ i += 3; // 跳过3个字节
+ } else {
+ // 这里应处理2字节UTF-8字符的逻辑
+ // 例如: return (chinese_string[i] << 8) | chinese_string[i + 1];
+ i += 2; // 跳过2个字节
+ }
+ }
+ if(i+4 > length)
+ break;
+ }
+ return i;
+}
+
+
+//安卓消息接收解析数据 //ANCS 2AE1
+uint8_t jscheck_ancs(uint8_t *data)
+{
+ uint8_t *json;
+ json = data;
+ cJSON* root = cJSON_Parse((const char *)json);
+ if (root == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"信息解析 JSON解析 失败\n");
+ return 2;
+ }
+
+ int uid_t = 0;
+ int appid_t = 0;
+ int hasCode_t = 0;
+ char *titleBuf;
+ char *msgBuf;
+ titleBuf = ym_malloc(TITLE_BUF_LEN+1);
+ msgBuf = ym_malloc(MSG_BUF_LEN+1);
+ if(titleBuf == NULL || msgBuf == NULL)//申请内存失败不在申请
+ {
+ return 2;
+ }
+ memset(titleBuf,0,TITLE_BUF_LEN+1);
+ memset(msgBuf,0,MSG_BUF_LEN+1);
+ cJSON* uid = cJSON_GetObjectItem(root, "uid");
+ if (uid && cJSON_IsNumber(uid)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"uid_t: %d\n", uid->valueint);
+ uid_t = uid->valueint;
+ }
+ cJSON* appid = cJSON_GetObjectItem(root, "appid");
+ if (appid && cJSON_IsNumber(appid)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"appid_t: %d\n", appid->valueint);
+ appid_t = appid->valueint;
+ }
+ cJSON* title_c = cJSON_GetObjectItem(root, "title");
+ if (title_c && cJSON_IsString(title_c)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"titleBuf: %s\n", title_c->valuestring);
+ int len = strlen(title_c->valuestring);
+ if(len >= TITLE_BUF_LEN){
+ len = uft8_check(title_c->valuestring,TITLE_BUF_LEN-4);
+ title_c->valuestring[len++] ='.';
+ title_c->valuestring[len++] = '.';
+ title_c->valuestring[len++] = '.';
+ title_c->valuestring[len++] = 0;
+ }
+ memcpy_s(titleBuf,TITLE_BUF_LEN,(uint8_t *)title_c->valuestring,len);
+ }
+ cJSON* msg = cJSON_GetObjectItem(root, "msg");
+ if (msg && cJSON_IsString(msg)) {
+ int len = strlen(msg->valuestring);
+ if(len >= MSG_BUF_LEN-4){
+ len = uft8_check(msg->valuestring,MSG_BUF_LEN-4);
+ msg->valuestring[len++] ='.';
+ msg->valuestring[len++] = '.';
+ msg->valuestring[len++] = '.';
+ msg->valuestring[len++] = 0;
+ }
+ memcpy_s(msgBuf,MSG_BUF_LEN,(uint8_t *)msg->valuestring,len);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msgBuf: %s\n",msgBuf);
+ }
+ cJSON* time = cJSON_GetObjectItem(root, "time");
+ if (time && cJSON_IsString(time)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %s\n", time->valuestring);
+ // timeBuf = time->valueint;
+ }
+ cJSON* hasCode = cJSON_GetObjectItem(root, "hasCode");
+ if (hasCode && cJSON_IsNumber(hasCode)) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hasCode_t: %d\n", hasCode->valueint);
+ hasCode_t = hasCode->valueint;
+ }
+ cJSON_Delete(root);
+
+ // if(ancs_msg_data!=NULL)
+ // {
+ // free(ancs_msg_data);
+ // ancs_msg_data=NULL;
+ // }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message\r\n");
+ message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message ok\r\n");
+
+ if(titleBuf != NULL){
+ ym_free(titleBuf);
+ titleBuf = NULL;
+ }
+ if(msgBuf != NULL){
+ ym_free(msgBuf);
+ msgBuf = NULL;
+ }
+ return 1;
+}
+
+void ancsDataShowCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+ uint8_t value[19];
+ memset(value,0,19);
+ uint32_t tmp = 1;
+ value[0] =0x72;
+ value[1] =0x02;
+ value[2] =0x01;
+ memcpy(value+3,&tmp,4);
+ memcpy(value+7,&tmp,4);
+ memcpy(value+11,&tmp,4);
+ memcpy(value+15,&tmp,2);
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ //解析ancs数据并且显示出来
+ uint8_t check_ok= 1;
+ check_ok = jscheck_ancs(data);
+ value[17] = 1;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }else{
+ value[17] = 0;
+ value[18] = Calculate_CRC(value,18);
+ sendBleData(value,19);
+ }
+}
+
+void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void *data)
+{
+ CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA,(uint8_t*)data,sizeof(ancs_data_info_t));
+}
+
+void type2AE1Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)
+{
+ uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE1Data typeID:0x%4X\r\n",typeID);
+ #endif
+ switch (typeID) //ID
+ {
+ case ANDROID_ANCS_CMD://
+ ancsDataShowCmd(typeID,data,datalen,totalData,crcvalue);
+ break;
+ }
+}
+
+void bleRecvANCSData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据
+{
+ uint8_t type = buf_cmd[1];
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%d crcvalue:%x\r\n",buf_cmd[0],type,data_size,data[0],crcvalue);
+ switch (type)
+ {
+ case 0x03://
+ type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);
+ break;
+ default:
+ break;
+ }
+}
+
+/**
+ * less than 20bytes msg reply
+*/
+errcode_t ble_reply_msgarr(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t *replydata,uint16_t replydata_len)
+{
+
+ //发送校验失败
+
+ if (replydata_len > 20)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"datalen is larger than 20, please send with other api !\n");
+ return ERRCODE_FAIL;
+ }
+ uint16_t replybuflen=sizeof(msg_header_t)+replydata_len+1;
+ uint8_t *replybuf=malloc(replybuflen);
+ if(replybuf != NULL)
+ {
+ msg_header_t *reply_cmd_header=(msg_header_t*)replybuf;
+ reply_cmd_header->direction = MSG_DIRECTION_SEND;
+ reply_cmd_header->cmdtype =msg_cmdtype;
+ reply_cmd_header->cmdid = msg_cmdid;
+ reply_cmd_header->package_count = 1;
+ reply_cmd_header->package_index = 1;
+ reply_cmd_header->package_len = replydata_len;
+ reply_cmd_header->total_data_len = replydata_len;
+ memcpy_s(replybuf+sizeof(msg_header_t),replydata_len,replydata,replydata_len);
+ uint8_t crc_value = Calculate_CRC( replybuf, replybuflen - 1);
+ replybuf[ replybuflen - 1 ] = crc_value ; //CRC
+ errcode_t ret=0;
+ if(msg_cmdtype==6)
+ {
+ ret=sendBleData_zhihui(replybuf,replybuflen);
+
+ }else
+ {
+ ret= sendBleData(replybuf,replybuflen);
+ }
+
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ble_reply_msgarr cmdtype %02X cmdid %02X package %d/%d , len %d,total len %d , data[0] %02X crc %02X\n",
+ reply_cmd_header->cmdtype,
+ reply_cmd_header->cmdid,
+ reply_cmd_header->package_index,
+ reply_cmd_header->package_count,
+ reply_cmd_header->package_len,
+ reply_cmd_header->total_data_len,
+ (replybuf+sizeof(msg_header_t))[0],
+ crc_value
+ );
+ free(replybuf);
+ return ret;
+ }else{
+ return ERRCODE_MALLOC;
+ }
+}
+
+errcode_t ble_reply_cmdarr(uint16_t msg_cmd,uint8_t *replydata,uint16_t replydata_len)
+{
+
+ uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);
+ uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);
+
+ return ble_reply_msgarr(cmdtype,cmdid,replydata,replydata_len);
+
+}
+errcode_t ble_reply_cmd(uint16_t msg_cmd,uint8_t replydata)
+{
+ uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);
+ uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msg_cmd %04X cmdtype %02X cmdid %02X\n",msg_cmd,cmdtype,cmdid);
+ return ble_reply_msg(cmdtype,cmdid,replydata);
+}
+errcode_t ble_reply_msg(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t replydata)
+{
+ return ble_reply_msgarr(msg_cmdtype,msg_cmdid,&replydata,1);
+}
+
+static uint32_t last_package_id=0;
+static void ble_transfer_Timer_CallBack(int data)
+{
+ timer_flie_flag--;
+
+ if(timer_flie_flag==0)
+ {
+ cancel_recv_file(1);
+ }
+}
+uint8_t OTA_FILE_value=0;
+
+errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue)
+{
+ if(datalen<sizeof(msg_header_t))
+ {
+ return ERRCODE_FAIL;
+ }
+
+ msg_header_t *header = (msg_header_t*)data;
+
+ if(header->cmdtype!=0x06)
+ {
+ return ERRCODE_FAIL;
+ }
+
+ uint8_t* data_=data+sizeof(msg_header_t);
+ //datalen-=18;
+ datalen=header->package_len;
+
+ if(header->cmdid==0x0B)
+ {
+ //取消文件传输
+ if(Check_CRC(data_,datalen,crcvalue))
+ {
+ cancel_recv_file(0);
+ uint8_t replydata= 1;
+ ble_reply_msgarr(6,0x0B,&replydata,1);
+ }
+ else
+ {
+ cancel_recv_file(0);
+ uint8_t replydata= 0;
+ ble_reply_msgarr(6,0x0B,&replydata,1);
+ }
+
+ }
+ else if(header->cmdid==0x02)
+ {
+
+ uint32_t package_id=header->package_index;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package_id: %d \r\n",package_id);
+ if(Check_CRC(data_,datalen,crcvalue))
+ {
+
+ if(package_id==0)
+ {
+ last_package_id=package_id;
+ if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )
+ {
+ buffer_handle->file_recv_stat.lrcvalue = 0;
+ if (buffer_handle->file_recv_stat.file_type == 1)
+ {
+
+ buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);
+
+
+ }
+ else if (buffer_handle->file_recv_stat.file_type == 2)
+ {
+ char musicpath[64]={0};
+ get_music_path(musicpath,64);
+ //"/user/userdata/music"
+ char filepath[256]={0};
+ create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);
+
+ buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+ }
+ else if (buffer_handle->file_recv_stat.file_type == 4)
+ {
+ char filepath[128]={0};
+ if (get_app_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+ {
+ buffer_handle->file_recv_stat.file = fopen(filepath,"w+");//?
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
+ }
+ }
+ else
+ {
+ char filepath[128]={0};
+ 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)
+ {
+ buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
+ }
+ }
+
+
+
+ if (buffer_handle->file_recv_stat.file == NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file \n");
+ return ERRCODE_FAIL;
+ }
+ size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);
+ if(writtensize == datalen)
+ {
+ timer_flie_flag=10;
+
+ buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);
+ buffer_handle->file_recv_stat.received_size += datalen;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);
+ OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
+
+
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);
+ return ERRCODE_FAIL;
+ }
+
+
+ buffer_handle->file_recv_stat.recv_file_stat = 1;
+ ////////////////创建文件传输超时定时器//////////////////
+ uint32_t tick;
+ osStatus_t retTimer;
+ if(BR_TRANSFER_timer!=NULL)
+ {
+ osTimerDelete(BR_TRANSFER_timer);
+ BR_TRANSFER_timer = NULL;
+ }
+ ble_read_timer_p=buffer_handle;
+ timer_flie_flag=10;
+
+ BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);
+ tick =1000;// osMs2Tick(1000);
+ retTimer = osTimerStart(BR_TRANSFER_timer, tick);
+ if (retTimer != osOK && BR_TRANSFER_timer != NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+ osTimerDelete(BR_TRANSFER_timer);
+ BR_TRANSFER_timer = NULL;
+ return ERRCODE_FAIL;
+ }
+
+ {
+ if(buffer_handle->file_recv_stat.file_type==3)
+ TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;
+
+ if(buffer_handle->file_recv_stat.file_type==1)
+ TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;
+
+ if(buffer_handle->file_recv_stat.file_type==2)
+ TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+
+ if(buffer_handle->file_recv_stat.file_type==4)
+ TRANSMIT_DATA=TRANS_BIN_TRANSMITTING;
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ }
+ }
+ ///////////////////////////////////////////////////////////
+ }
+ else if ((last_package_id+1)==package_id)
+ {
+ last_package_id=package_id;
+ if (buffer_handle->file_recv_stat.file == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n");
+ return ERRCODE_FAIL;
+ }
+ //写入文件
+ size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);
+ if(writtensize == datalen)
+ {
+ timer_flie_flag=10;
+
+ buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);
+ buffer_handle->file_recv_stat.received_size += datalen;
+ OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size
+ ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size);
+
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);
+ return ERRCODE_FAIL;
+ }
+
+ //检查文件是否写完
+ if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)
+ {
+ if (buffer_handle->file_recv_stat.file!=NULL)
+ {
+ fclose(buffer_handle->file_recv_stat.file);
+ buffer_handle->file_recv_stat.file = NULL;
+ }
+ if (buffer_handle->file_recv_stat.file_name != NULL)
+ {
+ free(buffer_handle->file_recv_stat.file_name);
+ buffer_handle->file_recv_stat.file_name=NULL;
+ }
+ buffer_handle->file_recv_stat.recv_file_stat = 2;
+ buffer_handle->receive_file_flag = 0;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");
+
+ if(BR_TRANSFER_timer)
+ {
+ osTimerStop(BR_TRANSFER_timer);
+ osTimerDelete(BR_TRANSFER_timer);
+ BR_TRANSFER_timer = NULL;
+ }
+ ble_read_timer_p=NULL;
+
+ TRANSMIT_DATA=FILE_IS_DONE;
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+
+ ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功
+ }
+
+ }
+ else if (last_package_id==package_id)
+ {
+ uint32_t replydata=0xffffffff;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"0xffffffff 包重复\r\n");
+ //ble_reply_msgarr(6,4,&replydata,4);
+ }
+ else if (last_package_id!=package_id)
+ {
+ uint32_t replydata= last_package_id+1;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"包错漏\r\n");
+
+
+ ble_reply_msgarr(0x06,0x04,&replydata,4);
+ }
+ return ERRCODE_SUCC;
+ }
+ else
+ {
+ return ERRCODE_FAIL;
+ }
+ }
+ return ERRCODE_FAIL;
+}
+
+
+
+
+errcode_t decode_ota_json(ble_read_data *buffer_handle) {
+
+ if (uapi_dev_runtime_get_train_status() == 1) {
+ return ERRCODE_FAIL;
+ }
+
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+ uint16_t datalen = buffer_handle->totalDataLen;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ota_json_file_save %s\n",data);
+
+ cJSON* root = cJSON_Parse((const char *)data);
+ if(root != NULL)
+ {
+ cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");
+ if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))
+ {
+ buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;
+ if(is_free_ota_update(ota_size_json->valueint)==false)
+ {
+ TRANSMIT_DATA=TRANS_OTA_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ cJSON_Delete(root);
+
+ return ERRCODE_FAIL;
+ }
+ }
+
+ cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");
+ if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))
+ {
+ buffer_handle->file_recv_stat.file_type = ota_type_json->valueint;
+ }
+
+ cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");
+ if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {
+ uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;
+ if (filenamelen > 0 && filenamelen < 255)
+ {
+ buffer_handle->file_recv_stat.file_name = malloc(filenamelen);
+ if (buffer_handle->file_recv_stat.file_name!=NULL)
+ memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);
+ //下载完成再在 cancel download 里 free filename
+ }else{
+ buffer_handle->file_recv_stat.file_name = NULL;
+ }
+ }else{
+ buffer_handle->file_recv_stat.file_name = NULL;
+ }
+
+ cJSON* ota_major_json = cJSON_GetObjectItem(root, "major");
+ if(ota_major_json != NULL && cJSON_IsNumber(ota_major_json))
+ {
+ buffer_handle->file_recv_stat.ota_major = ota_major_json->valueint;
+ }
+ cJSON* ota_mid_json = cJSON_GetObjectItem(root, "mid");
+ if(ota_mid_json != NULL && cJSON_IsNumber(ota_mid_json))
+ {
+ buffer_handle->file_recv_stat.ota_mid = ota_mid_json->valueint;
+ }
+ cJSON* ota_minor_json = cJSON_GetObjectItem(root, "minor");
+ if(ota_minor_json != NULL && cJSON_IsNumber(ota_minor_json))
+ {
+ buffer_handle->file_recv_stat.ota_minor = ota_minor_json->valueint;
+ }
+ cJSON* ota_isforced_json = cJSON_GetObjectItem(root, "isForced");
+ if(ota_isforced_json != NULL && cJSON_IsNumber(ota_isforced_json))
+ {
+ buffer_handle->file_recv_stat.ota_isforced = ota_isforced_json->valueint;
+ }
+ cJSON_Delete(root);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," ota_type= %d, ota_name=%s, ota_size=%d, ota_major=%d, ota_mid=%d, ota_minor=%d, ota_isforced=%d \n",
+ buffer_handle->file_recv_stat.file_type,
+ buffer_handle->file_recv_stat.file_name,
+ buffer_handle->file_recv_stat.file_size,
+ buffer_handle->file_recv_stat.ota_major,
+ buffer_handle->file_recv_stat.ota_mid,
+ buffer_handle->file_recv_stat.ota_minor,
+ buffer_handle->file_recv_stat.ota_isforced
+ );
+ buffer_handle->file_recv_stat.received_size = 0;
+ buffer_handle->file_recv_stat.lrcvalue = 0;
+ buffer_handle->receive_file_flag = 1;
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+ //进入特殊UI
+ TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ return ERRCODE_SUCC;
+ }else{
+ buffer_handle->receive_file_flag = 0;
+ return ERRCODE_FAIL;
+ }
+}
+
+
+errcode_t decode_mp3_json(ble_read_data *buffer_handle)
+{
+ if (uapi_dev_runtime_get_train_status() == 1) {
+ return ERRCODE_FAIL;
+ }
+
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+ uint16_t datalen = buffer_handle->totalDataLen;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MP3_file_save %s\n",data);
+
+ cJSON* root = cJSON_Parse((const char *)data);
+
+ if(root != NULL)
+ {
+ cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");
+ if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))
+ {
+ buffer_handle->file_recv_stat.file_type = ota_type_json->valueint;
+ }
+
+ cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");
+ if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {
+ uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;
+
+ if (filenamelen > 0 && filenamelen < 255)
+ {
+ if(buffer_handle->file_recv_stat.file_name)
+ {
+ free(buffer_handle->file_recv_stat.file_name);
+ buffer_handle->file_recv_stat.file_name=NULL;
+ }
+ buffer_handle->file_recv_stat.file_name = malloc(filenamelen);
+ if (buffer_handle->file_recv_stat.file_name!=NULL)
+ {
+ memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);
+ memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);
+ }
+
+ //下载完成再在 cancel download 里 free filename
+ }else{
+ buffer_handle->file_recv_stat.file_name = NULL;
+ }
+ }
+
+ cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");
+ if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))
+ {
+ buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;
+ }
+ cJSON_Delete(root);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," MP3_type= %d, MP3_name=%s, MP3_size=%d \n",
+ buffer_handle->file_recv_stat.file_type,
+ buffer_handle->file_recv_stat.file_name,
+ buffer_handle->file_recv_stat.file_size
+ );
+ // buffer_handle->file_recv_stat.received_size = 0;
+ // buffer_handle->file_recv_stat.lrcvalue = 0;
+ // buffer_handle->receive_file_flag = 1;
+ // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+ // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+ // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ if(IS_free_save_Mp3(ota_size_json->valueint)==false)
+ {
+ free(buffer_handle->file_recv_stat.file_name);
+ buffer_handle->file_recv_stat.file_name=NULL;
+
+ TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ return ERRCODE_FAIL;
+ }
+ else
+ {
+ buffer_handle->file_recv_stat.received_size = 0;
+ buffer_handle->file_recv_stat.lrcvalue = 0;
+ buffer_handle->receive_file_flag = 1;
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+
+ return ERRCODE_SUCC;
+ }
+
+ }else{
+ buffer_handle->receive_file_flag = 0;
+ return ERRCODE_FAIL;
+ }
+}
+
+
+errcode_t decode_bin_json(ble_read_data *buffer_handle)
+{
+ if (uapi_dev_runtime_get_train_status() == 1) {
+ return ERRCODE_FAIL;
+ }
+
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+ uint16_t datalen = buffer_handle->totalDataLen;
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"decode_bin_json %s\n",data);
+
+ cJSON* root = cJSON_Parse((const char *)data);
+
+ if(root != NULL)
+ {
+ cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");
+ if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))
+ {
+ buffer_handle->file_recv_stat.file_type = ota_type_json->valueint;
+ }
+
+ cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");
+ if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {
+ uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;
+
+ if (filenamelen > 0 && filenamelen < 255)
+ {
+ if(buffer_handle->file_recv_stat.file_name)
+ {
+ free(buffer_handle->file_recv_stat.file_name);
+ buffer_handle->file_recv_stat.file_name=NULL;
+ }
+ buffer_handle->file_recv_stat.file_name = malloc(filenamelen);
+ if (buffer_handle->file_recv_stat.file_name!=NULL)
+ {
+ memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);
+ memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);
+ }
+
+ //下载完成再在 cancel download 里 free filename
+ }else{
+ buffer_handle->file_recv_stat.file_name = NULL;
+ }
+ }
+
+ cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");
+ if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))
+ {
+ buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;
+ }
+ cJSON_Delete(root);
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," bin type = %d, bin name =%s, bin size =%d \n",
+ buffer_handle->file_recv_stat.file_type,
+ buffer_handle->file_recv_stat.file_name,
+ buffer_handle->file_recv_stat.file_size
+ );
+ // buffer_handle->file_recv_stat.received_size = 0;
+ // buffer_handle->file_recv_stat.lrcvalue = 0;
+ // buffer_handle->receive_file_flag = 1;
+ // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+ // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+ // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ if(IS_free_save_Mp3(ota_size_json->valueint)==false)
+ {
+ free(buffer_handle->file_recv_stat.file_name);
+ buffer_handle->file_recv_stat.file_name=NULL;
+
+ TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ return ERRCODE_FAIL;
+ }
+ else
+ {
+ buffer_handle->file_recv_stat.received_size = 0;
+ buffer_handle->file_recv_stat.lrcvalue = 0;
+ buffer_handle->receive_file_flag = 1;
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+
+ memset_s(app_name,64,0,64);
+ memcpy_s(app_name,64, buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name));
+
+
+ return ERRCODE_SUCC;
+ }
+
+ }else{
+ buffer_handle->receive_file_flag = 0;
+ return ERRCODE_FAIL;
+ }
+}
+static uint16_t ble_dial_uid=0;
+
+errcode_t decode_dial_info(ble_read_data *buffer_handle)
+{
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_dial_info \n");
+ for(uint8_t i = 0;i<buffer_handle->data_len;i++)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+ if (buffer_handle->data_len == 6)
+ {
+
+ return ERRCODE_SUCC;
+ }
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+ uint16_t datalen = buffer_handle->totalDataLen;
+
+ msg_recv_dial_info_t dialinfo={0};
+ msg_recv_dial_info_t *pdialinfo=(msg_recv_dial_info_t*)data;
+
+ // dialinfo.dial_count = pdialinfo->dial_count;
+ dialinfo.dial_uid = pdialinfo->dial_uid;
+ if(dialinfo.dial_uid<=4)
+ {
+
+ msg_recv_custom_dial_info_t *custom_dial_info=(msg_recv_custom_dial_info_t*)data;
+ custom_dial_info->dial_uid+=1;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"custom_dial_info %d %d %d %d",
+ custom_dial_info->dial_uid,
+ custom_dial_info->battery,
+ custom_dial_info->time,
+ custom_dial_info->time_font);
+
+ ble_save_dial_custom(custom_dial_info);
+ ble_dial_file_count=*(data+sizeof(msg_recv_custom_dial_info_t));
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," custom_dial file_count %d\r\n",ble_dial_file_count);
+
+ }
+ else
+ {
+ dialinfo.file_name_len = pdialinfo->file_name_len;
+ // dialinfo.file_type = pdialinfo->file_type;
+
+ if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [0,255] \n");
+ return ERRCODE_FAIL;
+ }
+
+ char * filename = malloc(dialinfo.file_name_len);
+
+ ble_dial_file_count= data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len];
+ if (filename == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed filename_len %d\n",dialinfo.file_name_len);
+ return ERRCODE_FAIL;
+ }
+ memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len);
+
+ buffer_handle->file_recv_stat.file_name = filename;
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," dial name = %s, dial file count = %d \n",
+ filename,ble_dial_file_count);
+
+ free(filename);
+ buffer_handle->file_recv_stat.file_name=NULL;
+ }
+
+ ble_dial_uid = dialinfo.dial_uid;
+
+ buffer_handle->file_recv_stat.received_size = 0;
+ buffer_handle->file_recv_stat.lrcvalue = 0;
+ buffer_handle->receive_file_flag = 0;
+
+ return ERRCODE_SUCC;
+
+}
+
+errcode_t decode_single_dial_info(ble_read_data *buffer_handle)
+{
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_single_dial_info \n");
+ for(uint8_t i = 0;i<buffer_handle->data_len;i++)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+ if (buffer_handle->data_len == 6)
+ {
+ return ERRCODE_SUCC;
+ }
+ uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+ uint16_t datalen = buffer_handle->totalDataLen;
+
+ msg_recv_single_dial_info_t dialinfo={0};
+ msg_recv_single_dial_info_t *pdialinfo=(msg_recv_single_dial_info_t*)data;
+
+ dialinfo.dial_count = pdialinfo->dial_count;
+
+ ble_dial_file_index= dialinfo.dial_count;
+
+ dialinfo.dial_uid = pdialinfo->dial_uid;
+ dialinfo.file_name_len = pdialinfo->file_name_len;
+ dialinfo.file_type = pdialinfo->file_type;
+
+ if (dialinfo.file_name_len < 6 || dialinfo.file_name_len >255)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [6,255] \n");
+ return ERRCODE_FAIL;
+ }
+
+ if (uapi_dev_runtime_get_train_status() == 1) {
+ return ERRCODE_FAIL;
+ }
+
+
+ char * filename = malloc(dialinfo.file_name_len+1);
+ //下载完成再在 cancel download 里 free filename
+
+ uint32_t file_size = 0;
+ memcpy_s((void*)&file_size,sizeof(uint32_t),(void*)&data[sizeof(msg_recv_single_dial_info_t)+dialinfo.file_name_len],sizeof(uint32_t));
+ if (filename == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed filename_len %d\n",dialinfo.file_name_len);
+ return ERRCODE_FAIL;
+ }
+ memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_single_dial_info_t),dialinfo.file_name_len);
+ filename[dialinfo.file_name_len] ='\0';
+ //在runtime中备份一个安装文件名。
+ uapi_dev_runtime_set_dialname(filename);
+
+ if (check_dial_freespace(dialinfo.dial_uid, file_size) == false)
+ {
+ free(filename);
+ filename=NULL;
+
+ TRANSMIT_DATA=TRANS_DIAL_MAX_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ return ERRCODE_FAIL;
+ }
+
+ //存表盘id
+ ble_dial_uid = dialinfo.dial_uid;
+ // if(ble_dial_uid<=4)
+ // ble_dial_uid++;
+
+ if(buffer_handle->file_recv_stat.file_name)
+ {
+ free(buffer_handle->file_recv_stat.file_name);
+ buffer_handle->file_recv_stat.file_name=NULL;
+ }
+
+ buffer_handle->file_recv_stat.file_name = filename;
+ buffer_handle->file_recv_stat.file_size = file_size;
+ buffer_handle->file_recv_stat.file_type = 3;//表盘
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," filetype = %d, file_name=%s, file_size=%d , dial_uid %04X ,dial_count %d, dial_filetype %d\n",
+ buffer_handle->file_recv_stat.file_type,
+ buffer_handle->file_recv_stat.file_name,
+ buffer_handle->file_recv_stat.file_size,
+ dialinfo.dial_uid,
+ dialinfo.dial_count,
+ dialinfo.file_type
+
+ );
+ buffer_handle->file_recv_stat.received_size = 0;
+ buffer_handle->file_recv_stat.lrcvalue = 0;
+ buffer_handle->receive_file_flag = 1;
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+
+ // TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;
+ // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ return ERRCODE_SUCC;
+
+
+
+
+
+
+}
+static errcode_t install_dial(void)
+{
+ char *lzmapkgname = uapi_dev_runtime_get_dialname();
+ // 增加初始参数校验打印
+ if (lzmapkgname == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n");
+ return ERRCODE_FAIL;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname);
+
+ // 检查是否为lzma格式包
+ char *lzmaindex = strstr(lzmapkgname, ".lzma");
+ if (lzmaindex == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n");
+ return ERRCODE_FAIL;
+ }
+
+ // 创建表盘目录(若不存在)
+ struct stat info;
+ if (stat(get_dial_path(), &info) != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n");
+ if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n");
+ return ERRCODE_FAIL;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n");
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n");
+ }
+
+ // 解析表盘基础名称(去除.lzma后缀)
+ char dial_basename[64] = {0};
+ int dial_basenamelen = lzmaindex - lzmapkgname;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen);
+ if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen);
+ return ERRCODE_FAIL;
+ }
+ memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename);
+
+ // 确定解压后bin文件路径
+ char dialbin_filepath[128] = {0};
+ if (ble_dial_uid > 5) {
+ if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n");
+ return ERRCODE_FAIL;
+ }
+ } else {
+ if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n");
+ return ERRCODE_FAIL;
+ }
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath);
+
+ // 确定源lzma文件路径
+ char lzma_filepath[128] = {0};
+ if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n");
+ return ERRCODE_FAIL;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath);
+
+ // 执行解压操作
+ errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret,
+ (ret == ERRCODE_SUCC) ? "成功" : "失败");
+
+ // 关键:检查解压后bin文件是否存在及大小
+ struct stat bin_info;
+ if (stat(dialbin_filepath, &bin_info) != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath);
+ ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败
+ } else {
+ if (bin_info.st_size <= 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size);
+ ret = ERRCODE_FAIL; // 大小为空视为失败
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size);
+ }
+ }
+
+ // 若解压失败,直接返回
+ if (ret != ERRCODE_SUCC) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n");
+ return ret;
+ }
+
+ // 注册并设置表盘
+ char *namebuf = strtok(lzmapkgname, ".");
+ if (ble_dial_uid > 5) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid);
+ install_Register_dial(namebuf, ble_dial_uid);
+ ble_set_dial_by_id(ble_dial_uid);
+ } else {
+ if (ble_dial_file_index == ble_dial_file_count) {
+ char name_str[32] = {0};
+ ble_get_custom_dial(ble_dial_uid, name_str);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid);
+ install_Register_dial(name_str, ble_dial_uid);
+ ble_set_dial_by_id(ble_dial_uid);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n",
+ ble_dial_file_index, ble_dial_file_count);
+ }
+ }
+
+ // 删除源lzma文件
+ #if 1
+ if (remove(lzma_filepath) != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath);
+ // 此处不返回失败,仅警告,因为核心安装已完成
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n");
+ }
+ #endif
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n");
+ return ERRCODE_SUCC;
+}
+static char file_name[128]={0};
+static uint32_t file_size=0;
+
+bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id)
+{
+
+ char *data= (char *)malloc(pack_size+1);
+ uint16_t read_size=0;
+ FILE *fp=fopen(file_name,"rb+");
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size);
+
+ uint32_t pack=file_size/pack_size+1;
+ uint32_t pack_id=1;
+ if(fp==NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);
+ free(data);
+ return false;
+ }
+
+ do
+ {
+ memset_s(data,pack_size+1,0,pack_size+1);
+ read_size=fread(data,1,pack_size,fp);
+ if(read_size!=0)
+ {
+ ble_data_type type_={0x05,id,file_size,pack,pack_id};
+ send_big_data(type_,(char *)data,read_size);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size);
+ }
+
+
+ //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);
+ pack_id++;
+
+ } while (read_size==pack_size);
+ free(data);
+ fclose(fp);
+ sendbigDataBufState = false;
+ return true;
+}
+
+
+void delete_app(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)
+{
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ if(ble_app_delete(data))
+ {
+ ble_reply_cmd(cmd,1);
+ }
+ else
+ {
+ ble_reply_cmd(cmd,2);
+ }
+
+ }
+ else
+ {
+ ble_reply_cmd(cmd,0);
+ }
+
+}
+
+void get_app_list(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)
+{
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ cJSON *jdata=ble_app_list();
+
+ if(jdata)
+ {
+
+ char *jsonString = cJSON_PrintUnformatted(jdata);
+
+ if (jsonString == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");
+ cJSON_Delete(jdata);
+ return;
+ }
+
+ uint32_t data_len = strlen(jsonString);
+ cJSON_Delete(jdata);
+
+ if (data_len == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");
+ return;
+ }
+ int num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+
+ send_long_data(jsonString,num,0x06,0x0E);
+
+ cJSON_free(jsonString);
+ }
+
+
+ }
+ else
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC ERROR!");
+ ble_reply_cmd(cmd,0);
+ }
+
+}
+
+void get_watch_msg(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)
+{
+
+ if(Check_CRC(data,len,crcvalue))
+ {
+ cJSON *jdata=ble_get_watch_msg();
+
+ if(jdata)
+ {
+
+ char *jsonString = cJSON_PrintUnformatted(jdata);
+
+ if (jsonString == NULL) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");
+ cJSON_Delete(jdata);
+ return;
+ }
+
+ uint32_t data_len = strlen(jsonString);
+ cJSON_Delete(jdata);
+
+ if (data_len == 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");
+ return;
+ }
+ int num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+
+ send_long_data(jsonString,num,0x06,0x0F);
+
+ cJSON_free(jsonString);
+ }
+
+
+ }
+ else
+ {
+ ble_reply_cmd(cmd,0);
+ }
+
+}
+
+
+bool read_dir_send_json()
+{
+
+ char *send_buf=NULL;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json xxxxxxxx\r\n");
+ memset_s(file_name,128,0,128);
+ send_buf=tar_dir_to_json_buf_malloc_(file_name,&file_size);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json end\r\n");
+ if( send_buf!=NULL)
+ {
+ //send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04);
+
+ ble_data_type type_={0x04,0x26,strlen(send_buf),1,1};
+
+ send_big_data(type_,(char *)send_buf,strlen(send_buf));
+
+ free(send_buf);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void decode_file_checksum_2AE6(ble_read_data *buffer_handle)
+{
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+ uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);
+ if ((msg_crc == buffer_handle->crcvalue)
+ || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID ))
+ {
+ uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue);
+ uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)];
+#if 1
+ if ((file_crc == crc_recv) ||
+ (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))
+#else
+ if (file_crc == crc_recv)
+#endif
+ {
+ ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,1);
+ switch(buffer_handle->file_recv_stat.file_type)
+ {
+ case 1: //ota
+ ble_reply_cmd(FILE_SUCC_TRANSFER,1);
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);
+ TRANSMIT_DATA=TRANS_OTA_SUCC;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ break;
+ case 2://mp3
+ TRANSMIT_DATA=TRANS_MP3_SUCC;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ ble_reply_cmd(FILE_SUCC_TRANSFER,1);
+ ble_mp3_list_update();
+
+ break;
+ case 3://dial
+ //TODO: 设置成当前下载的表盘
+ if (install_dial() == ERRCODE_SUCC)
+ {
+ //ble_set_dial_by_id(ble_dial_uid);
+
+ if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count)
+ {
+ TRANSMIT_DATA= TRANS_DIAL_SUCC;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ //0504
+ ble_reply_cmd(DIAL_SUCC_INSTALL,1);
+ }
+
+
+
+ // ble_reply_cmd(GET_TRANS_END_CMD,1);
+
+ }
+ else
+ {
+ TRANSMIT_DATA= TRANS_DIAL_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ ble_reply_cmd(DIAL_SUCC_INSTALL,0);
+
+ }
+ break;
+ case 4://dial
+ TRANSMIT_DATA=TRANS_BIN_SUCC;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ if( ble_bin_install(app_name))
+ ble_reply_cmd(FILE_SUCC_TRANSFER,1);
+ else
+ ble_reply_cmd(FILE_SUCC_TRANSFER,0);
+
+ // ble_mp3_list_update();
+
+ break;
+ default:
+ break;
+ }
+ }else{
+ ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,2);
+ switch (buffer_handle->file_recv_stat.file_type)
+ {
+ case 1: //ota
+ TRANSMIT_DATA=TRANS_OTA_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+ case 2://mp3
+ TRANSMIT_DATA=TRANS_MP3_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ break;
+ case 3://dial
+ TRANSMIT_DATA= TRANS_DIAL_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+
+ case 4://dial
+ TRANSMIT_DATA= TRANS_BIN_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ break;
+ default:
+ break;
+ }
+
+ }
+ }else{
+ ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,0);
+ switch (buffer_handle->file_recv_stat.file_type)
+ {
+ case 1: //ota
+ TRANSMIT_DATA=TRANS_OTA_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+ case 2://mp3
+ TRANSMIT_DATA=TRANS_MP3_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ break;
+ case 3://dial
+ TRANSMIT_DATA= TRANS_DIAL_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+ case 4://dial
+ TRANSMIT_DATA= TRANS_BIN_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+ default:
+ break;
+ }
+ }
+ buffer_handle->file_recv_stat.recv_file_stat=0;
+}
+
+void decode_file_checksum(ble_read_data *buffer_handle)
+{
+ uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+ uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);
+ if ((msg_crc == buffer_handle->crcvalue)
+ || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID ))
+ {
+ uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue);
+ uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)];
+#if 1
+ if ((file_crc == crc_recv) ||
+ (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))
+#else
+ if (file_crc == crc_recv)
+#endif
+ {
+ ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,1);
+ switch(buffer_handle->file_recv_stat.file_type)
+ {
+ case 1: //ota
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);
+
+ TRANSMIT_DATA=TRANS_OTA_SUCC;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+
+ break;
+ case 2://mp3
+ TRANSMIT_DATA=TRANS_MP3_SUCC;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);
+ ble_mp3_list_update();
+
+ break;
+ case 3://dial
+ //TODO: 设置成当前下载的表盘
+ if (install_dial() == ERRCODE_SUCC)
+ {
+ //ble_set_dial_by_id(ble_dial_uid);
+
+ if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count)
+ {
+ TRANSMIT_DATA= TRANS_DIAL_SUCC;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ //0504
+ ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);
+ }
+
+
+
+ // ble_reply_cmd(GET_TRANS_END_CMD,1);
+
+ }
+ else
+ {
+ TRANSMIT_DATA= TRANS_DIAL_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ ble_reply_cmd(DIAL_INSTALL_REPY_CMD,0);
+
+ }
+ break;
+ default:
+ break;
+ }
+ }else{
+ ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2);
+ switch (buffer_handle->file_recv_stat.file_type)
+ {
+ case 1: //ota
+ TRANSMIT_DATA=TRANS_OTA_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+ case 2://mp3
+ TRANSMIT_DATA=TRANS_MP3_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ break;
+ case 3://dial
+ TRANSMIT_DATA= TRANS_DIAL_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ break;
+ default:
+ break;
+ }
+
+ }
+ }else{
+ ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,0);
+ switch (buffer_handle->file_recv_stat.file_type)
+ {
+ case 1: //ota
+ TRANSMIT_DATA=TRANS_OTA_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+ case 2://mp3
+ TRANSMIT_DATA=TRANS_MP3_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ break;
+ case 3://dial
+ TRANSMIT_DATA= TRANS_DIAL_FAIL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ break;
+ default:
+ break;
+ }
+ }
+ buffer_handle->file_recv_stat.recv_file_stat=0;
+
+}
+
+void type2AE0Data(ble_read_data *buffer_handle)
+{
+ uint16_t typeID = buffer_handle->cmd_header.cmdtype*256 + buffer_handle->cmd_header.cmdid;
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data typeID:0x%04X datalen %d\r\n",typeID,buffer_handle->totalDataLen);
+
+ bool checkcrc = (get_crc_from_lrc(buffer_handle->lrcvalue) == buffer_handle->crcvalue);
+
+ uint32_t num;
+ if ( (checkcrc == true ) ||
+ (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))
+ {
+ switch (typeID) //ID
+ {
+ case OTA_FILE_RECV_CMD://
+ {
+ if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(OTA_FILE_RECV_CMD,1);
+ }else{
+ ble_reply_cmd(OTA_FILE_RECV_CMD,2);
+ }
+ }
+ break;
+ case MP3_FILE_RECV_CMD:
+ {
+ if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(MP3_FILE_RECV_CMD,1);
+ }else{
+ ble_reply_cmd(MP3_FILE_RECV_CMD,2);
+ }
+ }
+ break;
+ case DIAL_FILE_RECV_CMD:
+ {
+ if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)
+ {
+
+ //if(ble_dial_uid >=5 &&
+ // if(get_dial_num()>=MAX_BLE_EVENT_DIAL_NUM)
+ // {
+ // ble_reply_cmd(DIAL_FILE_RECV_CMD,3);
+
+ // }
+ //else
+ {
+
+ ble_reply_cmd(DIAL_FILE_RECV_CMD,1);
+ }
+
+ }else{
+ ble_reply_cmd(DIAL_FILE_RECV_CMD,2);
+ }
+ }
+ break;
+ case FILE_CHECKSUM_RECV_CMD:
+ decode_file_checksum(buffer_handle);
+ break;
+ case SINGLE_DIAL_FILE_RECV_CMD:
+ if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,1);
+ } else {
+ ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,2);
+ }
+ break;
+ case EPO_DATA_RECV_CMD:
+ break;
+ case APP_INAUIRE_EXC_FILE_CMD:
+ get_tar_dir_file_count();
+
+ if(!read_dir_send_json())
+ {
+ ble_reply_cmd(APP_INAUIRE_EXC_FILE_CMD,2);
+ }
+ break;
+
+ case APP_START_SEND_EXC_FILE_CMD:
+ num=(ble_nus_max_data_len-18);
+ if(num>482)num=482;
+ if(!Read_tar_file_buf_send_Data(num,0x63))
+ {
+ ble_reply_cmd(APP_START_SEND_EXC_FILE_CMD,2);
+ }
+ break;
+ case APP_SEND_EXC_FILE_END_CMD:
+ if(!tar_rmove(file_name))
+ {
+ ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);
+ }
+ if(!read_dir_send_json())
+ {
+ ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);
+ }
+ break;
+
+
+ default:
+ break;
+ }
+
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data CRC failed!\n");
+ }
+
+}
+//
+void type2AE6Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)
+{
+ uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];
+ #ifdef BLE_LOG
+
+ #endif
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE6Data:0x%04X\r\n",cmd);
+ // uint8_t typeID = cmd_buf[2];
+ switch (cmd)
+ {
+ case OTA_FILE_MSG_CMD :
+ {
+ if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(OTA_FILE_MSG_CMD,1);
+ }else{
+ ble_reply_cmd(OTA_FILE_MSG_CMD,2);
+ }
+ }
+ break;
+
+ case OTA_FILE_RECV_CMD://
+ {
+ if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(OTA_FILE_RECV_CMD,1);
+ }else{
+ ble_reply_cmd(OTA_FILE_RECV_CMD,2);
+ }
+ }
+ break;
+
+
+ case DIAL_COLLECT_FILE_CMD :
+ {
+ if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(DIAL_COLLECT_FILE_CMD,1);
+ }else{
+ ble_reply_cmd(DIAL_COLLECT_FILE_CMD,2);
+ }
+ break;
+ }
+
+ case DIAL_SINGEL_FILE_CMD :
+ {
+ if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(DIAL_SINGEL_FILE_CMD,1);
+
+ } else {
+
+ ble_reply_cmd(DIAL_SINGEL_FILE_CMD,2);
+
+ }
+ break;
+ }
+ case MP3_FILE_CMD :
+ {
+ if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(MP3_FILE_CMD,1);
+ }else{
+ ble_reply_cmd(MP3_FILE_CMD,2);
+ }
+ }
+ break;
+ case BIN_FILE_CMD :
+ {
+ if (decode_bin_json( buffer_handle) == ERRCODE_SUCC)
+ {
+ ble_reply_cmd(BIN_FILE_CMD,1);
+ }else{
+ ble_reply_cmd(BIN_FILE_CMD,2);
+ }
+ }
+ break;
+
+
+ case FILE_CHECKSUM_RECV_CMD:
+ decode_file_checksum(buffer_handle);
+ break;
+ // case OTA_FILE_DATA_CMD :
+ // {
+ // if (decode_ota_data( buffer_handle,data,datalen, crcvalue) == ERRCODE_SUCC)
+ // {
+
+ // }else{
+ // ble_reply_cmd(OTA_FILE_DATA_CMD,0);
+ // }
+ // }
+
+ case FILE_CHECKSUM_RECV_CMD_ZHIHUI :
+ decode_file_checksum_2AE6(buffer_handle);
+ break;
+
+ case OTA_FILE_FAIL_CMD :
+
+ break;
+
+ case APP_DELETE_CMD :
+ delete_app( cmd, data,datalen,crcvalue);
+ break;
+ case GET_LIST_CMD :
+
+ get_app_list( cmd, data,datalen,crcvalue);
+
+ break;
+ case GET_APP_MSG_CMD:
+ get_watch_msg( cmd, data,datalen,crcvalue);
+
+ break;
+ default:
+ break;
+ }
+}
+
+
+
+
+void dumpHeader(msg_header_t *msgheader)
+{
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dumpHeader(%d) direction %02X, type %02X, id %02X, package_count %d, total_data_len %d,package_index %d , package_len %d\n",
+ sizeof(msg_header_t),
+ msgheader->direction,
+ msgheader->cmdtype,
+ msgheader->cmdid,
+ msgheader->package_count,
+ msgheader->total_data_len,
+ msgheader->package_index,
+ msgheader->package_len
+ );
+ #endif
+}
+
+errcode_t check_header(msg_header_t *header )
+{
+ if( (header->direction == MSG_DIRECTION_RECV || header->direction == MSG_DIRECTION_RECV_ANDROID)
+ && (header->cmdtype > 0 && header->cmdtype <= 6 )
+ && (header->cmdid > 0 && header->cmdid <= 0x50 )
+ )
+ {
+ // 这个是合理的值,可以当做header来处理
+ dumpHeader(header);
+ return ERRCODE_SUCC;
+ }else{
+ //非header
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"not first package , no header!\n");
+ return ERRCODE_FAIL;
+ }
+}
+
+
+errcode_t cancel_recv_file(uint8_t flag)
+{
+ if(BR_TRANSFER_timer)
+ {
+ timer_flie_flag=0;
+ osTimerStop(BR_TRANSFER_timer);
+ osTimerDelete(BR_TRANSFER_timer);
+ BR_TRANSFER_timer = NULL;
+ }
+
+ if(ble_read_timer_p)
+ {
+ if(flag)
+ {
+ if(ble_read_timer_p->file_recv_stat.file_type==1)
+ {
+ TRANSMIT_DATA=TRANS_OTA_FAIL;
+ }
+ else if (ble_read_timer_p->file_recv_stat.file_type==3)
+ {
+ TRANSMIT_DATA=TRANS_DIAL_FAIL;
+ }
+ else if(ble_read_timer_p->file_recv_stat.file_type==2)
+ {
+ TRANSMIT_DATA=TRANS_MP3_FAIL;
+ }
+ else if(ble_read_timer_p->file_recv_stat.file_type==4)
+ {
+ TRANSMIT_DATA=TRANS_BIN_FAIL;
+ }
+
+ else
+ {
+ TRANSMIT_DATA=TRANS_FREE;
+ }
+ ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败
+ }
+ else
+ {
+ TRANSMIT_DATA=TRANS_FREE;
+ }
+
+ ble_read_timer_p->receive_file_flag = 0;
+
+ if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。
+ {
+ if (ble_read_timer_p->file_recv_stat.file!=NULL)
+ {
+ fclose(ble_read_timer_p->file_recv_stat.file);
+ ble_read_timer_p->file_recv_stat.file = NULL;
+ }
+
+ if (ble_read_timer_p->file_recv_stat.file_type == 2)
+ {
+ char musicpath[64]={0};
+ get_music_path(musicpath,64);
+ //"/user/userdata/music"
+ char filepath[256]={0};
+ create_mp3_name(filepath,musicpath,ble_read_timer_p->file_recv_stat.file_name);
+ remove(filepath);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+ }
+ else if (ble_read_timer_p->file_recv_stat.file_type == 3)
+ {
+ char filepath[128]={0};
+ if (get_file_recv_file_path(ble_read_timer_p->file_recv_stat.file_name,strlen(ble_read_timer_p->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+ {
+ remove(filepath);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+ }
+ }
+
+ if (ble_read_timer_p->file_recv_stat.file_name != NULL)
+ {
+ free(ble_read_timer_p->file_recv_stat.file_name);
+ ble_read_timer_p->file_recv_stat.file_name=NULL;
+ }
+ ble_read_timer_p->file_recv_stat.recv_file_stat = -1;
+ //ble_read_timer_p=NULL;
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ }
+ // else
+ // {
+ // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ // }
+ ble_read_timer_p=NULL;
+
+ }
+
+
+
+ return ERRCODE_SUCC;
+}
+
+uint8_t get_OTA_recv_value()
+{
+ return OTA_FILE_value;
+}
+
+void Set_OTA_recv_value()
+{
+ OTA_FILE_value=0;
+ return;
+}
+
+static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)
+{
+
+ //保存前 4 bytes + 最后 1 byte
+ int save_len = 4;
+ uint8_t last_byte = calculate_lrc(data,event_size,0x00);
+ if (event_size < 4)
+ {
+ save_len = event_size;
+ }
+ memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample));
+ buffer_handle->last_data_size = event_size;
+ memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,save_len);
+ buffer_handle->last_data_sample[4]=last_byte;
+
+ return ERRCODE_SUCC;
+}
+static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size)
+{
+
+
+ //对比前 4 bytes + 最后 1 byte
+ int save_len = 4;
+ uint8_t current_sample_data[5];
+ uint8_t last_byte = calculate_lrc(newdata,cmp_size,0x00);
+ if (cmp_size < 4)
+ {
+ save_len = cmp_size;
+ }
+ memset(current_sample_data,0,sizeof(current_sample_data));
+ memcpy_s(current_sample_data,sizeof(current_sample_data),newdata,save_len);
+ current_sample_data[4]=last_byte;
+
+ if (memcmp(lastdata,newdata,5)==0)
+ {
+ return ERRCODE_SUCC;
+ }else{
+ return ERRCODE_FAIL;
+ }
+}
+
+errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)
+{
+
+ if( event_size == 0 || data == NULL ) return ERRCODE_FAIL;
+
+ if (buffer_handle->last_data_size == event_size)
+ {
+ if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error handle_recv_file recve same package header 0x%02X%02X%02X%02X end 0x%02X skip \n"
+ ,buffer_handle->last_data_sample[0]
+ ,buffer_handle->last_data_sample[1]
+ ,buffer_handle->last_data_sample[2]
+ ,buffer_handle->last_data_sample[3]
+ ,buffer_handle->last_data_sample[4]);
+ // return ERRCODE_FAIL;
+ }
+ }
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file %d\n",event_size);
+ save_package_sample(buffer_handle,data,event_size);
+
+
+ //第一帧要创建文件
+ if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )
+ {
+ buffer_handle->file_recv_stat.lrcvalue = 0;
+ if (buffer_handle->file_recv_stat.file_type == 1)
+ {
+
+ buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);
+
+ }
+ else if (buffer_handle->file_recv_stat.file_type == 2)
+ {
+ char musicpath[64]={0};
+ get_music_path(musicpath,64);
+ //"/user/userdata/music"
+ char filepath[256]={0};
+ create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);
+
+ buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+ }
+ else
+ {
+ char filepath[128]={0};
+ 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)
+ {
+ buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
+ }
+ }
+ if (buffer_handle->file_recv_stat.file == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file NULL\n");
+ return ERRCODE_FAIL;
+ }
+ buffer_handle->file_recv_stat.recv_file_stat = 1;
+ OTA_FILE_value=0;
+ ////////////////创建文件传输超时定时器//////////////////
+ uint32_t tick;
+ osStatus_t retTimer;
+ if(BR_TRANSFER_timer!=NULL)
+ {
+ osTimerDelete(BR_TRANSFER_timer);
+ BR_TRANSFER_timer = NULL;
+ }
+ ble_read_timer_p=buffer_handle;
+ timer_flie_flag=10;
+
+ BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);
+ tick =1000;// osMs2Tick(1000);
+ retTimer = osTimerStart(BR_TRANSFER_timer, tick);
+ if (retTimer != osOK && BR_TRANSFER_timer != NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+ osTimerDelete(BR_TRANSFER_timer);
+ BR_TRANSFER_timer = NULL;
+ return ERRCODE_FAIL;
+ }
+ // if(buffer_handle->file_recv_stat.received_size==0)
+ {
+ if(buffer_handle->file_recv_stat.file_type==3)
+ TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;
+
+ if(buffer_handle->file_recv_stat.file_type==1)
+ TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;
+
+ if(buffer_handle->file_recv_stat.file_type==2)
+ TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+ }
+
+ ///////////////////////////////////////////////////////////
+ }
+ if (buffer_handle->file_recv_stat.file == NULL)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n");
+ return ERRCODE_FAIL;
+ }
+ //写入文件
+ size_t writtensize = fwrite(data,1,event_size,buffer_handle->file_recv_stat.file);
+ if(writtensize == event_size)
+ {
+ timer_flie_flag=10;
+
+ buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,event_size,buffer_handle->file_recv_stat.lrcvalue);
+ buffer_handle->file_recv_stat.received_size += event_size;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);
+ OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
+
+
+ }else{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,event_size);
+ return ERRCODE_FAIL;
+ }
+
+ //检查文件是否写完
+ if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)
+ {
+ if (buffer_handle->file_recv_stat.file!=NULL)
+ {
+ fclose(buffer_handle->file_recv_stat.file);
+ buffer_handle->file_recv_stat.file = NULL;
+ }
+ if (buffer_handle->file_recv_stat.file_name != NULL)
+ {
+ free(buffer_handle->file_recv_stat.file_name);
+ buffer_handle->file_recv_stat.file_name=NULL;
+ }
+ buffer_handle->file_recv_stat.recv_file_stat = 2;
+ buffer_handle->receive_file_flag = 0;
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");
+
+ if(BR_TRANSFER_timer)
+ {
+ osTimerStop(BR_TRANSFER_timer);
+ osTimerDelete(BR_TRANSFER_timer);
+ BR_TRANSFER_timer = NULL;
+ }
+ ble_read_timer_p=NULL;
+ TRANSMIT_DATA=FILE_IS_DONE;
+
+ CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+ ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,1);//接收成功
+ }
+
+ return ERRCODE_SUCC;
+}
+
+//长数据解析
+void bleLongRecvData(ble_read_data *buffer_handle,uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据
+{
+ uint8_t type=buf_cmd[1];
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%x crcvalue:%x\r\n",
+ buffer_handle->cmd_header.cmdtype,
+ buffer_handle->cmd_header.cmdid,
+ data_size,
+ data,
+ crcvalue);
+ #endif
+
+ if(buffer_handle->handle==data2ae4Cmd)
+ {
+ type2AE4Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);
+ }
+ else if (buffer_handle->handle==data2ae3Cmd)
+ {
+ type2AE3Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);
+ }
+ else if (buffer_handle->handle==data2ae1Cmd)
+ {
+ type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);
+ }
+ else if (buffer_handle->handle==data2ae0Cmd)
+ {
+ type2AE0Data(buffer_handle);
+ }
+ else if (buffer_handle->handle==data2ae6Cmd)
+ {
+ type2AE6Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);
+ }
+}
+
+
+/// @brief 解码收到的msg
+/// @param buffer_handle
+/// @return
+static errcode_t handle_ble_msg(ble_read_data *buffer_handle)
+{
+
+ if(buffer_handle->buffer_to_file == 0)
+ {
+ bleLongRecvData(buffer_handle,buffer_handle->data+sizeof(msg_header_t),buffer_handle->totalDataLen,(uint8_t*)(&buffer_handle->cmd_header),buffer_handle->data,buffer_handle->crcvalue);
+
+ }else{
+ //处理缓存成文件的
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle ble msg file buffer! not implement\n");
+ }
+ return ERRCODE_SUCC;
+}
+/*****
+ * 组包函数
+ * 组包校验完成,在分发给对应的handler去解码协议。
+ *
+*/
+errcode_t combine_data_internal(ble_read_data *buffer_handle,uint8_t *totalData, uint16_t event_size)
+{
+
+
+ if(buffer_handle->receive_file_flag == 1 )
+ {
+ //接收文件
+ if(buffer_handle->handle==data2ae6Cmd)
+ return decode_ota_data( buffer_handle,totalData,event_size,totalData[event_size-1]);
+ else
+ return handle_recv_file(buffer_handle,totalData,event_size);
+ }
+
+ msg_header_t *header = (msg_header_t*)totalData;
+ //第一帧
+ if (event_size > sizeof(msg_header_t) && check_header(header) == ERRCODE_SUCC )
+ {
+
+ if (header->direction == MSG_DIRECTION_RECV_ANDROID)
+ {
+ //uapi_dev_runtime_set_android_connection_status(1);
+ }else{
+ // uapi_dev_runtime_set_android_connection_status(0);
+ }
+ buffer_handle->cmd_header.direction = header->direction;
+ buffer_handle->cmd_header.cmdtype = header->cmdtype;
+ buffer_handle->cmd_header.cmdid = header->cmdid;
+ buffer_handle->cmd_header.package_count = header->package_count;
+ buffer_handle->cmd_header.total_data_len = header->total_data_len;
+ buffer_handle->cmd_header.package_len = header->package_len;
+ buffer_handle->cmd_header.package_index = header->package_index;
+ //如果有历史数据,没有被清空,可能是历史错误数据,则清空内存。
+ if (buffer_handle->data!=NULL && buffer_handle->data_len > 0)
+ {
+ free(buffer_handle->data);
+ buffer_handle->data = NULL;
+ }
+ if (buffer_handle->tmpfilehandle!=NULL && buffer_handle->data_len>0)
+ {
+ fclose(buffer_handle->tmpfilehandle);
+ buffer_handle->tmpfilehandle = NULL;
+ }
+ buffer_handle->data_len = 0;
+ buffer_handle->crcvalue = 0;
+ buffer_handle->lrcvalue = 0;
+ buffer_handle->buffer_to_file = 0;
+ buffer_handle->decode_type = 0;
+ buffer_handle->tmpfilehandle = NULL;
+ uint32_t timestamp_ble=0;
+ uapi_get_timestampe_ss(×tamp_ble);
+ buffer_handle->last_timestamp = timestamp_ble;
+ buffer_handle->totalDataLen = buffer_handle->cmd_header.total_data_len;
+ if (buffer_handle->totalDataLen > MAX_BLE_MSG_PACKAGE_LEN || buffer_handle->totalDataLen < 0 )
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package is too lardge (%d) than (%d) or too small !\n",buffer_handle->totalDataLen,MAX_BLE_MSG_PACKAGE_LEN);
+ return ERRCODE_FAIL;
+ }
+ if(buffer_handle->totalDataLen+sizeof(msg_header_t)+1 > MAX_BLE_MSG_PACKAGE_LEN)
+ {
+ //如果总长度超过限定大小,则写入文件做缓存。
+ buffer_handle->buffer_to_file = 1;
+ int filelen = strlen(BLE_MSG_TMP_FILE_NAME);
+ buffer_handle->data = malloc(filelen);
+ if (buffer_handle->data== NULL)
+ {
+ return ERRCODE_MALLOC;
+ }
+ //生成临时文件名
+ sprintf_s((char*)buffer_handle->data,filelen,BLE_MSG_TMP_FILE_NAME,buffer_handle->handle);
+ buffer_handle->tmpfilehandle = fopen((const char*)buffer_handle->data,"w+");
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create ble protocol tmpfile %s handle %X\n",buffer_handle->data,buffer_handle->tmpfilehandle);
+ if (buffer_handle->tmpfilehandle != NULL)
+ {
+ //写buffer到文件
+ size_t ret =fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);
+ buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"write %d to buffer file!\n",ret);
+ }
+ buffer_handle->data_len += event_size;
+
+ }else{
+ //如果长度在限定大小之内。则写入内存中缓存。
+ buffer_handle->buffer_to_file = 0;
+ buffer_handle->data = malloc(buffer_handle->totalDataLen+sizeof(msg_header_t)+1);
+ if (buffer_handle->data== NULL)
+ {
+ return ERRCODE_MALLOC;
+ }
+ //创建缓存开始存储包数据
+ if(buffer_handle->cmd_header.package_len >=0)
+ {
+ memcpy_s(buffer_handle->data,buffer_handle->totalDataLen+sizeof(msg_header_t)+1,totalData,event_size);
+ buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);
+ buffer_handle->data_len += event_size;
+ }
+
+ //单一包
+ if(event_size == sizeof(msg_header_t)+buffer_handle->totalDataLen+1)
+ {
+ buffer_handle->crcvalue = totalData[event_size-1];
+ }
+ }
+
+ }else{
+ //处理第二包以后的数据
+
+ //经过第一包处理,仍然data==NULL证明第一帧就是错的,要退出解析。
+ if (buffer_handle->data== NULL)
+ {
+ return ERRCODE_MALLOC;
+ }
+ //此处是最后一帧 event_size = (buffer_handle->totalDataLen-buffer_handle->data_len) + 1
+ if (event_size == (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 -buffer_handle->data_len ))
+ {
+ if(buffer_handle->buffer_to_file == 1)
+ {
+ fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);
+
+ }else{
+ memcpy_s(buffer_handle->data+buffer_handle->data_len,buffer_handle->totalDataLen,totalData,event_size);
+
+ }
+ buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);
+ buffer_handle->data_len += event_size;
+ }else if (event_size < (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len)) //中间帧
+ {
+ if(buffer_handle->buffer_to_file == 1)
+ {
+ fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);
+
+ }else{
+ memcpy_s(buffer_handle->data+buffer_handle->data_len,(buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len),totalData,event_size);
+
+ }
+ buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);
+ buffer_handle->data_len += event_size;
+ }else{ //异常帧
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"error event_size %d , should <= %d\n",event_size, (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len) );
+
+ }
+
+ }
+ //如果包完整接收,进行crc校验
+ if( (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 ) == buffer_handle->data_len )
+ {
+ //我们认为最后一个包,应该不包含其他包,因此其最后一位,应当就是crc值,因此可直接获取crc值
+ buffer_handle->crcvalue = buffer_handle->data[buffer_handle->data_len - 1];//获取crc
+ //最后一位校验位清0,方便字符串处理
+ buffer_handle->data[buffer_handle->data_len - 1] = 0;
+
+ //缓存到文件的,处理方法会不同因此单独解决
+ if(buffer_handle->buffer_to_file == 1)
+ {
+ //先关闭临时文件,然后把文件名给协议解析函数即可。
+ if (buffer_handle->tmpfilehandle != NULL)
+ {
+ fclose(buffer_handle->tmpfilehandle);
+ buffer_handle->tmpfilehandle=NULL;
+ }
+ }
+ // #define COMMON_CRC_MSG
+ //通用回复crc校验结果,不是所有指令都一致,暂时取消,在每个指令内部进行回复
+ #ifdef COMMON_CRC_MSG
+ if (get_crc_from_lrc(buffer_handle->lrcvalue) != buffer_handle->crcvalue)
+ {
+ //发送校验失败
+ ble_reply_msg(buffer_handle->cmd_header.cmdtype,buffer_handle->cmd_header.cmdid,0);
+
+ }else
+ #endif
+ {
+ //协议解析指令
+ handle_ble_msg(buffer_handle);
+ }
+ //所有操作都完成,要释放 data
+ if(buffer_handle->data != NULL)
+ {
+ free(buffer_handle->data);
+ buffer_handle->data=NULL;
+ }
+
+ }
+ return ERRCODE_SUCC;
+}
+
+
+
+void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
+{
+
+ if (event_size < sizeof(msg_header_t))
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"event size (%d) is less than msg_header_t (%d) ",event_size,sizeof(msg_header_t));
+ // return ;
+ }
+ #ifdef BLE_LOG
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bleDataRecv handle:%d\r\n",handle);
+ #endif
+ int last_unused_handle_index = -1;
+ int handle_index_found = -1;
+ for(int i = 0;i<MAX_HANDLE_NUM;i++)
+ {
+ if(handle_l[i].handle == 0 && last_unused_handle_index == -1)
+ {
+ last_unused_handle_index = i;
+ }
+ if(handle_l[i].handle == handle)
+ {
+ //找到当前handle的缓存数据 ,进行组包
+ handle_index_found = i;
+ break;
+ }
+ }
+ //如果没找到已经用到的handle_l,就用第一个空的handle_l
+ if(last_unused_handle_index >=0 && handle_index_found == -1)
+ {
+ handle_index_found = last_unused_handle_index;
+ }
+
+ if(handle_index_found>=0)
+ {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_index_found:index %d addr %X\r\n",handle_index_found,&handle_l[handle_index_found]);
+ handle_l[handle_index_found].handle = handle;
+ combine_data_internal(&handle_l[handle_index_found],totalData,event_size);
+ }
+ else
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"no empty handle_l found! skip this msg!\n");
+
+
+}
+
+void free_ble_data(void)//以防断开蓝牙没有释放数据类型
+{
+ blesrv_service_recv_msg_handler(0xff,(uint8_t*)"clean",6);
+ return;
+
+}
+
+
+void cancel_AI_cur_chat(void)
+{
+ blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_cancel_AI",13);
+ return;
+ //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);
+}
+
+void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型
+{
+
+ totalpack = 0;
+ muiltFlag = 0;
+ packdataLen = 0;
+ totalDataLen = 0;
+ ANCSBigBufFlag = 0;
+
+ recvBigDataBufState = false;
+ sendbigDataBufState = false;
+
+ is_connect_synchronization_time=0;
+
+
+ cancel_recv_file(1);
+
+ for (int i = 0 ; i < MAX_HANDLE_NUM ; i++)
+ {
+ if (handle_l[i].data != NULL)
+ {
+ free(handle_l[i].data);
+ handle_l[i].data=NULL;
+ }
+ memset((void*)&handle_l[i],0,sizeof(ble_read_data));
+ }
+ return;
+
+}
+
+//发送AI录音准备就绪国内/
+/*使用模型:
+0:文心一言
+1:ChatGPT
+2:KIMI
+3:豆包*/
+bool send_AI_is_ready_(uint8_t type)
+{
+
+ if(AI_is_end_state==0)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");
+ ble_data_type type_={0x05,0x05,1,1,1};
+ send_big_data(type_,(char *)&type,1);
+ AI_is_end_state=1;
+ return true;
+ }
+ else
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪失败,没有正确回复结束\r\n");
+ return false;
+ }
+ //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);
+}
+
+static uint8_t AI_is_ready_type=0;
+
+bool send_AI_is_ready(uint8_t type)
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");
+ AI_is_ready_type=type;
+ blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_is_ready",12);
+ return true;
+}
+
+void cancel_AI_cur_chat_(void)
+{
+ //if(AI_is_end_state)
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"取消当前AI对话\r\n");
+ uint8_t data=1;
+ ble_data_type type_={0x05,0x07,1,1,1};
+ send_big_data(type_,(char *)&data,1);
+ AI_is_end_state=0;
+
+ }
+ //else
+ // {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"已经取消当前AI对话无需再次取消\r\n");
+ // }
+
+
+ //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);
+}
+
+//接收app下发的原始数据
+void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小
+{
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size);
+ if(handle==0xff)
+ {
+ if(strcmp("AI_cancel_AI",(char *)buf)==0)
+ {
+ cancel_AI_cur_chat_();
+ }
+ else if(strcmp("AI_is_ready",(char *)buf)==0)
+ {
+ send_AI_is_ready_(AI_is_ready_type);
+ }
+ else
+ {
+ free_ble_data_Event();
+ }
+
+ return;
+ }
+
+ bleDataRecv(buf,event_size,handle);
+}
+#endif
+#endif
+#ifdef __cplusplus
+}
#endif
\ No newline at end of file