diff --git a/app/src/basic/ssd1306/wave_drawer.c b/app/src/basic/ssd1306/wave_drawer.c index 6242a60..0bb9b67 100644 --- a/app/src/basic/ssd1306/wave_drawer.c +++ b/app/src/basic/ssd1306/wave_drawer.c @@ -2,6 +2,8 @@ #include "znordic.h" +static bool m_draw_scan_line = false; + void wave_drawer_init(wave_drawer_t *dw, uint8_t xs, uint8_t ys, uint16_t width, uint16_t high) { dw->xs = xs; dw->ys = ys; @@ -67,7 +69,11 @@ void wave_drawer_draw_next_point(wave_drawer_t *dw, uint8_t y) { */ for (size_t yoff = 0; yoff < dw->high; yoff++) { if (xpos + 1 <= dw->xright) { - ssd1306_gram_write_point(ssd1306_handler(), xpos + 1, dw->ybottom - yoff, 1); + if (m_draw_scan_line) { + ssd1306_gram_write_point(ssd1306_handler(), xpos + 1, dw->ybottom - yoff, 1); + } else { + ssd1306_gram_write_point(ssd1306_handler(), xpos + 1, dw->ybottom - yoff, 0); + } } for (uint8_t i = 2; i < 2 + 20; i++) { if (xpos + i <= dw->xright) { diff --git a/app/src/one_conduction/display_manager.c b/app/src/one_conduction/display_manager.c index 857a40c..a144559 100644 --- a/app/src/one_conduction/display_manager.c +++ b/app/src/one_conduction/display_manager.c @@ -214,7 +214,7 @@ typedef struct { int heartrate_y; } sample_page_state_t; sample_page_state_t m_sample_page_state; - +#if 0 void dsp_mgr_change_to_sampling(int progress_s, int heartrate) { // sample_page_state_t* sps = &m_sample_page_state; @@ -274,6 +274,73 @@ void samplePage_update_state(int progress_s, int wave_y, int heartrate, bool upd } if (update_screen) ssd1306_basic_gram_update(); } +#endif +void dsp_mgr_change_to_sampling(int progress_s, int heartrate) { // + sample_page_state_t* sps = &m_sample_page_state; + + sps->progress_x = SMAPLE_PAGE_START_X + 1; + sps->progress_y = SMAPLE_PAGE_START_Y; + sps->progress_width = 110; + sps->progress_hight = 8; + + sps->wave_drawser_x = SMAPLE_PAGE_START_X; + sps->wave_drawser_y = SMAPLE_PAGE_START_Y + sps->progress_hight + 10; + sps->wave_drawser_hight = 40; + sps->wave_drawser_width = 100; + + sps->heartrate_x = sps->wave_drawser_x + sps->wave_drawser_width + 5; + sps->heartrate_y = sps->wave_drawser_y; + + int progress = progress_s / 30.0 * 25; + uint8_t xchange, ychange; + + ssd1306_basic_clear_gram(); + /** + * @brief + * =============== o + * | | ÐÄ + * | wave | + * | | ÐÄÂÊ + */ + ssd1306_basic_draw_progress(sps->progress_x, sps->progress_y, sps->progress_width, sps->progress_hight, 25, progress); + ssd1306_basic_draw_str(sps->progress_x + sps->progress_width + 2, sps->progress_y, &xchange, &ychange, "x", &font8x8_xo_lib); + + wave_drawer_init(&sps->wave_drawer, sps->wave_drawser_x, sps->wave_drawser_y, sps->wave_drawser_width, sps->wave_drawser_hight); + wave_drawer_draw_border(&sps->wave_drawer); + + ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y, &xchange, &ychange, "<>", &font_asicc16x8_lib); + if (heartrate <= 0) { + ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, "-- ", &font_asicc16x8_lib); + } else { + ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, fmt("%3d", heartrate), &font_asicc16x8_lib); + } + ssd1306_basic_gram_update(); + dsp_mgr_change_to_page(kPage_sampling); +} + +void samplePage_update_state(int progress_s, int wave_y, int heartrate, bool update_screen) { // + + sample_page_state_t* sps = &m_sample_page_state; + uint8_t xchange, ychange; + + int progress = progress_s / 30.0 * 25; + + ssd1306_basic_draw_progress(sps->progress_x, sps->progress_y, sps->progress_width, sps->progress_hight, 25, progress); + if (progress_s / 10 >= 3) { + ssd1306_basic_draw_str(sps->progress_x + sps->progress_width + 2, sps->progress_y, &xchange, &ychange, "o", &font8x8_xo_lib); + } else { + ssd1306_basic_draw_str(sps->progress_x + sps->progress_width + 2, sps->progress_y, &xchange, &ychange, "x", &font8x8_xo_lib); + } + + ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y, &xchange, &ychange, "<>", &font_asicc16x8_lib); + if (heartrate <= 0) { + ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, "-- ", &font_asicc16x8_lib); + } else { + ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, fmt("%3d", heartrate), &font_asicc16x8_lib); + } + wave_drawer_draw_next_point(&sps->wave_drawer, wave_y); + if (update_screen) ssd1306_basic_gram_update(); +} void samplePage_schedule() { static int count = 0; @@ -282,10 +349,12 @@ void samplePage_schedule() { int wave_y = (int)hwss_read_val(); int heartrate = (int)hwss_read_heart_rate(); // ZLOGI("samplePage_schedule %d %d %d", capturetime, wave_y, heartrate); - samplePage_update_state(capturetime / 1000, wave_y, heartrate, count % 3 == 0); + samplePage_update_state(capturetime / 1000, wave_y, heartrate, count % 10 == 0); } -// +/******************************************************************************* + * samplingError * + *******************************************************************************/ void dsp_mgr_change_to_samplingError() { /** * @brief diff --git a/app/src/one_conduction/heart_wave_sample_service.c b/app/src/one_conduction/heart_wave_sample_service.c index 54f1630..03a9aa2 100644 --- a/app/src/one_conduction/heart_wave_sample_service.c +++ b/app/src/one_conduction/heart_wave_sample_service.c @@ -31,12 +31,42 @@ static void swap_buffer() { m_capture_buffer_index = 0; return; } +static float amp_val(uint16_t val, uint16_t valcener, float amp) { + float valf = (float)val - valcener; + valf = valf * amp; + valf += valcener; + if (valf >= 100) { + valf = 100; + } + + if (valf <= 0) { + valf = 0; + } + return valf; +} + +typedef struct { + float value; + float efectiveFactor; +} filter_t; + +filter_t m_filter = {0, 0.8}; + +static float Filter(filter_t* filter, float newInput) { + float newv = ((float)filter->value * (1.0f - filter->efectiveFactor)) + ((float)newInput * filter->efectiveFactor); + filter->value = newv; + return newv; +} void nrfx_timer_event_handler(nrf_timer_event_t event_type, void* p_context) { // uint16_t val = SingleLeadECG_battery_get_adc_val(); // 12bit - m_real_time_data = (float)val / 4096.0f * 100; - ZLOGI("%d", val); + float val_af100 = (float)val / 4096.0f * 100; + + val_af100 = amp_val(val_af100, 50, 1.8f); + val_af100 = Filter(&m_filter, val_af100); + m_real_time_data = val_af100; + // ZLOGI("%d", val); if (m_capture_buffer == NULL) { swap_buffer();