uint8_t *recvData;\r
#include "los_memory.h"\r
\r
-\r
-#if USE_PROTOCOL_EN_DE_BY_SNICKER\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
errcode_t cancel_recv_file(ble_read_data *buffer_handle);\r
\r
\r
-#else\r
-\r
-typedef struct \r
-{\r
- uint8_t *data;\r
- int handle;\r
- int data_len ;\r
- int totalDataLen;\r
- uint8_t cmd_data[17];\r
- uint8_t crcvalue;\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
-\r
-#endif\r
-\r
-\r
-\r
\r
\r
\r
\r
}\r
\r
-\r
-#if USE_PROTOCOL_EN_DE_BY_SNICKER\r
void getUserInfo(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
{\r
\r
ble_reply_cmd(USER_INFOR_CMD,0);//crc error\r
}\r
}\r
-#else\r
-//APP下发设置用户数据\r
-void getUserInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
-{\r
- \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
- if(Check_CRC(data,len,crcvalue))\r
- {\r
- printf("getUserInfo:!!!!!!!!\r\n");\r
- msg_user_info_t user_info={0};\r
- ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
- memset(&user_info,0,sizeof(msg_user_info_t));\r
- \r
- for(uint8_t i = 0;i<len;i++)\r
- {\r
- printf("%x ",data[i]);\r
- }\r
- user_info.age = data[0];\r
- user_info.gender = data[1];\r
- user_info.height = data[2];\r
- printf("getUserInfo:!!!!!!!!5555\r\n");\r
- memcpy(&user_info.weight,data+3,2);\r
- //memcpy(data+3,&user_info.weight,2);\r
- memcpy(&user_info.target_step,data+5,4);\r
- printf("getUserInfo:!!!!!!!!666\r\n");\r
- //memcpy(data+5,&user_info.target_step,4);\r
- memcpy(&user_info.fat_time,data+9,2);\r
- user_info.target_stand = data[11];\r
- user_info.timeformat = data[12];\r
- uint32_t target_kcal = 0;\r
- memcpy(&target_kcal,data+13,2);\r
- printf("getUserInfo:!!!!!!!!99\r\n");\r
- set_goal_caloriescount(target_kcal);\r
- printf("getUserInfo:!!!!!!!!22\r\n");\r
- uint8_t target_km = data[15];\r
- printf("getUserInfo:!!!!!!!!22\r\n");\r
- set_goal_discount(target_km);\r
- printf("getUserInfo:!!!!!!!!333\r\n",user_info.age,user_info.gender,user_info.height,user_info.weight,user_info.target_step,user_info.fat_time,user_info.target_stand,\r
- user_info.timeformat,user_info.timeformat);\r
- set_user_data(&user_info);\r
- printf("getUserInfo:!!!!!!!!444\r\n");\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
-#endif\r
+\r
//APP下发快捷辅助功能参数\r
void get_auxil_fun_parm(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
{\r
\r
}\r
\r
-#if USE_PROTOCOL_EN_DE_BY_SNICKER\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
-#else\r
-void type2AE4Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)\r
-#endif\r
{\r
uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
printf("type2AE4Data typeID:0x%x\r\n",typeID);\r
switch (typeID) //ID\r
{\r
case USER_INFOR_CMD://app下发的获取用户信息\r
- #if USE_PROTOCOL_EN_DE_BY_SNICKER\r
getUserInfo(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
- #else\r
- getUserInfo(typeID,data,datalen,totalData,crcvalue);\r
- #endif\r
break;\r
case SET_PHONE_INFOR_CMD://app下发的下发的手机信息\r
getPhoneInfo(typeID,data,datalen,totalData,crcvalue);\r
}\r
}\r
//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟\r
-#if USE_PROTOCOL_EN_DE_BY_SNICKER\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
-#else\r
-static void RemoveFileCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-#endif\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
\r
- #if USE_PROTOCOL_EN_DE_BY_SNICKER\r
cancel_recv_file(buffer_handle);\r
- #endif \r
+\r
}else\r
{\r
value[17] = 0;\r
*totaldata:总的数据内容 包含包头和校验预览做接口是用 如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和\r
crcvalue;数据的校验和 不包含包头和校验和的计算结果\r
*/\r
-#if USE_PROTOCOL_EN_DE_BY_SNICKER\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
-#else\r
-void type2AE3Data(uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
-#endif\r
{\r
uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];\r
printf("typeHexOneData:0x%04X\r\n",cmd);\r
GetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
break;\r
case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
- #if USE_PROTOCOL_EN_DE_BY_SNICKER\r
RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue);\r
- #endif\r
break;\r
case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
GetFileTypeCmd(data,datalen); //\r
}\r
}\r
\r
-\r
-#if USE_PROTOCOL_EN_DE_BY_SNICKER\r
-\r
-\r
/**\r
* less than 20bytes msg reply\r
*/\r
\r
}\r
\r
-void free_ble_data(void)//以防断开蓝牙没有释放数据类型\r
-{\r
- return;\r
- totalpack = 0;\r
- muiltFlag = 0; \r
- packdataLen = 0;\r
- totalDataLen = 0;\r
- ANCSBigBufFlag = 0;\r
- recvBigDataBufState = false;\r
- sendbigDataBufState = false;\r
- \r
-}\r
-#else \r
-\r
-\r
-\r
-//长数据解析\r
-void bleLongRecvData(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
- printf("type:%d %d data_size:%d data:%x crcvalue:%x\r\n",buf_cmd[0],type,data_size,data,crcvalue);\r
-\r
- switch (type)\r
- {\r
- case 0x02://获取手机信息\r
- type2AE4Data(buf_cmd,data,data_size,totalData,crcvalue);\r
- break;\r
- case 0x01:\r
- type2AE3Data(buf_cmd,data,data_size,totalData,crcvalue);\r
- break;\r
- case 0x03://\r
- type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);\r
- break;\r
- case 0x04:\r
- break;\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-\r
-void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)\r
-{\r
-\r
- if(sendbigDataBufState == true)//正在发送大数据不接收任何app指令下发的数据\r
- {\r
- return;\r
- }\r
- printf("bleDataRecv handle:%d\r\n",handle); \r
-\r
- if(sendbigDataBufState == true)//正在发送大数据不接收任何app指令下发的数据\r
- {\r
- return;\r
- }\r
- printf("bleDataRecv handle:%d\r\n",handle);\r
- ble_read_data* read_data_tmp = NULL;\r
- for(int i = 0;i<MAX_HANDLE_NUM;i++)\r
- {\r
- if(handle_l[i].handle == 0)//第一次用 \r
- {\r
- handle_l[i].handle = handle; \r
-\r
- }\r
- if(handle_l[i].handle == handle)//以前用过 2AE4 2AE5 2AE1 2AE3 2AE0 \r
- {\r
- if((totalData[0]==0x4a || totalData[0]==0x73)&& totalData[1] <= 0x09){//多包第一包\r
- if(handle_l[i].data)//保证第一包时释放buf\r
- {\r
- ym_free(handle_l[i].data);\r
- handle_l[i].data = NULL;\r
- memset(&handle_l[i],0,sizeof(ble_read_data));\r
- handle_l[i].handle = handle;\r
- }\r
- }\r
- if(handle_l[i].data == NULL )//释放过的\r
- {\r
- printf("bleDataRecv!!!!!!!!!!!!!recv %x %x\r\n",totalData[0],totalData[1]);\r
- if(event_size <= 17 || !((totalData[0] ==0x4a || totalData[0] == 0x73) && totalData[1] <= 0x09))//第一包的数据一定要大于17个字节并且第一包的数据头必须为0x73 或者0x4a 并且类型小于0x09 类型根据协议可自行增加或者减少\r
- {\r
- break;\r
- }\r
- memcpy(&totalDataLen,totalData+7,4);//总的数据大小\r
- handle_l[i].totalDataLen = totalDataLen;\r
- \r
- \r
- // printf("bleDataRecv!!!!!!!%d\r\n",totalDataLen);\r
- if(totalDataLen > event_size-17)//多包数据第一包处理,大于一包的数据长度 514-17=494\r
- {\r
- packdataLen = event_size-17;//多包数据第一包数据不带CRC校验和的\r
- handle_l[i].data = ym_malloc(totalDataLen+1);\r
- if(handle_l[i].data != NULL){\r
- printf("bleDataRecv long data %d\r\n",totalDataLen);\r
- if(handle_l[i].totalDataLen < packdataLen)\r
- {\r
- printf("packdataLen error!!!!!!!%d\r\n",packdataLen);\r
- packdataLen=handle_l[i].totalDataLen;\r
- }\r
- memcpy(handle_l[i].data,totalData+17,packdataLen);//从第十七个字节开始接收数据data\r
- handle_l[i].data_len = packdataLen;//当前包的数据长度\r
- memset(handle_l[i].cmd_data,0,17);\r
- memcpy(handle_l[i].cmd_data,totalData,17);\r
- } \r
- }else{//一包数据\r
- printf("bleDataRecv short data %d\r\n",totalDataLen);\r
- packdataLen = event_size-18;\r
- if(totalDataLen != 0)\r
- {\r
- handle_l[i].data =ym_malloc(totalDataLen+1);\r
- memcpy(handle_l[i].data,totalData+17,packdataLen);\r
- }\r
- memset(handle_l[i].cmd_data,0,17);\r
- memcpy(handle_l[i].cmd_data,totalData,17);\r
- handle_l[i].crcvalue = totalData[event_size-1];\r
- handle_l[i].data_len = packdataLen;\r
- read_data_tmp = &handle_l[i];//完整包,遍历后需要处理数据\r
- }\r
- }else//多包数据存储\r
- {\r
-\r
- uint32_t packStartAddrLen = handle_l[i].data_len;//每一包接收的数据长度起始地址\r
- handle_l[i].data_len = handle_l[i].data_len+event_size;\r
- printf("muilt 133333 handle_l[i].data_len:%d\r\n",handle_l[i].data_len);\r
- if(handle_l[i].data_len >= handle_l[i].totalDataLen)//接收完整的数据\r
- {\r
- handle_l[i].data_len = handle_l[i].data_len -1;//最后一包要减去最后的CRC的那一位\r
- //这是最后一包的起始地址\r
- if(handle_l[i].totalDataLen -packStartAddrLen < event_size-1)\r
- {\r
- printf("packStartAddrLen error!!!!!!!%d\r\n",packStartAddrLen);\r
- event_size=handle_l[i].totalDataLen-packStartAddrLen;\r
- }\r
- memcpy(handle_l[i].data+packStartAddrLen,totalData,event_size-1);//为了不把CRC copy到data所以多一步操作\r
- handle_l[i].crcvalue = totalData[event_size-1];//最后一个字节为总的数据包的CRC\r
- read_data_tmp = &handle_l[i];\r
- }else{ //还没接收完 有 3 4 5包.........\r
- if(handle_l[i].totalDataLen -packStartAddrLen < event_size)\r
- {\r
- printf("event_size error!!!!!!!%d\r\n",event_size);\r
- event_size=handle_l[i].totalDataLen-packStartAddrLen;\r
- }\r
- memcpy(handle_l[i].data+packStartAddrLen,totalData,event_size); //这是不带CRC数据说明还有下一包直接copy\r
- }\r
- }\r
- break;\r
- } \r
- \r
- }\r
- if(read_data_tmp)//获取到完整数据,处理数据且释放内存\r
- {\r
- printf("pack data start!!!!!\r\n");\r
- //处理数据..\r
- if(read_data_tmp->data)\r
- {\r
- read_data_tmp->data[read_data_tmp->totalDataLen]=0;\r
- }\r
- bleLongRecvData(read_data_tmp->data,read_data_tmp->totalDataLen,read_data_tmp->cmd_data,NULL,read_data_tmp->crcvalue);\r
- if(read_data_tmp->data)//只有数据不为NULL的才释放\r
- {\r
- ym_free(read_data_tmp->data);\r
- }\r
- read_data_tmp->data_len = 0;\r
- read_data_tmp->data = NULL;\r
- read_data_tmp->totalDataLen = 0;\r
- //read_data_tmp->handle = 0;\r
- read_data_tmp->crcvalue = 0;\r
- memset(read_data_tmp->cmd_data,0,17);\r
- printf("pack data end!!!!!!\r\n");\r
- }\r
-\r
-\r
-}\r
void free_ble_data(void)//以防断开蓝牙没有释放数据类型\r
{\r
return;\r
\r
}\r
\r
-#endif\r
\r
//接收app下发的原始数据 \r
void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小\r