diff --git a/openrtx/include/state.h b/openrtx/include/state.h index e66635bd..fdfe7d96 100644 --- a/openrtx/include/state.h +++ b/openrtx/include/state.h @@ -52,6 +52,8 @@ typedef struct uint8_t rtxStatus; uint8_t sqlLevel; uint8_t voxLevel; + + bool emergency; } state_t; diff --git a/openrtx/include/ui.h b/openrtx/include/ui.h index e0706314..8d36e4ba 100644 --- a/openrtx/include/ui.h +++ b/openrtx/include/ui.h @@ -39,7 +39,8 @@ enum uiScreen MENU_CONTACTS, MENU_SMS, MENU_GPS, - MENU_SETTINGS + MENU_SETTINGS, + LOW_BAT }; /** diff --git a/openrtx/src/main.c b/openrtx/src/main.c index 39f0314b..b2c73d6d 100644 --- a/openrtx/src/main.c +++ b/openrtx/src/main.c @@ -28,28 +28,6 @@ #include #include -/* If battery level is below 0% draw low battery screen, wait and shutdown */ -void check_battery() -{ - OS_ERR os_err; - - // Check battery percentage - float vbat = platform_getVbat(); - float charge = battery_getCharge(vbat); - - // Draw low battery screen - if (charge <= 0) - { - ui_drawLowBatteryScreen(); - gfx_render(); - - // Wait 5 seconds - OSTimeDlyHMSM(0u, 0u, 5u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err); - - // TODO: Shut down radio unless a button is pressed - } -} - int main(void) { OS_ERR os_err; @@ -63,9 +41,6 @@ int main(void) // Initialize user interface ui_init(); - // Check if battery has enough charge to operate - check_battery(); - // Display splash screen ui_drawSplashScreen(); gfx_render(); @@ -83,7 +58,7 @@ int main(void) // Auxiliary functions loop while(true) { - check_battery(); - OSTimeDlyHMSM(0u, 1u, 0u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err); + // No low-frequency function at the moment + OSTaskSuspend(NULL, &os_err); } } diff --git a/openrtx/src/state.c b/openrtx/src/state.c index 1c4bddad..8fe80e21 100644 --- a/openrtx/src/state.c +++ b/openrtx/src/state.c @@ -44,4 +44,6 @@ void state_init() state.rtxStatus = RTX_OFF; state.sqlLevel = 0; state.voxLevel = 0; + + state.emergency = false; } diff --git a/openrtx/src/ui.c b/openrtx/src/ui.c index d4ce74a1..831af042 100644 --- a/openrtx/src/ui.c +++ b/openrtx/src/ui.c @@ -354,7 +354,7 @@ void ui_drawSplashScreen() #endif } -void ui_drawLowBatteryScreen() +bool _ui_drawLowBatteryScreen() { gfx_clearScreen(); uint16_t bat_width = SCREEN_WIDTH / 2; @@ -375,10 +375,23 @@ void ui_drawLowBatteryScreen() FONT_SIZE_6PT, TEXT_ALIGN_CENTER, color_white); + return true; } void ui_updateFSM(event_t event) { + // Check if battery has enough charge to operate + float charge = battery_getCharge(state.v_bat); + if (!state.emergency && charge <= 0) + { + state.ui_screen = LOW_BAT; + if(event.type == EVENT_KBD && event.payload) { + state.ui_screen = MAIN_VFO; + state.emergency = true; + } + return; + } + // Process pressed keys if(event.type == EVENT_KBD) { @@ -440,6 +453,10 @@ bool ui_updateGUI(state_t last_state) case MENU_TOP: screen_update = _ui_drawMenuTop(); break; + // Low battery screen + case LOW_BAT: + screen_update = _ui_drawLowBatteryScreen(); + break; } return screen_update; }