You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

444 lines
16 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #include "display_manager.h"
  2. #include "../../../screen_res/logo_mono.c"
  3. //
  4. #include <stdarg.h>
  5. #include "basic/ssd1306/driver_ssd1306.h"
  6. #include "basic/ssd1306/driver_ssd1306_basic.h"
  7. #include "basic/ssd1306/wave_drawer.h"
  8. #include "board/board_battery_state.h"
  9. #include "config.h"
  10. #include "font.h"
  11. #include "heart_wave_sample_service.h"
  12. #include "one_conduction_board.h"
  13. PageState_t g_pageState;
  14. void dsp_mgr_change_to_page(page_t page) { //
  15. g_pageState.page = page;
  16. g_pageState.last_page = page;
  17. g_pageState.page_change_to_page_time = znordic_getpower_on_s();
  18. g_pageState.in_prompt = false;
  19. memset(g_pageState.prompt, 0, sizeof(g_pageState.prompt));
  20. }
  21. uint32_t dsp_mgr_get_page_elapsed_time_s(void) { //
  22. return znordic_getpower_on_s() - g_pageState.page_change_to_page_time;
  23. }
  24. void dsp_mgr_schedule(void) {}
  25. PageState_t* dsp_mgr_get_state(void) { return NULL; }
  26. int compute_x_pos_by_center(int16_t x, int16_t width) { return x - width / 2; }
  27. int compute_y_pos_by_center(int16_t y, int16_t height) { return y - height / 2; }
  28. #define SCREEN_CENTER_X 64
  29. #define SCREEN_CENTER_Y 32
  30. #define CHARGE_BATTERY_WIDTH (12 * 1.2)
  31. #define CHARGE_BATTERY_HEIGHT (22 * 1.2)
  32. #define MAIN_PAGE_BATTERY_WIDTH (12) // ��ҳ���ؿ���
  33. #define MAIN_PAGE_BATTERY_HEIGHT (22) // ��ҳ���ظ߶�
  34. /*******************************************************************************
  35. * ҳ *
  36. *******************************************************************************/
  37. /**
  38. * ʾԪ:
  39. * 1.ص
  40. * ---------------
  41. * | _ |
  42. * | | | |
  43. * | |
  44. * ---------------
  45. *
  46. * Ч:
  47. * 1. ص
  48. *
  49. */
  50. static uint32_t m_nowshowbatterylevel; // ��ǰ��ʾ�ĵ��ص���
  51. void dsp_mgr_change_to_chargingPage() {
  52. ssd1306_basic_clear();
  53. uint8_t x = compute_x_pos_by_center(SCREEN_CENTER_X, CHARGE_BATTERY_WIDTH);
  54. uint8_t y = compute_y_pos_by_center(SCREEN_CENTER_Y, CHARGE_BATTERY_HEIGHT);
  55. uint8_t xchange, ychange;
  56. ssd1306_basic_draw_battery_level(x, y, &xchange, &ychange, BoardBattery_get_battery_level(), CHARGE_BATTERY_WIDTH, CHARGE_BATTERY_HEIGHT);
  57. m_nowshowbatterylevel = BoardBattery_get_battery_level();
  58. ssd1306_basic_gram_update();
  59. dsp_mgr_change_to_page(kPage_chargingPage);
  60. }
  61. void chargingPage_set_batteryLevel(int batteryLevel) {
  62. uint8_t x = compute_x_pos_by_center(SCREEN_CENTER_X, CHARGE_BATTERY_WIDTH);
  63. uint8_t y = compute_y_pos_by_center(SCREEN_CENTER_Y, CHARGE_BATTERY_HEIGHT);
  64. uint8_t xchange, ychange;
  65. ssd1306_basic_draw_battery_level(x, y, &xchange, &ychange, batteryLevel, CHARGE_BATTERY_WIDTH, CHARGE_BATTERY_HEIGHT);
  66. ssd1306_basic_gram_update();
  67. }
  68. void chargingPage_schedule() { //
  69. static uint32_t last_update_time = 0;
  70. if (znordic_haspassed_ms(last_update_time) < 300) {
  71. return;
  72. }
  73. last_update_time = znordic_getpower_on_ms();
  74. m_nowshowbatterylevel += 5;
  75. if (m_nowshowbatterylevel > 100) {
  76. m_nowshowbatterylevel = BoardBattery_get_battery_level();
  77. }
  78. chargingPage_set_batteryLevel(m_nowshowbatterylevel);
  79. }
  80. /*******************************************************************************
  81. * ӭҳ *
  82. *******************************************************************************/
  83. void dsp_mgr_change_to_welcome() {
  84. /**
  85. * @brief лӭ
  86. * 1. Ļ
  87. * 2. ĻԴ
  88. * 3. ʼҳ
  89. */
  90. // ssd1306_basic_string(0, 0, "123456789123456789123", 21, 0, SSD1306_FONT_12);
  91. ssd1306_basic_draw_screen((const char*)gImage_logo_mono);
  92. ssd1306_basic_gram_update();
  93. dsp_mgr_change_to_page(kPage_welcome);
  94. }
  95. void welcomePage_schedule() {}
  96. /*******************************************************************************
  97. * ҳ *
  98. *******************************************************************************/
  99. static bool m_main_page_colon_state = false;
  100. void mainPage_show(bool colon_state) {
  101. static ztm_t now;
  102. int16_t batterylevel;
  103. uint8_t xchange, ychange;
  104. uint8_t x, y;
  105. x = compute_x_pos_by_center(SCREEN_CENTER_X, fontclocklib.widthPixel * 5 + MAIN_PAGE_BATTERY_WIDTH);
  106. y = compute_y_pos_by_center(SCREEN_CENTER_Y, fontclocklib.heightPixel + 1);
  107. znordic_rtc_gettime(&now);
  108. batterylevel = BoardBattery_get_battery_level();
  109. ssd1306_basic_clear_gram();
  110. // ZLOGI("mainPage_show %d %d", colon_state, x, y);
  111. ssd1306_basic_draw_str(x, y, &xchange, &ychange, fmt("%02d:%02d", now.tm_hour, now.tm_min), &fontclocklib);
  112. x = x + 2 + xchange;
  113. ssd1306_basic_draw_battery_level(x, y, &xchange, &ychange, batterylevel, MAIN_PAGE_BATTERY_WIDTH, MAIN_PAGE_BATTERY_HEIGHT);
  114. ssd1306_basic_gram_update();
  115. m_main_page_colon_state = colon_state;
  116. dsp_mgr_change_to_page(kPage_main);
  117. }
  118. void dsp_mgr_change_to_main() { mainPage_show(true); }
  119. void mainPage_updateState() { mainPage_show(!m_main_page_colon_state); }
  120. void mainPage_schedule() {
  121. static uint32_t last_update_time = 0;
  122. if (znordic_haspassed_ms(last_update_time) < 300) {
  123. return;
  124. }
  125. last_update_time = znordic_getpower_on_ms();
  126. mainPage_updateState();
  127. }
  128. /*******************************************************************************
  129. * ־ֹҳ *
  130. *******************************************************************************/
  131. static int m_prepare_page_progress = 0;
  132. void PreparePage_show(int progress) {
  133. m_prepare_page_progress = progress;
  134. ssd1306_basic_clear_gram();
  135. uint8_t x = 0;
  136. uint8_t y = 0;
  137. uint8_t xchange, ychange;
  138. x = compute_x_pos_by_center(SCREEN_CENTER_X, font24x24_zh_lib.widthPixel * 4);
  139. y = compute_y_pos_by_center(SCREEN_CENTER_Y, font24x24_zh_lib.heightPixel);
  140. ssd1306_basic_draw_str(x, y, &xchange, &ychange, "���־�ֹ", &font24x24_zh_lib);
  141. if (progress == 0) {
  142. ssd1306_basic_draw_str(x - font8x8_xo_lib.widthPixel, y - font8x8_xo_lib.heightPixel, &xchange, &ychange, "xxxx", &font8x8_xo_lib);
  143. } else if (progress == 1) {
  144. ssd1306_basic_draw_str(x - font8x8_xo_lib.widthPixel, y - font8x8_xo_lib.heightPixel, &xchange, &ychange, "oxxx", &font8x8_xo_lib);
  145. } else if (progress == 2) {
  146. ssd1306_basic_draw_str(x - font8x8_xo_lib.widthPixel, y - font8x8_xo_lib.heightPixel, &xchange, &ychange, "ooxx", &font8x8_xo_lib);
  147. } else if (progress == 3) {
  148. ssd1306_basic_draw_str(x - font8x8_xo_lib.widthPixel, y - font8x8_xo_lib.heightPixel, &xchange, &ychange, "ooox", &font8x8_xo_lib);
  149. } else if (progress == 4) {
  150. ssd1306_basic_draw_str(x - font8x8_xo_lib.widthPixel, y - font8x8_xo_lib.heightPixel, &xchange, &ychange, "oooo", &font8x8_xo_lib);
  151. }
  152. ssd1306_basic_gram_update();
  153. }
  154. void dsp_mgr_change_to_preparePage() {
  155. PreparePage_show(0);
  156. dsp_mgr_change_to_page(kPage_preparePage);
  157. }
  158. void dsp_mgr_preparePage_set_progress(int progress) { PreparePage_show(progress); }
  159. int dsp_mgr_preparePage_get_progress() { return m_prepare_page_progress; }
  160. void PreparePage_schedule() {}
  161. /*******************************************************************************
  162. * ҳ *
  163. *******************************************************************************/
  164. #define SMAPLE_PAGE_START_X 1
  165. #define SMAPLE_PAGE_START_Y 1
  166. typedef struct {
  167. wave_drawer_t wave_drawer;
  168. int wave_drawser_x;
  169. int wave_drawser_y;
  170. int wave_drawser_hight;
  171. int wave_drawser_width;
  172. int progress_x;
  173. int progress_y;
  174. int progress_width;
  175. int progress_hight;
  176. int heartrate_x;
  177. int heartrate_y;
  178. } sample_page_state_t;
  179. sample_page_state_t m_sample_page_state;
  180. #if 0
  181. void dsp_mgr_change_to_sampling(int progress_s, int heartrate) { //
  182. sample_page_state_t* sps = &m_sample_page_state;
  183. sps->wave_drawser_x = SMAPLE_PAGE_START_X;
  184. sps->wave_drawser_y = SMAPLE_PAGE_START_Y;
  185. sps->wave_drawser_hight = 40;
  186. sps->wave_drawser_width = 120;
  187. sps->progress_x = SMAPLE_PAGE_START_X + 1;
  188. sps->progress_y = SMAPLE_PAGE_START_Y + sps->wave_drawser_hight + 3 + 4;
  189. sps->progress_width = 80;
  190. sps->progress_hight = 8;
  191. sps->heartrate_x = sps->progress_x + sps->progress_width + 2;
  192. sps->heartrate_y = sps->progress_y - 4;
  193. int progress = progress_s / SAMPLE_MIN_TIME_S * 25;
  194. ssd1306_basic_clear_gram();
  195. wave_drawer_init(&sps->wave_drawer, sps->wave_drawser_x, sps->wave_drawser_y, sps->wave_drawser_width, sps->wave_drawser_hight);
  196. wave_drawer_draw_border(&sps->wave_drawer);
  197. uint8_t xchange, ychange;
  198. ssd1306_basic_draw_progress(sps->progress_x, sps->progress_y, sps->progress_width, sps->progress_hight, 25, progress);
  199. if (heartrate <= 0) {
  200. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y, &xchange, &ychange, "<>-- ", &font_asicc16x8_lib);
  201. } else {
  202. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y, &xchange, &ychange, fmt("<>%3d", heartrate), &font_asicc16x8_lib);
  203. }
  204. ssd1306_basic_gram_update();
  205. dsp_mgr_change_to_page(kPage_sampling);
  206. }
  207. void samplePage_update_state(int progress_s, int wave_y, int heartrate, bool update_screen) { //
  208. sample_page_state_t* sps = &m_sample_page_state;
  209. uint8_t xchange, ychange;
  210. int progress = progress_s / SAMPLE_MIN_TIME_S * 25;
  211. if (progress_s / 10 == 0) {
  212. ssd1306_basic_draw_str(sps->progress_x, sps->progress_y - 8, &xchange, &ychange, "xxx", &font8x8_xo_lib);
  213. } else if (progress_s / 10 == 1) {
  214. ssd1306_basic_draw_str(sps->progress_x, sps->progress_y - 8, &xchange, &ychange, "oxx", &font8x8_xo_lib);
  215. } else if (progress_s / 10 == 2) {
  216. ssd1306_basic_draw_str(sps->progress_x, sps->progress_y - 8, &xchange, &ychange, "oox", &font8x8_xo_lib);
  217. } else if (progress_s / 10 == 3) {
  218. ssd1306_basic_draw_str(sps->progress_x, sps->progress_y - 8, &xchange, &ychange, "ooo", &font8x8_xo_lib);
  219. }
  220. wave_drawer_draw_next_point(&sps->wave_drawer, wave_y);
  221. ssd1306_basic_draw_progress(sps->progress_x, sps->progress_y, sps->progress_width, sps->progress_hight, 25, progress);
  222. if (heartrate <= 0) {
  223. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y, &xchange, &ychange, "<>-- ", &font_asicc16x8_lib);
  224. } else {
  225. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y, &xchange, &ychange, fmt("<>%3d", heartrate), &font_asicc16x8_lib);
  226. }
  227. if (update_screen) ssd1306_basic_gram_update();
  228. }
  229. #endif
  230. void dsp_mgr_change_to_sampling(int progress_s, int heartrate) { //
  231. sample_page_state_t* sps = &m_sample_page_state;
  232. sps->progress_x = SMAPLE_PAGE_START_X + 10;
  233. sps->progress_y = SMAPLE_PAGE_START_Y + 3;
  234. sps->progress_width = 100;
  235. sps->progress_hight = 8;
  236. sps->wave_drawser_x = SMAPLE_PAGE_START_X + 5;
  237. sps->wave_drawser_y = SMAPLE_PAGE_START_Y + sps->progress_hight + 5;
  238. sps->wave_drawser_hight = 45;
  239. sps->wave_drawser_width = 90;
  240. sps->heartrate_x = sps->wave_drawser_x + sps->wave_drawser_width + 2;
  241. sps->heartrate_y = sps->wave_drawser_y + 5;
  242. int progress = progress_s / SAMPLE_MIN_TIME_S * 25;
  243. uint8_t xchange, ychange;
  244. ssd1306_basic_clear_gram();
  245. /**
  246. * @brief
  247. * =================
  248. * | |
  249. * | wave |
  250. * | |
  251. */
  252. ssd1306_basic_draw_progress(sps->progress_x, sps->progress_y, sps->progress_width, sps->progress_hight, 25, progress);
  253. // ssd1306_basic_draw_str(sps->progress_x + sps->progress_width + 2, sps->progress_y, &xchange, &ychange, "x", &font8x8_xo_lib);
  254. wave_drawer_init(&sps->wave_drawer, sps->wave_drawser_x, sps->wave_drawser_y, sps->wave_drawser_width, sps->wave_drawser_hight);
  255. // wave_drawer_draw_border(&sps->wave_drawer);
  256. ssd1306_basic_draw_str(sps->heartrate_x + 2, sps->heartrate_y, &xchange, &ychange, "<>", &font_asicc16x8_lib);
  257. if (heartrate <= 0) {
  258. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, "-- ", &font_asicc16x8_lib);
  259. } else {
  260. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, fmt("%3d", heartrate), &font_asicc16x8_lib);
  261. }
  262. ssd1306_basic_gram_update();
  263. dsp_mgr_change_to_page(kPage_sampling);
  264. }
  265. void samplePage_update_state(int progress_s, int wave_y, int heartrate, bool updateHeart, bool update_screen) { //
  266. sample_page_state_t* sps = &m_sample_page_state;
  267. uint8_t xchange, ychange;
  268. static bool heart_logo_state = false;
  269. int progress = progress_s / SAMPLE_MIN_TIME_S * 25;
  270. ssd1306_basic_draw_progress(sps->progress_x, sps->progress_y, sps->progress_width, sps->progress_hight, 25, progress);
  271. // if (progress_s / 10 >= 3) {
  272. // ssd1306_basic_draw_str(sps->progress_x + sps->progress_width + 2, sps->progress_y, &xchange, &ychange, "o", &font8x8_xo_lib);
  273. // } else {
  274. // ssd1306_basic_draw_str(sps->progress_x + sps->progress_width + 2, sps->progress_y, &xchange, &ychange, "x", &font8x8_xo_lib);
  275. // }
  276. if (update_screen && updateHeart) {
  277. if (heart_logo_state) {
  278. ssd1306_basic_draw_str(sps->heartrate_x + 2, sps->heartrate_y, &xchange, &ychange, "<>", &font_asicc16x8_lib);
  279. } else {
  280. ssd1306_basic_draw_str(sps->heartrate_x + 2, sps->heartrate_y, &xchange, &ychange, " ", &font_asicc16x8_lib);
  281. }
  282. heart_logo_state = !heart_logo_state;
  283. }
  284. if (heartrate <= 0) {
  285. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, "-- ", &font_asicc16x8_lib);
  286. } else {
  287. ssd1306_basic_draw_str(sps->heartrate_x, sps->heartrate_y + 20, &xchange, &ychange, fmt("%3d", heartrate), &font_asicc16x8_lib);
  288. }
  289. wave_drawer_draw_next_point(&sps->wave_drawer, wave_y);
  290. if (update_screen) ssd1306_basic_gram_update();
  291. }
  292. void samplePage_schedule() {
  293. static int count = 0;
  294. count++;
  295. int capturetime = hwss_has_captured_time_ms();
  296. int wave_y = (int)hwss_read_val();
  297. int heartrate = (int)hwss_read_heart_rate();
  298. // ZLOGI("samplePage_schedule %d %d %d", capturetime, wave_y, heartrate);
  299. samplePage_update_state(capturetime / 1000, wave_y, hwss_read_heart_rate(), count % 30 == 0, count % 10 == 0);
  300. }
  301. /*******************************************************************************
  302. * samplingError *
  303. *******************************************************************************/
  304. void dsp_mgr_change_to_samplingError() {
  305. /**
  306. * @brief
  307. * 30[X]
  308. */
  309. ssd1306_basic_clear_gram();
  310. uint8_t x;
  311. uint8_t y;
  312. x = compute_x_pos_by_center(SCREEN_CENTER_X, font24x24_zh_lib.widthPixel * 3 + font12x24_asiic_lib.widthPixel * 2);
  313. y = compute_y_pos_by_center(SCREEN_CENTER_Y, font24x24_zh_lib.heightPixel);
  314. uint8_t xchange, ychange;
  315. ssd1306_basic_draw_str(x, y, &xchange, &ychange, "����", &font24x24_zh_lib);
  316. x = x + xchange;
  317. ssd1306_basic_draw_str(x, y, &xchange, &ychange, "30", &font12x24_asiic_lib);
  318. x = x + xchange;
  319. ssd1306_basic_draw_str(x, y, &xchange, &ychange, "��", &font24x24_zh_lib);
  320. x = x + xchange;
  321. ssd1306_basic_gram_update();
  322. dsp_mgr_change_to_page(kPage_samplingError);
  323. }
  324. void dsp_mgr_change_to_sampleSuc() {
  325. /**
  326. * @brief
  327. * 1.
  328. * 2.ʾϢ
  329. */
  330. ssd1306_basic_clear();
  331. uint8_t x = 0;
  332. uint8_t y = 0;
  333. uint8_t xchange, ychange;
  334. x = compute_x_pos_by_center(SCREEN_CENTER_X, font24x24_zh_lib.widthPixel * 4);
  335. y = compute_y_pos_by_center(SCREEN_CENTER_Y, font24x24_zh_lib.heightPixel);
  336. ssd1306_basic_draw_str(x, y, &xchange, &ychange, "�ɼ�����", &font24x24_zh_lib);
  337. ssd1306_basic_gram_update();
  338. dsp_mgr_change_to_page(kPage_storagingSuc);
  339. }
  340. /*******************************************************************************
  341. * SCHEDULE *
  342. *******************************************************************************/
  343. APP_TIMER_DEF(m_dsp_mgr_schedule_tmr);
  344. static void dsp_mgr_schedule_tmr_cb(void* p_context) { //
  345. if (g_pageState.page == kPage_chargingPage) {
  346. chargingPage_schedule();
  347. } else if (g_pageState.page == kPage_welcome) {
  348. welcomePage_schedule();
  349. } else if (g_pageState.page == kPage_main) {
  350. mainPage_schedule();
  351. } else if (g_pageState.page == kPage_preparePage) {
  352. PreparePage_schedule();
  353. } else if (g_pageState.page == kPage_sampling) {
  354. samplePage_schedule();
  355. }
  356. }
  357. void dsp_mgr_init(void) {
  358. static bool timer_inited = false;
  359. SingleLeadECG_screen_init();
  360. if (!timer_inited) {
  361. ZERROR_CHECK(app_timer_create(&m_dsp_mgr_schedule_tmr, APP_TIMER_MODE_REPEATED, dsp_mgr_schedule_tmr_cb));
  362. }
  363. // �˴����ھ�������һ��ҳ����ʾ�Ŀ���
  364. ZERROR_CHECK(app_timer_start(m_dsp_mgr_schedule_tmr, APP_TIMER_TICKS(12), NULL));
  365. timer_inited = true;
  366. }
  367. void dsp_mgr_uninit(void) {
  368. app_timer_stop(m_dsp_mgr_schedule_tmr);
  369. SingleLeadECG_screen_deinit();
  370. }