kopia lustrzana https://github.com/OpenRTX/OpenRTX
Keyboard: Manage keyboard status with a queue
rodzic
42ccc3ac28
commit
869cb673b6
|
@ -54,6 +54,11 @@ void create_threads();
|
||||||
|
|
||||||
#define UI_TASK_STKSIZE 4096
|
#define UI_TASK_STKSIZE 4096
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stack size for Keyboard task, in bytes.
|
||||||
|
*/
|
||||||
|
#define KBD_TASK_STKSIZE 128
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stack size for state update task, in bytes.
|
* Stack size for state update task, in bytes.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
/* Mutex for concurrent access to state variable */
|
/* Mutex for concurrent access to state variable */
|
||||||
static OS_MUTEX state_mutex;
|
static OS_MUTEX state_mutex;
|
||||||
|
|
||||||
|
/* Queue for sending and receiving keyboard status */
|
||||||
|
static OS_Q kbd_queue;
|
||||||
|
|
||||||
/**************************** IMPORTANT NOTE ***********************************
|
/**************************** IMPORTANT NOTE ***********************************
|
||||||
* *
|
* *
|
||||||
|
@ -50,6 +52,10 @@ static OS_MUTEX state_mutex;
|
||||||
static OS_TCB ui_tcb;
|
static OS_TCB ui_tcb;
|
||||||
static CPU_STK ui_stk[UI_TASK_STKSIZE/sizeof(CPU_STK)];
|
static CPU_STK ui_stk[UI_TASK_STKSIZE/sizeof(CPU_STK)];
|
||||||
|
|
||||||
|
/* Keyboard task control block and stack */
|
||||||
|
static OS_TCB kbd_tcb;
|
||||||
|
static CPU_STK kbd_stk[KBD_TASK_STKSIZE/4];
|
||||||
|
|
||||||
/* State task control block and stack */
|
/* State task control block and stack */
|
||||||
static OS_TCB state_tcb;
|
static OS_TCB state_tcb;
|
||||||
static CPU_STK state_stk[STATE_TASK_STKSIZE/sizeof(CPU_STK)];
|
static CPU_STK state_stk[STATE_TASK_STKSIZE/sizeof(CPU_STK)];
|
||||||
|
@ -70,9 +76,8 @@ static void ui_task(void *arg)
|
||||||
{
|
{
|
||||||
(void) arg;
|
(void) arg;
|
||||||
OS_ERR os_err;
|
OS_ERR os_err;
|
||||||
|
OS_MSG_SIZE msg_size = 0;
|
||||||
|
|
||||||
// Initialize keyboard
|
|
||||||
kbd_init();
|
|
||||||
// Initialize graphics driver
|
// Initialize graphics driver
|
||||||
gfx_init();
|
gfx_init();
|
||||||
// Initialize user interface
|
// Initialize user interface
|
||||||
|
@ -95,23 +100,19 @@ static void ui_task(void *arg)
|
||||||
state_t last_state = state;
|
state_t last_state = state;
|
||||||
OSMutexPost(&state_mutex, OS_OPT_POST_NONE, &os_err);
|
OSMutexPost(&state_mutex, OS_OPT_POST_NONE, &os_err);
|
||||||
|
|
||||||
keyboard_t last_keys = 0;
|
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
keyboard_t keys = kbd_getKeys();
|
// Read from the keyboard queue (returns 0 if no message is present)
|
||||||
if(keys != last_keys)
|
keyboard_t keys = (keyboard_t)OSQPend(&kbd_queue, 0u, OS_OPT_PEND_NON_BLOCKING,
|
||||||
{
|
&msg_size, 0u, &os_err);
|
||||||
last_keys = keys;
|
if(msg_size != 0) printf("msg size:%d\n", msg_size);
|
||||||
}
|
// Lock mutex, read and update state
|
||||||
|
|
||||||
OSMutexPend(&state_mutex, 0u, OS_OPT_PEND_BLOCKING, 0u, &os_err);
|
OSMutexPend(&state_mutex, 0u, OS_OPT_PEND_BLOCKING, 0u, &os_err);
|
||||||
|
|
||||||
// React to keypresses and update FSM inside state
|
// React to keypresses and update FSM inside state
|
||||||
ui_updateFSM(last_state, keys);
|
ui_updateFSM(last_state, keys);
|
||||||
// Update state local copy
|
// Update state local copy
|
||||||
last_state = state;
|
last_state = state;
|
||||||
|
// Unlock mutex
|
||||||
OSMutexPost(&state_mutex, OS_OPT_POST_NONE, &os_err);
|
OSMutexPost(&state_mutex, OS_OPT_POST_NONE, &os_err);
|
||||||
|
|
||||||
// Redraw GUI
|
// Redraw GUI
|
||||||
|
@ -128,6 +129,36 @@ static void ui_task(void *arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \internal Task function for reading and sending keyboard status.
|
||||||
|
*/
|
||||||
|
static void kbd_task(void *arg)
|
||||||
|
{
|
||||||
|
(void) arg;
|
||||||
|
OS_ERR os_err;
|
||||||
|
|
||||||
|
// Initialize keyboard driver
|
||||||
|
kbd_init();
|
||||||
|
// Initialize previous keyboard status
|
||||||
|
keyboard_t last_keys = 0;
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
keyboard_t keys = kbd_getKeys();
|
||||||
|
// Compare current keyboard state with previous state
|
||||||
|
if(keys != last_keys)
|
||||||
|
{
|
||||||
|
// Save current keyboard state
|
||||||
|
last_keys = keys;
|
||||||
|
// Send keyboard status in queue
|
||||||
|
OSQPost(&kbd_queue, (void *)keys, sizeof(keyboard_t),
|
||||||
|
OS_OPT_POST_FIFO + OS_OPT_POST_NO_SCHED, &os_err);
|
||||||
|
}
|
||||||
|
// Read keyboard state at 10Hz
|
||||||
|
OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &os_err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \internal Task function in charge of updating the radio state.
|
* \internal Task function in charge of updating the radio state.
|
||||||
*/
|
*/
|
||||||
|
@ -196,6 +227,12 @@ void create_threads()
|
||||||
(CPU_CHAR *) "State Mutex",
|
(CPU_CHAR *) "State Mutex",
|
||||||
(OS_ERR *) &os_err);
|
(OS_ERR *) &os_err);
|
||||||
|
|
||||||
|
// Create keyboard queue
|
||||||
|
OSQCreate((OS_Q *) &kbd_queue,
|
||||||
|
(CPU_CHAR *) "Keyboard Queue",
|
||||||
|
(OS_MSG_QTY ) 10,
|
||||||
|
(OS_ERR *) &os_err);
|
||||||
|
|
||||||
// State initialization, execute before starting all tasks
|
// State initialization, execute before starting all tasks
|
||||||
state_init();
|
state_init();
|
||||||
|
|
||||||
|
@ -214,6 +251,21 @@ void create_threads()
|
||||||
(OS_OPT ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
|
(OS_OPT ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
|
||||||
(OS_ERR *) &os_err);
|
(OS_ERR *) &os_err);
|
||||||
|
|
||||||
|
// Create Keyboard thread
|
||||||
|
OSTaskCreate((OS_TCB *) &kbd_tcb,
|
||||||
|
(CPU_CHAR *) "Keyboard Task",
|
||||||
|
(OS_TASK_PTR ) kbd_task,
|
||||||
|
(void *) 0,
|
||||||
|
(OS_PRIO ) 20,
|
||||||
|
(CPU_STK *) &kbd_stk[0],
|
||||||
|
(CPU_STK ) 0,
|
||||||
|
(CPU_STK_SIZE) KBD_TASK_STKSIZE/4,
|
||||||
|
(OS_MSG_QTY ) 0,
|
||||||
|
(OS_TICK ) 0,
|
||||||
|
(void *) 0,
|
||||||
|
(OS_OPT ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
|
||||||
|
(OS_ERR *) &os_err);
|
||||||
|
|
||||||
// Create state thread
|
// Create state thread
|
||||||
OSTaskCreate((OS_TCB *) &state_tcb,
|
OSTaskCreate((OS_TCB *) &state_tcb,
|
||||||
(CPU_CHAR *) "State Task",
|
(CPU_CHAR *) "State Task",
|
||||||
|
|
Ładowanie…
Reference in New Issue