diff --git a/.DS_Store b/.DS_Store index 379ea5b..5e61392 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/app/src/ble_module.h b/app/src/ble_module.h index 3746f0a..1dd8500 100644 --- a/app/src/ble_module.h +++ b/app/src/ble_module.h @@ -11,3 +11,5 @@ void ble_resp_rate_notify(uint16_t resp_rate); void ble_ecg_notify(int32_t *ecg_data, uint8_t len); void ble_ppg_notify(int16_t ppg_data); void ble_bioz_notify(int32_t *resp_data, uint8_t len); +void healthypi5_service_send_data(const uint8_t *data, uint16_t len); + diff --git a/app/src/cmd_module.c b/app/src/cmd_module.c index f40e9a5..4ad4f48 100644 --- a/app/src/cmd_module.c +++ b/app/src/cmd_module.c @@ -121,7 +121,7 @@ void ces_parse_packet(char rxch) void hpi_decode_data_packet(uint8_t *in_pkt_buf, uint8_t pkt_len) { - int rc; + //int rc; uint8_t cmd_cmd_id = in_pkt_buf[0]; // printk("Recd Command: %X\n", cmd_cmd_id); @@ -353,11 +353,11 @@ void cmd_serial_cb(const struct device *dev, void *user_data) } */ -static void cmd_init(void) +/*static void cmd_init(void) { printk("CMD Module Init\n"); - /*if (!device_is_ready(esp_uart_dev)) + if (!device_is_ready(esp_uart_dev)) { printk("UART device not found!"); return; @@ -382,8 +382,8 @@ static void cmd_init(void) return; } uart_irq_rx_enable(esp_uart_dev); - */ -} + +}*/ /*void cmd_thread(void) { diff --git a/app/src/cmd_module.h b/app/src/cmd_module.h index 11bd4b7..eb48b33 100644 --- a/app/src/cmd_module.h +++ b/app/src/cmd_module.h @@ -24,10 +24,13 @@ void cmdif_send_ble_progress(uint8_t m_stage, uint16_t m_total_time, uint16_t m_curr_time, uint16_t m_current, uint16_t m_imped); void cmdif_send_ble_command(uint8_t m_cmd); void cmdif_send_ble_device_status_response(void); - -//void cmdif_send_ble_data(const char *buf, size_t len); void cmdif_send_ble_file_data(int8_t *m_data, uint8_t m_data_len); -//void cmdif_send_ble_file_data(uint8_t *m_data, uint32_t number_writes,uint8_t m_data_len); +void cmdif_send_memory_status(uint8_t m_cmd); +void cmdif_send_session_count(uint8_t m_cmd,uint8_t indication); +void cmdif_send_ble_session_data(int8_t *m_data, uint8_t m_data_len); +void cmdif_send_ble_data_idx(uint8_t *m_data, uint8_t m_data_len); + + enum cmdsm_state { diff --git a/app/src/data_module.c b/app/src/data_module.c index 42d823b..495d141 100644 --- a/app/src/data_module.c +++ b/app/src/data_module.c @@ -17,7 +17,7 @@ LOG_MODULE_REGISTER(data_module, CONFIG_SENSOR_LOG_LEVEL); #ifdef CONFIG_HEALTHYPI_DISPLAY_ENABLED -#include "display_module.h"` +#include "display_module.h" #endif #include "fs_module.h" @@ -67,8 +67,13 @@ const uint8_t hpi_ov3_packet_footer[2] = {0, CES_CMDIF_PKT_STOP}; uint8_t hpi_ov3_ecg_bioz_data[HPI_OV3_DATA_ECG_BIOZ_LEN]; uint8_t hpi_ov3_ppg_data[HPI_OV3_DATA_PPG_LEN]; +/*extern bool settings_send_usb_enabled; +extern bool settings_send_ble_enabled; +extern bool settings_send_display_enabled;*/ + static bool settings_send_usb_enabled = true; static bool settings_send_ble_enabled = true; +static bool settings_send_display_enabled = true; static bool settings_send_rpi_uart_enabled = false; static bool settings_plot_enabled = true; @@ -76,7 +81,6 @@ extern bool settings_log_data_enabled; // true; extern bool sd_card_present; extern struct fs_mount_t *mp_sd; extern struct hpi_log_session_header_t hpi_log_session_header; -static int settings_data_format = DATA_FMT_HPI5_OV3; // DATA_FMT_PLAIN_TEXT; // struct hpi_sensor_data_t log_buffer[LOG_BUFFER_LENGTH]; struct hpi_sensor_logging_data_t log_buffer[LOG_BUFFER_LENGTH]; @@ -254,7 +258,7 @@ void send_ecg_bioz_data_ov3_format(int32_t *ecg_data, int32_t ecg_sample_count, } }*/ -void send_data_text(int32_t ecg_sample, int32_t bioz_samples, int32_t raw_red) +/*void send_data_text(int32_t ecg_sample, int32_t bioz_samples, int32_t raw_red) { char data[100]; float f_ecg_sample = (float)ecg_sample / 1000; @@ -281,7 +285,7 @@ void send_data_text_1(int32_t in_sample) sprintf(data, "%.3f\r\n", (double)f_in_sample); send_usb_cdc(data, strlen(data)); -} +}*/ // Start a new session log void flush_current_session_logs() @@ -424,30 +428,20 @@ void data_thread(void) { printk("Data Thread starting\n"); - struct hpi_sensor_data_t sensor_sample; - struct hpi_computed_data_t computed_data; - struct hpi_ecg_bioz_sensor_data_t ecg_bioz_sensor_sample; struct hpi_ppg_sensor_data_t ppg_sensor_sample; // record_init_session_log(); - int m_temp_sample_counter = 0; - uint32_t irBuffer[500]; // infrared LED sensor data uint32_t redBuffer[500]; // red LED sensor data - float ecg_filt_in[8]; - float ecg_filt_out[8]; - int32_t bufferLength; // data length int32_t m_spo2; // SPO2 value int8_t validSPO2; // indicator to show if the SPO2 calculation is valid int32_t m_hr; // heart rate value int8_t validHeartRate; // indicator to show if the heart rate calculation is valid - uint32_t ppg_buffer_count = 0; - uint32_t spo2_time_count = 0; /* Initialize the FIR filter */ @@ -475,20 +469,6 @@ void data_thread(void) // Get Sample from ECG / BioZ sampling queue if (k_msgq_get(&q_ecg_bioz_sample, &ecg_bioz_sensor_sample, K_NO_WAIT) == 0) { - // printk("S: %d", ecg_bioz_sensor_sample.ecg_num_samples); - - /*for (int i = 0; i < ecg_bioz_sensor_sample.ecg_num_samples; i++) - { - ecg_filt_in[i] = (float)(ecg_bioz_sensor_sample.bioz_samples[i]/1000.0000 ); - } - - arm_fir_f32(&sFIR, ecg_filt_in, ecg_filt_out, BLOCK_SIZE); - - for (int i = 0; i < ecg_bioz_sensor_sample.ecg_num_samples; i++) - { - ecg_bioz_sensor_sample.bioz_samples[i] = (int32_t)(ecg_filt_out[i] * 1000.0000); - }*/ - int16_t resp_i16_buf[4]; int16_t resp_i16_filt_out[4]; @@ -523,7 +503,7 @@ void data_thread(void) // #endif #ifdef CONFIG_HEALTHYPI_DISPLAY_ENABLED - if (settings_plot_enabled) + if (settings_plot_enabled && settings_send_display_enabled) { k_msgq_put(&q_plot_ecg_bioz, &ecg_bioz_sensor_sample, K_NO_WAIT); } @@ -547,7 +527,7 @@ void data_thread(void) // #endif #ifdef CONFIG_HEALTHYPI_DISPLAY_ENABLED - if (settings_plot_enabled) + if (settings_plot_enabled && settings_send_display_enabled) { k_msgq_put(&q_plot_ppg, &ppg_sensor_sample, K_NO_WAIT); } @@ -575,21 +555,27 @@ void data_thread(void) if (validSPO2) { #ifdef CONFIG_HEALTHYPI_DISPLAY_ENABLED - hpi_scr_home_update_spo2(m_spo2); + if (settings_send_display_enabled) + { + hpi_scr_home_update_spo2(m_spo2); + } #endif - // #ifdef CONFIG_BT - ble_spo2_notify(m_spo2); + if (settings_send_ble_enabled) + { + ble_spo2_notify(m_spo2); + } + if (settings_send_usb_enabled) { spo2_serial = m_spo2; } - // #endif } if (validHeartRate) { #ifdef CONFIG_HEALTHYPI_DISPLAY_ENABLED - hpi_scr_home_update_pr(m_hr); + if (settings_send_display_enabled) + hpi_scr_home_update_pr(m_hr); #endif } diff --git a/app/src/data_module.h b/app/src/data_module.h index f971626..74a6261 100644 --- a/app/src/data_module.h +++ b/app/src/data_module.h @@ -15,4 +15,6 @@ struct hpi_computed_data_t { int32_t spo2; uint8_t hr_valid; uint8_t spo2_valid; -}; \ No newline at end of file +}; + +void flush_current_session_logs(void); \ No newline at end of file diff --git a/app/src/datalog_module.c b/app/src/datalog_module.c index 830e9c0..2151804 100644 --- a/app/src/datalog_module.c +++ b/app/src/datalog_module.c @@ -222,7 +222,7 @@ void hpi_get_session_count(void) if (res) { printk("Error opening dir %s [%d]\n", path, res); - return res; + //return res; } for (;;) @@ -277,7 +277,7 @@ void hpi_get_session_index(void) if (res) { printk("Error opening dir %s [%d]\n", path, res); - return res; + //return res; } for (;;) @@ -298,8 +298,7 @@ void hpi_get_session_index(void) if (entry.type != FS_DIR_ENTRY_DIR) { - char session_header[80]; - + //char session_header[80]; hpi_log_session_header.session_id =(uint16_t)atoi(entry.name); hpi_log_session_header.session_size = (uint32_t)entry.size; @@ -379,10 +378,10 @@ uint32_t hpi_log_session_get_length(char *m_file_name) void hpi_session_fetch(uint16_t session_id,uint8_t file_no) { int8_t m_buffer[FILE_TRANSFER_BLE_PACKET_SIZE]; - char m_session_id[20]; + //char m_session_id[20]; char m_session_name[30]; char m_session_path[50] = "/SD:/"; - char m_session_file_type[4]; + char m_session_file_type[5]; if (file_no == 1) strcpy(m_session_file_type, "ECG"); @@ -502,7 +501,6 @@ void hpi_datalog_delete_all(void) void hpi_datalog_delete_session(uint16_t session_id,uint8_t file_no) { - int res; struct fs_dir_t dir; fs_dir_t_init(&dir); @@ -519,29 +517,6 @@ void hpi_datalog_delete_session(uint16_t session_id,uint8_t file_no) snprintf(session_name, sizeof(session_name), "/SD:/%d_%s.CSV", session_id,m_session_file_type); fs_unlink(session_name); - /*res = fs_opendir(&dir, "/SD:/"); - if (res) - { - printk("Unable to open (err %d)", res); - } - - while (1) - { - struct fs_dirent entry; - - res = fs_readdir(&dir, &entry); - if (res) - { - printk("Unable to read directory"); - break; - } - - if (strcmp(session_name, entry.name) == 0) - { - fs_unlink(entry.name); - } - } - fs_closedir(&dir);*/ printk("%s\n",session_name); } diff --git a/app/src/datalog_module.h b/app/src/datalog_module.h index a99d2aa..a656e37 100644 --- a/app/src/datalog_module.h +++ b/app/src/datalog_module.h @@ -18,7 +18,13 @@ struct hpi_log_session_header_t struct healthypi_time_t session_start_time; }; -void hpi_datalog_start_session(in_pkt_buf); +void hpi_datalog_start_session(uint8_t *in_pkt_buf); void hpi_session_fetch(uint16_t session_id,uint8_t file_no); void hpi_get_session_count(void); void hpi_log_session_write_file(); +void hpi_datalog_delete_session(uint16_t session_id,uint8_t file_no); +void hpi_datalog_delete_all(void); +void hpi_get_session_index(void); + + + diff --git a/app/src/display/display_module.c b/app/src/display/display_module.c index 8f83007..15ef072 100644 --- a/app/src/display/display_module.c +++ b/app/src/display/display_module.c @@ -51,7 +51,7 @@ lv_style_t style_icon; static lv_obj_t *label_batt_level; static lv_obj_t *label_batt_level_val; -static lv_obj_t *label_sym_ble; +//static lv_obj_t *label_sym_ble; extern struct k_sem sem_hw_inited; K_SEM_DEFINE(sem_disp_inited, 0, 1); @@ -238,7 +238,8 @@ void hpi_disp_change_event(enum hpi_scr_event evt) if ((curr_screen + 1) == SCR_LIST_END) { printk("End of list\n"); - return; + //return; + hpi_load_screen(SCR_LIST_START+1, SCROLL_LEFT); } else { @@ -253,7 +254,8 @@ void hpi_disp_change_event(enum hpi_scr_event evt) if ((curr_screen - 1) == SCR_LIST_START) { printk("Start of list\n"); - return; + hpi_load_screen(SCR_LIST_END-1, SCROLL_RIGHT); + //return; } else { @@ -403,8 +405,7 @@ void hpi_load_screen(enum hpi_disp_screens m_screen, enum scroll_dir m_scroll_di void disp_screen_event(lv_event_t *e) { lv_event_code_t event_code = lv_event_get_code(e); - lv_obj_t *target = lv_event_get_target(e); - + if (event_code == LV_EVENT_GESTURE && lv_indev_get_gesture_dir(lv_indev_get_act()) == LV_DIR_LEFT) { lv_indev_wait_release(lv_indev_get_act()); @@ -413,7 +414,8 @@ void disp_screen_event(lv_event_t *e) if ((curr_screen + 1) == SCR_LIST_END) { printk("End of list\n"); - return; + hpi_load_screen(SCR_LIST_START+1, SCROLL_LEFT); + //return; } else { @@ -429,7 +431,8 @@ void disp_screen_event(lv_event_t *e) if ((curr_screen - 1) == SCR_LIST_START) { printk("Start of list\n"); - return; + hpi_load_screen(SCR_LIST_END, SCROLL_RIGHT); + //return; } else { @@ -445,9 +448,10 @@ void hpi_show_screen(lv_obj_t *parent, enum scroll_dir m_scroll_dir) lv_obj_add_event_cb(parent, disp_screen_event, LV_EVENT_GESTURE, NULL); if (m_scroll_dir == SCROLL_LEFT) - lv_scr_load_anim(parent, LV_SCR_LOAD_ANIM_MOVE_LEFT, SCREEN_TRANS_TIME, 0, true); + lv_scr_load_anim(parent, LV_SCR_LOAD_ANIM_NONE, 0, 0, true); else - lv_scr_load_anim(parent, LV_SCR_LOAD_ANIM_MOVE_RIGHT, SCREEN_TRANS_TIME, 0, true); + lv_scr_load_anim(parent, LV_SCR_LOAD_ANIM_NONE, 0, 0, true); + // lv_scr_load_anim(parent, LV_SCR_LOAD_ANIM_MOVE_RIGHT, SCREEN_TRANS_TIME, 0, true); } void draw_header(lv_obj_t *parent, bool showFWVersion) @@ -529,7 +533,6 @@ void hpi_disp_update_batt_level(int batt_level) void display_screens_thread(void) { - struct hpi_computed_data_t computed_data; struct hpi_ecg_bioz_sensor_data_t ecg_bioz_sensor_sample; struct hpi_ppg_sensor_data_t ppg_sensor_sample; @@ -555,9 +558,9 @@ void display_screens_thread(void) printk("Display screens inited"); - //draw_scr_ecg(SCROLL_DOWN); - // draw_scr_resp(SCROLL_DOWN); - //draw_scr_ppg(SCROLL_DOWN); + // draw_scr_ecg(SCROLL_DOWN); + // draw_scr_resp(SCROLL_DOWN); + // draw_scr_ppg(SCROLL_DOWN); // draw_scr_welcome(); hpi_load_screen(SCR_ECG, SCROLL_DOWN); @@ -599,8 +602,18 @@ void display_screens_thread(void) sample_count++; } + if (k_sem_take(&sem_down_key_pressed, K_NO_WAIT) == 0) + { + hpi_disp_change_event(HPI_SCR_EVENT_DOWN); + } + + if (k_sem_take(&sem_up_key_pressed, K_NO_WAIT) == 0) + { + hpi_disp_change_event(HPI_SCR_EVENT_UP); + } + lv_task_handler(); - k_sleep(K_MSEC(2)); + k_sleep(K_MSEC(1)); } } diff --git a/app/src/display/display_module.h b/app/src/display/display_module.h index 03b8b9f..6590ac6 100644 --- a/app/src/display/display_module.h +++ b/app/src/display/display_module.h @@ -54,6 +54,8 @@ void hpi_disp_change_event(enum hpi_scr_event); void draw_scr_chart_single(uint8_t m_data_type); void draw_chart_single_scr(uint8_t m_data_type, lv_obj_t *scr_obj); +void draw_scr_home_footer(lv_obj_t *parent); +void hpi_scr_home_update_spo2(int spo2); // ECG Screen functions void draw_scr_ecg(enum scroll_dir m_scroll_dir); diff --git a/app/src/fs_module.c b/app/src/fs_module.c index 114c26c..eb912e8 100644 --- a/app/src/fs_module.c +++ b/app/src/fs_module.c @@ -60,7 +60,7 @@ struct fs_mount_t *mp_sd = &sd_fs_mnt; return rc; }*/ -static int littlefs_mount(struct fs_mount_t *mp) +/*static int littlefs_mount(struct fs_mount_t *mp) { int rc; @@ -70,7 +70,7 @@ static int littlefs_mount(struct fs_mount_t *mp) return rc; } - /* Do not mount if auto-mount has been enabled */ + // Do not mount if auto-mount has been enabled #if !DT_NODE_EXISTS(PARTITION_NODE) || \ !(FSTAB_ENTRY_DT_MOUNT_FLAGS(PARTITION_NODE) & FS_MOUNT_FLAG_AUTOMOUNT) rc = fs_mount(mp); @@ -86,7 +86,7 @@ static int littlefs_mount(struct fs_mount_t *mp) #endif return 0; -} +}*/ static int lsdir(const char *path) { @@ -146,7 +146,6 @@ static int mount_sd_fs() { int rc; struct fs_statvfs sbuf; - struct fs_dir_t dir; rc = fs_mount(&sd_fs_mnt); k_sleep(K_MSEC(50)); @@ -188,50 +187,16 @@ static int mount_sd_fs() { printk("unable to access SD card\n"); } - - - + return 0; } #endif void fs_module_init(void) { - /*int rc; - struct fs_statvfs sbuf; - - printk("Initing FS...\n"); - - rc = littlefs_mount(mp); - if (rc < 0) - { - return; - } - - rc = fs_statvfs(mp->mnt_point, &sbuf); - if (rc < 0) - { - // printk("FAIL: statvfs: %d\n", rc); - // goto out; - } - - printk("%s: bsize = %lu ; frsize = %lu ;" - " blocks = %lu ; bfree = %lu\n", - mp->mnt_point, - sbuf.f_bsize, sbuf.f_frsize, - sbuf.f_blocks, sbuf.f_bfree); - - //fs_mkdir("/lfs/log"); - rc = lsdir("/lfs/log"); - if (rc < 0) - { - LOG_PRINTK("FAIL: lsdir %s: %d\n", mp->mnt_point, rc); - // goto out; - }*/ - -#ifdef CONFIG_HEALTHYPI_SD_CARD_ENABLED - mount_sd_fs(); -#endif + #ifdef CONFIG_HEALTHYPI_SD_CARD_ENABLED + mount_sd_fs(); + #endif } diff --git a/app/src/fs_module.h b/app/src/fs_module.h index 4524b5f..2658419 100644 --- a/app/src/fs_module.h +++ b/app/src/fs_module.h @@ -5,9 +5,7 @@ void fs_module_init(void); void init_settings(void); -//void record_write_to_file(int ecg_ppg_counter, struct hpi_sensor_logging_data_t *current_session_log_points); -static int lsdir(const char *path); -//static int littlefs_flash_erase(unsigned int id); +//static int lsdir(const char *path); void set_current_session_log_id(uint8_t m_sec, uint8_t m_min, uint8_t m_hour, uint8_t m_day, uint8_t m_month, uint8_t m_year); void write_header_to_new_file(); diff --git a/app/src/hw_module.c b/app/src/hw_module.c index df2bafd..165230f 100644 --- a/app/src/hw_module.c +++ b/app/src/hw_module.c @@ -78,6 +78,10 @@ static const struct pwm_dt_spec bl_led_pwm = PWM_DT_SPEC_GET(DT_ALIAS(bl_led_pwm uint8_t global_batt_level = 0; static int32_t global_temp_val = 0; +/*bool settings_send_usb_enabled = true; +bool settings_send_ble_enabled = true; +bool settings_send_display_enabled = false;*/ + static void leds_init() { int ret; @@ -231,7 +235,6 @@ int16_t hpi_get_global_temp(void) int16_t hpi_hw_read_temp(void) { - int ret = 0; int32_t i32_temp_val = 0; int16_t temp_val = 0; @@ -278,8 +281,10 @@ uint8_t hpi_hw_read_batt(void) static void gpio_keys_cb_handler(struct input_event *evt) { - printk("GPIO_KEY %s pressed, zephyr_code=%u, value=%d\n", - evt->dev->name, evt->code, evt->value); + printk("GPIO_KEY %s pressed, zephyr_code=%u, value=%d\n",evt->dev->name, evt->code, evt->value); + /*settings_send_usb_enabled = false; + settings_send_ble_enabled = false; + settings_send_display_enabled = true;*/ #ifdef CONFIG_HEALTHYPI_DISPLAY_ENABLED if (evt->value == 1) @@ -288,15 +293,18 @@ static void gpio_keys_cb_handler(struct input_event *evt) { case INPUT_KEY_ENTER: LOG_INF("OK Key Pressed"); - hpi_disp_change_event(HPI_SCR_EVENT_OK); + //hpi_disp_change_event(HPI_SCR_EVENT_OK); + k_sem_give(&sem_ok_key_pressed); break; case INPUT_KEY_UP: LOG_INF("UP Key Pressed"); - hpi_disp_change_event(HPI_SCR_EVENT_UP); + //hpi_disp_change_event(HPI_SCR_EVENT_UP); + k_sem_give(&sem_up_key_pressed); break; case INPUT_KEY_DOWN: LOG_INF("DOWN Key Pressed"); - hpi_disp_change_event(HPI_SCR_EVENT_DOWN); + //hpi_disp_change_event(HPI_SCR_EVENT_DOWN); + k_sem_give(&sem_down_key_pressed); break; default: break; @@ -380,13 +388,19 @@ void hw_thread(void) global_temp_val = hpi_hw_read_temp(); #ifdef CONFIG_DISPLAY + //if (settings_send_display_enabled) + //{ hpi_disp_update_batt_level(global_batt_level); hpi_disp_update_temp(global_temp_val); + //} #endif #ifdef CONFIG_BT + //if (settings_send_ble_enabled) + //{ ble_bas_notify(global_batt_level); ble_temp_notify(global_temp_val); + //} #endif k_sleep(K_MSEC(1000)); diff --git a/app/src/resp_process.c b/app/src/resp_process.c index d5287b3..94299df 100644 --- a/app/src/resp_process.c +++ b/app/src/resp_process.c @@ -18,6 +18,7 @@ uint8_t Respiration_Rate = 0; int16_t RESP_WorkingBuff[2 * FILTERORDER]; int16_t Pvev_DC_Sample = 0, Pvev_Sample = 0; +int16_t Prev_DC_Sample = 0, Prev_Sample = 0; int16_t RespCoeffBuf[FILTERORDER] = {120, 124, 126, 127, 127, 125, 122, 118, 113, /* Coeff for lowpass Fc=2Hz @ 125 SPS*/ 106, 97, 88, 77, 65, 52, 38, 24, 8, @@ -62,16 +63,16 @@ void resp_filt(int16_t *RESP_WorkingBuff, int16_t *CoeffBuf, int16_t *FilterOut) *FilterOut = (int16_t)(acc >> 15); } -void resp_remove_dc_component(int32_t CurrAqsSample, int32_t respFiltered) +int16_t resp_remove_dc_component(int16_t current_sample) { - int32_t temp1; //, RESPData; - int32_t RESPData; - - temp1 = NRCOEFF * Pvev_DC_Sample; - Pvev_DC_Sample = (CurrAqsSample - Pvev_Sample) + temp1; - Pvev_Sample = CurrAqsSample; - RESPData = (int32_t)Pvev_DC_Sample; - respFiltered = RESPData; + int16_t temp1; //, RESPData; + int16_t RESPData; + + temp1 = NRCOEFF * Prev_DC_Sample; + Prev_DC_Sample = (current_sample - Prev_Sample) + temp1; + Prev_Sample = current_sample; + RESPData = (int16_t)Prev_DC_Sample; + return RESPData; } void resp_process_sample(int16_t *CurrAqsSample, int16_t *respFiltered) diff --git a/app/src/resp_process.h b/app/src/resp_process.h index 0d2b298..0723901 100644 --- a/app/src/resp_process.h +++ b/app/src/resp_process.h @@ -4,4 +4,6 @@ void resp_filt(int16_t * RESP_WorkingBuff, int16_t * CoeffBuf, int16_t* FilterOu void resp_process_sample(int16_t *CurrAqsSample, int16_t *respFiltered); void resp_algo_process(int16_t *CurrSample,volatile uint8_t *RespirationRate); void resp_rate_detect(int16_t Resp_wave,volatile uint8_t *RespirationRate); -void resp_remove_dc_component(int32_t CurrAqsSample, int32_t respFiltered); +//void resp_remove_dc_component(int16_t *CurrAqsSample, int16_t *respFiltered); +int16_t resp_remove_dc_component(int16_t current_sample); + diff --git a/app/src/sampling_module.c b/app/src/sampling_module.c index d563b9f..3b952c5 100644 --- a/app/src/sampling_module.c +++ b/app/src/sampling_module.c @@ -19,10 +19,10 @@ extern const struct device *const max30205_dev; #define TEMP_SAMPLING_INTERVAL_COUNT 125 // Number of counts of SAMPLING_INTERVAL_MS to wait before sampling temperature #define PPG_SAMPLING_INTERVAL_MS 8 -#define ECG_SAMPLING_INTERVAL_MS 60 +#define ECG_SAMPLING_INTERVAL_MS 50 -K_MSGQ_DEFINE(q_ecg_bioz_sample, sizeof(struct hpi_ecg_bioz_sensor_data_t), 64, 1); -K_MSGQ_DEFINE(q_ppg_sample, sizeof(struct hpi_ppg_sensor_data_t), 64, 1); +K_MSGQ_DEFINE(q_ecg_bioz_sample, sizeof(struct hpi_ecg_bioz_sensor_data_t), 128, 4); +K_MSGQ_DEFINE(q_ppg_sample, sizeof(struct hpi_ppg_sensor_data_t), 128, 4); SENSOR_DT_READ_IODEV(max30001_iodev, DT_ALIAS(max30001), SENSOR_CHAN_VOLTAGE); SENSOR_DT_READ_IODEV(afe4400_iodev, DT_ALIAS(afe4400), SENSOR_CHAN_RED); @@ -120,26 +120,42 @@ static void sensor_ecg_bioz_processing_cb(int result, uint8_t *buf, const struct max30001_encoded_data *edata = (const struct max30001_encoded_data *)buf; struct hpi_ecg_bioz_sensor_data_t ecg_bioz_sensor_sample; - // printk("ECG NS: %d | B: %d ", edata->num_samples_ecg, edata->num_samples_bioz); + printk("ECG NS: %d | B: %d ", edata->num_samples_ecg, edata->num_samples_bioz); + uint8_t n_samples_ecg = edata->num_samples_ecg; + uint8_t n_samples_bioz = edata->num_samples_bioz; - if ((edata->num_samples_ecg > 0) || (edata->num_samples_bioz > 0)) + if (n_samples_ecg > 8) { - ecg_bioz_sensor_sample.ecg_num_samples = edata->num_samples_ecg; - ecg_bioz_sensor_sample.bioz_num_samples = edata->num_samples_bioz; + n_samples_ecg = 8; + } + + if (n_samples_bioz > 4) + { + n_samples_bioz = 4; + } - for (int i = 0; i < edata->num_samples_ecg; i++) + if ((n_samples_ecg > 0) || (n_samples_bioz > 0)) + { + ecg_bioz_sensor_sample.ecg_num_samples = n_samples_ecg; + ecg_bioz_sensor_sample.bioz_num_samples = n_samples_bioz; + + for (int i = 0; i < n_samples_ecg; i++) { ecg_bioz_sensor_sample.ecg_samples[i] = edata->ecg_samples[i]; } - for (int i = 0; i < edata->num_samples_bioz; i++) + for (int i = 0; i < n_samples_bioz; i++) { ecg_bioz_sensor_sample.bioz_samples[i] = edata->bioz_samples[i]; } ecg_bioz_sensor_sample.hr = edata->hr; - k_msgq_put(&q_ecg_bioz_sample, &ecg_bioz_sensor_sample, K_MSEC(1)); + while(k_msgq_put(&q_ecg_bioz_sample, &ecg_bioz_sensor_sample, K_NO_WAIT)!=0) + { + printk("Q Err \n"); + k_msgq_purge(&q_ecg_bioz_sample); + } } } @@ -166,10 +182,11 @@ void ecg_bioz_sample_trigger_thread(void) sensor_processing_with_callback(&max30001_read_rtio_ctx, sensor_ecg_bioz_processing_cb); k_sleep(K_MSEC(ECG_SAMPLING_INTERVAL_MS)); + // k_msleep(4); } } -#define ECG_SAMPLING_THREAD_PRIORITY 3 +#define ECG_SAMPLING_THREAD_PRIORITY 4 -K_THREAD_DEFINE(ecg_bioz_sample_trigger_thread_id, 2048, ecg_bioz_sample_trigger_thread, NULL, NULL, NULL, ECG_SAMPLING_THREAD_PRIORITY, 0, 1000); +K_THREAD_DEFINE(ecg_bioz_sample_trigger_thread_id, 4096, ecg_bioz_sample_trigger_thread, NULL, NULL, NULL, ECG_SAMPLING_THREAD_PRIORITY, 0, 1000); K_THREAD_DEFINE(ppg_sample_trigger_thread_id, 2048, ppg_sample_trigger_thread, NULL, NULL, NULL, ECG_SAMPLING_THREAD_PRIORITY, 0, 1000); diff --git a/app/src/sampling_module.h b/app/src/sampling_module.h index cf65fda..a31463a 100644 --- a/app/src/sampling_module.h +++ b/app/src/sampling_module.h @@ -1,15 +1,5 @@ #pragma once -struct hpi_sensor_data_t { - int32_t ecg_sample; - int32_t bioz_samples; - int32_t raw_red; - int32_t raw_ir; - int32_t temp; - bool _bioZSkipSample; - uint16_t rtor; - uint16_t hr; -}; #define ECG_POINTS_PER_SAMPLE 8 #define BIOZ_POINTS_PER_SAMPLE 4 @@ -24,7 +14,6 @@ struct hpi_ecg_bioz_sensor_data_t uint16_t hr; uint8_t ecg_lead_off; uint8_t bioz_lead_off; - bool _bioZSkipSample; }; struct hpi_ppg_sensor_data_t diff --git a/app/src/spo2_process.c b/app/src/spo2_process.c index cd0ac8b..ef88c68 100644 --- a/app/src/spo2_process.c +++ b/app/src/spo2_process.c @@ -5,6 +5,10 @@ #include #include "spo2_process.h" + +static int32_t an_x[ BUFFER_SIZE]; //ir +static int32_t an_y[ BUFFER_SIZE]; //red + // uch_spo2_table is approximated as -45.060*ratioAverage* ratioAverage + 30.354 *ratioAverage + 94.845 ; const uint8_t uch_spo2_table[184] = {95, 95, 95, 96, 96, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, diff --git a/app/src/spo2_process.h b/app/src/spo2_process.h index 6824aa0..9c2e5b8 100644 --- a/app/src/spo2_process.h +++ b/app/src/spo2_process.h @@ -37,9 +37,6 @@ #define BUFFER_SIZE (FreqS * 4) #define MA4_SIZE 4 // DONOT CHANGE -static int32_t an_x[ BUFFER_SIZE]; //ir -static int32_t an_y[ BUFFER_SIZE]; //red - void maxim_heart_rate_and_oxygen_saturation(uint32_t *pun_ir_buffer, int32_t n_ir_buffer_length, uint32_t *pun_red_buffer, int32_t *pn_spo2, int8_t *pch_spo2_valid, int32_t *pn_heart_rate, int8_t *pch_hr_valid); void maxim_find_peaks(int32_t *pn_locs, int32_t *n_npks, int32_t *pn_x, int32_t n_size, int32_t n_min_height, int32_t n_min_distance, int32_t n_max_num); void maxim_peaks_above_min_height(int32_t *pn_locs, int32_t *n_npks, int32_t *pn_x, int32_t n_size, int32_t n_min_height); diff --git a/app/src/ui/screens/scr_ecg.c b/app/src/ui/screens/scr_ecg.c index 9c06680..4eebf0f 100644 --- a/app/src/ui/screens/scr_ecg.c +++ b/app/src/ui/screens/scr_ecg.c @@ -31,6 +31,7 @@ extern lv_style_t style_temp; extern lv_style_t style_sub; extern uint8_t curr_screen; +int counter_ecg = 0; #define DISP_WINDOW_SIZE_ECG 390 @@ -66,7 +67,7 @@ void draw_scr_ecg(enum scroll_dir m_scroll_dir) static void hpi_ecg_disp_add_samples(int num_samples) { - gx += num_samples; + gx += num_samples; } static void hpi_ecg_disp_do_set_scale(int disp_window_size) @@ -91,7 +92,7 @@ void hpi_ecg_disp_draw_plot_ecg(int32_t *data_ecg, int num_samples, bool ecg_lea { for (int i = 0; i < num_samples; i++) { - int32_t data_ecg_i = ((data_ecg[i]*1000)/5242880)*10;// in mV// (data_ecg[i]); + int32_t data_ecg_i = data_ecg[i];// in mV// (data_ecg[i]); if (data_ecg_i < y_min_ecg) { diff --git a/app/src/ui/screens/scr_ppg.c b/app/src/ui/screens/scr_ppg.c index 888b754..b53b3d9 100644 --- a/app/src/ui/screens/scr_ppg.c +++ b/app/src/ui/screens/scr_ppg.c @@ -90,15 +90,15 @@ void hpi_ppg_disp_draw_plot_ppg(int32_t data_ppg_red, int32_t data_ppg_ir, bool if (data_ppg_red < y_min_ppg) { - y_min_ppg = data_ppg_red; + y_min_ppg = (int16_t)data_ppg_red; } if (data_ppg_red > y_max_ppg) { - y_max_ppg = data_ppg_red; + y_max_ppg = (int16_t)data_ppg_red; } - lv_chart_set_next_value(chart_ppg, ser_ppg, data_ppg_red); + lv_chart_set_next_value(chart_ppg, ser_ppg, (int16_t)data_ppg_red); hpi_ppg_disp_add_samples(1); hpi_ppg_disp_do_set_scale(PPG_DISP_WINDOW_SIZE); diff --git a/app/src/ui/screens/scr_resp.c b/app/src/ui/screens/scr_resp.c index 51361cd..7688254 100644 --- a/app/src/ui/screens/scr_resp.c +++ b/app/src/ui/screens/scr_resp.c @@ -21,7 +21,7 @@ static bool chart_resp_update = true; // Chart Variables static float y_max_resp = 0; -static float y_min_resp = 10000; +static float y_min_resp = 500; static float gx = 0; // GUI Styles @@ -79,8 +79,8 @@ static void hpi_resp_disp_do_set_scale(int disp_window_size) gx = 0; - y_max_resp = -900000; - y_min_resp = 900000; + y_max_resp = -200; + y_min_resp = 100; } } @@ -91,9 +91,9 @@ void hpi_resp_disp_draw_plot_resp(int32_t *data_resp, int num_samples, bool resp for (int i = 0; i < num_samples; i++) { - int32_t resp_i16_filt_out; - resp_remove_dc_component(data_resp[i], resp_i16_filt_out); - int32_t data_resp_i = resp_i16_filt_out; // / 10066); // in mV// (data_resp[i]); + int16_t resp_filt_out; + resp_filt_out = resp_remove_dc_component(data_resp[i]); + int32_t data_resp_i = (int32_t) resp_filt_out; // / 10066); // in mV// (data_resp[i]); /* 2^19 524288 BIOZ GAIN 40 V/V CG_MAG 48 uA diff --git a/drivers/sensor/afe4400/afe4400_decoder.c b/drivers/sensor/afe4400/afe4400_decoder.c index 79a44be..f7c16bb 100644 --- a/drivers/sensor/afe4400/afe4400_decoder.c +++ b/drivers/sensor/afe4400/afe4400_decoder.c @@ -45,21 +45,9 @@ static int afe4400_decoder_decode(const uint8_t *buffer, enum sensor_channel cha size_t channel_idx, uint32_t *fit, uint16_t max_count, void *data_out) { - const struct afe4400_encoded_data *edata = (const struct max32664_encoded_data *)buffer; - const struct afe4400_decoder_header *header = &edata->header; - - if (*fit != 0) - { - return 0; - } - - printk("D "); - //printk("Num samples: %u\n", edata->samples[0].ir_sample); - - /*switch (channel) - { + //const struct afe4400_encoded_data *edata = (const struct afe4400_encoded_data *)buffer; - }*/ + return 0; } SENSOR_DECODER_API_DT_DEFINE() = { diff --git a/drivers/sensor/max30001/max30001.c b/drivers/sensor/max30001/max30001.c index c48f962..a1c0d91 100644 --- a/drivers/sensor/max30001/max30001.c +++ b/drivers/sensor/max30001/max30001.c @@ -246,10 +246,10 @@ static void max30001_enable_rtor(const struct device *dev) k_sleep(K_MSEC(100)); } -static void max30001_enable_dcloff(const struct device *dev) +/*static void max30001_enable_dcloff(const struct device *dev) { LOG_INF("Enabling MAX30001 DCLOFF...\n"); -} +}*/ static void max30001_disable_ecg(const struct device *dev) { @@ -266,10 +266,10 @@ static void max30001_disable_rtor(const struct device *dev) LOG_INF("Disabling MAX30001 RTOR...\n"); } -static void max30001_disable_dcloff(const struct device *dev) +/*static void max30001_disable_dcloff(const struct device *dev) { LOG_INF("Disabling MAX30001 DCLOFF...\n"); -} +}*/ static int max30001_sample_fetch(const struct device *dev, enum sensor_channel chan) @@ -420,11 +420,11 @@ static int max30001_attr_set(const struct device *dev, return 0; } -static int max30001_load_settings_regs(const struct device *dev) +/*static int max30001_load_settings_regs(const struct device *dev) { return 0; -} +}*/ static int max30001_chip_init(const struct device *dev) { diff --git a/drivers/sensor/max30001/max30001_async.c b/drivers/sensor/max30001/max30001_async.c index a43570d..fb6ae54 100644 --- a/drivers/sensor/max30001/max30001_async.c +++ b/drivers/sensor/max30001/max30001_async.c @@ -8,7 +8,7 @@ LOG_MODULE_REGISTER(MAX30001_ASYNC, CONFIG_SENSOR_LOG_LEVEL); static int max30001_async_sample_fetch(const struct device *dev, uint32_t *num_samples_ecg, uint32_t *num_samples_bioz, int32_t ecg_samples[32], int32_t bioz_samples[32], uint16_t *rri, uint16_t *hr, - uint8_t ecg_lead_off, uint8_t bioz_lead_off) + uint8_t *ecg_lead_off, uint8_t *bioz_lead_off) { struct max30001_data *data = dev->data; const struct max30001_config *config = dev->config; @@ -22,7 +22,7 @@ static int max30001_async_sample_fetch(const struct device *dev, uint8_t buf_ecg[512]; uint8_t buf_bioz[512]; - int num_bytes = 0; + //int num_bytes = 0; uint8_t cmd_tx_ecg_fifo_burst = ((ECG_FIFO_BURST << 1) | RREG); const struct spi_buf tx_buf_ecg[1] = {{.buf = &cmd_tx_ecg_fifo_burst, .len = 1}}; @@ -36,19 +36,25 @@ static int max30001_async_sample_fetch(const struct device *dev, max30001_status = max30001_read_status(dev); + while ((max30001_status & MAX30001_STATUS_MASK_EINT) != MAX30001_STATUS_MASK_EINT) + { + max30001_status = max30001_read_status(dev); + k_sleep(K_MSEC(20)); + }; + if ((max30001_status & MAX30001_STATUS_MASK_DCLOFF) == MAX30001_STATUS_MASK_DCLOFF) { // LOG_INF("Leads Off\n"); data->ecg_lead_off = 1; - ecg_lead_off = 1; + *ecg_lead_off = 1; } else { data->ecg_lead_off = 0; - ecg_lead_off = 0; + *ecg_lead_off = 0; } - if ((max30001_status & MAX30001_STATUS_MASK_EINT) == MAX30001_STATUS_MASK_EINT) // EINT bit is set, FIFO is full + if (1) //((max30001_status & MAX30001_STATUS_MASK_EINT) == MAX30001_STATUS_MASK_EINT) // EINT bit is set, FIFO is full { max30001_mngr_int = max30001_read_reg(dev, MNGR_INT); e_fifo_num_samples = (((max30001_mngr_int & MAX30001_INT_MASK_EFIT) >> MAX30001_INT_SHIFT_EFIT) + 1); // No of samples = EFIT + 1 @@ -108,7 +114,7 @@ static int max30001_async_sample_fetch(const struct device *dev, { uint32_t btag = ((((uint8_t)buf_bioz[i * 3 + 2]) & 0x07)); - //printk("B %x ", btag); + // printk("B %x ", btag); if ((btag == 0x00) || (btag == 0x02)) // Valid sample { @@ -129,7 +135,7 @@ static int max30001_async_sample_fetch(const struct device *dev, { printk("BOVF "); max30001_fifo_reset(dev); - // max30001_synch(dev); + //max30001_synch(dev); break; } } diff --git a/drivers/sensor/max30001/max30001_decoder.c b/drivers/sensor/max30001/max30001_decoder.c index 192ef6f..774dbc6 100644 --- a/drivers/sensor/max30001/max30001_decoder.c +++ b/drivers/sensor/max30001/max30001_decoder.c @@ -45,21 +45,10 @@ static int max30001_decoder_decode(const uint8_t *buffer, enum sensor_channel ch size_t channel_idx, uint32_t *fit, uint16_t max_count, void *data_out) { - const struct max30001_encoded_data *edata = (const struct max32664_encoded_data *)buffer; - const struct max30001_decoder_header *header = &edata->header; + //const struct max30001_encoded_data *edata = (const struct max30001_encoded_data *)buffer; + //const struct max30001_decoder_header *header = &edata->header; - if (*fit != 0) - { - return 0; - } - - printk("D "); - //printk("Num samples: %u\n", edata->samples[0].ir_sample); - - /*switch (channel) - { - - }*/ + return 0; } SENSOR_DECODER_API_DT_DEFINE() = { diff --git a/make_display_st7796.sh b/make_display_st7796.sh index 982a640..422aa92 100755 --- a/make_display_st7796.sh +++ b/make_display_st7796.sh @@ -1 +1 @@ -west build -p auto -b healthypi5 app -DEXTRA_CONF_FILE='overlay-bt.conf;overlay-display-st7796.conf" -DEXTRA_DTC_OVERLAY_FILE=healthypi5_rp2040_display_st7796.overlay \ No newline at end of file +west build -p auto -b healthypi5_rp2040 app -DEXTRA_CONF_FILE='overlay-bt.conf;overlay-display-st7796.conf' -DEXTRA_DTC_OVERLAY_FILE='healthypi5_rp2040_display_st7796.overlay;healthypi5_rp2040_sd.overlay' \ No newline at end of file