Add screen (event/stack) abstraction

This commit is contained in:
Puck Meerburg
2026-02-07 22:54:19 +00:00
parent decd87a456
commit 5b0b659002
7 changed files with 201 additions and 141 deletions

View File

@@ -12,8 +12,7 @@
#include "cdc.h"
#include "wang.h"
#include "platform.h"
int anim_render(uint16_t *fb, int index, int frame);
#include "screen.h"
enum usb_control_resp bl_handler(enum usb_control_state state) {
if ((usb_control_request.bmRequestType & 0x7f) != 0x43) return USB_CONTROL_RESP_PASS;
@@ -26,61 +25,10 @@ enum usb_control_resp bl_handler(enum usb_control_state state) {
}
int button_was_pressed[BUTTON_COUNT] = {0};
static int button_was_pressed[BUTTON_COUNT] = {0};
static int button_hold[BUTTON_COUNT] = {0};
int image_index = 0;
int frame = 0;
int subframe = 99999;
int main_handler(void) {
#define TIMER(btn0, btn1, v, count) if (button_pressed[0] != btn0 || button_pressed[1] != btn1) { v = 0; } else if (v < count) { v += 1; } else
static int menu_timer = 0;
TIMER(1, 0, menu_timer, 500) {
display_brightness = (display_brightness + 15) % 16;
menu_timer = 0;
menu_switch();
return 1;
}
if (button_pressed[0] && !button_was_pressed[0]) {
display_brightness = (display_brightness + 1) % 16;
}
if (button_pressed[1] && !button_was_pressed[1]) {
if (flash_header_valid) {
image_index++;
if (!flash_header.widths[image_index]) image_index = 0;
frame = 0;
subframe = 99999;
}
display_flip();
}
subframe++;
if (subframe > 33 && flash_header_valid) {
// approximately 30fps
subframe = 0;
uint16_t fb[44];
if (anim_render(fb, image_index, frame)) {
frame = 0;
} else {
frame++;
}
display_make_buf_all(fb, display_screen);
display_flip();
}
for (int i = 0; i < BUTTON_COUNT; i++) {
button_was_pressed[i] = button_pressed[i];
}
if (!flash_header_valid) return 1;
return 0;
}
extern struct screen badge_screen;
int main()
{
@@ -102,13 +50,14 @@ int main()
PFIC_EnableIRQ(TMR3_IRQn);
wang_init();
main_handler();
usb_register_handler(bl_handler);
usb_init();
ble_init();
screen_push(&badge_screen);
while (1) {
WWDG_SetCounter(0x7F);
static int btldr_timer = 0;
@@ -119,17 +68,42 @@ int main()
btldr_timer = 0;
}
static int cur_handler = 0;
if (cur_handler) {
cur_handler = menu_handler();
if (!cur_handler) {
for (int i = 0; i < BUTTON_COUNT; i++) {
button_was_pressed[i] = button_pressed[i];
struct screen_event ev = {
SE_TICK,
0
};
current_screen->event_handler(ev);
for (int i = 0; i < BUTTON_COUNT; i++) {
int is_pressed = button_pressed[i];
if (button_was_pressed[i] && is_pressed) {
button_hold[i]++;
if (button_hold[i] == 500) {
ev.type = SE_BUTTON_HOLD;
ev.data = i;
current_screen->event_handler(ev);
} else if (button_hold[i] > 500) {
button_hold[i] = 501;
}
subframe = 99999;
} else if (is_pressed && !button_was_pressed[i]) {
ev.type = SE_BUTTON_PRESS;
ev.data = i;
current_screen->event_handler(ev);
button_was_pressed[i] = 1;
button_hold[i] = 0;
} else if (!is_pressed && button_was_pressed[i]) {
ev.type = button_hold[i] >= 500 ? SE_BUTTON_RELEASE_HOLD : SE_BUTTON_RELEASE_SHORT;
ev.data = i;
current_screen->event_handler(ev);
button_was_pressed[i] = 0;
}
} else
cur_handler = main_handler();
}
if (screen_dirty) {
screen_dirty = 0;
current_screen->draw_handler(display_screen);
display_flip();
}
TMOS_SystemProcess();
cdc_tick();