#include #include #include "CH58x_common.h" #include "CH58x_sys.h" #include "CH58xBLE_LIB.h" #include "usb/core.h" #include "led.h" #include "input.h" #include "menu.h" #include "ble.h" #include "cdc.h" #include "wang.h" #include "platform.h" #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; 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; } static int button_was_pressed[BUTTON_COUNT] = {0}; static int button_hold[BUTTON_COUNT] = {0}; extern struct screen badge_screen; 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); TMR1_TimerInit((FREQ_SYS / 1000)); TMR1_ITCfg(ENABLE, TMR0_3_IT_CYC_END); TMR3_TimerInit(FREQ_SYS / 200); TMR3_ITCfg(ENABLE, TMR0_3_IT_CYC_END); PFIC_EnableIRQ(TMR3_IRQn); wang_init(); usb_register_handler(bl_handler); usb_init(); ble_init(); screen_push(&badge_screen); // set SEVONPEND PFIC->SCTLR |= (1 << 4); 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; } 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; } } 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; } } if (screen_dirty) { screen_dirty = 0; current_screen->draw_handler(display_screen); display_flip(); } TMOS_SystemProcess(); cdc_tick(); hid_tick(); while (!TMR1_GetITFlag(TMR0_3_IT_CYC_END)) { __SEV(); __asm__ volatile("wfi"); } TMR1_ClearITFlag(TMR0_3_IT_CYC_END); } }