272优化产测HFP连接,增加表冠校准
authorpenglei <1624952103@qq.com>
Wed, 10 Dec 2025 07:47:40 +0000 (15:47 +0800)
committerpenglei <1624952103@qq.com>
Wed, 10 Dec 2025 07:47:40 +0000 (15:47 +0800)
code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508.c
code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508.h
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c

index 78cb0b8..cb004aa 100644 (file)
@@ -46,6 +46,8 @@
 //custom to do  here
 #endif //NORDIC_SDK
 
+#define COFFY_PATH "/user/system/hx3508_coffy.bin"
+
 #define INT_PIN S_AGPIO_R3
 
 #define HX3508_I2C_BUS I2C_BUS_2
@@ -75,6 +77,11 @@ static uint8_t ost_init = 0;
 
 static uint16_t timer_cnt = 0;
 
+static float g_sum_y = 0;
+static float coffy = 0.0f;
+static uint8_t factory_flag = 0;
+static int16_t sum_deltay = 0;
+
 /*--------以下为定时函数相关定义 建立/启动/停止定时器//定时中断处理-----------*/
 
 
@@ -91,6 +98,47 @@ static void report_zero_data_for_start_stop_flag(void)
 }
 
 
+void hx3508_set_factory_test_mode(uint8_t cmd)
+{
+    factory_flag = cmd;
+}
+
+void hx3508_set_coffy(float data)
+{
+    coffy = data;
+    // printf("set coffy :%.3f\n",coffy);
+    uapi_save_file_data(COFFY_PATH,&coffy,4,"w");
+}
+
+static void hx3508_get_coffy(void)
+{
+    float data = 0.0f;
+    uint16_t len = 4;
+    uapi_get_file_data(COFFY_PATH,&data,&len);
+    if(!data || data > 1.5 || data < 0.5)
+        coffy = 1;
+    else
+        coffy = data;
+    // printf("data : %f\n",data);
+    // printf("coffy: %f\n",coffy);
+}
+
+void hx3508_get_sum_y(float *data)
+{
+    if(sum_deltay && coffy!= 0 && data != 0 && sum_deltay != 0)
+    {
+        g_sum_y = 360/(float)sum_deltay * 1000 * coffy;
+        // printf("sum_deltay : %d\n",sum_deltay);
+        // printf("g_sum_y : %.3f,coffy : %.3f\n",g_sum_y,coffy);
+        *data = g_sum_y;
+    }
+
+    g_sum_y = 0;
+    sum_deltay = 0;
+}
+
+
+
 /**
  * OTS 定时器创建函数
  * @param NULL
@@ -494,7 +542,20 @@ void ots_data_handler(void *p_event_data, uint16_t event_size)
         deltax = ots_read_reg(RA_ACC_DELTA_X_LOW) |(ots_read_reg(RA_ACC_DELTA_X_HIG)<<8);
         deltay = ots_read_reg(RA_ACC_DELTA_Y_LOW) |(ots_read_reg(RA_ACC_DELTA_Y_HIG)<<8);                                                              
         TYHX_LOG("Deltay = %d \r\n",deltay);//djd0305
-        
+        // printf("deltay:%d,coffy:%.3f\n",deltay,coffy);
+        // if(deltay && coffy)
+            // deltay = (float)deltay * coffy;
+        // printf("deltay:%d\n",deltay);
+        if(factory_flag && deltay != 0)
+        {
+            // printf("deltay : %d\n",deltay);
+            // printf("coffy:%f\n",coffy);
+            // g_sum_y += 360/(float)deltay*1000*coffy;
+            // printf("g_sum_y:%.3f\n",g_sum_y);
+            sum_deltay += deltay;
+            // printf("deltay:%.d, sum_deltay : %d\n",deltay,sum_deltay);
+        }
+
         if (stand_still == 1) 
         {
             //上次是静止,上报状态改变
@@ -504,7 +565,10 @@ void ots_data_handler(void *p_event_data, uint16_t event_size)
         
         //用户添加程序, deltay 是表冠产生数据, 上报给UI, 如果需要数据变化, 
         // 积攒到一定值再上报UI, 可以调用 ots_result_deal()函数处理.
-    
+        if(coffy && deltay != 0)
+        {
+            deltay = (int16_t)(deltay * coffy);
+        }
         ots_result_deal(deltay);
     }
     else
@@ -773,7 +837,8 @@ void ots_start(void)
     LOS_Mdelay(10);
     ots_write_reg(RA_DEBUG_CAS0,0x43);
        hx3508l_calibration();
-
+    if(!coffy)
+        hx3508_get_coffy();
 #ifdef MOT_NO_USE_MODE   // 如果是非中断模式, 初始后, 开启定时器; 
     // ots_timer_start();
 #endif
index 9e6b813..0a37a1f 100644 (file)
@@ -191,4 +191,8 @@ int16_t hx3508_get_stand_still(void);
 void hx3508_get_chip_id(uint16_t *id);
 void hx3508_open(void);
 
+void hx3508_set_factory_test_mode(uint8_t cmd);
+void hx3508_set_coffy(float data);
+void hx3508_get_sum_y(float *data);
+
 #endif //_TYHX__OTS_hx3508_CUSTOM_H
index ec8b788..29badca 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-06-17 14:31:08\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-12-03 11:30:51\r
+ * @LastEditTime: 2025-12-10 15:36:21\r
  * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
  * @Description: \r
  * \r
@@ -235,7 +235,7 @@ static void bt_connect_timer_callback(void *argument)
     printf("conn_type : %d\n", conn_type);\r
 \r
     g_bt_conn_cnt++;\r
-    if(g_bt_conn_cnt >= 10)\r
+    if(g_bt_conn_cnt >= 120)\r
     {\r
         g_bt_conn_cnt = 0;\r
         osTimerStop(g_bt_conn_timer);\r
@@ -1236,7 +1236,79 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                         0x07,\r
                         &send_data,\r
                         1);\r
-            }\r
+            } \r
+            else if(testitem == 0x08)\r
+            {\r
+                //获取表冠ID\r
+                uint8_t send_data[2] = {0};\r
+#ifdef ROTARYENCODER_HX3508\r
+                uint16_t crown_id =0;\r
+                rotary_get_chip_id(&crown_id);\r
+                send_data[0] = (uint8_t)(((uint16_t)crown_id & 0xFF00) >> 8);\r
+                send_data[1] = (uint8_t)((uint16_t)crown_id & 0x00FF);\r
+#endif\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY,\r
+                        0x08,\r
+                        send_data,\r
+                        2);\r
+            } \r
+            else if(testitem == 0x09)\r
+            {\r
+                //进入表冠校准模式\r
+                uint8_t send_data = 0;\r
+#ifdef ROTARYENCODER_HX3508\r
+                hx3508_set_factory_test_mode(1);\r
+#endif\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY,\r
+                        0x09,\r
+                        &send_data,\r
+                        1);\r
+            } \r
+            else if(testitem == 0x0A)\r
+            {\r
+                //获取校准结果\r
+                uint8_t databuf[2] = {0};\r
+#ifdef ROTARYENCODER_HX3508\r
+                float send_data = 0;\r
+                hx3508_get_sum_y(&send_data);\r
+                printf("send_data : %.3f\n",send_data);\r
+                int16_t signed_data = (int16_t)send_data;\r
+                databuf[0] = (uint8_t)(((uint32_t)signed_data & 0xFF00) >> 8);\r
+                databuf[1] = (uint8_t)((uint32_t)signed_data & 0x00FF);\r
+#endif\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY,\r
+                        0x0A,\r
+                        databuf,\r
+                        2);\r
+            } \r
+            \r
+            else if(testitem == 0x0B)\r
+            {\r
+                //设置校准参数\r
+                uint8_t send_data = 0;\r
+                // printf("len : %d\n",len);\r
+                // for(int i = 0 ; i < len ; i++)\r
+                // {\r
+                //     printf("data[%d]:0x%x\n",i,data[i]);\r
+                // }\r
+#ifdef ROTARYENCODER_HX3508\r
+                if(data != NULL && len == 5)\r
+                {\r
+                    float coffy = ((uint16_t)data[0] << 8 | data[1]) / 1000.0f;\r
+                    printf("coffy : %.3f \n",coffy);\r
+                    hx3508_set_coffy(coffy);\r
+                }\r
+#endif\r
+                factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
+                        BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY,\r
+                        0x0B,\r
+                        &send_data,\r
+                        1);\r
+            } \r
+            \r
 \r
             break;\r
 \r
@@ -2443,7 +2515,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 }\r
                 if(g_bt_conn_timer != NULL)\r
                 {\r
-                    osTimerStart(g_bt_conn_timer, 500);\r
+                    osTimerStart(g_bt_conn_timer, 1000);\r
                 }\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r
@@ -2462,7 +2534,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
                 }\r
                 if(g_bt_conn_timer != NULL)\r
                 {\r
-                    osTimerStart(g_bt_conn_timer, 500);\r
+                    osTimerStart(g_bt_conn_timer, 1000);\r
                 }\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r