diff --git a/app/src/app_basic_service/zapp.c b/app/src/app_basic_service/zapp.c index 1326e68..8348a48 100644 --- a/app/src/app_basic_service/zapp.c +++ b/app/src/app_basic_service/zapp.c @@ -94,7 +94,7 @@ void zapp_init() { m_delay_event_preset_tmr[8].tmrid = m_delay_event_preset_tmr8; m_delay_event_preset_tmr[9].tmrid = m_delay_event_preset_tmr9; } -void zapp_start_schedule() { ZERROR_CHECK(app_timer_start(m_state_machine_driver_tmr, APP_TIMER_TICKS(300), NULL)); } +void zapp_start_schedule() { ZERROR_CHECK(app_timer_start(m_state_machine_driver_tmr, APP_TIMER_TICKS(1000), NULL)); } /*********************************************************************************************************************** * state_machine * diff --git a/app/src/app_service/display_ctrl_service/display_mgr.c b/app/src/app_service/display_ctrl_service/display_mgr.c index 37bec41..d41cf0f 100644 --- a/app/src/app_service/display_ctrl_service/display_mgr.c +++ b/app/src/app_service/display_ctrl_service/display_mgr.c @@ -85,7 +85,9 @@ static void _page_change(page_t page) { for (int i = 0; i < m_pageNum; i++) { if (m_page_processers[i].page == m_page) { if (m_page_processers[i].on_page_load) m_page_processers[i].on_page_load(); - ZERROR_CHECK(app_timer_start(m_dsp_mgr_schedule_tmr, APP_TIMER_TICKS(10 /*ms*/), NULL)); + + int32_t period = m_page_processers[i].page_get_schedule_period(); + ZERROR_CHECK(app_timer_start(m_dsp_mgr_schedule_tmr, APP_TIMER_TICKS(period /*ms*/), NULL)); break; } } @@ -239,7 +241,7 @@ void samplePage_update_state(int progress_s, int wave_y, int heartrate, bool upd } static void page_sampling_unload() {} -static uint32_t page_sampling_get_scheduler_period() { return 10; } +static uint32_t page_sampling_get_scheduler_period() { return 20; } static void page_sampling_tmr_cb() { static int count = 0; count++; @@ -247,7 +249,7 @@ static void page_sampling_tmr_cb() { int wave_y = (int)ecg_service_get_display_val(); int heartrate = (int)ecg_service_get_heart_rate(); - samplePage_update_state(capturetime / 1000, wave_y, heartrate, count % 30 == 0, count % 10 == 0); + samplePage_update_state(capturetime / 1000, wave_y, heartrate, count % 15 == 0, count % 5 == 0); } /*********************************************************************************************************************** diff --git a/app/src/app_service/ecg_service/algo/iflytop_simple_filter_ext.h b/app/src/app_service/ecg_service/algo/iflytop_simple_filter_ext.h index 75a2e2e..ad126f2 100644 --- a/app/src/app_service/ecg_service/algo/iflytop_simple_filter_ext.h +++ b/app/src/app_service/ecg_service/algo/iflytop_simple_filter_ext.h @@ -1,7 +1,7 @@ #pragma once #include "iflytop_simple_filter.h" -#define FILTER_MAX_ORDER 10 +#define FILTER_MAX_ORDER 20 typedef struct { LPFilter_t lp_filter[FILTER_MAX_ORDER]; int order; diff --git a/app/src/app_service/ecg_service/algo/zdata_statistics.c b/app/src/app_service/ecg_service/algo/zdata_statistics.c index 630b5a1..fda9ce4 100644 --- a/app/src/app_service/ecg_service/algo/zdata_statistics.c +++ b/app/src/app_service/ecg_service/algo/zdata_statistics.c @@ -1,38 +1,57 @@ #include "zdata_statistics.h" +#include + void zdata_statistics_init(zdata_statistics_t* p_analyzer, int32_t* buf, int32_t bufsize) { p_analyzer->buf = buf; p_analyzer->bufsize = bufsize; - p_analyzer->head = 0; - p_analyzer->tail = 0; p_analyzer->avg = 0; p_analyzer->max = 0; p_analyzer->min = 0; } + +int32_t zdata_statistics_get_date(int off) {} + void zdata_statistics_push(zdata_statistics_t* p_analyzer, int32_t data) { - p_analyzer->buf[p_analyzer->head] = data; - p_analyzer->head = (p_analyzer->head + 1) % p_analyzer->bufsize; - if (p_analyzer->head == p_analyzer->tail) { - p_analyzer->tail = (p_analyzer->tail + 1) % p_analyzer->bufsize; - p_analyzer->sum -= p_analyzer->buf[p_analyzer->tail]; + memmove(p_analyzer->buf + 1, p_analyzer->buf, (p_analyzer->bufsize - 1) * sizeof(int32_t)); + p_analyzer->buf[0] = data; + + p_analyzer->datanum++; + if (p_analyzer->datanum > p_analyzer->bufsize) { + p_analyzer->datanum = p_analyzer->bufsize; + } + + p_analyzer->sum = 0; + for (int i = 0; i < p_analyzer->datanum; i++) { + p_analyzer->sum += p_analyzer->buf[i]; + } + p_analyzer->avg = p_analyzer->sum / p_analyzer->datanum; + + float max = 0; + float min = 0; + + max = p_analyzer->buf[0]; + min = p_analyzer->buf[0]; + + for (int i = 0; i < p_analyzer->datanum; i++) { + max = max > p_analyzer->buf[i] ? max : p_analyzer->buf[i]; + min = min < p_analyzer->buf[i] ? min : p_analyzer->buf[i]; } - p_analyzer->sum += data; - p_analyzer->avg = p_analyzer->sum / p_analyzer->bufsize; - p_analyzer->max = p_analyzer->max > data ? p_analyzer->max : data; - p_analyzer->min = p_analyzer->min < data ? p_analyzer->min : data; + + p_analyzer->max = max; + p_analyzer->min = min; } void zdata_statistics_clear(zdata_statistics_t* p_analyzer) { - p_analyzer->head = 0; - p_analyzer->tail = 0; - p_analyzer->sum = 0; - p_analyzer->avg = 0; - p_analyzer->max = 0; - p_analyzer->min = 0; + p_analyzer->sum = 0; + p_analyzer->avg = 0; + p_analyzer->max = 0; + p_analyzer->min = 0; + p_analyzer->datanum = 0; } float zdata_statistics_get_avg(zdata_statistics_t* p_analyzer) { return p_analyzer->avg; } float zdata_statistics_get_max(zdata_statistics_t* p_analyzer) { return p_analyzer->max; } float zdata_statistics_get_min(zdata_statistics_t* p_analyzer) { return p_analyzer->min; } -bool zdata_statistics_is_full(zdata_statistics_t* p_analyzer) { return p_analyzer->head == p_analyzer->tail; } +bool zdata_statistics_is_full(zdata_statistics_t* p_analyzer) { return p_analyzer->datanum == p_analyzer->bufsize; } diff --git a/app/src/app_service/ecg_service/algo/zdata_statistics.h b/app/src/app_service/ecg_service/algo/zdata_statistics.h index 22ef9b6..6e21912 100644 --- a/app/src/app_service/ecg_service/algo/zdata_statistics.h +++ b/app/src/app_service/ecg_service/algo/zdata_statistics.h @@ -12,8 +12,7 @@ typedef struct { float max; float min; - uint32_t head; - uint32_t tail; + uint32_t datanum; } zdata_statistics_t; diff --git a/app/src/app_service/ecg_service/ecg_algo.c b/app/src/app_service/ecg_service/ecg_algo.c index 844142a..ef30b47 100644 --- a/app/src/app_service/ecg_service/ecg_algo.c +++ b/app/src/app_service/ecg_service/ecg_algo.c @@ -22,27 +22,29 @@ void ecg_algo_init() { zsimple_qrs_init(&m_qrs, SAMPLE_RATE); zdata_statistics_init(&m_data_statistics, m_data_statistics_buf, ZARRAY_SIZE(m_data_statistics_buf)); } -void ecg_algo_process_data(int32_t indata) { - int32_t data = indata; - data = LPFilterExt_update(&m_lp_filter, data); - data = HPFilterExt_update(&m_hp_filter, data); - data = NOTCHFilterExt_update(&m_notch_filter, data); - reportdata = data; +int32_t maxval; +int32_t minval; +int32_t nowval100; +void ecg_algo_process_data(int32_t indata) { + float data = indata; + data = LPFilterExt_update(&m_lp_filter, data); + data = HPFilterExt_update(&m_hp_filter, data); + data = NOTCHFilterExt_update(&m_notch_filter, data); + reportdata = data; zdata_statistics_push(&m_data_statistics, data); if (zdata_statistics_is_full(&m_data_statistics)) { zsimple_qrs_process_data(&m_qrs, data, zdata_statistics_get_min(&m_data_statistics), zdata_statistics_get_max(&m_data_statistics), - zdata_statistics_get_avg(&m_data_statistics)); + zdata_statistics_get_avg(&m_data_statistics)); /** * @brief */ - int32_t max = zdata_statistics_get_max(&m_data_statistics); - int32_t min = zdata_statistics_get_min(&m_data_statistics); + maxval = zdata_statistics_get_max(&m_data_statistics); + minval = zdata_statistics_get_min(&m_data_statistics); - - int32_t nowvaloff = data - min; - int32_t nowval100 = nowvaloff * 100 / (max - min); + int32_t nowvaloff = data - minval; + nowval100 = 10 + nowvaloff * 80 / (maxval - minval); displaydata = nowval100; } else { @@ -50,9 +52,9 @@ void ecg_algo_process_data(int32_t indata) { } } void ecg_algo_reset() { - LPFilterExt_init(&m_lp_filter, 40, SAMPLE_RATE, 5, true); - HPFilterExt_init(&m_hp_filter, 1, SAMPLE_RATE, 3, true); - NOTCHFilterExt_init(&m_notch_filter, 50, 1, SAMPLE_RATE, 1, true); + LPFilterExt_init(&m_lp_filter, 40, SAMPLE_PERIOD_S, 9, true); + HPFilterExt_init(&m_hp_filter, 1, SAMPLE_PERIOD_S, 1, true); + NOTCHFilterExt_init(&m_notch_filter, 50, 10, SAMPLE_PERIOD_S, 3, false); zdata_statistics_clear(&m_data_statistics); zsimple_qrs_clear(); } diff --git a/app/src/app_service/ecg_service/ecg_service.c b/app/src/app_service/ecg_service/ecg_service.c index e54d670..bb4259b 100644 --- a/app/src/app_service/ecg_service/ecg_service.c +++ b/app/src/app_service/ecg_service/ecg_service.c @@ -196,12 +196,12 @@ static void ads1291_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t a ads129x_read_data(&capture_data); // 算法处理 - // ecg_algo_process_data(capture_data.ch1data); + ecg_algo_process_data(capture_data.ch1data); // 上报 one_frame_t frame; - // frame.data = ecg_algo_get_report_data(); - frame.data = capture_data.ch1data; + frame.data = ecg_algo_get_report_data(); + // frame.data = capture_data.ch1data; frame.leadoff = capture_data.loffstate; ecg_data_mgr_push_one_frame(frame); } diff --git a/app/src/one_conduction_main.c b/app/src/one_conduction_main.c index e96d44f..7f896c4 100644 --- a/app/src/one_conduction_main.c +++ b/app/src/one_conduction_main.c @@ -214,7 +214,7 @@ void on_state_change(device_state_t from, device_state_t to) { beep_load(); light_ctrl_load(); dsp_mgr_load(); - // dsp_mgr_change_page(kpage_welcome); + dsp_mgr_change_page(kpage_welcome); ecg_service_load(); m_poweron_flag = true; @@ -225,6 +225,7 @@ void on_state_change(device_state_t from, device_state_t to) { } else if (from == kstate_mainPage) { } else if (from == kstate_capture) { ecg_service_stop_capture(); + beep_set_effect(STOP_SAMPLE_EFFECT); } else if (from == kstate_charging) { } @@ -256,6 +257,8 @@ void on_state_change(device_state_t from, device_state_t to) { } else if (to == kstate_capture) { dsp_mgr_change_page(kpage_sampling); ecg_service_start_capture(); + beep_set_effect(START_SAMPLE_EFFECT); + } else if (to == kstate_charging) { dsp_mgr_change_page(kpage_charging_page); } @@ -264,12 +267,16 @@ void on_state_change(device_state_t from, device_state_t to) { /*********************************************************************************************************************** * 事件处理 * ***********************************************************************************************************************/ -void on_zapp_ebus_event(void* p_event_data, uint16_t event_size) { + +extern int32_t maxval; +extern int32_t minval; +extern int32_t nowval100; +void on_zapp_ebus_event(void* p_event_data, uint16_t event_size) { if (!p_event_data) return; app_event_t* p_event = (app_event_t*)p_event_data; - if(p_event->eventType == kappevent_tmr_scheduler_event){ - ZLOGI("tmr event."); + if (p_event->eventType == kappevent_tmr_scheduler_event) { + ZLOGI("tmr event. %d %d %d", nowval100, minval, maxval); } if (zapp_state_machine_now_state() == kstate_standby) {