event: support switching between keyboard and uart RX
This commit is contained in:
parent
fd00b7854b
commit
a83a8819c8
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue