fix fatal error screens with LVGL

This commit is contained in:
gagarinlg
2022-06-11 15:38:08 +02:00
committed by Raphael Coeffic
parent 40641e5787
commit 809480bc6a
3 changed files with 72 additions and 8 deletions
+59 -7
View File
@@ -22,6 +22,7 @@
#include "opentx.h"
#include "lcd.h"
#include "theme_manager.h"
#include "libopenui.h"
coord_t drawStringWithIndex(BitmapBuffer * dc, coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix)
{
@@ -124,6 +125,7 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration,
static const BitmapBuffer* shutdown = OpenTxTheme::instance()->shutdown;
lcd->reset();
lcdInitDirectDrawing();
lcd->clear(bgColor);
if (shutdown) {
@@ -163,21 +165,71 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration,
lcdRefresh();
}
class FatalErrorScreen: public FormGroup
{
public:
FatalErrorScreen(const std::string& message):
FormGroup(MainWindow::instance(), {0, 0, LCD_W, LCD_H}, OPAQUE | FORM_NO_BORDER),
message(std::move(message))
{
Layer::push(this);
bringToTop();
setFocus(SET_FOCUS_DEFAULT);
}
#if defined(DEBUG_WINDOWS)
std::string getName() const override
{
return "FatalErrorScreen";
}
#endif
void paint(BitmapBuffer * dc) override
{
dc->clear(COLOR2FLAGS(BLACK));
dc->drawText(LCD_W/2, LCD_H/2-20, message.c_str(), FONT(XL)|CENTERED|COLOR2FLAGS(WHITE));
}
void deleteLater(bool detach = true, bool trash = true) override
{
Layer::pop(this);
Window::deleteLater(detach, trash);
}
protected:
std::string message;
bool running = false;
};
static FatalErrorScreen *errorScreen = nullptr;
void drawFatalErrorScreen(const char * message)
{
lcd->reset();
lcd->clear(COLOR2FLAGS(BLACK));
lcd->drawText(LCD_W/2, LCD_H/2-20, message, FONT(XL)|CENTERED|COLOR2FLAGS(WHITE));
WDG_RESET();
lcdRefresh();
if(!errorScreen)
{
errorScreen = new FatalErrorScreen(message);
}
RTOS_WAIT_MS(1);
MainWindow::instance()->run(false);
LvglWrapper::instance()->run();
}
void clearFatalErrorScreen()
{
errorScreen->deleteLater();
errorScreen = nullptr;
}
void runFatalErrorScreen(const char * message)
{
lcdInitDisplayDriver();
while (true) {
backlightEnable(100);
drawFatalErrorScreen(message);
lcd->reset();
lcdInitDirectDrawing();
lcd->clear(COLOR2FLAGS(BLACK));
lcd->drawText(LCD_W/2, LCD_H/2-20, message, FONT(XL)|CENTERED|COLOR2FLAGS(WHITE));
WDG_RESET();
lcdRefresh();
uint8_t refresh = false;
while (true) {
+1
View File
@@ -52,6 +52,7 @@
coord_t drawStringWithIndex(BitmapBuffer * dc, coord_t x, coord_t y, const char * str, int idx, LcdFlags flags = 0, const char * prefix = nullptr, const char * suffix = nullptr);
void drawFatalErrorScreen(const char * message);
void clearFatalErrorScreen();
void runFatalErrorScreen(const char * message);
void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att);
void drawSource(BitmapBuffer * dc, coord_t x, coord_t y, mixsrc_t idx, LcdFlags flags=0);
+12 -1
View File
@@ -488,7 +488,7 @@ void guiMain(event_t evt)
void perMain()
{
DEBUG_TIMER_START(debugTimerPerMain1);
static bool fatalError = false;
checkSpeakerVolume();
@@ -521,6 +521,7 @@ void perMain()
#if defined(RTC_BACKUP_RAM)
if (globalData.unexpectedShutdown) {
fatalError = true;
drawFatalErrorScreen(STR_EMERGENCY_MODE);
return;
}
@@ -538,12 +539,22 @@ void perMain()
// TODO: implement for b/w
#if defined(COLORLCD)
fatalError = true;
drawFatalErrorScreen(STR_NO_SDCARD);
return;
#endif
}
#endif
#if defined(LIBOPENUI)
if(fatalError)
{
clearFatalErrorScreen();
fatalError = false;
}
#endif
if (usbPlugged() && getSelectedUsbMode() == USB_MASS_STORAGE_MODE) {
#if defined(LIBOPENUI)
// draw some image showing USB