void kbd_event_set_key(struct rtgui_event_kbd *ekbd, rt_uint16_t key) { RTGUI_EVENT_KBD_INIT(ekbd); ekbd->mod = RTGUI_KMOD_NONE; ekbd->unicode = 0; ekbd->key = key; ekbd->type = RTGUI_KEYDOWN; }
void rtgui_server_handle_kbd(struct rtgui_event_kbd *event) { struct rtgui_topwin *wnd; /* re-init to server thread */ RTGUI_EVENT_KBD_INIT(event); /* todo: handle input method and global shortcut */ wnd = rtgui_topwin_get_focus(); if (wnd != RT_NULL) { RT_ASSERT(wnd->flag & WINTITLE_ACTIVATE) /* send to focus window */ event->wid = wnd->wid; /* send keyboard event to thread */ rtgui_send(wnd->tid, (struct rtgui_event *)event, sizeof(struct rtgui_event_kbd)); return; } }
static void key_thread_entry(void *parameter) { #ifdef RT_USING_RTGUI rt_time_t next_delay; rt_uint8_t i; struct rtgui_event_kbd kbd_event; key_io_init(); /* init keyboard event */ RTGUI_EVENT_KBD_INIT(&kbd_event); kbd_event.mod = RTGUI_KMOD_NONE; kbd_event.unicode = 0; while (1) { next_delay = RT_TICK_PER_SECOND/10; kbd_event.key = RTGUIK_UNKNOWN; kbd_event.type = RTGUI_KEYDOWN; if (KEY_ENTER_GETVALUE() == 0 ) { for(i=0; ; i++) { rt_thread_delay( next_delay ); if (KEY_ENTER_GETVALUE() == 0) { if (i>=4) { /* HOME key */ kbd_event.key = RTGUIK_HOME; next_delay = RT_TICK_PER_SECOND/5; break; } } else { kbd_event.key = RTGUIK_RETURN; break; } } } if (KEY_DOWN_GETVALUE() == 0) { kbd_event.key = RTGUIK_DOWN; } if (KEY_UP_GETVALUE() == 0) { kbd_event.key = RTGUIK_UP; } if (KEY_RIGHT_GETVALUE() == 0) { kbd_event.key = RTGUIK_RIGHT; } if (KEY_LEFT_GETVALUE() == 0) { kbd_event.key = RTGUIK_LEFT; } if (kbd_event.key != RTGUIK_UNKNOWN) { /* post down event */ rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); } else { kbd_event.type = RTGUI_KEYUP; rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); } /* wait next key press */ rt_thread_delay(next_delay); } #else extern struct rt_messagequeue mq; rt_time_t next_delay; struct lcd_msg msg; msg.type = KEY_MSG; key_io_init(); while (1) { msg.key = NO_KEY; next_delay = RT_TICK_PER_SECOND/10; if (KEY_ENTER_GETVALUE() == 0 ) { msg.key = KEY_ENTER; } if (KEY_DOWN_GETVALUE() == 0) { msg.key = KEY_DOWN; } if (KEY_UP_GETVALUE() == 0) { msg.key = KEY_UP; } if (KEY_RIGHT_GETVALUE() == 0) { msg.key = KEY_RIGHT; } if (KEY_LEFT_GETVALUE() == 0) { msg.key = KEY_LEFT; } rt_mq_send(&mq, &msg, sizeof(msg)); /* wait next key press */ rt_thread_delay(next_delay); } #endif }
static void key_thread_entry(void *parameter) { rt_time_t next_delay; struct rtgui_event_kbd kbd_event; GPIO_Configuration(); // EXTI_Configuration(); // NVIC_Configuration(); /* init keyboard event */ RTGUI_EVENT_KBD_INIT(&kbd_event); kbd_event.wid = RT_NULL; kbd_event.mod = RTGUI_KMOD_NONE; kbd_event.unicode = 0; while (1) { next_delay = 10; kbd_event.key = RTGUIK_UNKNOWN; kbd_event.type = RTGUI_KEYDOWN; if ( key_enter_GETVALUE() == 1 ) { rt_thread_delay( next_delay*4 ); if (key_enter_GETVALUE() == 1) { /* HOME key */ rt_kprintf("key_home\n"); kbd_event.key = RTGUIK_HOME; } else { rt_kprintf("key_enter\n"); kbd_event.key = RTGUIK_RETURN; } } if ( key_up_GETVALUE() == 1 ) { rt_kprintf("key_up\n"); kbd_event.key = RTGUIK_UP; } if ( key_down_GETVALUE() == 1 ) { rt_kprintf("key_down\n"); kbd_event.key = RTGUIK_DOWN; } if ( key_left_GETVALUE() == 1 ) { rt_kprintf("key_left\n"); kbd_event.key = RTGUIK_LEFT; } if ( key_right_GETVALUE() == 1 ) { rt_kprintf("key_right\n"); kbd_event.key = RTGUIK_RIGHT; } if(key_stop_GETVALUE() == 1) { rt_kprintf("key_stop\n"); } if(key_menu_GETVALUE() == 1) { rt_kprintf("key_menu\n"); } if (kbd_event.key != RTGUIK_UNKNOWN) { /* post down event */ rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); next_delay = 10; /* delay to post up event */ rt_thread_delay(next_delay); /* post up event */ kbd_event.type = RTGUI_KEYUP; rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); } /* wait next key press */ rt_thread_delay(next_delay); } }