Add initial events implementation

replace/bab21e6b7556c7d2fa1a3bae1ce7532390bd7edb
Federico Amedeo Izzo 2020-12-03 23:34:37 +01:00
rodzic 41ecb11d3a
commit 3e461e6b80
2 zmienionych plików z 64 dodań i 13 usunięć

Wyświetl plik

@ -0,0 +1,49 @@
/***************************************************************************
* Copyright (C) 2020 by Federico Amedeo Izzo IU2NUO, *
* Niccolò Izzo IU2KIN, *
* Silvano Seva IU2KWO *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#ifndef EVENT_H
#define EVENT_H
/**
* This enum describes the event message type:
* - EVENT_KBD is used to send a keypress
* - EVENT_STATUS is used to send a status change notification
*/
enum eventType_t
{
EVENT_KBD = 0,
EVENT_STATUS = 1
};
/**
* The event message is constrained to 32 bits size
* This is necessary to send event messages in uC OS/III Queues
* That accept a void * type message, which is 32-bits wide on
* ARM cortex-M MCUs
* uC OS/III Queues are meant to send pointer to allocated data
* But if we keep the size under 32 bits, we can sent the
* entire message, casting it to a void * pointer.
*/
typedef struct
{
uint32_t type : 3,
uint32_t payload : 29
}event_t;
#endif /* EVENT_H */

Wyświetl plik

@ -26,6 +26,7 @@
#include <graphics.h>
#include <platform.h>
#include <hwconfig.h>
#include <events.h>
#include <stdio.h>
@ -33,7 +34,7 @@
static OS_MUTEX state_mutex;
/* Queue for sending and receiving keyboard status */
static OS_Q kbd_queue;
static OS_Q ui_queue;
/**************************** IMPORTANT NOTE ***********************************
* *
@ -103,20 +104,19 @@ static void ui_task(void *arg)
while(1)
{
// Read from the keyboard queue (returns 0 if no message is present)
void * msg = OSQPend(&kbd_queue, 0u, OS_OPT_PEND_NON_BLOCKING,
&msg_size, 0u, &os_err);
// Copy keyboard_t keys from received void * pointer msg
keyboard_t keys = msg;
// Lock mutex, read and update state
event_t event = OSQPend(&ui_queue, 0u, OS_OPT_PEND_NON_BLOCKING,
&msg_size, 0u, &os_err);
// Lock mutex, read and write state
OSMutexPend(&state_mutex, 0u, OS_OPT_PEND_BLOCKING, 0u, &os_err);
// React to keypresses and update FSM inside state
ui_updateFSM(last_state, keys);
ui_updateFSM(last_state, event);
// Update state local copy
last_state = state;
// Unlock mutex
OSMutexPost(&state_mutex, OS_OPT_POST_NONE, &os_err);
// Redraw GUI
// Redraw GUI based on last state copy
bool renderNeeded = ui_updateGUI(last_state);
if(renderNeeded)
@ -147,10 +147,12 @@ static void kbd_task(void *arg)
// Check if some key is pressed
if(keys != 0)
{
// Copy keyboard_t keys in void * message to use with OSQPost
void * msg = keys;
// Send event_t as void * message to use with OSQPost
event_t kbd_msg;
kbd_msg.type = EVENT_KBD;
kbd_msg.payload = keys;
// Send keyboard status in queue
OSQPost(&kbd_queue, msg, sizeof(keyboard_t),
OSQPost(&ui_queue, (void *)kbd_msg, sizeof(event_t),
OS_OPT_POST_FIFO + OS_OPT_POST_NO_SCHED, &os_err);
}
// Read keyboard state at 5Hz
@ -226,9 +228,9 @@ void create_threads()
(CPU_CHAR *) "State Mutex",
(OS_ERR *) &os_err);
// Create keyboard queue
OSQCreate((OS_Q *) &kbd_queue,
(CPU_CHAR *) "Keyboard Queue",
// Create UI event queue
OSQCreate((OS_Q *) &ui_queue,
(CPU_CHAR *) "UI event queue",
(OS_MSG_QTY ) 10,
(OS_ERR *) &os_err);