From df7db4394078cf5a1694228684d3ab42713a298e Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 20 Feb 2022 08:57:40 +0100 Subject: [PATCH] Prevent simu lockup on exit --- radio/src/gui/colorlcd/lcd.cpp | 11 +++++++++++ radio/src/gui/colorlcd/lcd.h | 5 +++++ radio/src/targets/simu/simpgmspace.cpp | 9 +++++++++ 3 files changed, 25 insertions(+) diff --git a/radio/src/gui/colorlcd/lcd.cpp b/radio/src/gui/colorlcd/lcd.cpp index e962fb751..839d71397 100644 --- a/radio/src/gui/colorlcd/lcd.cpp +++ b/radio/src/gui/colorlcd/lcd.cpp @@ -33,6 +33,13 @@ static lv_area_t screen_area = { 0, 0, LCD_W-1, LCD_H-1 }; +static void (*lcd_wait_cb)(lv_disp_drv_t *) = nullptr; + +void lcdSetWaitCb(void (*cb)(lv_disp_drv_t *)) +{ + lcd_wait_cb = cb; +} + void newLcdRefresh(uint16_t* buffer, const rect_t& copy_area); static void flushLcd(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) @@ -62,12 +69,16 @@ void lcdInitDisplayDriver() lv_disp_draw_buf_init(&disp_buf, lcdFront->getData(), lcd->getData(), LCD_W*LCD_H); lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + disp_drv.draw_buf = &disp_buf; /*Set an initialized buffer*/ disp_drv.flush_cb = flushLcd; /*Set a flush callback to draw to the display*/ + disp_drv.wait_cb = lcd_wait_cb; /*Set a wait callback*/ + disp_drv.hor_res = LCD_W; /*Set the horizontal resolution in pixels*/ disp_drv.ver_res = LCD_H; /*Set the vertical resolution in pixels*/ disp_drv.full_refresh = 0; disp_drv.direct_mode = 0; + #if defined (LCD_VERTICAL_INVERT) disp_drv.rotated = LV_DISP_ROT_180; #endif diff --git a/radio/src/gui/colorlcd/lcd.h b/radio/src/gui/colorlcd/lcd.h index 39c688518..0d7e46250 100644 --- a/radio/src/gui/colorlcd/lcd.h +++ b/radio/src/gui/colorlcd/lcd.h @@ -38,6 +38,11 @@ #define SLOW_BLINK_ON_PHASE (g_blinkTmr10ms & (1<<7)) #endif +struct _lv_disp_drv_t; +typedef _lv_disp_drv_t lv_disp_drv_t; + +void lcdSetWaitCb(void (*cb)(lv_disp_drv_t *)); + // Init LVGL and its display driver void lcdInitDisplayDriver(); diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index eaea1543b..8118ce8fa 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -146,6 +146,13 @@ static void* bootloaderThread(void*) } #endif +static void lcdExitHandler(lv_disp_drv_t*) +{ + if (simu_shutdown) { + lcdFlushed(); + } +} + void simuStart(bool tests, const char * sdPath, const char * settingsPath) { if (simu_running) @@ -204,6 +211,8 @@ void simuStart(bool tests, const char * sdPath, const char * settingsPath) try { #endif + lcdSetWaitCb(lcdExitHandler); + #if !defined(SIMU_BOOTLOADER) simuMain(); #else