From 907bf5905554d6da779145eb939dbe416458f60e Mon Sep 17 00:00:00 2001 From: Dien-Nhung Nguyen-Phu Date: Sun, 29 Sep 2024 09:34:49 +0700 Subject: [PATCH] add animation while charging - add 5x7 font - add animation - display version after the animation end - add BOOT state for switching to normal mode while charging --- Makefile | 1 + src/font.c | 100 ++++++++++++++++++++++++++++ src/font.h | 8 +++ src/main.c | 44 +++++++++--- src/res/fossasia-badgemagic-ani.xbm | 14 ++++ src/resource.c | 8 +++ src/resource.h | 1 + 7 files changed, 167 insertions(+), 9 deletions(-) create mode 100644 src/font.c create mode 100644 src/font.h create mode 100644 src/res/fossasia-badgemagic-ani.xbm diff --git a/Makefile b/Makefile index 749073b..94f7de4 100644 --- a/Makefile +++ b/Makefile @@ -67,6 +67,7 @@ src/usb/composite/cdc-serial.c \ src/xbm.c \ src/resource.c \ src/animation.c \ +src/font.c \ # ASM sources diff --git a/src/font.c b/src/font.c new file mode 100644 index 0000000..ce96c49 --- /dev/null +++ b/src/font.c @@ -0,0 +1,100 @@ +#include + +uint8_t font5x7[][6] = { //Font 5x7 + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 20 ' ' + {0x00, 0x00, 0x00, 0x5f, 0x00, 0x00}, // 21 ! + {0x00, 0x00, 0x07, 0x00, 0x07, 0x00}, // 22 " + {0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14}, // 23 # + {0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12}, // 24 $ + {0x00, 0x23, 0x13, 0x08, 0x64, 0x62}, // 25 % + {0x00, 0x36, 0x49, 0x55, 0x22, 0x50}, // 26 & + {0x00, 0x00, 0x05, 0x03, 0x00, 0x00}, // 27 ' + {0x00, 0x00, 0x1c, 0x22, 0x41, 0x00}, // 28 ( + {0x00, 0x00, 0x41, 0x22, 0x1c, 0x00}, // 29 ) + {0x00, 0x14, 0x08, 0x3e, 0x08, 0x14}, // 2a * + {0x00, 0x08, 0x08, 0x3e, 0x08, 0x08}, // 2b + + {0x00, 0x00, 0x50, 0x30, 0x00, 0x00}, // 2c , + {0x00, 0x08, 0x08, 0x08, 0x08, 0x08}, // 2d - + {0x00, 0x00, 0x60, 0x60, 0x00, 0x00}, // 2e . + {0x00, 0x20, 0x10, 0x08, 0x04, 0x02}, // 2f / + {0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e}, // 30 0 + {0x00, 0x00, 0x42, 0x7f, 0x40, 0x00}, // 31 1 + {0x00, 0x42, 0x61, 0x51, 0x49, 0x46}, // 32 2 + {0x00, 0x21, 0x41, 0x45, 0x4b, 0x31}, // 33 3 + {0x00, 0x18, 0x14, 0x12, 0x7f, 0x10}, // 34 4 + {0x00, 0x27, 0x45, 0x45, 0x45, 0x39}, // 35 5 + {0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30}, // 36 6 + {0x00, 0x01, 0x71, 0x09, 0x05, 0x03}, // 37 7 + {0x00, 0x36, 0x49, 0x49, 0x49, 0x36}, // 38 8 + {0x00, 0x06, 0x49, 0x49, 0x29, 0x1e}, // 39 9 + {0x00, 0x00, 0x36, 0x36, 0x00, 0x00}, // 3a : + {0x00, 0x00, 0x56, 0x36, 0x00, 0x00}, // 3b ; + {0x00, 0x08, 0x14, 0x22, 0x41, 0x00}, // 3c < + {0x00, 0x14, 0x14, 0x14, 0x14, 0x14}, // 3d = + {0x00, 0x00, 0x41, 0x22, 0x14, 0x08}, // 3e > + {0x00, 0x02, 0x01, 0x51, 0x09, 0x06}, // 3f ? + {0x00, 0x32, 0x49, 0x79, 0x41, 0x3e}, // 40 @ + {0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e}, // 41 A + {0x00, 0x7f, 0x49, 0x49, 0x49, 0x36}, // 42 B + {0x00, 0x3e, 0x41, 0x41, 0x41, 0x22}, // 43 C + {0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c}, // 44 D + {0x00, 0x7f, 0x49, 0x49, 0x49, 0x41}, // 45 E + {0x00, 0x7f, 0x09, 0x09, 0x09, 0x01}, // 46 F + {0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a}, // 47 G + {0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f}, // 48 H + {0x00, 0x00, 0x41, 0x7f, 0x41, 0x00}, // 49 I + {0x00, 0x20, 0x40, 0x41, 0x3f, 0x01}, // 4a J + {0x00, 0x7f, 0x08, 0x14, 0x22, 0x41}, // 4b K + {0x00, 0x7f, 0x40, 0x40, 0x40, 0x40}, // 4c L + {0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f}, // 4d M + {0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f}, // 4e N + {0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e}, // 4f O + {0x00, 0x7f, 0x09, 0x09, 0x09, 0x06}, // 50 P + {0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e}, // 51 Q + {0x00, 0x7f, 0x09, 0x19, 0x29, 0x46}, // 52 R + {0x00, 0x46, 0x49, 0x49, 0x49, 0x31}, // 53 S + {0x00, 0x01, 0x01, 0x7f, 0x01, 0x01}, // 54 T + {0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f}, // 55 U + {0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f}, // 56 V + {0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f}, // 57 W + {0x00, 0x63, 0x14, 0x08, 0x14, 0x63}, // 58 X + {0x00, 0x07, 0x08, 0x70, 0x08, 0x07}, // 59 Y + {0x00, 0x61, 0x51, 0x49, 0x45, 0x43}, // 5a Z + {0x00, 0x00, 0x7f, 0x41, 0x41, 0x00}, // 5b [ + {0x00, 0x02, 0x04, 0x08, 0x10, 0x20}, // 5c ¥ + {0x00, 0x00, 0x41, 0x41, 0x7f, 0x00}, // 5d ] + {0x00, 0x04, 0x02, 0x01, 0x02, 0x04}, // 5e ^ + {0x00, 0x40, 0x40, 0x40, 0x40, 0x40}, // 5f _ + {0x00, 0x00, 0x01, 0x02, 0x04, 0x00}, // 60 ` + {0x00, 0x20, 0x54, 0x54, 0x54, 0x78}, // 61 a + {0x00, 0x7f, 0x48, 0x44, 0x44, 0x38}, // 62 b + {0x00, 0x38, 0x44, 0x44, 0x44, 0x20}, // 63 c + {0x00, 0x38, 0x44, 0x44, 0x48, 0x7f}, // 64 d + {0x00, 0x38, 0x54, 0x54, 0x54, 0x18}, // 65 e + {0x00, 0x08, 0x7e, 0x09, 0x01, 0x02}, // 66 f + {0x00, 0x0c, 0x52, 0x52, 0x52, 0x3e}, // 67 g + {0x00, 0x7f, 0x08, 0x04, 0x04, 0x78}, // 68 h + {0x00, 0x00, 0x44, 0x7d, 0x40, 0x00}, // 69 i + {0x00, 0x20, 0x40, 0x44, 0x3d, 0x00}, // 6a j + {0x00, 0x7f, 0x10, 0x28, 0x44, 0x00}, // 6b k + {0x00, 0x00, 0x41, 0x7f, 0x40, 0x00}, // 6c l + {0x00, 0x7c, 0x04, 0x18, 0x04, 0x78}, // 6d m + {0x00, 0x7c, 0x08, 0x04, 0x04, 0x78}, // 6e n + {0x00, 0x38, 0x44, 0x44, 0x44, 0x38}, // 6f o + {0x00, 0x7c, 0x14, 0x14, 0x14, 0x08}, // 70 p + {0x00, 0x08, 0x14, 0x14, 0x18, 0x7c}, // 71 q + {0x00, 0x7c, 0x08, 0x04, 0x04, 0x08}, // 72 r + {0x00, 0x48, 0x54, 0x54, 0x54, 0x20}, // 73 s + {0x00, 0x04, 0x3f, 0x44, 0x40, 0x20}, // 74 t + {0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c}, // 75 u + {0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c}, // 76 v + {0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c}, // 77 w + {0x00, 0x44, 0x28, 0x10, 0x28, 0x44}, // 78 x + {0x00, 0x0c, 0x50, 0x50, 0x50, 0x3c}, // 79 y + {0x00, 0x44, 0x64, 0x54, 0x4c, 0x44}, // 7a z + {0x00, 0x00, 0x08, 0x36, 0x41, 0x00}, // 7b { + {0x00, 0x00, 0x00, 0x7f, 0x00, 0x00}, // 7c | + {0x00, 0x00, 0x41, 0x36, 0x08, 0x00}, // 7d } + {0x00, 0x10, 0x08, 0x08, 0x10, 0x08}, // 7e -> + {0x00, 0x78, 0x46, 0x41, 0x46, 0x78} // 7f <- +}; \ No newline at end of file diff --git a/src/font.h b/src/font.h new file mode 100644 index 0000000..d3623d5 --- /dev/null +++ b/src/font.h @@ -0,0 +1,8 @@ +#ifndef __FONT_H__ +#define __FONT_H__ + +#include + +extern uint8_t font5x7[][6]; // Font 5x7 + +#endif /* __FONT_H__ */ diff --git a/src/main.c b/src/main.c index eaf2a50..4e13913 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include "bmlist.h" #include "resource.h" #include "animation.h" +#include "font.h" #include "power.h" #include "data.h" @@ -25,7 +26,8 @@ (v) = (min) enum MODES { - NORMAL = 0, + BOOT = 0, + NORMAL, DOWNLOAD, POWER_OFF, MODES_COUNT, @@ -383,16 +385,38 @@ static int bat_raw2percent(int r) return 100; } +static void fb_putchar(char c, int col, int row) +{ + for (int i=0; i < 6; i++) { + if (col + i >= LED_COLS) break; + fb[col + i] = (fb[col + i] & ~(0x7f << row)) + | (font5x7[c - ' '][i] << row); + } +} + +static void fb_puts(char *s, int len, int col, int row) +{ + while (*s && len--) { + fb_putchar(*s, col, row); + col += 6; + s++; + } +} + static void disp_charging() { int blink = 0; - while (1) { + while (mode == BOOT) { int percent = bat_raw2percent(read_batt_raw()); if (is_charging()) { - disp_bat_stt(blink ? percent : 0, 7, 2); + disp_bat_stt(blink ? percent : 0, 2, 2); + if (ani_xbm_next_frame(&fabm_xbm, fb, 16, 0) == 0) { + fb_puts("v0.1", 4, 16, 2); // TODO: get version from git tag + fb_putchar(' ', 40, 2); + } blink = !blink; - DelayMs(300); + DelayMs(500); } else { disp_bat_stt(percent, 7, 2); DelayMs(500); @@ -419,20 +443,22 @@ int main() bmlist_init(LED_COLS * 4); + btn_init(); + btn_onOnePress(KEY1, change_mode); + btn_onOnePress(KEY2, bm_transition); + btn_onLongPress(KEY1, change_brightness); + disp_charging(); play_splash(&splash, 0, 0); load_bmlist(); - btn_init(); - btn_onOnePress(KEY1, change_mode); - btn_onOnePress(KEY2, bm_transition); - btn_onLongPress(KEY1, change_brightness); - ble_setup(); spawn_tasks(); + + mode = NORMAL; while (1) { handle_mode_transition(); TMOS_SystemProcess(); diff --git a/src/res/fossasia-badgemagic-ani.xbm b/src/res/fossasia-badgemagic-ani.xbm new file mode 100644 index 0000000..be3bc23 --- /dev/null +++ b/src/res/fossasia-badgemagic-ani.xbm @@ -0,0 +1,14 @@ +#define fossasia_badgemagic_ani_width 26 +#define fossasia_badgemagic_ani_height 33 +static unsigned char fossasia_badgemagic_ani_bits[] = { + 0x9c, 0xc7, 0xe7, 0x03, 0x42, 0x28, 0x10, 0x00, 0x5f, 0xc8, 0xe3, 0x01, + 0x42, 0x08, 0x04, 0x02, 0x82, 0xe7, 0xf3, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x3e, 0x7c, 0xf2, 0x01, 0x40, 0x02, 0x02, 0x02, 0x7e, 0x3c, 0xf2, 0x03, + 0x42, 0x40, 0x12, 0x02, 0x7c, 0x3e, 0xe2, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x73, 0x9c, 0x03, + 0xa2, 0x94, 0x42, 0x00, 0x9e, 0x94, 0xc2, 0x01, 0xa2, 0x97, 0x5a, 0x00, + 0xa2, 0x94, 0x52, 0x00, 0x9e, 0x74, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x22, 0xe3, 0xce, 0x01, 0xb6, 0x14, 0x24, 0x00, + 0xaa, 0x14, 0x24, 0x00, 0xa2, 0xd7, 0x24, 0x00, 0xa2, 0x94, 0x24, 0x00, + 0xa2, 0xe4, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/src/resource.c b/src/resource.c index a8f8d14..040f3f2 100644 --- a/src/resource.c +++ b/src/resource.c @@ -4,6 +4,7 @@ #include "res/foss-asia-2.xbm" #include "res/bat-icon.xbm" #include "res/bat-warn-icon.xbm" +#include "res/fossasia-badgemagic-ani.xbm" xbm_t bluetooth = { .bits = bluetooth_bits, @@ -31,4 +32,11 @@ xbm_t batwarn_xbm = { .w = bat_warn_icon_width, .h = bat_warn_icon_height, .fh = 11 +}; + +xbm_t fabm_xbm = { + .bits = fossasia_badgemagic_ani_bits, + .w = fossasia_badgemagic_ani_width, + .h = fossasia_badgemagic_ani_height, + .fh = 11 }; \ No newline at end of file diff --git a/src/resource.h b/src/resource.h index 968d725..65ac03f 100644 --- a/src/resource.h +++ b/src/resource.h @@ -8,5 +8,6 @@ extern xbm_t bluetooth; extern xbm_t splash; extern xbm_t bat_xbm; extern xbm_t batwarn_xbm; +extern xbm_t fabm_xbm; // FOSSASIA-BADGEMAGIC animation #endif /* __RES_H__ */