diff --git a/openrtx/include/interfaces/state.h b/openrtx/include/interfaces/state.h
index 8ab6cd29..6df13fd5 100644
--- a/openrtx/include/interfaces/state.h
+++ b/openrtx/include/interfaces/state.h
@@ -64,6 +64,11 @@ typedef struct state_t {
*/
void state_init();
+/**
+ * This function is the entry point of the state thread
+ */
+void state_main();
+
/**
* This function updates the state information by sourcing the
* updated values of the various fields of the state_t struct
diff --git a/openrtx/include/interfaces/ui.h b/openrtx/include/interfaces/ui.h
index 29508b5a..45a3ad57 100644
--- a/openrtx/include/interfaces/ui.h
+++ b/openrtx/include/interfaces/ui.h
@@ -30,6 +30,11 @@
*/
void ui_init();
+/**
+ * This function is the entry point of the UI thread
+ */
+void ui_main();
+
/**
* This function advances the User Interface FSM, basing on the
* current radio state and the keys pressed.
diff --git a/openrtx/src/main.c b/openrtx/src/main.c
index 26b2ab36..630bcd45 100644
--- a/openrtx/src/main.c
+++ b/openrtx/src/main.c
@@ -1,5 +1,7 @@
/***************************************************************************
- * Copyright (C) 2020 by Federico Izzo IU2NUO, Niccolò Izzo IU2KIN and *
+ * Copyright (C) 2020 by Federico Amedeo Izzo IU2NUO, *
+ * Niccolò Izzo IU2KIN *
+ * Frederik Saraci IU2NRO *
* Silvano Seva IU2KWO *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -16,56 +18,157 @@
* along with this program; if not, see *
***************************************************************************/
-#include
-#include
#include
+#include
#include
-#include "gpio.h"
-#include "graphics.h"
-#include "hwconfig.h"
-#include "platform.h"
+#include "delays.h"
#include "state.h"
-#include "keyboard.h"
#include "ui.h"
+// Allocate UI thread task control block and stack
+static OS_TCB ui_tcb;
+static CPU_STK_SIZE ui_stk[128];
+static void ui_task(void *arg);
-int main(void)
+// Allocate state thread task control block and stack
+static OS_TCB state_tcb;
+static CPU_STK_SIZE state_stk[128];
+static void state_task(void *arg);
+
+// Allocate rtx radio thread task control block and stack
+static OS_TCB rtx_tcb;
+static CPU_STK_SIZE rtx_stk[128];
+static void rtx_task(void *arg);
+
+// Allocate dmr radio thread task control block and stack
+static OS_TCB dmr_tcb;
+static CPU_STK_SIZE dmr_stk[128];
+static void dmr_task(void *arg);
+
+
+void create_threads()
{
OS_ERR os_err;
+ // Create UI thread
+ OSTaskCreate((OS_TCB *)&ui_tcb,
+ (CPU_CHAR *)" ",
+ (OS_TASK_PTR ) ui_task,
+ (void *) 0,
+ (OS_PRIO ) 5,
+ (CPU_STK *)&ui_stk[0],
+ (CPU_STK ) 0,
+ (CPU_STK_SIZE) 128,
+ (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
+ OSTaskCreate((OS_TCB *)&state_tcb,
+ (CPU_CHAR *)" ",
+ (OS_TASK_PTR ) state_task,
+ (void *) 0,
+ (OS_PRIO ) 5,
+ (CPU_STK *)&state_stk[0],
+ (CPU_STK ) 0,
+ (CPU_STK_SIZE) 128,
+ (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 rtx radio thread
+ OSTaskCreate((OS_TCB *)&rtx_tcb,
+ (CPU_CHAR *)" ",
+ (OS_TASK_PTR ) rtx_task,
+ (void *) 0,
+ (OS_PRIO ) 5,
+ (CPU_STK *)&rtx_stk[0],
+ (CPU_STK ) 0,
+ (CPU_STK_SIZE) 128,
+ (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 dmr radio thread
+ OSTaskCreate((OS_TCB *)&dmr_tcb,
+ (CPU_CHAR *)" ",
+ (OS_TASK_PTR ) dmr_task,
+ (void *) 0,
+ (OS_PRIO ) 5,
+ (CPU_STK *)&dmr_stk[0],
+ (CPU_STK ) 0,
+ (CPU_STK_SIZE) 128,
+ (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);
+}
+
+int main(void)
+{
// Initialize the radio state
state_init();
- // Init the graphic stack
- gfx_init();
- platform_setBacklightLevel(255);
-
- // Print splash screen
- point_t splash_origin = {0, SCREEN_HEIGHT / 2};
- color_t color_yellow_fab413 = {250, 180, 19};
- char *splash_buf = "OpenRTX";
- gfx_clearScreen();
- gfx_print(splash_origin, splash_buf, FONT_SIZE_4, TEXT_ALIGN_CENTER, color_yellow_fab413);
- gfx_render();
- while(gfx_renderingInProgress());
- OSTimeDlyHMSM(0u, 0u, 1u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err);
+ // Create OpenRTX threads
+ create_threads();
- // Clear screen
- gfx_clearScreen();
- gfx_render();
- while(gfx_renderingInProgress());
+ while(1) ;
+ return 0;
+}
- // UI update infinite loop
+static void ui_task(void *arg)
+{
+ (void) arg;
+ OS_ERR os_err;
while(1)
{
- state_t state = state_update();
- uint32_t keys = kbd_getKeys();
- bool renderNeeded = ui_update(state, keys);
- if(renderNeeded)
- {
- gfx_render();
- while(gfx_renderingInProgress());
- }
- OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &os_err);
+ // Execute UI thread every 33ms to get ~30FPS
+ ui_main();
+ OSTimeDlyHMSM(0u, 0u, 0u, 33u, OS_OPT_TIME_HMSM_STRICT, &os_err);
+ }
+}
+
+static void state_task(void *arg)
+{
+ (void) arg;
+ OS_ERR os_err;
+ while(1)
+ {
+ // Execute state thread every 1s
+ state_main();
+ OSTimeDlyHMSM(0u, 0u, 1u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err);
+ }
+}
+
+static void rtx_task(void *arg)
+{
+ (void) arg;
+ OS_ERR os_err;
+ while(1)
+ {
+ // Execute rtx radio thread every 33ms to match UI refresh
+ //TODO: uncomment after rtx.h merge
+ //rtx_main();
+ OSTimeDlyHMSM(0u, 0u, 0u, 33u, OS_OPT_TIME_HMSM_STRICT, &os_err);
+ }
+}
+
+static void dmr_task(void *arg)
+{
+ (void) arg;
+ OS_ERR os_err;
+ while(1)
+ {
+ // Execute dmr radio thread every 30ms to match DMR timeslot
+ //TODO: uncomment after dmr.h merge
+ //dmr_main();
+ OSTimeDlyHMSM(0u, 0u, 0u, 30u, OS_OPT_TIME_HMSM_STRICT, &os_err);
}
}
diff --git a/openrtx/src/state.c b/openrtx/src/state.c
index 378efea3..30578ebf 100644
--- a/openrtx/src/state.c
+++ b/openrtx/src/state.c
@@ -30,6 +30,10 @@ void state_init()
current_state.tx_freq = 0.0;
}
+void state_main()
+{
+}
+
state_t state_update()
{
return current_state;
diff --git a/openrtx/src/ui.c b/openrtx/src/ui.c
index 64f1e5e5..82dd5306 100644
--- a/openrtx/src/ui.c
+++ b/openrtx/src/ui.c
@@ -1,6 +1,7 @@
/***************************************************************************
* Copyright (C) 2020 by Federico Amedeo Izzo IU2NUO, *
- * Niccolò Izzo IU2KIN, *
+ * Niccolò Izzo IU2KIN *
+ * Frederik Saraci IU2NRO *
* Silvano Seva IU2KWO *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -63,8 +64,11 @@
*/
#include
+#include
#include "ui.h"
#include "graphics.h"
+#include "keyboard.h"
+#include "delays.h"
#include "rtc.h"
#include "platform.h"
#include "hwconfig.h"
@@ -231,6 +235,43 @@ void ui_init()
layout_ready = true;
}
+void ui_main()
+{
+ OS_ERR os_err;
+
+ // Init the graphic stack
+ gfx_init();
+ platform_setBacklightLevel(255);
+
+ // Print splash screen
+ point_t splash_origin = {0, SCREEN_HEIGHT / 2};
+ color_t color_yellow_fab413 = {250, 180, 19};
+ char *splash_buf = "OpenRTX";
+ gfx_clearScreen();
+ gfx_print(splash_origin, splash_buf, FONT_SIZE_4, TEXT_ALIGN_CENTER, color_yellow_fab413);
+ gfx_render();
+ while(gfx_renderingInProgress());
+ OSTimeDlyHMSM(0u, 0u, 1u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err);
+
+ // Clear screen
+ gfx_clearScreen();
+ gfx_render();
+ while(gfx_renderingInProgress());
+
+ // UI update infinite loop
+ while(1)
+ {
+ state_t state = state_update();
+ uint32_t keys = kbd_getKeys();
+ bool renderNeeded = ui_update(state, keys);
+ if(renderNeeded)
+ {
+ gfx_render();
+ while(gfx_renderingInProgress());
+ }
+ OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &os_err);
+ }
+}
bool ui_update(state_t state, uint32_t keys)
{
if(!layout_ready)