From 4048983ce54252008578043e306e131dde7171a0 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 21 Jan 2022 11:18:27 +0100 Subject: [PATCH] Add a "No SD card" screen on boot (#1451) This prevents certain issues related to SD card being now mandatory to run EdgeTx. --- .../src/gui/common/stdlcd/draw_functions.cpp | 34 +++++++++++++++++++ radio/src/gui/common/stdlcd/draw_functions.h | 2 ++ radio/src/opentx.cpp | 15 +++++--- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index 4004f512d..e7e8aca13 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -575,3 +575,37 @@ void drawSourceValue(coord_t x, coord_t y, source_t source, LcdFlags flags) getvalue_t value = getValue(source); drawSourceCustomValue(x, y, source, value, flags); } + +void drawFatalErrorScreen(const char * message) +{ + lcdClear(); + lcdDrawText((LCD_W - getTextWidth(message, 0, DBLSIZE)) / 2, + LCD_H/2 - FH, message, DBLSIZE); + WDG_RESET(); + lcdRefresh(); + lcdRefreshWait(); +} + +void runFatalErrorScreen(const char * message) +{ + while (true) { + backlightEnable(); + drawFatalErrorScreen(message); + + uint8_t refresh = false; + while (true) { + uint32_t pwr_check = pwrCheck(); + if (pwr_check == e_power_off) { + boardOff(); + return; // only happens in SIMU, required for proper shutdown + } + else if (pwr_check == e_power_press) { + refresh = true; + } + else if (pwr_check == e_power_on && refresh) { + break; + } + WDG_RESET(); + } + } +} diff --git a/radio/src/gui/common/stdlcd/draw_functions.h b/radio/src/gui/common/stdlcd/draw_functions.h index 5ae6f4372..d0c15f09f 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.h +++ b/radio/src/gui/common/stdlcd/draw_functions.h @@ -44,6 +44,8 @@ void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att = 0); void drawStartupAnimation(uint32_t duration, uint32_t totalDuration); void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message); void drawSleepBitmap(); +void drawFatalErrorScreen(const char * message); +void runFatalErrorScreen(const char * message); void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0); void drawTrimMode(coord_t x, coord_t y, uint8_t flightMode, uint8_t idx, LcdFlags att=0); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 51ea419fa..9a66bc08d 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1824,6 +1824,13 @@ void opentxInit() if (!sdMounted()) sdInit(); +#if !defined(COLORLCD) + if (!sdMounted()) { + g_eeGeneral.pwrOffSpeed = 2; + runFatalErrorScreen(STR_NO_SDCARD); + } +#endif + #if defined(AUTOUPDATE) sportStopSendByteLoop(); if (f_stat(AUTOUPDATE_FILENAME, nullptr) == FR_OK) { @@ -2005,12 +2012,12 @@ int main() } #endif -#if !defined(EEPROM) - if (!SD_CARD_PRESENT() && !UNEXPECTED_SHUTDOWN()) { - // TODO: b/w SD card fatal screen #if defined(COLORLCD) + // SD_CARD_PRESENT() does not work properly on most + // B&W targets, so that we need to delay the detection + // until the SD card is mounted (requires RTOS scheduler running) + if (!SD_CARD_PRESENT() && !UNEXPECTED_SHUTDOWN()) { runFatalErrorScreen(STR_NO_SDCARD); -#endif } #endif