2828#include <stdint.h>
2929#include <stdio.h>
3030
31+ #define HRM_ALGO_TUNING_MODE 0
32+
3133#define STATUS_STRING_LEN 32
3234#define CTR_STRING_LEN 128
3335#define LEAKAGE_STRING_LEN 128
3436
35- #define PPG_GR_CTR_THS (28.0f)
36- #define PPG_IR_CTR_THS (36.0f)
37- #define PPG_RED_CTR_THS (36.0f)
38- #define PPG_GR_LEAK_THS (1.03f)
39- #define PPG_IR_LEAK_THS (0.8f)
40- #define PPG_RED_LEAK_THS (0.8f)
37+ #define PPG_GR_CTR_THS0 (423.0f)
38+ #define PPG_GR_CTR_THS1 (441.0f)
39+ #define PPG_IR_CTR_THS0 (339.0f)
40+ #define PPG_IR_CTR_THS1 (336.0f)
41+ #define PPG_RED_CTR_THS0 (564.0f)
42+ #define PPG_RED_CTR_THS1 (597.0f)
43+ #define PPG_GR_LEAK_THS0 (1.87f)
44+ #define PPG_GR_LEAK_THS1 (2.4f)
45+ #define PPG_IR_LEAK_THS0 (10.2f)
46+ #define PPG_IR_LEAK_THS1 (9.8f)
47+ #define PPG_RED_LEAK_THS0 (7.0f)
48+ #define PPG_RED_LEAK_THS1 (9.6f)
4149
4250typedef struct {
4351 Window window ;
@@ -58,10 +66,21 @@ static void prv_handle_hrm_data(PebbleEvent *e, void *context) {
5866 AppData * app_data = app_state_get_user_data ();
5967
6068 if (e -> type == PEBBLE_HRM_EVENT ) {
69+ #if HRM_ALGO_TUNING_MODE
70+ if (e -> hrm .event_type == HRMEvent_BPM ) {
71+ memset (app_data -> ctr_string , 0 , CTR_STRING_LEN );
72+ snprintf (app_data -> ctr_string , CTR_STRING_LEN , "HR:%d Q:%d" , e -> hrm .bpm .bpm , e -> hrm .bpm .quality );
73+ PBL_LOG (LOG_LEVEL_DEBUG , "%s" , app_data -> ctr_string );
74+ } else if (e -> hrm .event_type == HRMEvent_SpO2 ) {
75+ memset (app_data -> leak_string , 0 , LEAKAGE_STRING_LEN );
76+ snprintf (app_data -> leak_string , CTR_STRING_LEN , "SPO2:%d Q:%d" , e -> hrm .spo2 .percent , e -> hrm .spo2 .quality );
77+ PBL_LOG (LOG_LEVEL_DEBUG , "%s" , app_data -> leak_string );
78+ }
79+ #else
6180 if (e -> hrm .event_type == HRMEvent_CTR ) {
62- bool rst = (e -> hrm .ctr -> ctr [0 ] >= PPG_GR_CTR_THS ) && (e -> hrm .ctr -> ctr [1 ] >= PPG_GR_CTR_THS )
63- && (e -> hrm .ctr -> ctr [2 ] >= PPG_IR_CTR_THS ) && (e -> hrm .ctr -> ctr [3 ] >= PPG_IR_CTR_THS )
64- && (e -> hrm .ctr -> ctr [4 ] >= PPG_RED_CTR_THS ) && (e -> hrm .ctr -> ctr [5 ] >= PPG_RED_CTR_THS );
81+ bool rst = (e -> hrm .ctr -> ctr [0 ] >= PPG_GR_CTR_THS0 ) && (e -> hrm .ctr -> ctr [1 ] >= PPG_GR_CTR_THS1 )
82+ && (e -> hrm .ctr -> ctr [2 ] >= PPG_IR_CTR_THS0 ) && (e -> hrm .ctr -> ctr [3 ] >= PPG_IR_CTR_THS1 )
83+ && (e -> hrm .ctr -> ctr [4 ] >= PPG_RED_CTR_THS0 ) && (e -> hrm .ctr -> ctr [5 ] >= PPG_RED_CTR_THS1 );
6584 memset (app_data -> ctr_string , 0 , CTR_STRING_LEN );
6685 snprintf (app_data -> ctr_string , CTR_STRING_LEN ,
6786 "CTR:(%s)\n%4d.%02d %4d.%02d %4d.%02d\n%4d.%02d %4d.%02d %4d.%02d" ,
@@ -74,9 +93,9 @@ static void prv_handle_hrm_data(PebbleEvent *e, void *context) {
7493 (int )e -> hrm .ctr -> ctr [5 ], (int )(e -> hrm .ctr -> ctr [5 ]* 100 )%100 );
7594 PBL_LOG (LOG_LEVEL_DEBUG , "%s" , app_data -> ctr_string );
7695 } else if (e -> hrm .event_type == HRMEvent_Leakage ) {
77- bool rst = (e -> hrm .leakage -> leakage [0 ] <= PPG_GR_LEAK_THS ) && (e -> hrm .leakage -> leakage [1 ] <= PPG_GR_LEAK_THS )
78- && (e -> hrm .leakage -> leakage [2 ] <= PPG_IR_LEAK_THS ) && (e -> hrm .leakage -> leakage [3 ] <= PPG_IR_LEAK_THS )
79- && (e -> hrm .leakage -> leakage [4 ] <= PPG_RED_LEAK_THS ) && (e -> hrm .leakage -> leakage [5 ] <= PPG_RED_LEAK_THS );
96+ bool rst = (e -> hrm .leakage -> leakage [0 ] <= PPG_GR_LEAK_THS0 ) && (e -> hrm .leakage -> leakage [1 ] <= PPG_GR_LEAK_THS1 )
97+ && (e -> hrm .leakage -> leakage [2 ] <= PPG_IR_LEAK_THS0 ) && (e -> hrm .leakage -> leakage [3 ] <= PPG_IR_LEAK_THS1 )
98+ && (e -> hrm .leakage -> leakage [4 ] <= PPG_RED_LEAK_THS0 ) && (e -> hrm .leakage -> leakage [5 ] <= PPG_RED_LEAK_THS1 );
8099 memset (app_data -> leak_string , 0 , LEAKAGE_STRING_LEN );
81100 snprintf (app_data -> leak_string , LEAKAGE_STRING_LEN ,
82101 "Leak:(%s)\n%4d.%02d %4d.%02d %4d.%02d\n%4d.%02d %4d.%02d %4d.%02d" ,
@@ -89,7 +108,7 @@ static void prv_handle_hrm_data(PebbleEvent *e, void *context) {
89108 (int )e -> hrm .leakage -> leakage [5 ], (int )(e -> hrm .leakage -> leakage [5 ]* 100 )%100 );
90109 PBL_LOG (LOG_LEVEL_DEBUG , "%s" , app_data -> leak_string );
91110 }
92-
111+ #endif
93112 layer_mark_dirty (& app_data -> window .layer );
94113 }
95114}
@@ -99,6 +118,9 @@ static void prv_update_status(void* param) {
99118}
100119
101120static void prv_select_click_handler (ClickRecognizerRef recognizer , void * data ) {
121+ #if HRM_ALGO_TUNING_MODE
122+ return ;
123+ #endif
102124 AppData * app_data = app_state_get_user_data ();
103125 if (app_data -> test_type ) {
104126 gh3x2x_start_ft_ctr ();
@@ -169,8 +191,13 @@ static void prv_handle_init(void) {
169191
170192 // Use app data as session ref
171193 AppInstallId app_id = 1 ;
194+ #if HRM_ALGO_TUNING_MODE
195+ data -> hrm_session = sys_hrm_manager_app_subscribe (app_id , 1 , SECONDS_PER_HOUR ,
196+ HRMFeature_BPM | HRMFeature_SpO2 );
197+ #else
172198 data -> hrm_session = sys_hrm_manager_app_subscribe (app_id , 1 , SECONDS_PER_HOUR ,
173199 HRMFeature_CTR | HRMFeature_Leakage );
200+ #endif
174201
175202 app_window_stack_push (window , true);
176203}
0 commit comments