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