血压
authorp15692025051 <846603105@qq.com>
Wed, 24 Jan 2024 01:50:16 +0000 (09:50 +0800)
committerp15692025051 <846603105@qq.com>
Wed, 24 Jan 2024 01:50:16 +0000 (09:50 +0800)
2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.c
2.sdk/sdk/gui/lv_drivers/indev/FR8012HAQ/fr8012haq.h

index 8ba6d51..049f7a6 100644 (file)
@@ -56,6 +56,11 @@ int s_FR8012HAQ_blood_data_len = 0;//接收的血压数据长度
 #define s_FR8012HAQ_emo_data_mxa_len 8*1024  //60秒存的字节数大小
 char * s_FR8012HAQ_emo_data = NULL;//情绪数据
 int s_FR8012HAQ_emo_data_len = 0;//情绪的血压数据长度
+
+#define s_FR8012HAQ_yyl_data_mxa_len 20*1024  //最大缓冲区
+char * s_FR8012HAQ_yyl_data = NULL;//中医数据
+int s_FR8012HAQ_yyl_data_len = 0;//中医数据长度
+
 static unsigned char s_FR8012HAQ_blood_oxygen = 0x0;//血氧
 static unsigned char s_FR8012HAQ_HRV = 0x0;//hrv
 unsigned char s_FR8012HAQ_wear_status = 1;//佩戴状态
@@ -64,7 +69,7 @@ static float temp = 0.00;
 unsigned char s_FR8012HAQ_heart_rate_buff[HEART_RATE_BUFF_LEN]={0};
 unsigned short s_FR8012HAQ_heart_rate_buff_count = 0;
 uint32_t FR8012HAQ_run_mode = NULL_MODE;
-uint32_t FR8012HAQ_jobs_mode = NULL_MODE;
+
 int ir_wear = 0;//红外佩戴状态
 int cap_wear = 1;//电容佩戴状态
 char is_open_sar = 1;//是否打开sar检测
@@ -384,17 +389,17 @@ void fr8012haq_timer_cfg(bool en)
         if(fr8012haq_timer == NULL )
             uos_timer_create(&fr8012haq_timer);
             //fr8012haq_timer = Helios_Timer_init( (void* )fr8012haq_timerout_cb, NULL);
-        if(FR8012HAQ_jobs_mode == WEAR_MODE)
+        if(FR8012HAQ_run_mode == WEAR_MODE)
         {
             
             uos_timer_start(fr8012haq_timer, MS_TO_TICKS(3000), MS_TO_TICKS(3000), fr8012haq_timerout_cb, NULL);
-        }else if(FR8012HAQ_jobs_mode == BP_MODE)//血压150MS
+        }else if(FR8012HAQ_run_mode == BP_MODE)//血压150MS
         {
-            
+            FR8012HAQ_LOG("fr8012haq_timer_cfg:BP_MODE!!!!!\n");
             uos_timer_start(fr8012haq_timer, MS_TO_TICKS(150), MS_TO_TICKS(150), fr8012haq_timerout_cb, NULL);
-        }else if(FR8012HAQ_jobs_mode == YYL_MODE)//中医50秒
+        }else if(FR8012HAQ_run_mode == YYL_MODE)//中医30秒
         {
-            uos_timer_start(fr8012haq_timer, MS_TO_TICKS(50000), MS_TO_TICKS(50000), fr8012haq_timerout_cb, NULL);
+            uos_timer_start(fr8012haq_timer, MS_TO_TICKS(10000), MS_TO_TICKS(10000), fr8012haq_timerout_cb, NULL);
         }else//其他1秒
         {
             
@@ -497,11 +502,24 @@ void FR8012HAQ_test(uint32_t mode)
                 break;
             }
         }
-        if(fr8012haq_parse_returned_data(60) == 1)//必须解析到执行成功
+        if(fr8012haq_parse_returned_data(100) == 1)//必须解析到执行成功
+            break;
+        UOS_SleepMs(100);
+    }
+       char send_data[100] = {0};
+    int send_data_len = 0;
+    unsigned int time = 0;
+    Hal_Rtc_Gettime_Count(&time);
+    count = 5;//重试次数
+    UOS_SleepMs(100);
+    while(count--)
+    {
+        send_data_len = snprintf(send_data,sizeof(send_data),"{\"cmd\":\"3\",\"set_time\":\"%d\"}\n",time);//发送时间戳
+        uart4_send_data(send_data,send_data_len);
+        if(fr8012haq_parse_returned_data(100) == 3)//必须解析到执行成功
             break;
         UOS_SleepMs(100);
     }
-       
     fr8012haq_timer_cfg(true);
     
        FR8012HAQ_LOG("FR8012HAQ_test2:%d!!!!\n\n",mode);
@@ -513,18 +531,10 @@ static void fr8012haq_start(void)
     
     hal_fr8012haq_int_init();
     
-    if(FR8012HAQ_jobs_mode != NULL_MODE)//没关闭就打开其他模式,先关闭一次
-    {
-        // FR8012HAQ_close();
-        // fr8012haq_delay(20);
-        // FR8012HAQ_jobs_mode = NULL_MODE;
-    }
-    // else
-    //         FR8012HAQ_restart();
+
     
     FR8012HAQ_test(FR8012HAQ_run_mode);
-    FR8012HAQ_jobs_mode = FR8012HAQ_run_mode;
-    FR8012HAQ_run_mode = NULL_MODE;
+
 
     // hal_gh30x_int_init();
     // fr8012haq_en_gpio_enable(false);
@@ -546,7 +556,6 @@ static void fr8012haq_stop(void)
     FR8012HAQ_close();
     //FR8012HAQ_LOG("FR8012HAQ_irq_cb: 1111111111111!!!!!!!!\r\n");
     //FR8012HAQ_run_mode = NULL_MODE;
-    //FR8012HAQ_jobs_mode = NULL_MODE;
     fr8012haq_ppg_timerout_flag = 0;
     fr8012haq_agc_timerout_flag = 0;
     Timer0_Switch(0);
@@ -554,16 +563,19 @@ static void fr8012haq_stop(void)
 }
 //读取并解析返回数据
 #define DATA_HANDLE (1<<24)
-#define UART4_BUF_LEN 2*1024
-#define YYL_OUT_DATA_SIZE 30
-yylPFE_OutputData yyl_out_data[YYL_OUT_DATA_SIZE]={0};
-int yyl_out_data_len = 0;
+#define UART4_BUF_LEN 4*1024
+
+void my_str_print(char *data,int len)
+{
+    for(int i = 0;i<len;i++)
+        FR8012HAQ_LOG("%c",data[i]);
+}
 int fr8012haq_parse_returned_data(int timeout)
 {
     static char *UART4_buf = NULL;
     char *str_tmp = NULL;
     char num_buf[20] = {0};
-    unsigned char num_buf_len = 0;
+    unsigned int num_buf_len = 0;
     int i = 0,ret = -1;
     unsigned int len;
     if(NULL == UART4_buf)
@@ -722,119 +734,50 @@ int fr8012haq_parse_returned_data(int timeout)
                 memcpy(HA_req_code,str_tmp,num_buf_len);
             }
             /*中医数据*/
-            str_tmp = strstr(UART4_buf,"\"yyl_data\":[");
-            if(str_tmp)
+            str_tmp = strstr(UART4_buf,"\"yyl_data\":\"");
+            if(str_tmp && s_FR8012HAQ_yyl_data_len < s_FR8012HAQ_yyl_data_mxa_len)
             {    
                 //unsigned char hrs = 0;
-                str_tmp += strlen("\"yyl_data\":[");
+                str_tmp += strlen("\"yyl_data\":\"");
                 //time
+                unsigned int yyl_data_len = 0;
+
+                yyl_data_len = find_c(str_tmp,'\"');
+                if(s_FR8012HAQ_yyl_data!= NULL && s_FR8012HAQ_yyl_data_len ==0)//统一线程释放,避免上层应用释放导致dump
+                {
+                    free(s_FR8012HAQ_yyl_data);
+                    s_FR8012HAQ_yyl_data = NULL;
+                }
                 
-                Hal_Rtc_Gettime_Count(&yyl_out_data[yyl_out_data_len].time);
-                //timestamp
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int int_tmp = atoi(num_buf); 
-                yyl_out_data[yyl_out_data_len].timestamp = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[timestamp]:%d\n",yyl_out_data[yyl_out_data_len].timestamp);
-                str_tmp += num_buf_len+1;
-                //areaUP
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf); 
-                yyl_out_data[yyl_out_data_len].areaUP = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[areaUP]:%d\n",yyl_out_data[yyl_out_data_len].areaUP);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
-                //areaUPBase
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf); 
-                yyl_out_data[yyl_out_data_len].areaUPBase = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[areaUPBase]:%d\n",yyl_out_data[yyl_out_data_len].areaUPBase);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
-                //areaUPHeight
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf); 
-                yyl_out_data[yyl_out_data_len].areaUPHeight = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[areaUPHeight]:%d\n",yyl_out_data[yyl_out_data_len].areaUPHeight);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
-                //areaDOWN
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf);
-                yyl_out_data[yyl_out_data_len].areaDOWN = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[areaDOWN]:%d\n",yyl_out_data[yyl_out_data_len].areaDOWN);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
-                //areaDOWNBase
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf);
-                yyl_out_data[yyl_out_data_len].areaDOWNBase = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[areaDOWNBase]:%d\n",yyl_out_data[yyl_out_data_len].areaDOWNBase);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
-                //areaDOWNHeight
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf);
-                yyl_out_data[yyl_out_data_len].areaDOWNHeight = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[areaDOWNHeight]:%d\n",yyl_out_data[yyl_out_data_len].areaDOWNHeight);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
-                //RRI
-                num_buf_len = find_c(str_tmp,',');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf);
-                yyl_out_data[yyl_out_data_len].RRI = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[RRI]:%d\n",yyl_out_data[yyl_out_data_len].RRI);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
-                //motion
-                num_buf_len = find_c(str_tmp,']');
-                if(num_buf_len>=sizeof(num_buf))
-                    num_buf_len = sizeof(num_buf)-1;
-                memset(num_buf,0,sizeof(num_buf));
-                memcpy(num_buf,str_tmp,num_buf_len);
-                int_tmp = atoi(num_buf);
-                yyl_out_data[yyl_out_data_len].motion = int_tmp; 
-                FR8012HAQ_LOG("yyl_out_data[motion]:%d\n",yyl_out_data[yyl_out_data_len].motion);
-                FR8012HAQ_LOG("num_buf[%d]:%s\n",num_buf_len,num_buf);
-                str_tmp += num_buf_len+1;
+                if(s_FR8012HAQ_yyl_data == NULL)//第一次用
+                {
+                    s_FR8012HAQ_yyl_data = malloc(yyl_data_len);
+                    s_FR8012HAQ_yyl_data_len = 0;
+
+                }else
+                {
+                    char *s_FR8012HAQ_yyl_data_tmp = malloc(yyl_data_len+s_FR8012HAQ_yyl_data_len);
+                    memcpy(s_FR8012HAQ_yyl_data_tmp,s_FR8012HAQ_yyl_data,s_FR8012HAQ_yyl_data_len);
+                    free(s_FR8012HAQ_yyl_data);
+                    s_FR8012HAQ_yyl_data = s_FR8012HAQ_yyl_data_tmp;
 
-                if(yyl_out_data_len<YYL_OUT_DATA_SIZE-1)
-                    yyl_out_data_len++;
+                }
+                if(s_FR8012HAQ_yyl_data)//复制数据
+                {
+                    memcpy(&s_FR8012HAQ_yyl_data[s_FR8012HAQ_yyl_data_len],str_tmp,yyl_data_len);
+                    s_FR8012HAQ_yyl_data_len+=yyl_data_len;
+                    
+                }
+                FR8012HAQ_LOG("yyl_data:len:%d\n",s_FR8012HAQ_yyl_data_len);
+                FR8012HAQ_LOG("yyl_data:");
+                my_str_print(s_FR8012HAQ_yyl_data,s_FR8012HAQ_yyl_data_len);//打印
+                FR8012HAQ_LOG("\n\n");
+                FR8012HAQ_LOG("yyl_data:len:%d",s_FR8012HAQ_yyl_data_len);
             }
         }
         if(strstr(UART4_buf,"\"cmd\":\"3\""))
         {  
+            ret = 3;
             if(strstr(UART4_buf,"\"HA_activate\":\"1\""))
             {
                 ret = 3;
@@ -866,8 +809,8 @@ void fr8012haq_process_data(uint32_t *process_data)
 
     Timer0_Switch(1);
     
-    //FR8012HAQ_LOG("fr8012haq_process_data:%d!!!!\n\n",FR8012HAQ_jobs_mode);
-    switch (FR8012HAQ_jobs_mode)
+    //FR8012HAQ_LOG("fr8012haq_process_data:%d!!!!\n\n",FR8012HAQ_run_mode);
+    switch (FR8012HAQ_run_mode)
     {
         case HRS_MODE:
             /* code */
@@ -896,7 +839,7 @@ void fr8012haq_process_data(uint32_t *process_data)
         default:
             break;
     }
-    //FR8012HAQ_LOG("fr8012haq_process_data2:%d!!!!\n",FR8012HAQ_jobs_mode);
+    //FR8012HAQ_LOG("fr8012haq_process_data2:%d!!!!\n",FR8012HAQ_run_mode);
     // float tmp = 0x3FE2E147;
     // FR8012HAQ_LOG("float:%f\n",tmp);
     fr8012haq_parse_returned_data(60);
@@ -975,9 +918,11 @@ void hal_fr8012haq_int_init(void)
 {
     // code implement by user
     // must register func hal_gh30x_int_handler as callback
+    
     Timer0_Switch(1);
     mfp_config(fr8012haq_mfp_cfgs);
     fr8012haq_en_gpio_init();
+    UOS_SleepMs(100);
     FR8012HAQ_LOG("FR8012HAQ ID : 0x%02x\n",get_fr8012haq_id());
 }
 void Fr8012haq_Init(void)
@@ -1006,7 +951,7 @@ void Fr8012haq_Init(void)
     FR8012HAQ_LOG("Fr8012haq_Init4!!!!\n\n");
     FR8012HAQ_restart();
     uart4_debug();
-    UOS_SleepMs(100);
+    UOS_SleepMs(5);
     HA_lib_init();
     // while(1)
     // {
@@ -1075,12 +1020,14 @@ void FR8012HAQ_restart(void)
        fr8012haq_delay(50);
        fr8012haq_en_gpio_enable(true);
        fr8012haq_delay(100);
+    
+    
+    FR8012HAQ_LOG("FR8012HAQ_restart!!!\n");
 }
 void fr8012haq_measure_stop(void)
 {
     FR8012HAQ_LOG("fr8012haq_measure_stop !!!!!!!!\n");
-    FR8012HAQ_run_mode = NULL_MODE;
-    FR8012HAQ_jobs_mode = NULL_MODE;
+    FR8012HAQ_run_mode = close_MODE;
     sensor_task_send_message(FR8012HAQ_ID,SENSOR_MSG_STOP);
 }
 void FR8012HAQ_close(void)
@@ -1088,6 +1035,7 @@ void FR8012HAQ_close(void)
     FR8012HAQ_LOG("FR8012HAQ_close !!!!!!!!\n");
     watch_set_sleep_lcd_only(false);
     is_measuring_flag = false;
+    
     if(s_FR8012HAQ_blood_data!= NULL)
     {
         free(s_FR8012HAQ_blood_data);
@@ -1101,13 +1049,13 @@ void FR8012HAQ_close(void)
     uart4_send_data("{\"cmd\":\"1\",\"work_mode\":\"close\"}",sizeof("{\"cmd\":\"1\",\"work_mode\":\"close\"}"));
     fr8012haq_timer_cfg(false);
     //fr8012haq_hrs_disable
-    // if(FR8012HAQ_jobs_mode == HRS_MODE)
+    // if(FR8012HAQ_run_mode == HRS_MODE)
     // {
     //     //fr8012haq_hrs_disable();
-    // }else if(FR8012HAQ_jobs_mode == SPO2_MODE)
+    // }else if(FR8012HAQ_run_mode == SPO2_MODE)
     // {
     //     //fr8012haq_spo2_disable();
-    // }else if(FR8012HAQ_jobs_mode == HRV_MODE)
+    // }else if(FR8012HAQ_run_mode == HRV_MODE)
     // {
     //     //fr8012haq_hrv_disable();
     // }
@@ -1177,15 +1125,20 @@ char  *fr8012haq_emo_data_get(int *len)
     *len = s_FR8012HAQ_emo_data_len;
     return s_FR8012HAQ_emo_data;
 }
-//获取云医链中医数据,一分钟产生一个,最多存30个。返回当前存多少个,yyl_data:数据复制缓冲区,必须大于30*sizeof(yylPFE_OutputData)
-//yylPFE_OutputData yyl_out_data
-int  fr8012haq_YYL_data_get(yylPFE_OutputData *yyl_data)
+//获取云医链中医数据,一分钟产生30-40组结构体数据,将结构体转str后保存。返回数据字符串,yyl_data_len:字符串长度
+char*  fr8012haq_YYL_data_get(int *yyl_data_len)
 {
-    int len_tmp = yyl_out_data_len;
-    memcpy(yyl_data,yyl_out_data,yyl_out_data_len*sizeof(yylPFE_OutputData));
-    yyl_out_data_len = 0;
-    memset(yyl_out_data,0,YYL_OUT_DATA_SIZE*sizeof(yylPFE_OutputData));
-       return len_tmp;
+    FR8012HAQ_LOG("fr8012haq_YYL_data_get start\n");
+    *yyl_data_len = s_FR8012HAQ_yyl_data_len;
+    
+       return s_FR8012HAQ_yyl_data;
+}
+//清空数据缓冲区,获取数据处理完后要执行清空数据
+void  fr8012haq_YYL_data_clean(void)
+{
+    s_FR8012HAQ_yyl_data_len = 0;
+       
+    FR8012HAQ_LOG("fr8012haq_YYL_data_clean\n");
 }
 void fr8012haq_hr_bp_bo_value_clear(void)
 {
index 23faa05..cc386c9 100644 (file)
@@ -62,4 +62,5 @@ unsigned char FR8012HAQ_result_get_wear_status(void);
 void FR8012HAQ_close(void);
 void fr8012haq_measure_stop(void);
 int  *fr8012haq_blood_data_get(int *len);
+char*  fr8012haq_YYL_data_get(int *yyl_data_len);
 #endif