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
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
}\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
}\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
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
\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
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
-//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
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
\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
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
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
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 )
{
//一组数据最后一条
{
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");
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);
{
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);
}
}
- printf("decode_nmea done\r\n");
- free(temp_buf);
+ // printf("decode_nmea done\r\n");
+ // free(temp_buf);
}
}
}
// }\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
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
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
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
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