Add screen (event/stack) abstraction
This commit is contained in:
106
src/menu.c
106
src/menu.c
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user