Files
bagdewitch/src/main.c
Puck Meerburg da0529dd99 Add vendor request to reset the MCU
There's two issues with this.
1. There's no way to force a USB reset.
2. This USB stack is cursed.

I can't tell how much of the latter is my fault, though, so I'm
keeping it in.
2025-12-30 17:05:46 +00:00

138 lines
3.1 KiB
C

#include <stdint.h>
#include <stdlib.h>
#include "CH58x_common.h"
#include "CH58x_sys.h"
#include "CH58xBLE_LIB.h"
#include "usb/core.h"
#include "led.h"
#include "button.h"
#include "menu.h"
#include "ble.h"
#include "cdc.h"
#include "wang.h"
int anim_render(uint16_t *fb, int index, int frame);
enum usb_control_resp bl_handler(enum usb_control_state state) {
if ((usb_control_request.bmRequestType & 0x7f) != 0x43) return USB_CONTROL_RESP_PASS;
if (usb_control_request.bRequest != 0x69)
return USB_CONTROL_RESP_STALL;
if (state == USB_CONTROL_FINISHED) asm volatile("j 0x00");
return USB_CONTROL_RESP_ACK;
}
int btn1_was_pressed = 1;
int btn2_was_pressed = 0;
int btn1_hold = 0;
int btn2_hold = 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] && !btn1_was_pressed) {
display_brightness = (display_brightness + 1) % 16;
}
if (button_pressed[1] && !btn2_was_pressed) {
if (flash_header_valid) {
image_index++;
if (!flash_header.widths[image_index]) image_index = 0;
frame = 0;
subframe = 99999;
}
display_flip();
}
subframe++;
if (subframe > 32 && flash_header_valid) {
// approximately 60fps
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();
}
btn2_was_pressed = button_pressed[1];
btn1_was_pressed = button_pressed[0];
return 0;
}
int main()
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
button_init();
display_init();
WWDG_SetCounter(0x7F);
WWDG_ResetCfg(ENABLE);
TMR0_TimerInit((FREQ_SYS / 16000) / 2);
TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END);
PFIC_EnableIRQ(TMR0_IRQn);
TMR3_TimerInit(FREQ_SYS / 200);
TMR3_ITCfg(ENABLE, TMR0_3_IT_CYC_END);
PFIC_EnableIRQ(TMR3_IRQn);
wang_init();
main_handler();
usb_register_handler(bl_handler);
usb_init();
ble_init();
while (1) {
WWDG_SetCounter(0x7F);
static int btldr_timer = 0;
if (button_pressed[1] && button_pressed[0]) {
btldr_timer++;
if (btldr_timer > 1000) asm volatile("j 0x00");
} else {
btldr_timer = 0;
}
static int cur_handler = 0;
if (cur_handler) {
cur_handler = menu_handler();
if (!cur_handler) {
btn2_was_pressed = button_pressed[1];
btn1_was_pressed = button_pressed[0];
subframe = 99999;
}
} else
cur_handler = main_handler();
TMOS_SystemProcess();
cdc_tick();
hid_tick();
DelayMs(1);
}
}