Added field to state data structure containing the current operating state of the device. Implemented clean shutdown of all the threads.
This commit is contained in:
parent
810daf7599
commit
5f40ceceb3
|
|
@ -46,6 +46,7 @@ m17_t;
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
uint8_t devStatus;
|
||||||
datetime_t time;
|
datetime_t time;
|
||||||
uint16_t v_bat;
|
uint16_t v_bat;
|
||||||
uint8_t charge;
|
uint8_t charge;
|
||||||
|
|
@ -61,12 +62,13 @@ typedef struct
|
||||||
uint16_t bank;
|
uint16_t bank;
|
||||||
uint8_t rtxStatus;
|
uint8_t rtxStatus;
|
||||||
|
|
||||||
bool shutdown;
|
|
||||||
bool emergency;
|
bool emergency;
|
||||||
settings_t settings;
|
settings_t settings;
|
||||||
gps_t gps_data;
|
gps_t gps_data;
|
||||||
bool gps_set_time;
|
bool gps_set_time;
|
||||||
bool gpsDetected;
|
bool gpsDetected;
|
||||||
|
bool backup_eflash;
|
||||||
|
bool restore_eflash;
|
||||||
m17_t m17_data;
|
m17_t m17_data;
|
||||||
}
|
}
|
||||||
state_t;
|
state_t;
|
||||||
|
|
@ -86,6 +88,15 @@ enum RtxStatus
|
||||||
RTX_TX
|
RTX_TX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum DeviceStatus
|
||||||
|
{
|
||||||
|
PWROFF = 0,
|
||||||
|
STARTUP,
|
||||||
|
RUNNING,
|
||||||
|
DATATRANSFER,
|
||||||
|
SHUTDOWN
|
||||||
|
};
|
||||||
|
|
||||||
extern state_t state;
|
extern state_t state;
|
||||||
extern pthread_mutex_t state_mutex;
|
extern pthread_mutex_t state_mutex;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ extern void *dev_task(void *arg);
|
||||||
|
|
||||||
void openrtx_init()
|
void openrtx_init()
|
||||||
{
|
{
|
||||||
|
state.devStatus = STARTUP;
|
||||||
|
|
||||||
platform_init(); // Initialize low-level platform drivers
|
platform_init(); // Initialize low-level platform drivers
|
||||||
state_init(); // Initialize radio state
|
state_init(); // Initialize radio state
|
||||||
|
|
||||||
|
|
@ -47,20 +49,29 @@ void openrtx_init()
|
||||||
sleepFor(0u, 30u);
|
sleepFor(0u, 30u);
|
||||||
platform_setBacklightLevel(state.settings.brightness);
|
platform_setBacklightLevel(state.settings.brightness);
|
||||||
|
|
||||||
// Detect and initialise GPS
|
|
||||||
#if defined(GPS_PRESENT)
|
#if defined(GPS_PRESENT)
|
||||||
|
// Detect and initialise GPS
|
||||||
state.gpsDetected = gps_detect(1000);
|
state.gpsDetected = gps_detect(1000);
|
||||||
if(state.gpsDetected) gps_init(9600);
|
if(state.gpsDetected) gps_init(9600);
|
||||||
|
#else
|
||||||
|
// Keep the splash screen for 1 second
|
||||||
|
sleepFor(1u, 0u);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void *openrtx_run()
|
void *openrtx_run()
|
||||||
{
|
{
|
||||||
|
state.devStatus = RUNNING;
|
||||||
|
|
||||||
// Start the OpenRTX threads
|
// Start the OpenRTX threads
|
||||||
create_threads();
|
create_threads();
|
||||||
|
|
||||||
// Jump to the device management task
|
// Jump to the device management task
|
||||||
dev_task(NULL);
|
dev_task(NULL);
|
||||||
|
|
||||||
|
// Device task terminated, complete shutdown sequence
|
||||||
|
state_terminate();
|
||||||
|
platform_terminate();
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,6 @@ void state_init()
|
||||||
state.channel_index = 1; // Set default channel index (it is 1-based)
|
state.channel_index = 1; // Set default channel index (it is 1-based)
|
||||||
state.bank_enabled = false;
|
state.bank_enabled = false;
|
||||||
state.rtxStatus = RTX_OFF;
|
state.rtxStatus = RTX_OFF;
|
||||||
state.shutdown = false;
|
|
||||||
state.emergency = false;
|
state.emergency = false;
|
||||||
|
|
||||||
// Force brightness field to be in range 0 - 100
|
// Force brightness field to be in range 0 - 100
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <utils.h>
|
#include <utils.h>
|
||||||
#include <input.h>
|
#include <input.h>
|
||||||
|
#include <backup.h>
|
||||||
#ifdef GPS_PRESENT
|
#ifdef GPS_PRESENT
|
||||||
#include <interfaces/gps.h>
|
#include <interfaces/gps.h>
|
||||||
#include <gps.h>
|
#include <gps.h>
|
||||||
|
|
@ -48,31 +49,25 @@ void *ui_task(void *arg)
|
||||||
{
|
{
|
||||||
(void) arg;
|
(void) arg;
|
||||||
|
|
||||||
|
event_t kbd_event = {{EVENT_KBD, 0}};
|
||||||
kbd_msg_t kbd_msg;
|
kbd_msg_t kbd_msg;
|
||||||
rtxStatus_t rtx_cfg;
|
rtxStatus_t rtx_cfg;
|
||||||
bool sync_rtx = true;
|
bool sync_rtx = true;
|
||||||
long long time = 0;
|
long long time = 0;
|
||||||
|
|
||||||
// Keep the splash screen for 1 second
|
|
||||||
sleepFor(1u, 0u);
|
|
||||||
|
|
||||||
// Load initial state and perform a GUI draw
|
// Load initial state and perform a GUI draw
|
||||||
ui_saveState();
|
ui_saveState();
|
||||||
ui_updateGUI();
|
ui_updateGUI();
|
||||||
gfx_render();
|
gfx_render();
|
||||||
|
|
||||||
while(1)
|
while(state.devStatus != SHUTDOWN)
|
||||||
{
|
{
|
||||||
time = getTick();
|
time = getTick();
|
||||||
|
|
||||||
// Scan keyboard
|
if(input_scanKeyboard(&kbd_msg))
|
||||||
bool kbd_event = input_scanKeyboard(&kbd_msg);
|
|
||||||
if(kbd_event)
|
|
||||||
{
|
{
|
||||||
event_t event;
|
kbd_event.payload = kbd_msg.value;
|
||||||
event.type = EVENT_KBD;
|
ui_pushEvent(kbd_event);
|
||||||
event.payload = kbd_msg.value;
|
|
||||||
ui_pushEvent(event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&state_mutex); // Lock r/w access to radio state
|
pthread_mutex_lock(&state_mutex); // Lock r/w access to radio state
|
||||||
|
|
@ -115,6 +110,11 @@ void *ui_task(void *arg)
|
||||||
time += 25;
|
time += 25;
|
||||||
sleepUntil(time);
|
sleepUntil(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui_terminate();
|
||||||
|
gfx_terminate();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -128,17 +128,47 @@ void *dev_task(void *arg)
|
||||||
long long time = 0;
|
long long time = 0;
|
||||||
uint8_t tick_5ms = 0;
|
uint8_t tick_5ms = 0;
|
||||||
|
|
||||||
while(state.shutdown == false)
|
while(state.devStatus != SHUTDOWN)
|
||||||
{
|
{
|
||||||
time = getTick();
|
time = getTick();
|
||||||
tick_5ms++;
|
tick_5ms++;
|
||||||
|
|
||||||
|
// Check if power off is requested
|
||||||
|
pthread_mutex_lock(&state_mutex);
|
||||||
|
if(platform_pwrButtonStatus() == false)
|
||||||
|
state.devStatus = SHUTDOWN;
|
||||||
|
pthread_mutex_unlock(&state_mutex);
|
||||||
|
|
||||||
|
// Handle external flash backup/restore
|
||||||
|
#if !defined(PLATFORM_LINUX) && !defined(PLATFORM_MOD17)
|
||||||
|
if(state.backup_eflash)
|
||||||
|
{
|
||||||
|
eflash_dump();
|
||||||
|
|
||||||
|
pthread_mutex_lock(&state_mutex);
|
||||||
|
state.backup_eflash = false;
|
||||||
|
state.devStatus = SHUTDOWN;
|
||||||
|
pthread_mutex_unlock(&state_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(state.restore_eflash)
|
||||||
|
{
|
||||||
|
eflash_restore();
|
||||||
|
|
||||||
|
pthread_mutex_lock(&state_mutex);
|
||||||
|
state.restore_eflash = false;
|
||||||
|
state.devStatus = SHUTDOWN;
|
||||||
|
pthread_mutex_unlock(&state_mutex);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Run GPS task
|
||||||
#if defined(GPS_PRESENT) && !defined(MD3x0_ENABLE_DBG)
|
#if defined(GPS_PRESENT) && !defined(MD3x0_ENABLE_DBG)
|
||||||
if(state.gpsDetected)
|
if(state.gpsDetected)
|
||||||
gps_taskFunc();
|
gps_taskFunc();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Update radio state and push an event to the UI every 100ms
|
// Update radio state every 100ms
|
||||||
if((tick_5ms % 20) == 0)
|
if((tick_5ms % 20) == 0)
|
||||||
{
|
{
|
||||||
state_update();
|
state_update();
|
||||||
|
|
@ -170,7 +200,7 @@ void *rtx_task(void *arg)
|
||||||
|
|
||||||
rtx_init(&rtx_mutex);
|
rtx_init(&rtx_mutex);
|
||||||
|
|
||||||
while(state.shutdown == false)
|
while(state.devStatus == RUNNING)
|
||||||
{
|
{
|
||||||
rtx_taskFunc();
|
rtx_taskFunc();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -936,15 +936,6 @@ void ui_saveState()
|
||||||
|
|
||||||
void ui_updateFSM(bool *sync_rtx)
|
void ui_updateFSM(bool *sync_rtx)
|
||||||
{
|
{
|
||||||
// User wants to power off the radio, so shutdown.
|
|
||||||
if(!platform_pwrButtonStatus())
|
|
||||||
{
|
|
||||||
state.shutdown = true;
|
|
||||||
state_terminate();
|
|
||||||
platform_terminate();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for events
|
// Check for events
|
||||||
if(evQueue_wrPos == evQueue_rdPos) return;
|
if(evQueue_wrPos == evQueue_rdPos) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <backup.h>
|
|
||||||
#include <utils.h>
|
#include <utils.h>
|
||||||
#include <ui.h>
|
#include <ui.h>
|
||||||
#include <interfaces/nvmem.h>
|
#include <interfaces/nvmem.h>
|
||||||
|
|
@ -464,18 +463,8 @@ void _ui_drawMenuBackup(ui_state_t* ui_state)
|
||||||
gfx_print(line, FONT_SIZE_8PT, TEXT_ALIGN_CENTER,
|
gfx_print(line, FONT_SIZE_8PT, TEXT_ALIGN_CENTER,
|
||||||
color_white, "press PTT to start.");
|
color_white, "press PTT to start.");
|
||||||
|
|
||||||
// Shutdown all the other parts
|
state.devStatus = DATATRANSFER;
|
||||||
state.shutdown = true;
|
state.backup_eflash = true;
|
||||||
|
|
||||||
if(platform_getPttStatus() == 1)
|
|
||||||
{
|
|
||||||
platform_ledOn(GREEN);
|
|
||||||
#if !defined(PLATFORM_LINUX) && !defined(PLATFORM_MOD17)
|
|
||||||
eflash_dump();
|
|
||||||
platform_terminate();
|
|
||||||
NVIC_SystemReset();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _ui_drawMenuRestore(ui_state_t* ui_state)
|
void _ui_drawMenuRestore(ui_state_t* ui_state)
|
||||||
|
|
@ -497,18 +486,8 @@ void _ui_drawMenuRestore(ui_state_t* ui_state)
|
||||||
gfx_print(line, FONT_SIZE_8PT, TEXT_ALIGN_CENTER,
|
gfx_print(line, FONT_SIZE_8PT, TEXT_ALIGN_CENTER,
|
||||||
color_white, "press PTT to start.");
|
color_white, "press PTT to start.");
|
||||||
|
|
||||||
// Shutdown all the other parts
|
state.devStatus = DATATRANSFER;
|
||||||
state.shutdown = true;
|
state.restore_eflash = true;
|
||||||
|
|
||||||
if(platform_getPttStatus() == 1)
|
|
||||||
{
|
|
||||||
platform_ledOn(GREEN);
|
|
||||||
#if !defined(PLATFORM_LINUX) && !defined(PLATFORM_MOD17)
|
|
||||||
eflash_restore();
|
|
||||||
platform_terminate();
|
|
||||||
NVIC_SystemReset();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _ui_drawMenuInfo(ui_state_t* ui_state)
|
void _ui_drawMenuInfo(ui_state_t* ui_state)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue