添加工厂测试协议解析,获取系统版本指令调通
authorSnickerSun <snickersun@163.com>
Thu, 28 Mar 2024 03:56:12 +0000 (11:56 +0800)
committerSnickerSun <snickersun@163.com>
Thu, 28 Mar 2024 03:56:12 +0000 (11:56 +0800)
code/sdk/application/wearable/service/factorytest_service/CMakeLists.txt
code/sdk/application/wearable/service/factorytest_service/factorytestService.c
code/sdk/application/wearable/service/factorytest_service/factorytestService.h
code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c [new file with mode: 0644]
code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.h [new file with mode: 0644]

index 29a329d..9fa68b6 100644 (file)
@@ -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
index 3ff3c3d..8d3ec2d 100644 (file)
@@ -43,26 +43,6 @@ uint32_t factory_ate_write_handl = 0;
 uint32_t g_factory_ota_report_hdl = 0;\r
 uint32_t factory_ota_write_handl = 0;\r
 \r
-uint16_t modbus_crc16(uint8_t *data, uint16_t length) {  \r
-    uint8_t crc_hi = 0xFF;  \r
-    uint8_t crc_lo = 0xFF;  \r
-    int i;  \r
-  \r
-    while (length--) {  \r
-        crc_hi ^= *data++;\r
-        for (i = 0; i < 8; i++) {  \r
-            if (crc_hi & 0x80) {  \r
-                crc_hi = (crc_hi << 1) ^ 0x8005;  \r
-            } else {  \r
-                crc_hi <<= 1;  \r
-            }  \r
-        }  \r
-    }  \r
-  \r
-    return (crc_hi << 8) | crc_lo;  \r
-}  \r
- \r
-\r
 /* 创建服务 */\r
 static void ble_factorytest_add_service(void)\r
 {\r
@@ -230,14 +210,14 @@ void ble_factory_server_init(void)
     ble_factorytest_add_service();\r
 }\r
 \r
+extern void factorytest_protocol_decode(uint8_t *buf, uint16_t event_size);\r
 //协议接收client下发的数据接口\r
 void factory_recv_cmd_data(uint8_t *buf, uint16_t event_size,uint16_t handle)\r
 {\r
-    printf("factory_recv_cmd_data len %d , handle 0x%X\r\n",event_size,handle);\r
+    if(buf != NULL)\r
+        printf("factory_recv_cmd_data len %d , handle 0x%X ,*buf 0x02X\r\n",event_size,handle,*buf);\r
     /****此处为接收指令,处理后反馈结果的参考**/\r
-    uint8_t buff[128]={0};\r
-    sprintf((char*)buff,"%X",event_size);\r
-    ble_factorytest_server_send_input_report((uint8_t*)buff,strlen((char*)buff));\r
+    factorytest_protocol_decode(buf,event_size);\r
     /*****参考结束****/\r
 }\r
 \r
index 388b5ab..c88dccd 100644 (file)
@@ -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 (file)
index 0000000..6bafd53
--- /dev/null
@@ -0,0 +1,178 @@
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2022. All rights reserved.\r
+ * Description: BT HID Service Server Module.\r
+ */\r
+#include "factorytest_protocol.h"\r
+#include "factorytestService.h"\r
+#include "wearable_log.h"\r
+#include "custom_utils.h"\r
+\r
+#pragma pack(1)\r
+typedef struct factorytest_cmd_header_t\r
+{\r
+    uint8_t header;\r
+    uint16_t len;\r
+    uint8_t  mode;\r
+    uint8_t submod;\r
+    uint8_t testitem;\r
+}factorytest_cmd_header_t;\r
+#pragma pack()\r
+\r
+uint16_t modbus_crc16(uint8_t *data, uint16_t length) {  \r
+    uint8_t crc_hi = 0xFF;  \r
+    uint8_t crc_lo = 0xFF;  \r
+    int i;  \r
+  \r
+    while (length--) {  \r
+        crc_hi ^= *data++;\r
+        for (i = 0; i < 8; i++) {  \r
+            if (crc_hi & 0x80) {  \r
+                crc_hi = (crc_hi << 1) ^ 0x8005;  \r
+            } else {  \r
+                crc_hi <<= 1;  \r
+            }  \r
+        }  \r
+    }  \r
+  \r
+    return (crc_hi << 8) | crc_lo;  \r
+}  \r
+ \r
+errcode_t factorytest_protocol_replymsg(uint8_t mode, uint8_t submode,uint8_t testitem,\r
+                                uint8_t *input_data,uint16_t input_len)\r
+{\r
+\r
+    uint8_t * replybuf=NULL;\r
+    errcode_t ret;\r
+    uint16_t total_len = input_len +1+2+1+1+1+2;//头+长度+mode+submod+testitem+crc\r
+    replybuf = malloc(total_len);\r
+    if(replybuf == NULL) return ERRCODE_MALLOC;\r
+    factorytest_cmd_header_t *pcmdheader = (factorytest_cmd_header_t*)replybuf;\r
+    pcmdheader->header = BLE_TEST_PROTOCOL_HEADER;\r
+    pcmdheader->len = total_len - 2 -1 - 2; //去掉头,长度,crc\r
+    pcmdheader->mode = mode;\r
+    pcmdheader->submod = submode;\r
+    pcmdheader->testitem = testitem;\r
+    if (input_len>0)\r
+        memcpy_s(replybuf+1+2+1+1+1/*header+len+mode+submod+testitem*/,input_len,input_data,input_len);\r
+    //计算除了crc外的所有数据\r
+    uint16_t crc16 = modbus_crc16(replybuf,total_len - 2);\r
+    \r
+    *(replybuf+(total_len-1)) = ((uint8_t *) &crc16 )[1];\r
+    *(replybuf+(total_len-2)) = ((uint8_t *) &crc16 )[0];\r
+    \r
+    ret = ble_factorytest_server_send_input_report(replybuf,total_len);\r
+    free(replybuf);\r
+    return ret;\r
+}\r
+/**\r
+ * BLE_TEST_CMD_MODE_COMMON\r
+ * factorytest_protocol_common_decode\r
+*/\r
+void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t* data,uint16_t len)\r
+{\r
+    errcode_t ret;\r
+    switch(submode)\r
+    {\r
+        printf("submode 0x%02X testitem 0x%02X\r\n",submode,testitem);\r
+        case BLE_TEST_CMD_COMMON_SUB_MODE_SYSTEM_VERSION:\r
+            if (testitem == 0x02)\r
+            {\r
+\r
+                uint8_t buildversion[64]={0};\r
+                uint16_t versionlen = 0;\r
+                ret = uapi_get_buildversion(buildversion,&versionlen);\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON,\r
+                        BLE_TEST_CMD_COMMON_SUB_MODE_SYSTEM_VERSION,\r
+                        0x02,\r
+                        buildversion,\r
+                        versionlen);\r
+            }\r
+            break;\r
+\r
+        default:\r
+            printf("");\r
+            break;\r
+\r
+    }\r
+}\r
+errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size)\r
+{\r
+    if(buf != NULL && event_size>=(1+2+1+1+1+2/*header+len+mod+submod+item+crc*/))\r
+    {\r
+        factorytest_cmd_header_t header ={0};\r
+        header.header = buf[0];\r
+        ((uint8_t *)&header.len)[1] = buf[1];\r
+        ((uint8_t *)&header.len)[0] = buf[2];\r
+        header.mode = buf[3];\r
+        header.submod = buf[4];\r
+        header.testitem = buf[5];\r
+        printf("header 0x%02X vs 0x%02X\n",header.header, buf[0]);\r
+        if (header.header == BLE_TEST_PROTOCOL_HEADER )\r
+        {   \r
+            //消息长度大于event_size证明解析错误. \r
+            printf("(header->len 0x%04X\n",header.len);\r
+            if ((header.len + 1+2+2) > event_size) \r
+            {\r
+                printf("Error 数据长度大于eventsize\r\n");\r
+                return ERRCODE_FAIL;\r
+            }\r
+            uint16_t crc16 = modbus_crc16(buf,header.len+1+2);\r
+            uint16_t crc16_2 = 0;\r
+            ((uint8_t *)&crc16_2)[1] = buf[event_size-2];\r
+            ((uint8_t *)&crc16_2)[0] = buf[event_size-1];\r
+                \r
+            printf("crc16 0x%04X vs 0x%04X\n",crc16,crc16_2);\r
+\r
+            // if( crc16 == crc16_2) //校验通过,开始正式解析\r
+            {\r
+                printf("mode %d\n",header.mode);\r
+                switch(header.mode)\r
+                {\r
+                    //  主模式ID  公共接口      0x01\r
+                    case BLE_TEST_CMD_MODE_COMMON:\r
+                        factorytest_protocol_common_decode(header.submod,header.testitem,\r
+                                        buf+1+2+1+1+1,\r
+                                        header.len);\r
+                        break;\r
+                    \r
+                    //  主模式ID  生产软件      0x02\r
+                    case BLE_TEST_CMD_MODE_SOFT_TEST:\r
+                        break;\r
+                        \r
+                    //  主模式ID  硬测接口      0x03\r
+                    case BLE_TEST_CMD_MODE_HW_TEST:\r
+                        break;\r
+\r
+                    //  主模式ID  串口接口      0x04\r
+                    case BLE_TEST_CMD_MODE_SERIAL_PORT:\r
+                        break;\r
+                }\r
+\r
+            }\r
+            \r
+        }else{\r
+            printf("crc error!\r\n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+\r
+    }else{\r
+        printf("error format!\r\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+\r
+errcode_t factorytest_ota_recv(const uint8_t *data, uint8_t len)\r
+{\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t factorytest_ota_report(uint8_t mode, uint8_t submode,uint8_t testitem,\r
+                                uint8_t *input_data,uint16_t input_len)\r
+{\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
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 (file)
index 0000000..5d9c098
--- /dev/null
@@ -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