更新3695算法库,优化心率计算 3048/1
authorpenglei <1624952103@qq.com>
Thu, 8 Jan 2026 04:21:16 +0000 (12:21 +0800)
committerpenglei <1624952103@qq.com>
Thu, 8 Jan 2026 04:21:16 +0000 (12:21 +0800)
code/sdk/zhihui/drivers/ppg/hx3695/CMakeLists.txt
code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c
code/sdk/zhihui/drivers/ppg/hx3695/lib_3695_hrs_2026_0107_11k.a [new file with mode: 0644]
code/sdk/zhihui/drivers/ppg/hx3695/tyhx_hrs_alg.h
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c
code/sdk/zhihui/services/gnss/src/NMEA0183.c

index 53bbac2..e665c40 100644 (file)
@@ -58,7 +58,7 @@ set(MAIN_COMPONENT
 if("PPG_HX3695" IN_LIST DEFINES)
     find_library(LIB_PATH_HX3695 libhx3695.a ${CMAKE_CURRENT_SOURCE_DIR})
     find_library(LIB_PATH_HX3695_HRV libHX3697_hs_20241230_103__01_hrv.a ${CMAKE_CURRENT_SOURCE_DIR})
-    find_library(LIB_PATH_HX3695_HRS libHX3697_hs_20241230_3153__01_hrs.a ${CMAKE_CURRENT_SOURCE_DIR})
+    find_library(LIB_PATH_HX3695_HRS lib_3695_hrs_2026_0107_11k.a ${CMAKE_CURRENT_SOURCE_DIR})
     find_library(LIB_PATH_HX3695_SPO libHX3697_hs_20240607_3333__02_spo.a ${CMAKE_CURRENT_SOURCE_DIR})
 
     target_link_libraries(${TARGET_NAME} PRIVATE -Wl,--whole-archive 
index 9573e81..3a28e43 100644 (file)
@@ -50,8 +50,8 @@ uint8_t s_cal_state = 0;
 uint8_t check_touch_cnt = 0;\r
 static wear_msg_code_t wear_status = MSG_NO_WEAR;\r
 static wear_msg_code_t wear_status_pre = MSG_NO_INIT;\r
-WORK_MODE_T work_mode_flag = HRS_MODE;\r
-ppg_sensor_data_t ppg_sensor_data;\r
+static WORK_MODE_T work_mode_flag = HRS_MODE;\r
+static ppg_sensor_data_t ppg_sensor_data;\r
 int16_t gsen_data_x_fifo[64];\r
 int16_t gsen_data_y_fifo[64];\r
 int16_t gsen_data_z_fifo[64];\r
@@ -333,9 +333,11 @@ uint16_t hx3695_led_data_analysis(ppg_sensor_data_t *ppg_sensor_dat, uint16_t fi
     }\r
     for(ii=0;ii<4;ii++)\r
     {\r
+        // printf("led_data[%d].led_state:%d\n",ii,ppg_sensor_dat->led_data[ii].led_state);\r
         if(ppg_sensor_dat->led_data[ii].led_state == Activated)\r
         {\r
             ppg_sensor_dat->led_data[ii].data_count = count+1;\r
+            // printf("ppg_sensor_dat->led_data[%d].data_count:%d\n",ii,ppg_sensor_dat->led_data[ii].data_count);\r
         }\r
     }\r
        return count+1;\r
@@ -497,6 +499,8 @@ bool hx3695_check_wear(ppg_sensor_data_t *ppg_sensor_dat)
         }\r
         else if(ppg_sensor_dat->led_data[3].data_val[ii] < CHECK_UNWEAR_THRE)\r
         {\r
+            // printf("ppg_sensor_dat->led_data[3].data_val[ii] < CHECK_UNWEAR_THRE\n");\r
+            // printf("ppg_sensor_dat->led_data[3].data_val[ii] :%d \n",ppg_sensor_dat->led_data[3].data_val[ii]);\r
             if(check_touch_cnt>0)\r
             {\r
                 check_touch_cnt--;\r
@@ -1446,9 +1450,59 @@ void hx3695_alg_send_data(ppg_sensor_data_t *ppg_sensor_dat, WORK_MODE_T mode, u
                     ble_ppgtest_server_send_input_report(&ble_data,1);\r
                 }\r
 #endif\r
-            }\r
-\r
 \r
+// #ifdef SUPPORT_PPG_BLE_SERVICE\r
+//             if(uapi_dev_runtime_get_hrs_ble_status())\r
+//             {\r
+//                 uint8_t encoded_hrm[17] = {0};//PPG_DATA_LEN_MAX>17会导致APP连接提示定义设备与所选类型不匹配\r
+//                 uint8_t red_bit = 0;\r
+//                 uint8_t ir_bit = 0;\r
+//                 uint8_t green_bit = 0;\r
+//                 // HRS_CAL_SET_T cal= get_hrs_agc_status();\r
+        \r
+//                 for(int ii=0; ii<data_count; ii++)\r
+//                 {\r
+//                     // c\r
+//                     if(ppg_sensor_dat->led_data[0].data_val[ii]<0)\r
+//                     {\r
+//                         red_bit = 0x80;\r
+//                         ppg_sensor_dat->led_data[0].data_val[ii] =  -ppg_sensor_dat->led_data[0].data_val[ii];\r
+//                     }\r
+//                     // ppg_sensor_dat->led_data[2].data_val[ii]\r
+//                     if(ppg_sensor_dat->led_data[3].data_val[ii]<0)\r
+//                     {\r
+//                         ir_bit = 0x80;\r
+//                         ppg_sensor_dat->led_data[3].data_val[ii] =  -ppg_sensor_dat->led_data[3].data_val[ii];\r
+//                     }\r
+        \r
+//                     encoded_hrm[0] = 0x55;//心率标志位,一定要设置正确\r
+//                     encoded_hrm[1] = (uint8_t)(hrs_result.data_cnt - data_count + ii) % 256;//原始data_cnt会一直自加,但是这里只有一个字节,0-255循环\r
+//                     encoded_hrm[2] = (uint8_t)(hrs_result.hr_result & 0xFF);//心率值\r
+        \r
+//                     encoded_hrm[3] = (uint8_t)((ppg_sensor_dat->led_data[0].data_val[ii] & 0xFF0000) >> 16) | red_bit;      //绿灯原始数据\r
+//                     encoded_hrm[4] = (uint8_t)((ppg_sensor_dat->led_data[0].data_val[ii] & 0xFF00) >> 8);                           //绿灯原始数据\r
+//                     encoded_hrm[5] = (uint8_t)(ppg_sensor_dat->led_data[0].data_val[ii] & 0xFF);                                                    //绿灯原始数据\r
+        \r
+//                     encoded_hrm[6] = (uint8_t)((ppg_sensor_dat->led_data[3].data_val[ii] & 0xFF0000) >> 16) | ir_bit;               //ir原始数据\r
+//                     encoded_hrm[7] = (uint8_t)((ppg_sensor_dat->led_data[3].data_val[ii] & 0xFF00) >> 8);                                   //ir原始数据\r
+//                     encoded_hrm[8] = (uint8_t)(ppg_sensor_dat->led_data[3].data_val[ii] & 0xFF);                                                    //ir原始数据\r
+        \r
+//                     encoded_hrm[9] = (uint8_t)((gsen_data_x_fifo[ii]&0xFF00)>>8);//模拟x,1234换成填入自己的x数据\r
+//                     encoded_hrm[10] = (uint8_t)(gsen_data_x_fifo[ii]&0xFF);\r
+//                     encoded_hrm[11] = (uint8_t)((gsen_data_y_fifo[ii]&0xFF00)>>8);//模拟y,-1234换成填入自己的y数据\r
+//                     encoded_hrm[12] = (uint8_t)(gsen_data_y_fifo[ii]&0xFF);\r
+//                     encoded_hrm[13] = (uint8_t)((gsen_data_z_fifo[ii]&0xFF00)>>8);//模拟z,3987换成填入自己的z数据\r
+//                     encoded_hrm[14] = (uint8_t)(gsen_data_z_fifo[ii]&0xFF);       \r
+                    \r
+//                     encoded_hrm[15] = ppg_sensor_dat->led_data[0].led_current;//绿灯电流\r
+//                     encoded_hrm[16] = wear_status;//红外电流\r
+\r
+//                     ble_ppgtest_server_send_input_report(encoded_hrm,17);\r
+//                 }\r
+\r
+//             }\r
+// #endif  \r
+        }\r
                        break;\r
                }\r
                case SPO2_MODE:\r
@@ -1482,6 +1536,9 @@ void hx3695_alg_send_data(ppg_sensor_data_t *ppg_sensor_dat, WORK_MODE_T mode, u
 \r
 void hx3695_ppg_Int_handle(ppg_sensor_data_t *ppg_sensor_dat)\r
 {\r
+    // uint32_t time = 0;\r
+    // uapi_get_timestampe_ms(&time);\r
+    // printf("time:%d\n",time);\r
        uint16_t count = 0;\r
        uint16_t ii = 0;\r
        if(s_ppg_state == 0)\r
@@ -1489,6 +1546,7 @@ void hx3695_ppg_Int_handle(ppg_sensor_data_t *ppg_sensor_dat)
                return;\r
        }\r
        count = hx3695_read_fifo_data(ppg_sensor_dat);\r
+    // printf("count:%d\n",count);\r
     if(count > 0)\r
     {\r
         hx3695_check_wear(ppg_sensor_dat);\r
diff --git a/code/sdk/zhihui/drivers/ppg/hx3695/lib_3695_hrs_2026_0107_11k.a b/code/sdk/zhihui/drivers/ppg/hx3695/lib_3695_hrs_2026_0107_11k.a
new file mode 100644 (file)
index 0000000..1ffd5f8
Binary files /dev/null and b/code/sdk/zhihui/drivers/ppg/hx3695/lib_3695_hrs_2026_0107_11k.a differ
index f7eeaf4..41cdde0 100644 (file)
@@ -1,21 +1,21 @@
-//vesion3.1.53\r
+//vesion3.1.55\r
 #ifndef _TYHX_HRS_ALG_H_\r
 #define _TYHX_HRS_ALG_H_\r
 \r
 #include <stdint.h>\r
-\r
-// /* portable 8-bit unsigned integer */\r
-// typedef unsigned char           uint8_t;\r
-// /* portable 8-bit signed integer */\r
-// typedef signed char             int8_t;\r
-// /* portable 16-bit unsigned integer */\r
-// typedef unsigned short int      uint16_t;\r
-// /* portable 16-bit signed integer */\r
-// typedef signed short int        int16_t;\r
-// /* portable 32-bit unsigned integer */\r
-// //typedef unsigned int            uint32_t;\r
-// /* portable 32-bit signed integer */\r
-// //typedef signed int              int32_t;\r
+#include "hx3695.h"\r
+/* portable 8-bit unsigned integer */\r
+//typedef unsigned char           uint8_t;\r
+/* portable 8-bit signed integer */\r
+//typedef signed char             int8_t;\r
+/* portable 16-bit unsigned integer */\r
+//typedef unsigned short int      uint16_t;\r
+/* portable 16-bit signed integer */\r
+//typedef signed short int        int16_t;\r
+/* portable 32-bit unsigned integer */\r
+//typedef unsigned int            uint32_t;\r
+/* portable 32-bit signed integer */\r
+//typedef signed int              int32_t;\r
 \r
 #ifndef bool\r
 #define bool unsigned char\r
 #endif\r
 \r
 \r
-/////////////////////////  config  ///////////////////////////\r
-#define BP_CUSTDOWN_ALG_LIB\r
-#define SHARED_RAM\r
-#define NO_MATH_LIB\r
-\r
-//define DEBUG_DATA\r
-//////////////////////////////////////////////////////////////\r
-\r
-\r
-// #ifdef DEBUG_DATA\r
-// #define  DEBUG_PRINTF(...)     SEGGER_RTT_printf(0,__VA_ARGS__)\r
-// #else\r
-// #define      DEBUG_PRINTF(...)\r
-// #endif\r
-\r
-#ifdef SHARED_RAM\r
-extern uint8_t alg_ram[11 * 1024] __attribute__((aligned(4)));\r
-#endif\r
+#ifdef HRS_ALG_LIB\r
 \r
 typedef enum {\r
        NORMAL_MODE,\r
@@ -55,7 +38,7 @@ typedef enum {
        JUMP_MODE,\r
        ALLDAY_HR_MODE,\r
        HIGH_POW_MODE,\r
-    CLICK_MODE\r
+    TRAINER_MODE\r
 } hrs_sports_mode_t;\r
 \r
 typedef enum {\r
@@ -67,25 +50,25 @@ typedef enum {
 \r
 typedef enum {\r
        MSG_LIVING_INITIAL,\r
-       MSG_LIVING_TRUE,\r
+       MSG_LIVING_TRUE,  \r
        MSG_LIVING_FAIL\r
 } living_msg_code_t;\r
 \r
 typedef struct {\r
-       hrs_alg_msg_code_t  hrs_alg_status;\r
-    living_msg_code_t   living_status;\r
-       uint32_t            data_cnt;\r
-       uint8_t             hr_result;\r
-       uint16_t            cal_result;\r
-       uint8_t             hr_result_qual;\r
-    uint32_t            hr_result_std;\r
-    hrs_sports_mode_t   hr_mode;\r
-    uint8_t             stress;\r
-    uint8_t             breath;\r
-    uint32_t            rri;\r
-    uint32_t            rri_num;\r
-    uint32_t            rri_std;\r
-    uint32_t            rmssd;\r
+               hrs_alg_msg_code_t  hrs_alg_status;\r
+               living_msg_code_t   living_status;\r
+               uint32_t            data_cnt;\r
+               uint8_t             hr_result;\r
+               uint16_t            cal_result;\r
+               uint8_t             hr_result_qual;\r
+               uint32_t            hr_result_std;\r
+               hrs_sports_mode_t   hr_mode;\r
+               uint8_t             motion;\r
+               uint8_t             stress;\r
+               uint32_t            rri;\r
+               uint32_t            rri_num;  \r
+               uint32_t            rri_std;\r
+        uint32_t            rri_rmssd;\r
 } hrs_results_t;\r
 \r
 #ifdef BP_CUSTDOWN_ALG_LIB\r
@@ -110,7 +93,7 @@ typedef struct {
 typedef struct {\r
        bp_msg_code_t   bp_alg_status;\r
        uint8_t         sbp;\r
-       uint8_t         dbp;\r
+       uint8_t         dbp; \r
        uint32_t        data_cnt;\r
        uint8_t         hr_result;\r
        bool            object_flg;\r
@@ -131,7 +114,7 @@ bool tyhx_motion_pedometer(int16_t gsen_data_x, int16_t gsen_data_y, int16_t gse
 hrs_results_t tyhx_hrs_alg_get_results(void);\r
 void tyhx_hrs_set_alg_para(hrs_sports_mode_t sports_mode, uint16_t static_thre_val, uint8_t gsen_fun_lv_val);\r
 void tyhx_hrs_set_living(uint8_t mode, uint8_t qu_thre, uint8_t st_thre);\r
-\r
+#endif //HRS_ALG_LIB\r
 #endif\r
 \r
 \r
index 6fe4e81..84be0ca 100644 (file)
@@ -175,7 +175,7 @@ static int decode_nmea(char c)
     ret=0;
     if(nmea_decode(&g_nmeadata,c) ==1 ) ///调用解析函数
     {
-        dump_nmea_str(&(g_nmeadata.gpsParse));
+        // dump_nmea_str(&(g_nmeadata.gpsParse));
         if (g_nmeadata.gpsParse.sentence_type == GPS_SENTENCE_TH002 )
         {
             //一组数据最后一条
@@ -505,7 +505,8 @@ static void ListenGnssData(tiot_handle handle)
 {
     int32_t i = 0;
     int32_t timeout_count = 0;  // 连续超时计数器
-    
+    char temp_buf[512] = {0};
+
     // 初始化GNSS服务缓冲区
     if (init_gnss_service_buffer() != 0) {
         printf("Error: Failed to initialize GNSS service buffer\n");
@@ -557,7 +558,7 @@ static void ListenGnssData(tiot_handle handle)
 
                     int str_len = strnlen(pbuf, ret - MSG_CONTENT_IDX);
                     if (str_len > 0) {
-                        printf("%s\r\n", pbuf);
+                        // printf("%s\r\n", pbuf);
 
                         if (g_is_pgnss_logon && g_gnssLogFp != NULL) {
                             int fprintf_result = fprintf(g_gnssLogFp, "%s\n", pbuf);
@@ -580,12 +581,13 @@ static void ListenGnssData(tiot_handle handle)
                     {
                         if (decode_nmea(pbuf[index])==1)
                         {
-                        // dump_location_data(&g_global_gpsData);
-                        char *temp_buf = (char *)malloc(512);
-                        if (temp_buf == NULL) {
-                            printf("error: malloc temp_buf failed!\n");
-                            continue;
-                        }
+                        dump_location_data(&g_global_gpsData);
+                        memset_s(temp_buf,sizeof(temp_buf),0,sizeof(temp_buf));
+                        // char *temp_buf = (char *)malloc(512);
+                        // if (temp_buf == NULL) {
+                        //     printf("error: malloc temp_buf failed!\n");
+                        //     continue;
+                        // }
                         dump_location_data_to_buf(&g_global_gpsData, temp_buf, 512);
                         
                         // printf("temp_buf : %s\n",temp_buf);
@@ -604,8 +606,8 @@ static void ListenGnssData(tiot_handle handle)
                             }
                         }
                         
-                        printf("decode_nmea done\r\n");
-                        free(temp_buf);
+                        // printf("decode_nmea done\r\n");
+                        // free(temp_buf);
                         }
                     }
                 }
index d45ad13..ccda54c 100644 (file)
@@ -240,7 +240,7 @@ static unsigned char nmea_term_complete(gps_nmea_t* pnmea, gps_data_t* pdata)
                                                // }\r
                                                // pdata->starcount = pnmea->starcount;\r
                                                add_start_to_gpsbuf(pnmea,pdata);\r
-                                               printf("gsv starcount copy to pdata \r\n");\r
+                                               // printf("gsv starcount copy to pdata \r\n");\r
                                                \r
                                                break;\r
                                        case GPS_SENTENCE_GLL:\r
@@ -252,7 +252,7 @@ static unsigned char nmea_term_complete(gps_nmea_t* pnmea, gps_data_t* pdata)
                                        case GPS_SENTENCE_TH000:\r
                                                pdata->th000_signal_vga = pnmea->th000_signal_vga;\r
                            pdata->last_gps_time_ms = now;\r
-                                               printf("th000 copy to pdata \r\n" );\r
+                                               // printf("th000 copy to pdata \r\n" );\r
                                                break;\r
                                        case GPS_SENTENCE_TH001:\r
                                                pdata->th001_errorcode = pnmea->th001_errorcode;\r
@@ -260,7 +260,7 @@ static unsigned char nmea_term_complete(gps_nmea_t* pnmea, gps_data_t* pdata)
                                                pdata->th001_trace_star_count = pnmea->th001_trace_star_count;\r
                                                pdata->th001_valid_star_count = pnmea->th001_valid_star_count;\r
                            pdata->last_gps_time_ms = now;\r
-                                               printf("th001 copy to pdata \r\n" );\r
+                                               // printf("th001 copy to pdata \r\n" );\r
                                        case GPS_SENTENCE_TH002:\r
                            pdata->last_gps_time_ms = now;\r
                                                break;\r
@@ -498,7 +498,7 @@ static unsigned char nmea_term_complete(gps_nmea_t* pnmea, gps_data_t* pdata)
             break;\r
                case GPS_SENTENCE_TH000 + 1:/*VGA 档位(第 2 字段)描述了当前的信号增益档位,有效范围为2~13,正常信号时,其档位值为 7~9;如果档位值显示为 2,说明可能存在强干扰,导致增益饱和;如果档位值为 13,说明信号特别弱,可能射频链路增益不足*/\r
                        pnmea->th000_signal_vga = (unsigned int)sring_to_int((const char*)pnmea->term, (void*)0);\r
-                       printf("th000 signal_vga %d,%s\n",pnmea->th000_signal_vga,pnmea->term);\r
+                       // printf("th000 signal_vga %d,%s\n",pnmea->th000_signal_vga,pnmea->term);\r
                        pnmea->gps_data_good = 1;\r
             break;\r
                case GPS_SENTENCE_TH001 + 4:\r
@@ -1424,7 +1424,7 @@ void dump_location_data(gps_data_t*locationdata)
        char* msgbuf=(char*)malloc(MSGBUF_LEN);\r
        if (msgbuf == NULL) return ;\r
        dump_location_data_to_buf(locationdata,msgbuf,MSGBUF_LEN);\r
-       printf("%s",msgbuf);\r
+       // printf("%s",msgbuf);\r
        free(msgbuf);\r
 }\r
 \r