event: support switching between keyboard and uart RX

This commit is contained in:
Zihao Yu 2024-01-09 02:34:33 +08:00
parent fd00b7854b
commit a83a8819c8
3 changed files with 17 additions and 8 deletions

View File

@ -3,18 +3,26 @@
extern std::vector<Component *> components;
void uart_rx_getchar(uint8_t ch);
static bool focus_uart_rx_term = false;
static void mousedown_handler(const SDL_Event &ev) {
int x_pos = ev.button.x;
int y_pos = ev.button.y;
bool click_uart_rx_term = false;
for (auto i : components) {
if (i->in_rect(x_pos, y_pos)) {
switch (i->get_component_type()) {
case BUTTON_TYPE: pin_poke(i->get_pin(), 1); break;
case SWITCH_TYPE: pin_poke(i->get_pin(), i->get_state() ^ 1); break;
case UART_TYPE: click_uart_rx_term = true; break;
}
}
}
if (focus_uart_rx_term ^ click_uart_rx_term) {
if (click_uart_rx_term) SDL_StartTextInput();
else SDL_StopTextInput();
focus_uart_rx_term = click_uart_rx_term;
}
}
static void mouseup_handler(const SDL_Event &ev) {
@ -45,11 +53,12 @@ void read_event() {
case SDL_MOUSEBUTTONDOWN: mousedown_handler(ev); break;
case SDL_MOUSEBUTTONUP: mouseup_handler(ev); break;
case SDL_KEYDOWN:
if (ev.key.keysym.sym == SDLK_RETURN) {
if (ev.key.keysym.sym == SDLK_RETURN && focus_uart_rx_term) {
uart_rx_getchar('\n');
}
case SDL_KEYUP:
break; //key_handler(ev.key.keysym.scancode, ev.key.type == SDL_KEYDOWN); break;
case SDL_TEXTINPUT: uart_rx_getchar(ev.text.text[0]); break;
if (!focus_uart_rx_term) key_handler(ev.key.keysym.scancode, ev.key.type == SDL_KEYDOWN);
break;
case SDL_TEXTINPUT: if (focus_uart_rx_term) uart_rx_getchar(ev.text.text[0]); break;
}
}

View File

@ -92,8 +92,6 @@ void nvboard_init(int vga_clk_cycle) {
extern void vga_set_clk_cycle(int cycle);
vga_set_clk_cycle(vga_clk_cycle);
SDL_StartTextInput();
}
void nvboard_quit(){

View File

@ -13,6 +13,11 @@ UART::UART(SDL_Renderer *rend, int cnt, int init_val, int ct, int x, int y, int
tx_state(0), rx_state(0), divisor(16), tx_update_gui(false) {
tx_term = new Term(rend, x, y, w, h);
rx_term = new Term(rend, x, y + h, w, 20);
SDL_Rect *rect_ptr = new SDL_Rect;
*rect_ptr = (SDL_Rect){x, y + h, w, 20};
set_rect(rect_ptr, 0);
uart_divisor_cnt = divisor - 1;
int len = pin_array[UART_TX].vector_len;
assert(len == 0 || len == 1); // either unbound or bound to 1 bit signal
@ -108,9 +113,6 @@ void UART::set_divisor(uint16_t d) {
void init_uart(SDL_Renderer *renderer) {
int x = WINDOW_WIDTH / 2, y = 0, w = WINDOW_WIDTH / 2, h = WINDOW_HEIGHT / 2;
uart = new UART(renderer, 1, 0, UART_TYPE, x, y, w, h);
SDL_Rect *rect_ptr = new SDL_Rect;
*rect_ptr = (SDL_Rect){x, y + h, w, 10};
uart->set_rect(rect_ptr, 0);
uart->add_pin(UART_TX);
uart->add_pin(UART_RX);
add_component(uart);