From: SnickerSun Date: Thu, 28 Mar 2024 03:56:12 +0000 (+0800) Subject: 添加工厂测试协议解析,获取系统版本指令调通 X-Git-Tag: release_V1.2.70_20241020_135402~1248 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=88195ff2b2163bf2f0fc23feb0f98a1524a1cd14;p=mirrors%2FFD230.git 添加工厂测试协议解析,获取系统版本指令调通 --- diff --git a/code/sdk/application/wearable/service/factorytest_service/CMakeLists.txt b/code/sdk/application/wearable/service/factorytest_service/CMakeLists.txt index 29a329d06..9fa68b6f3 100644 --- a/code/sdk/application/wearable/service/factorytest_service/CMakeLists.txt +++ b/code/sdk/application/wearable/service/factorytest_service/CMakeLists.txt @@ -9,6 +9,7 @@ set(PRIVATE_HEADER ) set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/factorytestService.c + ${CMAKE_CURRENT_SOURCE_DIR}/factorytest_protocol.c ) set(COMPONENT_PUBLIC_CCFLAGS diff --git a/code/sdk/application/wearable/service/factorytest_service/factorytestService.c b/code/sdk/application/wearable/service/factorytest_service/factorytestService.c index 3ff3c3d12..8d3ec2dff 100644 --- a/code/sdk/application/wearable/service/factorytest_service/factorytestService.c +++ b/code/sdk/application/wearable/service/factorytest_service/factorytestService.c @@ -43,26 +43,6 @@ uint32_t factory_ate_write_handl = 0; uint32_t g_factory_ota_report_hdl = 0; uint32_t factory_ota_write_handl = 0; -uint16_t modbus_crc16(uint8_t *data, uint16_t length) { - uint8_t crc_hi = 0xFF; - uint8_t crc_lo = 0xFF; - int i; - - while (length--) { - crc_hi ^= *data++; - for (i = 0; i < 8; i++) { - if (crc_hi & 0x80) { - crc_hi = (crc_hi << 1) ^ 0x8005; - } else { - crc_hi <<= 1; - } - } - } - - return (crc_hi << 8) | crc_lo; -} - - /* 创建服务 */ static void ble_factorytest_add_service(void) { @@ -230,14 +210,14 @@ void ble_factory_server_init(void) ble_factorytest_add_service(); } +extern void factorytest_protocol_decode(uint8_t *buf, uint16_t event_size); //协议接收client下发的数据接口 void factory_recv_cmd_data(uint8_t *buf, uint16_t event_size,uint16_t handle) { - printf("factory_recv_cmd_data len %d , handle 0x%X\r\n",event_size,handle); + if(buf != NULL) + printf("factory_recv_cmd_data len %d , handle 0x%X ,*buf 0x02X\r\n",event_size,handle,*buf); /****此处为接收指令,处理后反馈结果的参考**/ - uint8_t buff[128]={0}; - sprintf((char*)buff,"%X",event_size); - ble_factorytest_server_send_input_report((uint8_t*)buff,strlen((char*)buff)); + factorytest_protocol_decode(buf,event_size); /*****参考结束****/ } diff --git a/code/sdk/application/wearable/service/factorytest_service/factorytestService.h b/code/sdk/application/wearable/service/factorytest_service/factorytestService.h index 388b5abc8..c88dccd99 100644 --- a/code/sdk/application/wearable/service/factorytest_service/factorytestService.h +++ b/code/sdk/application/wearable/service/factorytest_service/factorytestService.h @@ -34,74 +34,6 @@ extern "C" { /* write */ #define BLE_UUID_ATE_TX 0x1004 -// 主模式ID 公共接口 0x01 -#define BLE_TEST_CMD_MODE_COMMON 0x01 -// 主模式ID 生产软件 0x02 -#define BLE_TEST_CMD_MODE_SOFT_TEST 0x02 -// 主模式ID 硬测接口 0x03 -#define BLE_TEST_CMD_MODE_HW_TEST 0x03 -// 主模式ID 串口接口 0x04 -#define BLE_TEST_CMD_MODE_SERIAL_PORT 0x04 - - -// 协议定义: -// 发送:协议头(0xFD) + 长度(2bytes) +模块ID(1bytes)+子模块ID(1bytes)+测试项ID(1bytes)+可变字节+CRC(2bytes) -// 接收:协议头(0xFD) + 长度(2bytes) +模块ID(1bytes)+子模块ID(1bytes)+测试项ID(1bytes)+执行状态(1bytes)+可变字节+CRC(2bytes) -// 备注: -// 1、状态返回00表示成功,01表示开始执行,其他表示各种错误。 -// 2、命令响应超时为:3秒,超时重发2次。 -// 3、大端模式。 -// 4、长耗时命令,先确认收到,执行完再返回结果。 -#define BLE_TEST_PROTOCOL_HEADER 0xFD - - -//公共模式 子模式ID 模式切换 -#define BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE 0x01 -//公共模式 子模式ID 系统版本 -#define BLE_TEST_CMD_COMMON_SUB_MODE_SYSTEM_VERSION 0x02 -//公共模式 子模式ID 开关机 -#define BLE_TEST_CMD_COMMON_SUB_MODE_POWER_ON_OFF_DEVICE 0x03 -//公共模式 子模式ID 功耗 -#define BLE_TEST_CMD_COMMON_SUB_MODE_POWERCONSUMPTION 0x04 -//公共模式 子模式ID OTA -#define BLE_TEST_CMD_COMMON_SUB_MODE_OTA 0x05 - -//软件测试 子模式ID 蓝牙 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_BLE 0x01 -//软件测试 子模式ID 马达 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_VIBRATOR 0x02 -//软件测试 子模式ID 按键 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY 0x03 -//软件测试 子模式ID RTC -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_RTC 0x04 -//软件测试 子模式ID 温度 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_TEMPERATURE 0x05 - -//软件测试 子模式ID 老化测试 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_AGING_TEST 0x06 - -//软件测试 子模式ID 定制测试 读写SN等 读CHIPID -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_CUSTOM_CMD 0x07 - -//软件测试 子模式ID 屏幕 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LCD 0x11 -//软件测试 子模式ID TP -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_TP 0x12 -//软件测试 子模式ID ACC -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC 0x13 -//软件测试 子模式ID 心率 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS 0x14 -//软件测试 子模式ID 地磁 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_COMPASS 0x16 -//软件测试 子模式ID 电源管理 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM 0x17 -//软件测试 子模式ID 扩展FLASH -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_EXTFLASH 0x18 -//软件测试 子模式ID 扩展RAM -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_EXTRAM 0x19 -//软件测试 子模式ID CAT1 -#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_CAT1 0x1A - /** * @if Eng diff --git a/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c new file mode 100644 index 000000000..6bafd5345 --- /dev/null +++ b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) @CompanyNameMagicTag 2022. All rights reserved. + * Description: BT HID Service Server Module. + */ +#include "factorytest_protocol.h" +#include "factorytestService.h" +#include "wearable_log.h" +#include "custom_utils.h" + +#pragma pack(1) +typedef struct factorytest_cmd_header_t +{ + uint8_t header; + uint16_t len; + uint8_t mode; + uint8_t submod; + uint8_t testitem; +}factorytest_cmd_header_t; +#pragma pack() + +uint16_t modbus_crc16(uint8_t *data, uint16_t length) { + uint8_t crc_hi = 0xFF; + uint8_t crc_lo = 0xFF; + int i; + + while (length--) { + crc_hi ^= *data++; + for (i = 0; i < 8; i++) { + if (crc_hi & 0x80) { + crc_hi = (crc_hi << 1) ^ 0x8005; + } else { + crc_hi <<= 1; + } + } + } + + return (crc_hi << 8) | crc_lo; +} + +errcode_t factorytest_protocol_replymsg(uint8_t mode, uint8_t submode,uint8_t testitem, + uint8_t *input_data,uint16_t input_len) +{ + + uint8_t * replybuf=NULL; + errcode_t ret; + uint16_t total_len = input_len +1+2+1+1+1+2;//头+长度+mode+submod+testitem+crc + replybuf = malloc(total_len); + if(replybuf == NULL) return ERRCODE_MALLOC; + factorytest_cmd_header_t *pcmdheader = (factorytest_cmd_header_t*)replybuf; + pcmdheader->header = BLE_TEST_PROTOCOL_HEADER; + pcmdheader->len = total_len - 2 -1 - 2; //去掉头,长度,crc + pcmdheader->mode = mode; + pcmdheader->submod = submode; + pcmdheader->testitem = testitem; + if (input_len>0) + memcpy_s(replybuf+1+2+1+1+1/*header+len+mode+submod+testitem*/,input_len,input_data,input_len); + //计算除了crc外的所有数据 + uint16_t crc16 = modbus_crc16(replybuf,total_len - 2); + + *(replybuf+(total_len-1)) = ((uint8_t *) &crc16 )[1]; + *(replybuf+(total_len-2)) = ((uint8_t *) &crc16 )[0]; + + ret = ble_factorytest_server_send_input_report(replybuf,total_len); + free(replybuf); + return ret; +} +/** + * BLE_TEST_CMD_MODE_COMMON + * factorytest_protocol_common_decode +*/ +void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t* data,uint16_t len) +{ + errcode_t ret; + switch(submode) + { + printf("submode 0x%02X testitem 0x%02X\r\n",submode,testitem); + case BLE_TEST_CMD_COMMON_SUB_MODE_SYSTEM_VERSION: + if (testitem == 0x02) + { + + uint8_t buildversion[64]={0}; + uint16_t versionlen = 0; + ret = uapi_get_buildversion(buildversion,&versionlen); + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON, + BLE_TEST_CMD_COMMON_SUB_MODE_SYSTEM_VERSION, + 0x02, + buildversion, + versionlen); + } + break; + + default: + printf(""); + break; + + } +} +errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size) +{ + if(buf != NULL && event_size>=(1+2+1+1+1+2/*header+len+mod+submod+item+crc*/)) + { + factorytest_cmd_header_t header ={0}; + header.header = buf[0]; + ((uint8_t *)&header.len)[1] = buf[1]; + ((uint8_t *)&header.len)[0] = buf[2]; + header.mode = buf[3]; + header.submod = buf[4]; + header.testitem = buf[5]; + printf("header 0x%02X vs 0x%02X\n",header.header, buf[0]); + if (header.header == BLE_TEST_PROTOCOL_HEADER ) + { + //消息长度大于event_size证明解析错误. + printf("(header->len 0x%04X\n",header.len); + if ((header.len + 1+2+2) > event_size) + { + printf("Error 数据长度大于eventsize\r\n"); + return ERRCODE_FAIL; + } + uint16_t crc16 = modbus_crc16(buf,header.len+1+2); + uint16_t crc16_2 = 0; + ((uint8_t *)&crc16_2)[1] = buf[event_size-2]; + ((uint8_t *)&crc16_2)[0] = buf[event_size-1]; + + printf("crc16 0x%04X vs 0x%04X\n",crc16,crc16_2); + + // if( crc16 == crc16_2) //校验通过,开始正式解析 + { + printf("mode %d\n",header.mode); + switch(header.mode) + { + // 主模式ID 公共接口 0x01 + case BLE_TEST_CMD_MODE_COMMON: + factorytest_protocol_common_decode(header.submod,header.testitem, + buf+1+2+1+1+1, + header.len); + break; + + // 主模式ID 生产软件 0x02 + case BLE_TEST_CMD_MODE_SOFT_TEST: + break; + + // 主模式ID 硬测接口 0x03 + case BLE_TEST_CMD_MODE_HW_TEST: + break; + + // 主模式ID 串口接口 0x04 + case BLE_TEST_CMD_MODE_SERIAL_PORT: + break; + } + + } + + }else{ + printf("crc error!\r\n"); + return ERRCODE_FAIL; + } + + }else{ + printf("error format!\r\n"); + return ERRCODE_FAIL; + } + return ERRCODE_SUCC; +} + + +errcode_t factorytest_ota_recv(const uint8_t *data, uint8_t len) +{ + + return ERRCODE_SUCC; +} + +errcode_t factorytest_ota_report(uint8_t mode, uint8_t submode,uint8_t testitem, + uint8_t *input_data,uint16_t input_len) +{ + + return ERRCODE_SUCC; +} + diff --git a/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h new file mode 100644 index 000000000..5d9c098e6 --- /dev/null +++ b/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) @CompanyNameMagicTag 2022. All rights reserved. + * Description: BT HID Service Server module. + */ + +/** + * @defgroup bluetooth_bts_hid_server HID SERVER API + * @ingroup bluetooth + * @{ + */ +#ifndef BLE_FACTORY_TEST_PROTOCOL_H +#define BLE_FACTORY_TEST_PROTOCOL_H + +#include "errcode.h" + +#ifdef __cplusplus +extern "C" { +#endif +// ATE工厂模式服务UUID: 00002760-08c2-11e1-9073-0e8afefd1000 +// OTA RX characteristic UUID: 00002760-08c2-11e1-9073-0e8afefd1001 +// OTA TX characteristic UUID: 00002760-08c2-11e1-9073-0e8afefd1002 +// ATE RX characteristic UUID: 00002760-08c2-11e1-9073-0e8afefd1003 +// ATE TX characteristic UUID: 00002760-08c2-11e1-9073-0e8afefd1004 + +// 主模式ID 公共接口 0x01 +#define BLE_TEST_CMD_MODE_COMMON 0x01 +// 主模式ID 生产软件 0x02 +#define BLE_TEST_CMD_MODE_SOFT_TEST 0x02 +// 主模式ID 硬测接口 0x03 +#define BLE_TEST_CMD_MODE_HW_TEST 0x03 +// 主模式ID 串口接口 0x04 +#define BLE_TEST_CMD_MODE_SERIAL_PORT 0x04 + + +// 协议定义: +// CRC 计算的所有数据的校驗值 +// 长度是从模块ID开始到CRC结束的长度 +// 发送:协议头(0xFD) + 长度(2bytes) +模块ID(1bytes)+子模块ID(1bytes)+测试项ID(1bytes)+可变字节+CRC(2bytes) +// 接收:协议头(0xFD) + 长度(2bytes) +模块ID(1bytes)+子模块ID(1bytes)+测试项ID(1bytes)+执行状态(1bytes)+可变字节+CRC(2bytes) +// 备注: +// 1、状态返回00表示成功,01表示开始执行,其他表示各种错误。 +// 2、命令响应超时为:3秒,超时重发2次。 +// 3、大端模式。 +// 4、长耗时命令,先确认收到,执行完再返回结果。 +#define BLE_TEST_PROTOCOL_HEADER 0xFD + + +//公共模式 子模式ID 模式切换 +#define BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE 0x01 +//公共模式 子模式ID 系统版本 +#define BLE_TEST_CMD_COMMON_SUB_MODE_SYSTEM_VERSION 0x02 +//公共模式 子模式ID 开关机 +#define BLE_TEST_CMD_COMMON_SUB_MODE_POWER_ON_OFF_DEVICE 0x03 +//公共模式 子模式ID 功耗 +#define BLE_TEST_CMD_COMMON_SUB_MODE_POWERCONSUMPTION 0x04 +//公共模式 子模式ID OTA +#define BLE_TEST_CMD_COMMON_SUB_MODE_OTA 0x05 + +//软件测试 子模式ID 蓝牙 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_BLE 0x01 +//软件测试 子模式ID 马达 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_VIBRATOR 0x02 +//软件测试 子模式ID 按键 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY 0x03 +//软件测试 子模式ID RTC +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_RTC 0x04 +//软件测试 子模式ID 温度 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_TEMPERATURE 0x05 + +//软件测试 子模式ID 老化测试 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_AGING_TEST 0x06 + +//软件测试 子模式ID 定制测试 读写SN等 读CHIPID +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_CUSTOM_CMD 0x07 + +//软件测试 子模式ID 屏幕 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LCD 0x11 +//软件测试 子模式ID TP +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_TP 0x12 +//软件测试 子模式ID ACC +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_ACC 0x13 +//软件测试 子模式ID 心率 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS 0x14 +//软件测试 子模式ID 地磁 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_COMPASS 0x16 +//软件测试 子模式ID 电源管理 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM 0x17 +//软件测试 子模式ID 扩展FLASH +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_EXTFLASH 0x18 +//软件测试 子模式ID 扩展RAM +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_EXTRAM 0x19 +//软件测试 子模式ID CAT1 +#define BLE_TEST_CMD_SOFT_TEST_SUB_MODE_CAT1 0x1A +/** + * + * encode cmd msg string and send to ble + * input: mod,submod,data,len + * output: output_data + * return:0 success other failed + * 请注意:output内存是函数内部创建,用后需要执行 factorytest_cmd_msg_free . +*/ +errcode_t factorytest_protocol_replymsg(uint8_t mode, uint8_t submode,uint8_t testitem, + uint8_t *input_data,uint16_t input_len); +/*** + * decode protocol data +*/ +errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size); + +errcode_t factorytest_ota_recv(const uint8_t *data, uint8_t len); +errcode_t factorytest_ota_report(uint8_t mode, uint8_t submode,uint8_t testitem, + uint8_t *input_data,uint16_t input_len); + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + + +#endif//BLE_FACTORY_TEST_PROTOCOL_H