From fd8ed7742e8c799e7f4aa1934af6d458b920521e Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 26 Jan 2024 22:33:48 +0800 Subject: [PATCH] update --- app/src/basic/ssd1306/driver_ssd1306_basic.c | 141 ++++++++++++++++++++++++++- app/src/basic/ssd1306/driver_ssd1306_basic.h | 4 +- app/src/one_conduction/display_manager.c | 58 +++++++++-- app/src/one_conduction/display_manager.h | 5 + app/src/one_conduction/font.h | 64 +++++++++--- app/src/one_conduction/one_conduction_main.c | 4 +- res/Snipaste_2024-01-26_20-00-58.png | Bin 0 -> 17175 bytes 7 files changed, 249 insertions(+), 27 deletions(-) create mode 100644 res/Snipaste_2024-01-26_20-00-58.png diff --git a/app/src/basic/ssd1306/driver_ssd1306_basic.c b/app/src/basic/ssd1306/driver_ssd1306_basic.c index 95a30a1..507eae4 100644 --- a/app/src/basic/ssd1306/driver_ssd1306_basic.c +++ b/app/src/basic/ssd1306/driver_ssd1306_basic.c @@ -561,7 +561,7 @@ uint8_t ssd1306_basic_draw_one_chr(uint8_t xs, uint8_t ys, char *str, FontLibrar return 0; } -uint8_t ssd1306_basic_draw_str(uint8_t xs, uint8_t ys, const char *str, FontLibrary_t *frontlib) { +uint8_t ssd1306_basic_draw_str(uint8_t xs, uint8_t ys, uint8_t *xchange, uint8_t *ychange, const char *str, FontLibrary_t *frontlib) { uint8_t x = xs; uint8_t y = ys; StrIterator_t iterator; @@ -575,7 +575,144 @@ uint8_t ssd1306_basic_draw_str(uint8_t xs, uint8_t ys, const char *str, FontLibr } ssd1306_basic_draw_one_chr(x, y, nowchr, frontlib); x += (uint8_t)(frontlib->widthPixel); /* x + font/2 */ + *xchange += frontlib->widthPixel; } } + + *ychange += frontlib->heightPixel; + return 0; -} \ No newline at end of file +} + +uint8_t ssd1306_basic_draw_battery_level(uint8_t xs, uint8_t ys, uint8_t *xchange, uint8_t *ychange, int level, int width, int high) { + /** + * @brief + * ***** + * ******** + * * * + * * **** * + * * **** * + * ******** + */ + + uint8_t xoff = 0; + uint8_t yoff = 0; + + int batteryHeaderHigh = 2; + int batteryHeaderWidth = 7; + int batteryBodyHigh = 20; + int batteryBodyWidth = 12; + int border_width = 1; + int blank_width = 1; + + float width_mult = width * 1.0 / batteryBodyWidth; + float high_mult = high * 1.0 / (batteryBodyHigh + batteryHeaderHigh); + + batteryHeaderHigh = batteryHeaderHigh * high_mult; + batteryHeaderWidth = batteryHeaderWidth * width_mult; + batteryBodyHigh = batteryBodyHigh * high_mult; + batteryBodyWidth = batteryBodyWidth * width_mult; + border_width = 1; + blank_width = 1; + + int batteryInterBodyWidth = batteryBodyWidth - blank_width * 2 - border_width * 2; + int batteryInterBodyHigh = batteryBodyHigh - border_width * 2 - blank_width * 2; + /** + * @brief 画头部 + */ + for (int yoff = 0; yoff < batteryHeaderHigh; yoff++) { + for (int xoff = 0; xoff < batteryBodyWidth; xoff++) { + uint16_t battery_start = (batteryBodyWidth - batteryHeaderWidth) / 2; + uint16_t battery_end = battery_start + batteryHeaderWidth; + if (xoff >= battery_start && xoff <= battery_end) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } else { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 0); + } + } + } + ys += batteryHeaderHigh; + + /** + * @brief 画上边沿 + */ + for (int yoff = 0; yoff < border_width; yoff++) { + for (int xoff = 0; xoff < batteryBodyWidth; xoff++) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } + } + ys += border_width; + /** + * @brief 画上留白 + */ + for (int yoff = 0; yoff < blank_width; yoff++) { + for (int xoff = 0; xoff < batteryBodyWidth; xoff++) { + // uint16_t start = blank_width; + if (xoff < border_width) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } else if (xoff >= (batteryInterBodyWidth + border_width * 1 + blank_width * 2)) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } else { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 0); + } + } + } + ys += blank_width; + + /** + * @brief 画身体 + */ + for (int yoff = 0; yoff < batteryInterBodyHigh; yoff++) { + for (int xoff = 0; xoff < batteryBodyWidth; xoff++) { + // uint16_t start = blank_width; + if (xoff < border_width) { + // right border + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } else if (xoff >= border_width + blank_width && xoff < batteryInterBodyWidth + border_width + blank_width) { + // body + // ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + + uint16_t batterylevel = (100 - level) / 100.0 * batteryInterBodyHigh; + if (yoff >= batterylevel) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } + + } else if (xoff >= batteryInterBodyWidth + border_width * 1 + blank_width * 2) { + // left border + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } else { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 0); + } + } + } + ys += batteryInterBodyHigh; + + /** + * @brief 画上留白 + */ + for (int yoff = 0; yoff < blank_width; yoff++) { + for (int xoff = 0; xoff < batteryBodyWidth; xoff++) { + // uint16_t start = blank_width; + if (xoff < border_width) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } else if (xoff >= (batteryInterBodyWidth + border_width * 1 + blank_width * 2)) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } else { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 0); + } + } + } + ys += blank_width; + /** + * @brief 画上边沿 + */ + for (int yoff = 0; yoff < border_width; yoff++) { + for (int xoff = 0; xoff < batteryBodyWidth; xoff++) { + ssd1306_gram_write_point(&gs_handle, xs + xoff, ys + yoff, 1); + } + } + ys += border_width; + + *xchange = batteryBodyWidth; + *ychange = batteryBodyHigh + batteryHeaderHigh; +} diff --git a/app/src/basic/ssd1306/driver_ssd1306_basic.h b/app/src/basic/ssd1306/driver_ssd1306_basic.h index ec47910..f113f6f 100644 --- a/app/src/basic/ssd1306/driver_ssd1306_basic.h +++ b/app/src/basic/ssd1306/driver_ssd1306_basic.h @@ -204,7 +204,9 @@ uint8_t ssd1306_basic_gram_update(); ssd1306_handle_t* ssd1306_handler(); uint8_t ssd1306_basic_line(uint8_t x, uint8_t y, uint8_t data); -uint8_t ssd1306_basic_draw_str(uint8_t xs, uint8_t ys, const char *str, FontLibrary_t *frontlib); +uint8_t ssd1306_basic_draw_str(uint8_t xs, uint8_t ys, uint8_t *xchange, uint8_t *ychange, const char *str, FontLibrary_t *frontlib); + +uint8_t ssd1306_basic_draw_battery_level(uint8_t xs, uint8_t ys, uint8_t *xchange, uint8_t *ychange,int level, int width, int high); /** * @} diff --git a/app/src/one_conduction/display_manager.c b/app/src/one_conduction/display_manager.c index 6b2e6a7..ebae393 100644 --- a/app/src/one_conduction/display_manager.c +++ b/app/src/one_conduction/display_manager.c @@ -2,15 +2,17 @@ #include "../../../res/logo_mono.c" // +#include + #include "basic/ssd1306/driver_ssd1306.h" #include "basic/ssd1306/driver_ssd1306_basic.h" #include "font.h" #include "one_conduction_board.h" -#include PageState_t g_pageState; void dsp_mgr_init(void) { FontLibrary_regsiter(&fontclocklib); + FontLibrary_regsiter(&font8x8_xo_lib); // fronlib16.asciifront = assci16code; // fronlib16.asciifrontIndex = "0123456789Ero."; @@ -47,6 +49,8 @@ void dsp_mgr_change_to_poweroff() { SingleLeadECG_screen_deinit(); } +void dsp_mgr_poweron() { SingleLeadECG_screen_init(); } + void dsp_mgr_change_to_welcome() { /** * @brief 切换到欢迎界面 @@ -54,14 +58,11 @@ void dsp_mgr_change_to_welcome() { * 2. 打开屏幕电源 * 3. 初始化开机页面 */ - SingleLeadECG_screen_init(); // ssd1306_basic_string(0, 0, "123456789123456789123", 21, 0, SSD1306_FONT_12); ssd1306_basic_draw_screen(gImage_logo_mono); ssd1306_basic_gram_update(); dsp_mgr_change_to_page(kPage_welcome); - - dsp_mgr_change_to_main(); } const char* fmt(const char* format, ...) { @@ -75,20 +76,57 @@ const char* fmt(const char* format, ...) { } void dsp_mgr_change_to_main() { - /** - * @brief - */ + int16_t batterylevel = 80; + int16_t hour = 12; + int16_t min = 32; + ssd1306_basic_clear(); - //打印时间 - ssd1306_basic_draw_str(40, 32 - fontclocklib.heightPixel / 2, fmt("%02d:%02d", 6, 32), &fontclocklib); - //打印电量 + uint8_t x = 20; + uint8_t y = 32 - fontclocklib.heightPixel / 2; // 12*4 +12 + uint8_t xchange, ychange; + ssd1306_basic_draw_str(x, y, &xchange, &ychange, fmt("%02d:%02d", hour, min), &fontclocklib); + x = x + 2 + xchange; + ssd1306_basic_draw_battery_level(x, y, &xchange, &ychange, batterylevel, 12, 22); ssd1306_basic_gram_update(); + dsp_mgr_change_to_page(kPage_main); +} + +void dsp_mgr_change_to_chargingPage() { + int16_t batterylevel = 80; + int16_t hour = 12; + int16_t min = 32; + + ssd1306_basic_clear(); + uint8_t x = 20; + uint8_t y = 32 - fontclocklib.heightPixel / 2; // 12*4 +12 + uint8_t xchange, ychange; + + ssd1306_basic_draw_str(x, y, &xchange, &ychange, fmt("%02d:%02d", hour, min), &fontclocklib); + x = x + 2 + xchange; + ssd1306_basic_draw_battery_level(x, y, &xchange, &ychange, batterylevel, 12, 22); + ssd1306_basic_gram_update(); + dsp_mgr_change_to_page(kPage_main); } void dsp_mgr_change_to_preparePage() { /** * @brief + * + * 1.进度条 + * 2.提示信息 */ + ssd1306_basic_clear(); + uint8_t x = 0; + uint8_t y = 0; + uint8_t xchange, ychange; + + // ssd1306_basic_draw_str(&x, &y, "123", &fontclocklib); + ssd1306_basic_draw_str(x, y, &xchange, &ychange, "ooox", &font8x8_xo_lib); + y = y + font8x8_xo_lib.heightPixel; + x = x + font8x8_xo_lib.widthPixel; + ssd1306_basic_draw_str(x, y, &xchange, &ychange, "保持静止", &font24x24_baochijingzhi_lib); + ssd1306_basic_gram_update(); + dsp_mgr_change_to_page(kPage_preparePage); } void dsp_mgr_change_to_sampling() {} void dsp_mgr_change_to_samplingError() {} diff --git a/app/src/one_conduction/display_manager.h b/app/src/one_conduction/display_manager.h index 84c8e82..10acfcc 100644 --- a/app/src/one_conduction/display_manager.h +++ b/app/src/one_conduction/display_manager.h @@ -35,6 +35,7 @@ typedef enum { kPage_samplingError, kPage_storaging, kPage_storagingSuc, + kPage_chargingPage, } page_t; typedef struct { @@ -60,9 +61,13 @@ void dsp_mgr_schedule(void); PageState_t* dsp_mgr_get_state(void); uint32_t dsp_mgr_get_page_elapsed_time_s(void); +void dsp_mgr_poweron(); +void dsp_mgr_poweroff(); + void dsp_mgr_change_to_poweroff(); void dsp_mgr_change_to_welcome(); void dsp_mgr_change_to_main(); +void dsp_mgr_change_to_chargingPage(); void dsp_mgr_change_to_preparePage(); void dsp_mgr_change_to_sampling(); void dsp_mgr_change_to_samplingError(); diff --git a/app/src/one_conduction/font.h b/app/src/one_conduction/font.h index 5f19bdc..ae0fe1e 100644 --- a/app/src/one_conduction/font.h +++ b/app/src/one_conduction/font.h @@ -98,20 +98,20 @@ static FontLibrary_t fontclocklib = { }; #endif -//24*24 +// 24*24 const char fontclocklib_code[] = { -0x00,0x00,0x80,0xC0,0xE0,0x60,0x20,0x60,0xE0,0xC0,0x80,0x00,0x00,0xFE,0xFF,0xFF,0x01,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x00,0x01,0x07,0x0F,0x1E,0x18,0x10,0x18,0x1E,0x0F,0x07,0x01,/*"0",0*/ -0x00,0x00,0x80,0x80,0x80,0xC0,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x1F,0x10,0x10,0x10,0x00,/*"1",1*/ -0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x60,0xE0,0xC0,0x80,0x00,0x00,0x03,0x03,0x03,0x80,0xC0,0x60,0x38,0x3F,0x1F,0x07,0x00,0x00,0x1C,0x1E,0x1B,0x19,0x18,0x18,0x18,0x18,0x1F,0x1F,0x00,/*"2",2*/ -0x00,0x80,0xC0,0xE0,0x20,0x20,0x60,0xE0,0xC0,0x80,0x00,0x00,0x00,0x03,0x03,0x03,0x10,0x10,0x18,0x3F,0xEF,0xE7,0x80,0x00,0x00,0x07,0x0F,0x1F,0x10,0x10,0x10,0x18,0x1F,0x0F,0x07,0x00,/*"3",3*/ -0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0xF0,0x00,0x00,0x00,0xC0,0xF0,0xB8,0x8E,0x87,0x81,0xFF,0xFF,0xFF,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x1F,0x10,0x10,/*"4",4*/ -0x00,0x00,0xE0,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x3F,0x3F,0x18,0x08,0x08,0x18,0xF8,0xF0,0xE0,0x00,0x00,0x07,0x0F,0x1B,0x10,0x10,0x10,0x1C,0x1F,0x0F,0x03,0x00,/*"5",5*/ -0x00,0x00,0x80,0xC0,0xC0,0x60,0x20,0x20,0xE0,0xE0,0xC0,0x00,0x00,0xFC,0xFF,0xFF,0x31,0x18,0x08,0x08,0x18,0xF8,0xF0,0xE0,0x00,0x01,0x07,0x0F,0x1C,0x18,0x10,0x10,0x18,0x0F,0x0F,0x03,/*"6",6*/ -0x00,0x00,0xC0,0xE0,0xE0,0x60,0x60,0x60,0x60,0xE0,0xE0,0x60,0x00,0x00,0x03,0x03,0x00,0x00,0xE0,0xF8,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,/*"7",7*/ -0x00,0x80,0xC0,0xE0,0x60,0x20,0x20,0x20,0x60,0xE0,0xC0,0x80,0x00,0x87,0xEF,0xEF,0x3C,0x18,0x38,0x30,0x78,0xEF,0xCF,0x83,0x00,0x07,0x0F,0x0F,0x18,0x10,0x10,0x10,0x18,0x1F,0x0F,0x07,/*"8",8*/ -0x00,0x00,0xC0,0xC0,0xE0,0x20,0x20,0x20,0xE0,0xC0,0x80,0x00,0x00,0x1F,0x3F,0x7F,0x60,0x40,0x40,0x60,0x30,0xFF,0xFF,0xFE,0x00,0x00,0x0C,0x1C,0x1C,0x10,0x10,0x18,0x0F,0x0F,0x03,0x00,/*"9",9*/ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x00,0x00,0x00,/*":",10*/ + 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x20, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0x07, 0x0F, 0x1E, 0x18, 0x10, 0x18, 0x1E, 0x0F, 0x07, 0x01, /*"0",0*/ + 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x1F, 0x10, 0x10, 0x10, 0x00, /*"1",1*/ + 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x20, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x03, 0x03, 0x03, 0x80, 0xC0, 0x60, 0x38, 0x3F, 0x1F, 0x07, 0x00, 0x00, 0x1C, 0x1E, 0x1B, 0x19, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, /*"2",2*/ + 0x00, 0x80, 0xC0, 0xE0, 0x20, 0x20, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x10, 0x10, 0x18, 0x3F, 0xEF, 0xE7, 0x80, 0x00, 0x00, 0x07, 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x18, 0x1F, 0x0F, 0x07, 0x00, /*"3",3*/ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xB8, 0x8E, 0x87, 0x81, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x1F, 0x10, 0x10, /*"4",4*/ + 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x18, 0x08, 0x08, 0x18, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x07, 0x0F, 0x1B, 0x10, 0x10, 0x10, 0x1C, 0x1F, 0x0F, 0x03, 0x00, /*"5",5*/ + 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x60, 0x20, 0x20, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x31, 0x18, 0x08, 0x08, 0x18, 0xF8, 0xF0, 0xE0, 0x00, 0x01, 0x07, 0x0F, 0x1C, 0x18, 0x10, 0x10, 0x18, 0x0F, 0x0F, 0x03, /*"6",6*/ + 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0x60, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0xE0, 0xF8, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, /*"7",7*/ + 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x20, 0x20, 0x20, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x87, 0xEF, 0xEF, 0x3C, 0x18, 0x38, 0x30, 0x78, 0xEF, 0xCF, 0x83, 0x00, 0x07, 0x0F, 0x0F, 0x18, 0x10, 0x10, 0x10, 0x18, 0x1F, 0x0F, 0x07, /*"8",8*/ + 0x00, 0x00, 0xC0, 0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x1F, 0x3F, 0x7F, 0x60, 0x40, 0x40, 0x60, 0x30, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x0C, 0x1C, 0x1C, 0x10, 0x10, 0x18, 0x0F, 0x0F, 0x03, 0x00, /*"9",9*/ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, /*":",10*/ }; static FontLibrary_t fontclocklib = { @@ -122,4 +122,42 @@ static FontLibrary_t fontclocklib = { .isAscii = true, .widthPixel = 12, .heightPixel = 24, -}; \ No newline at end of file +}; + +const char font8x8_xo_code[] = { + 0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x7E, 0x3C, 0x00, /*实心圆,代表完成*/ + 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, /*空心圆,代表未完成*/ + +}; + +static FontLibrary_t font8x8_xo_lib = { + .font = font8x8_xo_code, + .fontIndex = "ox", + .fontIndexLen = 2, + .fontCode = kutf8, + .isAscii = true, + .widthPixel = 8, + .heightPixel = 8, +}; + +const char font24x24_baochijingzhi_code[] = { + // 保(0) 持(1) 静(2) 止(3) 楷体 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF8, 0x38, 0x10, 0x10, 0xF0, 0x90, 0x10, 0x10, 0x10, 0x88, 0xF8, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x0C, 0x06, 0xE7, 0x1C, 0x10, 0x10, 0x10, 0x10, 0x93, + 0x71, 0xFF, 0x39, 0x49, 0x89, 0x08, 0x08, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x03, 0x07, 0x06, 0x06, 0x04, 0x04, 0x00, /*"保",0*/ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFC, 0xFC, 0xC0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC2, 0x63, 0x33, 0xFF, 0x0D, 0x09, 0x08, 0x48, + 0x48, 0x49, 0x48, 0x47, 0x4F, 0xFC, 0x24, 0x24, 0x26, 0x06, 0x04, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x08, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x20, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"持",1*/ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xFC, 0x20, 0xA0, 0x20, 0x00, 0x80, 0x60, 0x3C, 0x2C, 0xA0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x0C, 0x94, 0x75, 0x55, 0x57, 0x15, 0xF4, 0x02, 0x90, + 0x92, 0x92, 0x92, 0xFF, 0x92, 0x8A, 0x49, 0x3F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0F, 0x02, 0x01, 0x09, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x20, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*"静",2*/ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, + 0xFF, 0x0F, 0x08, 0x08, 0x08, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x18, 0x08, 0x08, 0x08, 0x0F, 0x08, 0x08, 0x0C, 0x0F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, /*"止",3*/ +}; + +static FontLibrary_t font24x24_baochijingzhi_lib = { + .font = font24x24_baochijingzhi_code, + .fontIndex = "保持静止", + .fontIndexLen = 12, + .fontCode = kutf8, + .isAscii = false, + .widthPixel = 24, + .heightPixel = 24, +}; diff --git a/app/src/one_conduction/one_conduction_main.c b/app/src/one_conduction/one_conduction_main.c index eb11b29..451d2ec 100644 --- a/app/src/one_conduction/one_conduction_main.c +++ b/app/src/one_conduction/one_conduction_main.c @@ -55,7 +55,9 @@ void one_conduction_main() { zble_module_start_adv(); dsp_mgr_init(); - dsp_mgr_change_to_welcome(); + + dsp_mgr_poweron(); + dsp_mgr_change_to_preparePage(); znordic_loop(); } diff --git a/res/Snipaste_2024-01-26_20-00-58.png b/res/Snipaste_2024-01-26_20-00-58.png new file mode 100644 index 0000000000000000000000000000000000000000..0274ad72aa9f4854dcf054d5a3a6a13078dd8cb7 GIT binary patch literal 17175 zcmXtgWl&sA)Ar&PEV#RCa3^?h3+^t9v$(rMf;++8-Ccr{#R(qV-QnB2p6~r}YOChd z^qKCSzGkN9>WxxSl0ii#Ley9KT3S;JTR{v!{QjW5vp}A!&73)+scFzb|FlGI9xk`To z9;J?swvFfWDK3&OQHq)AxY;O@a~DNj8@3)A6flrnqVDnPtEfz2MrVM&GZj|?4qfxZ-0oJbf;z5cgB{idgKWd}&Mju0J}RmG-rZiFpEKoS zfQwZ&?>A;XJq`9R1)au99~)$^$1k;g2YJ4)SCzFL9D+R%sap^Y&_$jecb}i+Sv@7Z z;az9qJC#XEx!&#Hm)%aYK6hkO%Y8l4#Z0rzVc2qCMlaq^VErB=;YgRT=vu?gO}-KY6|0%XP<@5-3)Yk1nodiB7Vo+fk9{|C$2)ch>@% zFJ^r+w?agpOJ~<`1y2ugya9g< zOs0wYP9gMqe7rsXzE}_Vh^T$qQZ#xtQ{G6VmQCEBczNI@oTzE@A6(%5>pQWaWe{b6 z(YgWJl@Y!AeMeN&^K!EJm~`e*a{YX(9N>NRbWpsSX~PRBVz7hwulF&v)v`h{i8lRB z5NI0wMjv|K&xFm59p+Ftvj1fpg>~qHIL+VmCC%l?BF)chjif`Zl<;lO-lOZRVWLY* zHnHfb_2c1U^Xk5JyQ_p1WiaynkWM56uI*%6kTh>i;xS&GAwug`pfQnOZ$S*-uUO>C7KWr@DN?Q+hXsbA0v%zGhe=I#g#yc zHnoY$yP2pMIZeA9#IwSh^P}~lycDptnB~y58{jYH0V)cAf`pSSi-%wMrm*1o`+2Js z#A96%?xK`EKS@ieo~OA(X$1IvvDVF(TY}*G{)?Gapa{f6J@Mbm9nCsL<_Rj7i2a?7 zKxotY-2%-y;Hy45(!2>;x4(_M=c2FcM~$?!B>@-cp#Ft~I0Eu4QTKI-4fQg&Ai*6z zp?ByFT0&5l=rG%G;08tGwWnTc#eU%;1h96WHjo!PE#(LadG2+7 zyk)U<&*O-`fG(%f47~@ZT7A#=^}wRFJ;&pn=Ur6Ik*%-&7u)TAHtEbc|G5VOWVz1! z85x7-oB2-M`ebBJX-+{Vv&zcO~WMuAgmukAR!L zCKp&_@3R4{bVnFtM;icz*{?;)If5Y zhPZM{Vvpbu)0QcoM5dgE#Ygd2M)cjev9?z9)dw;YVe`MovvuE!ig>8!scBeAW59~l zfr$V;asDm!9ZOR`22^uk9U z`72C!@wSKu{`_pKh!PRC$`CQgRf;R}bDQy3nYW2s0$?5b;_r4qjB+T=OWg7pJS5xy z818Om!siy{h=CKCD?vr{{B#-sByeFs8GSyXt$LU^4V`1jXnqCBL3$Pd)un%gZ5*Y1 z<0hO%eBGG?l3E_ra}n)WWIMYV>PID`zPVSo_C?XpdKwU~KpEf*6vW=4Jpq%pK&bmVA@;Bxk6PSe6PdD1YpsrCBqYO6bPh=?_m-_u69{v8bvukEuWNRq znCPhv`yr&63n?b3FnekBr2Tgz`Tth26-(!7UyYNfp#Tek(mU>oH&PjWd%W|&iRI<= z1+U;vaf^SmDTwRu2>b%B?gc3AQ};=9Yp)Uee-3q1>NoOFSBqp!EPsD%+%+t-td`wmMHOP@Wy^SoHk4}E#0*iLzHN+chn_WqD#pLIZPG0ITucxTm{lute4K)Q~ zZMrUV4>6k@+m7qoQ{6oMK`!pC#&x8oKwlimxC}a02DF|jz#aAM;Go{*6F_yT+Wz-R zXdqS_>e=MCQM#DU6k8RDUFGj7B$<{y`w^UV`bpFZp6mly3aWX!(`I$g(YcifSK=3w z<42g%HX`uV|FdEcXl0Zg$R=eF^f*_5^R~3473AmUh651sI>ctBT6^Z$?!6p%5LVGly0L}* zrDCNCgtzbFk9uj=y!dvA`AI#2{i2Iu78B`&yk@nV^l99vtEFG!qz6w#w$oj_ z^SWt~Nmp$y1uCw4TU7LaAG7dZg&xrv9faA1vKBhYNP_gWH_S#>m{c0RCj&bGRqkYM z2i+~3vY+Q{W*zgjd21$;??>d&uYI)ilUzqeM#QU+98&HMRS76U?y;cx4?jESx3#eb zKbMPXsBsg<3AtV;QqSGRp!-W#69y>uopQmhi{~!E>jv?tf%8f+1KDr*t0S+*uepSl zmo|?Sl$Et|!W;$}R}9H=TA^EfL!|jgPU@HJC_Coz#qk;kH3htRxVckwGdt|Qkbn(c zrmmCV~j-w_wKLy;45=tjzJma1=M7wrX&gvVEB>AFVa$v%F;FiDSoi&;;&v9-~J zlkX|pWpU&a;f8^6167;kXXr>Blzh}8O%%6=tXvTc#}ZmyCj%&Kue0HI`Cq`|RYWA& zriyrxr^EQFm%m#uS8Zmu5rH+6Vfsv>Ze_n=S0013f}i9J_%=>DhJw)oL$)s$E7CMr znSCc?TJj2_y(y0HXX45Ty=qcC#7V(Bbv!zgzFOLn5F-#|yYta=8fxi2GtH4iaW+T3 z{!@lcW%J18PrK#RVNdHLu;e}{(69kbW2e)M19!F)0}GqlH!!COx^e0)nFkVgZ}F(Y z5gtoEffr?S{&-nrKH<30vr2Tn!MYLZ`)|ams7Dg4ACj6DyT93-wMm9Xja1ZWOP~gU z={5o_NnCF;9YF_l1#iE|${&I{&GAsim#>cmh>dj0wcS=8Q&>OXZ%MXGe`*p7=x6~b zi{6u#Mt8)8uZFNhpXU-DF*$;J3U~xmG~Xx%bW$D~LIhBqr9t|4m#IWbseJvB?<%S{ zzmV3ss!q9zSc8`nOcYrLmc)EMcbT6d{A6+*mrRoF<*0omq^-CrJ?Y>&YpSoR@$&!6 z(<(cMYEr~a@_@t5XV|665q*}0LV_SO|A#%}6h00WKBzi+)>NnMZMv3_)qvd>(ag+D zlj?U_qk`^)Uo$I8tToJINjFpA#Ba2Ti<+-Lo%aYtg|qWc6JyrIV?(>bG2vjV1-Fkt+XQVjs5JBAe?lY^iO{*#fp-9 zuu_So8$0?6rx~sLRxMQC@Q^!rf1#gAEz*F}_$E#gi-jPcN963*IDEzwr`Q8?=y$hC z_--~<2rIE52?D&HpsI21(de`l+2FY_)7snjooav`{7M z`X16W59TIl3>d1%*vc+xU?pa28BaKSTofmK6K3^^NN%P9-+w?KbLf}5*fFI%R7|pH z?%Jcjnps2CW|+L>kx<5Wd^Jk8+3n+@LcGglo5QN-&EUZHW$DMa`_enU5HoD7{zGj( z%I(vMfzIn}(j^l;!09dd$oaUYtQS9HfuG!aC(QN9e)WNL0_P2Dd*?@-q6p{JzyHN}6tO>0M| zOciNZ!UMD*;^oWhRpg-|^vX(DJ@9fCrg_-Vb~o(V+poeU>yiizSgU~_S9D*tVU-65 za?-`Sc*&{kg2S8BF*!4@Jp?#)&=tV~9n(m--V`~eRY$BPs93s>+ES^WCryc;S;Ysy zT1j6*-2YT}p6J@#q;_`btvoW6wUU4+DvbnD_T|Jbuso}cYu%Lp%|?$k!+bQBOdJFC?Iv|)D#LU&wzcXOc{Z^{l@PAPmSMB4-~ zN{SzZy{FW)z@)l?H$!gu2dIK8si~>Bcz6sz-EeOXO46{o!G_%aZ3%Fz^gp9yvPtju zTfXU_le@*aQI<7oeSz#S?5cfFbE~Onb%UC7m$RBXE1&XQGGKm)mp4$2SQr|}YFNl3cU06cF)dua3*12W8aWUarE@pieNaj*@{b;~}lXD-g@Y4}XuubTm%$Q9&?GU_`dL*2!h zepcG^OgsIH1%J2lXRj3v4QaLZYMjzKF3t1z_V@3R%osr}VX_ia#2S^Lo+s=6W#z~@ z77+YO|r7@8S4W#}6ys4R_a+z5AfsUyHAz`R6hsk;3*)mRwhRe9%O>T(>x)dgwv0xHf5Q|sC?Ibk>>Mt4_|Z! z;_otQT4kc7NuSX18@lcA7?kC`{-YCpze?!dMvT=&vCCTl*uL@QAg+c7Qzq+{M6{CG zt+zc(8v+TJ!9_z24n)KV;?|{IeXpLpW)e3X7*V$RWHYxD-^DqbDWl%%6= zd-x@_eb11EMV{yBzQ)GT>r36VzVl=(c!I`B?cJTO_M+?_*d91$KR#!rjZfJeXV-~E zD4)082LVeGlvrMwi@zM1(mSV+EzHi~JD$U9%q%_gsp{Ov4g4GmWYNNY_*D9QovEAf z6HA`tqX({busYfLaKxEb#=syn>dG!&K88QV;5lyg_<=y*?X1MCIaz7qh(y_AHJKYi zJl3Xlc;Q}B)BtTDP1HQ-gq+y2PJdTR%_%D!-cRC$_~ox0oAFc>A_%jAPs z7!oRXr3L0JF*t=tCiM#W(+=-&t|M)hq(jhK*y#9k3ae(@yxsY9zB;z<`;?A{f+*;` zUZX(*kL2_uyXM}3Q*6YOwxuKa07Af(61ss%WJhMNpmNby&k=rY!Iq=$Lk6n~l67*d z46Z60;*#m^3)b8phBu4#+N)iSp3xdP85)y&j9=8;GY(i>CVzj^ztAQ!x&9mMjC9at z1BkrwDWbu@=(NKDN}TFLUCR3VU(<7|3e+oBe@J?`H$04cdEHVS%VC}(np<57{o{&b znh9}3oXYyX?NR+%TQ1Q!W24>GO4s*JF|D+uq;H+}M8KjO;Y3-?LvPEqU&7bf(5yD& z@5JG~l6#`VQ!M-0Pr!7I0rn zDF2B9T05tD@iIH<4z$kUD(=Z&FY7>zm#P(ns+!a7xsIL9S)+e7p-0>QOrQiR$aS$( zKR93^>pG5>A@v%{atpC5)iTIb|Gn=UDfTb@L+x%g@?}~I^A<;$eyH;R8)dq&qV%hT zvELv?TvE7!x}g__+_2{yas93q6fmdY<>9%uNh&+(i+2eE;IF{VsAIs(ngm#JPrJ3m z#t6Z{)f$LNrnjlN&CR*PlnXsqJnA%HX>w~+U5o+L+0&NdS(V$-7HGE3^Nz@DO0L=e zOOF#CsExC7I0)4tlLih6r_Y0dff*beWRy+Zd>@P8x6v_?(^w>S4#uSGCP7fL6pwm| zjzBud(9R)kqN7GJBQ~q#yg&`z^_v(WSPlFWgZrM>R-nQ|EV#sXIbw=yPE^XSEgYMM2di|MloFU)y!!h`GgjlMC=Vy+1X)-~2KrGH=I4 zIP{r5TYLmlW)*gJ5WrFI46pl-qas)Z{`LB|a`cTl=!({^aF#+6*bq)sgu~G<+kN1t z6`SX;+r(`!B3_b@p80_>5$?c_$`|6ZY}oS5svpl@SgIKzLw$?5NI|1e=BEEy(xOO) zyj$CG7TCo-1FYD1xJP-tM_S&M4O%-_4? zygknDP#OCJlSJU}W9PFzbjh?&)&g!C8P#B&1gdi#uH`@}LRU}u!UMGZk*Rl__09-7 z01)^*NF?%boTS7^;W)uQL^+Wl`zgIe~d;>;B?@i(Ue zW32z~taMc+BnEHZz9=PJ<8s7F4|VMRGRl}hPnGJQlkk}$hOAfCu|a|-owMuCHSydB zpAO7HCR?Qn#IqSTE1F|Ir~m-HHCO6@=nB0fg}R705zagp63&3L4xyh3RqT7gm2ypi zg*KP>^Kc?7-B&io*>(K5N}$48%x&U!$_)4SL)(#^qyOUqwCoUAFq=o4wNGp7EnO#f zEZaj>jSrBSkbfF^#sfN9;c^WkkNzRky05%jZo@bq*<)bot{O1Zy7a|QXU{~>T7M~4 z?|So#_wD?1Dz;O7WcaJg9tu?cr!%6h%Mza49thH>D6ywE(?%k;JyD#kxPCN|Mrq9- zJ916{g5*F;?YnX=L@EGsi|7(a$F6mW_(mKqhKN->j}mgz5BPhZJ{OyjsMb`UZ*kZ= zb~g%XZb7&=I-~gTL&`*URIra01W1HwfgP!rrWtv8qMnz=hNUvu;6?IM8#5M!r>IBT zTo`rfYASYt@K7k_zf2J~C9%hHw-nYN9Jr>h0bDBuQ3Z4GEL?Ktw}h_GzXS@h@uVPG zXnA=?9o=C1UYQ?YTrIkRZ(LR40$rrPu9w0cu{Oi*&OhnDd1QN5!lb>9Dg%f#x7s`g zV<}1FF*jxrsRXc8&1u`R4l9;64xx)AB4bA5!=zE%R(176fkw0iWVZUn;*o3p#y%^@ zolbWbu~rMt!wQmP^5Y$V0v#)*WEOO5_ap`1N?3YRAkUd z1bh!w^gj;^*h`Q!EZ&gZ?sw%zr|wJLNniXTI^Yx5e;~D0glX8{X@HHN6Zd5XxajF1 zz+BI-pfR5DXNba&?!V0EOCY=?7XM23x_6=3h?|odaOO;aQfiD{N5&aF}cr3URCKR#pwzB3WA|Y6rso7=QcWr*Wg#IBaReIU^S$F^yB&7J)xSiHj(UKBRv5G- z6?Df~-ak3sVrBeotg~>-PR|w#{Q@H}Xel6zz`DHaSfNhVpE;v?i_>I>M%iR)R8)g9 zTDkb3dLf_o)O>P#mEyz}xXXS1vMi&>Mhy(cey1G*>DURF{f3fy`kQWhcrVb(7~o#* zn7`hzY{jnZ-O|b5erLdwN%`Hs*?S+k=m!ELqBu$4$SCAC$3bxSquLy*;ZQml zo{vaCYMo@di2KU2vHW|UTE)t#R({k7zkN)z*Ihka8jKi*3#DL8D^>@t*+bYl=DqY# zzco>I5(mP*=i2fzzPmS9*3`lM+qXLwX6`}}Jao5JX(8x=0Q0kfNHvt<|GE+syyOK> znOKhBlIKr2kAGnb3IB2xnN4RPFv&dP-S(j=~Tv$_aA0Q+E;KD#ZjBrot(f!$4T%G&dw3x8J%WIlQ2+;BC%G|1b_IT8HEk-GgWE|F zZtiZ?O(enmBu>#i>qxn+t6Jn_GQgwX>zJJjFKs7>G#@2HT2!5q@{H(OEw6xK9%DtP zOBf%Er^{^xL!A=$OlJ6Z#{h;Q+GVwLpX}y%d1=pn_RU6_F55Yo9oN$w2c>%+at;qZ zNYpD?w+#6?g2z&_@@6KVHn?rtX0z8jp~Iy6}()_!FMIV?R$rkori^(Oi-eJmBunHr15W zK~ljsn|a0BoR?$-zTP+VadoaGlzX{G(g{Mt8Q*$KW7PhcAMB8oy>`7QgaxMC!PSl+ z|1$?a=X9I@aKN9V%iYgVT_%x6ai$q>M}#PHu;|+JSDSACE~wiK&1#{93%1E3U2p0 zB)i+p!aL}18M9dk!kqa_6{4Zm$2nqD_}diqC5{?TZSJb>sCX6PB>WAt=wBov#W38t z&?L0*djvVqy)6$}@wXYn_TsQOD-{TiRnl3q=M;{ux1rZ8ylkA*46QnT>Q2#JUh}4)+eY14swoF~u`mxk z28fl3+HTVmBmQk@IbAOm??#?8jKn_aKs^#B9KrhsB>jXZry>BkH8y>@KPxOO%%6bA zh{JV=LN&rD9SmZ*I_+wW!w%KWhbNrsp?B2t>Qt6`kS^p-He5g_7XNBgvux6L{sNES zp$LkVo?8oRK<2%V(;n8vu$_pR5$*K8vvsRtv*8JG>nK_;C6`?P)aqE@jE0VnnTab| z+(@C`h@0L70(&P?ZEePp7;T6Ca(sy&c>Uo=*!k9Q>T~J35BBXH4a%AJ7&bo6pig3r z(w;_(f`&~k{oMT)?pQI0w{owC!fCt&#Gk02KE+>%f>L$$zrh!@z#ZzO!>BBG%Ef|? zRAVh=lRI)FrBUpEt%T=AV$?7Cq{lGwIq6X`mSC#E7ffFyxzpoa-taoyBNO71=@zP1D;s zY8PnEK8u|Yo4l4X#V%RQWb2E;V!)!U^SUHU+(Mwco-!-#MV z*6KNaQ(OG&5gdc0{;=50T2Bq;=G6wxSyg#?)P*H2Hy&HLme0P=bYC63JgSCSnHlqCSRFKfzGYGS12g&OaJ%+QgQHbC=%!99f> z6f@A^c%^=r@VRrdv>U<`J~XpoV4~B0Dt7$RPGpuAE4UB%Z9=#Y?VLuZYF`TY#KkC# zYb0=E{BK-f-%)@4naK_~am#cNraV2gu{S#kK@g{tUG={(`K8bC=#$LeN( z3JVMC`0{7iFx*Smkg0eW058Z7P{(nCsti z*u)7$W^W8lKV!@8xrY7c`kL0AbhreZYj(Z~NoYAvWMy3UCEEV2GBIhVPRR@Sn-OV! z6Kf+{Ft4ePW%j50M^|;>Qlt%k7pnL6Z?nzWH>H8srP_1b?{&4|^cw`cf1L*ZGtSP= z7dR-v7$Prj_Ep{s&hcI1K8DLmVX<5`!rP@jn_?$@O3F7nk|i8W1SY+nYRzirEsiSd z&fgUS-kFPL#8P7+&Cf+Qujwi4j8-ePq1-t}3QjzTu1O5e#F5zXg2M4Etf&=%USP?o zFQfg|+A$^7i}AVlEh#AxjV+ z@$T7MA6; zwz3-VJG!J$_nr8|3nVcM3+=z3o&$cq`v2#O@(sSuU zJ=T56!e5?^p2|${^RG17lX@m!Rc&>_^Q>?x1bEFFm*Jr|JmF1g>7x#-z9sdJkI!0X zVHHkDHSr644U8PUyp~13zfg6Vla)uSf$^Ml&LG+^;OOa3Gd_+`q~f3$#Fza{FVsI@>hA!^mogoy?* zzf9fmrQ^MyJ%eWp-&(UWLqv(if)Z{$w8<8ir|IV5d998!aPIi<7(LUDpqr)eXPq>2 z(cNd*{HZb=x*prP79SKct(=1gs_5?MiMmxtqIDX_ZLOUX;BIZah9S5MXwLMOoU;}? zl$`G$M9@Nu{hkw-srGvs5RMZ&L)1_iQ7_jrAwh{~q0%m2z0YO8R@Vhdno43fH??{G zi}XukfvQ+0=&K7hAhoS}sW~?BRMj0zVZ(qRC8qCQ6kZ%BnZOD4&g;u!j#c)@{3G`($#pj=T@z}$z*U}D2qm`lk@9PZ8l)%Hu9@G zE?&jn%jQSV@yUf28{9665FR@;oGBK)7TB<*a$hR|P+!O~Gg7H&a3^SrHSFIzKi1_!Uxx3>g>!Rlv=5m)^AD*2k@<&l_~N z(c$YV5eMXm3jYz_9|x^iyDs$|RnlO!VXzkZisw`s-F%qz9aj-&#ZO)d>My@EUd*(I z4bg96`{+l3^D*3p z)82}a_8o`dYGu@lv#gh^#bh*Vur^{WYs=j-VwA=t`yYe;TadMmUGMkpd-#Zc$JFy| z%x#*EnR?GWw zw1aT?9vk%9BhEP1C{egP<}&r#b0w2AmEvED8%p(r&di4y3>c6b6Z-&Z&R`HOU4aooehD>bhkZcdM;cB*=etx;)CvyKS^<#zyKF{7i&thbp^% zhC4`c>6V4|_xEEd@rg}|UKzU_pFnn(el{Q8;JUwU5dKbF>R0Iz*!+`6sz8I|a;tZ@ zJ*4~XrH-GjV#U^sI*x>uoK^x6OEB{0+OLhlD$3to9~Y6V+`S{ASP|X!Ye*`4+7MSMH=IOLfTg7h}0? zZr&`ze{Y)U59Q~-UX0&%xSdGL$W%^;K{&o)+_gr{K)kZWceCEh%qSkCPJ33-_)f)F zXN~Q*Un4JZ3BHL`x6sG4{ZEZEBBgJ54j~iDf9>5yo{`XhJ*{uteKh3V((^Io=ZtmP zJp0nyzK_kRD+|YwQOx^O3?Q_>iu+mFzuT%JLf39Yz|4+@2cJYcY6OTK>d#+%ypwss zU{0vC;TkXv{vaTGurvBWQ5ftN-UyA<`?|GPG>oOj51BDrUSLs=cQ|E{Cu)+&T~w|C zN%OFf$Df@5GZsxsfC$orJb8CA5LYWy@6dYQGsfF%y);%Bl*2?)&XGNx9= zxPyNgRK-r>V;j<;%2;J{+h@0y1g2%|n@?sDCSUffezI3I!|G>T44yqI`?-w?=v6Ya z`Q`Ih!64GrdrNMal)$Atx7AT8)UH`~(Fz!PWe68xWm!AzS#9$pZV(tXnN>0qQK0#$ zg2ZF<>iwZN4^dLVv^oAylNes~@mfbuMAv>Mu+Cd|k7M9{0sRkP1S6wH@L5@5iSz1J z{`uW?y~8bE_0pAd+SqL68079%EV1q!tfDvncvSic^$r|_eCvs8z2s?6PrF#W2_Xtb zbfS4?;!P(wk9=EPi}8S~+n}}g(__;e5qS6?H94g{Q9OJyi`8@E_HsNwNeiw@7+U~Z zI{h2QNfz4pCxpr&Z40~^fGm2QjWXYCy=t}rN&<%TU#dC$$aG}!(fr(i_pPly-!T5N z8EPQ~#>~(MEELL33M@Rd0AZ=;NHG(TqN0WOY1*DVlx75 zX7gdH*K@{aL)}eD=zB9e!K#3?^Ai$@*qVDtB}_KSQTo{HVeo-sWslgx z(m4xoc#jT*Y`=_JgZ9m_Irnd~*#f#hK#t)M*vZX;h#`V9ETFUoKjSm&;6xIwAW%g& zdZ0*_5fSuc1}POd1{og%kT#e}v;>BZNz zdaVv1F5_x+G2`IUhy!KCoIdUbZLaHn#{?ErjRiWr~z3@ zJD`hZ<>7UEVH*6ISBGaB!^d8&A^5_mBe!vP{(zgPiHC8EME1^yQ5rsjMaFuMw&>F; zV*9*H{FJKy)`ifaU&yz6Sb?urX=1*8_n=> zD-<37C z;uP$(u^Vi;by{2I(r>UB^$sj&pxQfMw9bDUb8v!$Gt>Oew}8oW7EQ%$pVPn1>X7bU zXN3oY%hdYUTOkj9{H^v=Rw^?N0yT4Kb}RMoxu{@t5x(y2R~GacC}!oBlWLp%sWHl* z;>}fFZxsfeUss82>lI z)@I$BTggH=u|tt$TXCc0K`h|T-$}DNi;2OsK|dc_u-Sx!vJFLiI-WUuv^97F|inBE-1Xgf%P9{D13A z2E%V}xdnBfy1_oA>-UHJdTbFltwN`y;@EMx(H4-R77eR>KfAwes@Xz!k|aVdw_|g` zmfnEAc0E!DMFkX6zuDJeotPAP2oOrL573Oikt)Z719%FJB{vFP)nU?o*^yEZ-; z2=d&M1Nvx|YjESv`MQ|aFrDw%_+w@=MkXf}%8!2Cc94C4wk#g)ET|^3k!hTLH$YgwFs+pij2ONjI)ma`1b%h*pjC}^sI|@t=!YS;j@7FmA!p87 z!;jt0Cxf|}lNCw!BXGFwCyqs0qRVS`M`}C9!A!LK^VSBxQ0sBeM&|8vUDl@~3Z4n$ zsC9N^A~$fP=tFG}{_7J{SNNr4Td2jiQI~m$=BXc2nc6)=IWGR93P1|Dq%!sBSE9DQ zvsJ1q7%0N#7G(yZEvB;QA-A)_BGa2FTJ;h(3a;{iCBCo8t?x4|o%zyN7%^xkx>$}f zVhnv}r!s#dAS1I1|J&o|Q_fG(x5%}8YGLL;wyAsYW4!)7K$QU{7;gdL*Z02EW`l%< zWZF+1N_mLdHy0uNisYpaNjKa_9j7j8DB{~iHzf=8!)8CRN;~oV1X}$6Sg3%zUHakt zH9bRrKnIyX0`=BiGv zuCAWe^o<4N(m6~OHIyt{w3ddB@2i4BRBud;^g$FkeYTIxG)DC z7j|CaaFcxEE`psxEj9wGHTLD26K8tCr)b>_P{_VU*8fhBdR&GP(82J|+`TDDlC<;&Q4c?tz%g-u+{+wdX3ERQ zgn0>D^4e!+WDparadC3Cmq)%0HHKPQ?nA)C0qs8knIxW^n#A@Bnx^&&tKg(W6lZ{- z5F@~vQ~*S-gRD)FVCr(RDpN`ZyX=l$6+uKxH##!HGc`Fqy{G)>(&i3k?(S(FF>hgx3`ALQBLRH_TqeQMh3TftAPmb zmoHyBZLk#fu;*9)YiiW9va%}W$rEicfz+3_TTbNir>9?z;Cy4$SCKt5{Xc-xbL@WF z%@Q&ErV9WhC>e3_pr+Y*c_QDRW@H79P8($T5C#37Fab~gU3E2{nnYduqmJ(2gWa;P z*t*2vWTGZEX3ewPa)y;%7Q@f7aO{O_d_z_H=94+uvq(LPy7*?G2{{qwjEB;#30B{dHd>h<*-{o8L%kkz%nvDi1)%UaKdvW4~AP7QjdE&`E3&)NCfNCVrulk>TZqLN)et{D+ z|BCx{L%zf-33;$Rh`jUydGcT8jvYG+0P66egG-P+^uw>8x9069jh;?No0`h~Nny=c zw{Ber?HtxY$b;=cIc@qRd z5a9ajum9>-zq)VVJ^*O;H3yoF{=R`1pM2*2>#x85*=L`vI(vd32))bRy?d{}{`zly h>s!w~_gs4B{{tQCZ#5c^(l-DA002ovPDHLkV1m%!6t4gP literal 0 HcmV?d00001