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

@@ -9,6 +9,7 @@
#include "ble.h"
#include "input.h"
#include "wang.h"
#include "screen.h"
#include "img/menu.xbm"
@@ -53,11 +54,33 @@ static void render_xbm(uint8_t *bits, struct row_buf *b) {
display_make_buf_all(fb, b);
}
int menu_index = 0;
static int menu_index = 0;
static int was_button_pressed[BUTTON_COUNT] = {0};
void menu_render(void) {
static int menu_ticks = 0;
static void menu_event(struct screen_event event) {
if (event.type == SE_TICK) {
if (menu_ticks++ > 125) {
screen_dirty = 1;
}
} else if (event.type == SE_BUTTON_PRESS) {
if (event.data == 0) {
menu_index = (menu_index + 1) % 3;
if (!flash_header_valid && !menu_index) menu_index = 1;
screen_dirty = 1;
} else if (event.data == 1) {
if (menu_index == 0) {
screen_pop();
return;
} else if (menu_index == 1) {
ble_toggle();
screen_dirty = 1;
} else if (menu_index == 2) {
boop();
}
}
}
}
static void menu_draw(struct row_buf *rb) {
uint8_t buffer[(48 * 11) / 8];
memcpy(buffer, menu_bits, sizeof(buffer));
int invert_index = 1 + menu_index * 13;
@@ -98,74 +121,11 @@ void menu_render(void) {
}
}
render_xbm(buffer, display_screen);
display_flip();
}
void menu_switch(void) {
for (int i = 0; i < BUTTON_COUNT; i++) {
was_button_pressed[i] = button_pressed[i];
}
menu_index = flash_header_valid ? 0 : 1;
menu_render();
}
int menu_handler(void) {
static int btldr_timer = 0;
static int render_ticks = 0;
render_ticks++;
if (button_pressed[1] && button_pressed[0]) {
btldr_timer++;
if (btldr_timer > 2000) asm volatile("j 0x00");
} else {
btldr_timer = 0;
}
if (button_pressed[0] && !was_button_pressed[0] && !button_pressed[1]) {
menu_index = (menu_index + 1) % 3;
if (!flash_header_valid && !menu_index) menu_index = 1;
menu_render();
render_ticks = 0;
}
#if BUTTON_COUNT == 4
if (button_pressed[2] && !was_button_pressed[2]) {
menu_index = (menu_index + 2) % 3;
if (!flash_header_valid && !menu_index) menu_index = 2;
menu_render();
render_ticks = 0;
}
if (button_pressed[3] && !was_button_pressed[3]) {
menu_index = (menu_index + 1) % 3;
if (!flash_header_valid && !menu_index) menu_index = 1;
menu_render();
render_ticks = 0;
}
#endif
if (button_pressed[1] && !was_button_pressed[1] && !button_pressed[0]) {
if (menu_index == 0) {
return 0;
} else if (menu_index == 1) {
ble_toggle();
menu_render();
render_ticks = 0;
} else if (menu_index == 2) {
boop();
}
}
if (render_ticks > 125) {
render_ticks = 0;
menu_render();
}
for (int i = 0; i < BUTTON_COUNT; i++) {
was_button_pressed[i] = button_pressed[i];
}
return 1;
render_xbm(buffer, rb);
menu_ticks = 0;
}
struct screen menu_screen = {
menu_draw,
menu_event,
};