Remove scratch buffer

This commit is contained in:
Raphael Coeffic
2022-06-11 15:38:08 +02:00
committed by Raphael Coeffic
parent b40441f0c0
commit 86152da85d
11 changed files with 97 additions and 53 deletions
+5 -4
View File
@@ -203,7 +203,7 @@ extern BitmapBuffer * lcd;
static lv_disp_drv_t disp_drv;
static lv_disp_drv_t* init_disp_drv()
void init_disp_drv()
{
lv_disp_draw_buf_init(&disp_buf, lcdFront->getData(), lcd->getData(), LCD_W*LCD_H);
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
@@ -219,7 +219,8 @@ static lv_disp_drv_t* init_disp_drv()
// disp_drv.rotated = LV_DISP_ROT_90;
disp_drv.sw_rotate = 1;
return &disp_drv;
// Register the driver and save the created display objects
disp = lv_disp_drv_register(&disp_drv);
}
static void init_lvgl_drivers()
@@ -229,7 +230,7 @@ static void init_lvgl_drivers()
lv_group_set_default(inputGroup);
// Register the driver and save the created display objects
disp = lv_disp_drv_register(init_disp_drv());
init_disp_drv();
// Register the driver in LVGL and save the created input device object
lv_indev_drv_init(&touchDriver); /*Basic initialization*/
@@ -346,7 +347,7 @@ LvglWrapper::LvglWrapper()
// Create main window and load that screen
auto window = MainWindow::instance();
lv_scr_load(window->getLvObj());
window->setActiveScreen();
}
void LvglWrapper::run()
+49 -22
View File
@@ -31,13 +31,38 @@ const uint8_t __bmp_splash_chr[] {
#include "splash_chr.lbm"
};
void draw_splash_cb(lv_event_t * e)
{
auto draw_ctx = lv_event_get_draw_ctx(e);
auto splashImg = (BitmapBuffer*)lv_event_get_user_data(e);
// lcd->clear(splash_background_color);
if (splashImg) {
lv_draw_img_dsc_t img_dsc;
lv_draw_img_dsc_init(&img_dsc);
// TODO: center image
lv_area_t coords;
coords.x1 = 0;
coords.y1 = 0;
coords.x2 = splashImg->width()-1;
coords.y2 = splashImg->height()-1;
lv_draw_img_decoded(draw_ctx, &img_dsc, &coords,
(const uint8_t *)splashImg->getData(),
LV_IMG_CF_TRUE_COLOR);
}
}
void drawSplash()
{
constexpr LcdFlags splash_background_color =
COLOR2FLAGS(((0xC >> 3) << 11) | ((0x3F >> 2) << 5) | (0x66 >> 3));
static bool loadSplashImg = true;
static BitmapBuffer * splashImg = nullptr;
static BitmapBuffer* splashImg = nullptr;
static lv_obj_t* splashScreen = nullptr;
// try splash from SD card first
if (loadSplashImg && splashImg == nullptr) {
@@ -47,30 +72,32 @@ void drawSplash()
// otherwise load from FLASH
struct gtm t;
gettime(&t);
// Please do not spoil the suprise by discussing following lines in public
// mon == 11 == December, starts from 0!
if (t.tm_mon == 11 && t.tm_mday >= 24 && t.tm_mday <= 26)
{
if (splashImg == nullptr) {
splashImg = BitmapBuffer::loadRamBitmap(__bmp_splash_chr, sizeof(__bmp_splash_chr));
}
} else
{
if (splashImg == nullptr) {
splashImg = BitmapBuffer::loadRamBitmap(__bmp_splash, sizeof(__bmp_splash));
}
}
gettime(&t);
// Please do not spoil the suprise by discussing following lines in public
// mon == 11 == December, starts from 0!
if (t.tm_mon == 11 && t.tm_mday >= 24 && t.tm_mday <= 26) {
if (splashImg == nullptr) {
splashImg = BitmapBuffer::loadRamBitmap(__bmp_splash_chr,
sizeof(__bmp_splash_chr));
}
} else {
if (splashImg == nullptr) {
splashImg =
BitmapBuffer::loadRamBitmap(__bmp_splash, sizeof(__bmp_splash));
}
}
splashScreen = lv_obj_create(nullptr);
if (splashScreen) {
lv_obj_add_event_cb(splashScreen, draw_splash_cb, LV_EVENT_DRAW_MAIN, splashImg);
}
}
lcd->clear(splash_background_color);
if (splashImg) {
lcd->drawBitmap((LCD_W - splashImg->width())/2,
(LCD_H - splashImg->height())/2,
splashImg);
if (splashScreen) {
lv_scr_load(splashScreen);
lv_refr_now(nullptr);
}
lcdRefresh();
MainWindow::instance()->setActiveScreen();
}
#endif
+3 -1
View File
@@ -637,6 +637,9 @@ void doSplash()
checkBacklight();
}
#if defined(LIBOPENUI)
MainWindow::instance()->setActiveScreen();
#endif
}
}
#else
@@ -1770,7 +1773,6 @@ void opentxInit()
TRACE("opentxInit");
#if defined(LIBOPENUI)
// create ViewMain
LvglWrapper::instance();
ViewMain::instance();
#elif defined(GUI)
// TODO add a function for this (duplicated)
@@ -114,6 +114,7 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14)
${BOOTLOADER_SRC}
../../../../../gui/colorlcd/fonts.cpp
../../../../../gui/colorlcd/colors.cpp
../../../../../fonts/lvgl/lv_font_roboto_16.c
../../../../../thirdparty/libopenui/src/bitmapbuffer.cpp
../../../../../targets/${TARGET_DIR}/sdram_driver.c
../../../../../targets/common/arm/stm32/sdio_sd.c
@@ -122,6 +123,11 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14)
../../../../../syscalls.c
)
# Add LVGL sources
foreach(LVGL_FILE ${LVGL_SRC_FILES})
set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../${LVGL_FILE})
endforeach()
if(USB_CHARGER)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
+1 -5
View File
@@ -47,7 +47,6 @@
uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM;
uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM;
uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM;
uint8_t LCD_SCRATCH_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM;
uint8_t currentLayer = LCD_FIRST_LAYER;
BitmapBuffer lcdBuffer1(BMP_RGB565, LCD_W, LCD_H, (uint16_t *)LCD_FIRST_FRAME_BUFFER);
@@ -628,10 +627,6 @@ uint16_t* lcdGetBackupBuffer()
return (uint16_t*)LCD_BACKUP_FRAME_BUFFER;
}
uint16_t* lcdGetScratchBuffer()
{
return (uint16_t*)LCD_SCRATCH_FRAME_BUFFER;
}
static volatile uint8_t _frameBufferAddressReloaded = 0;
@@ -673,6 +668,7 @@ void newLcdRefresh(uint16_t * buffer)
while(_frameBufferAddressReloaded == 0);
#endif
}
void lcdRefresh()
{
//lcdSwitchLayers();
+6 -9
View File
@@ -59,19 +59,16 @@ void lcdRefresh()
pixel_t displayBuf1[DISPLAY_BUFFER_SIZE];
pixel_t displayBuf2[DISPLAY_BUFFER_SIZE];
pixel_t scratchBuf[DISPLAY_BUFFER_SIZE];
pixel_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE];
BitmapBuffer lcdBackup(BMP_RGB565, LCD_W, LCD_H, LCD_BACKUP_FRAME_BUFFER);
BitmapBuffer scratch(BMP_RGB565, LCD_W, LCD_H, scratchBuf);
BitmapBuffer _lcd1(BMP_RGB565, LCD_W, LCD_H, displayBuf1);
BitmapBuffer _lcd2(BMP_RGB565, LCD_W, LCD_H, displayBuf2);
BitmapBuffer * lcd = &_lcd1;
BitmapBuffer * lcdFront = &_lcd2;
uint16_t *lcdGetScratchBuffer() { return static_cast<uint16_t *>(scratchBuf); }
void lcdStoreBackupBuffer()
{
@@ -115,10 +112,10 @@ void newLcdRefresh(uint16_t *buffer, const rect_t& copy_area)
// Mark screen dirty for async refresh
simuLcdRefresh = true;
// .. and wait for refresh
auto start = RTOS_GET_MS();
while(simuLcdRefresh ||
(RTOS_GET_MS() - start > 100));
// // .. and wait for refresh
// auto start = RTOS_GET_MS();
// while(simuLcdRefresh ||
// (RTOS_GET_MS() - start <= 100));
}
void lcdRefresh()
{
@@ -145,8 +142,8 @@ void lcdRefresh()
void lcdInit()
{
_lcd1.clear();
_lcd2.clear();
memset(displayBuf1, 0, sizeof(displayBuf1));
memset(displayBuf2, 0, sizeof(displayBuf2));
}
void DMAFillRect(uint16_t *dest, uint16_t destw, uint16_t desth, uint16_t x,
+4
View File
@@ -183,6 +183,10 @@ bool perMainEnabled = true;
TASK_FUNCTION(menusTask)
{
#if defined(LIBOPENUI)
LvglWrapper::instance();
#endif
#if defined(SPLASH) && !defined(STARTUP_ANIMATION)
if (!UNEXPECTED_SHUTDOWN()) {
drawSplash();
-6
View File
@@ -299,9 +299,6 @@ TEST(FrSkySPORT, frskySetCellVoltage)
EXPECT_EQ(telemetryItems[0].value, 2068);
EXPECT_EQ(telemetryItems[0].valueMin, 1756);
EXPECT_EQ(telemetryItems[0].valueMax, 2071);
//display test
lcdClear();
}
TEST(FrSkySPORT, StrangeCellsBug)
@@ -379,9 +376,6 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
EXPECT_EQ(telemetryItems[2].value, 283);
EXPECT_EQ(telemetryItems[2].valueMin, 283);
EXPECT_EQ(telemetryItems[2].valueMax, 287);
//display test
lcdClear();
}
void generateSportFasVoltagePacket(uint8_t * packet, uint32_t voltage)
+8
View File
@@ -155,6 +155,9 @@ const char * nchar2string(const char * string, int size)
return _stringResult;
}
#if defined(LIBOPENUI)
void init_disp_drv();
#endif
int main(int argc, char **argv)
{
@@ -180,5 +183,10 @@ int main(int argc, char **argv)
listeners.Append(new TersePrinter(defaultPrinter));
}
#if defined(LIBOPENUI)
lv_init();
init_disp_drv();
#endif
return RUN_ALL_TESTS();
}
+14 -5
View File
@@ -28,7 +28,6 @@
#if defined(COLORLCD)
#include "gui/colorlcd/fonts.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
@@ -126,6 +125,8 @@ static void init_fake_disp(BitmapBuffer* dc)
TEST(Lcd_colorlcd, lines)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR_THEME_SECONDARY3);
dc.setClippingRect(50, 400, 50, 230);
@@ -144,6 +145,8 @@ TEST(Lcd_colorlcd, lines)
TEST(Lcd_colorlcd, vline)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR_THEME_SECONDARY3);
for (int x=0; x<100; x+=2) {
@@ -155,7 +158,6 @@ TEST(Lcd_colorlcd, vline)
TEST(Lcd_colorlcd, primitives)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR_THEME_SECONDARY3);
@@ -186,7 +188,6 @@ TEST(Lcd_colorlcd, primitives)
TEST(Lcd_colorlcd, transparency)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR_THEME_SECONDARY3);
@@ -256,6 +257,8 @@ TEST(Lcd_colorlcd, fonts)
TEST(Lcd_colorlcd, clipping)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR_THEME_SECONDARY3);
dc.drawSolidVerticalLine(100, 0, LCD_H, COLOR_THEME_SECONDARY1);
@@ -282,6 +285,8 @@ TEST(Lcd_colorlcd, clipping)
TEST(Lcd_colorlcd, bitmap)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR_THEME_SECONDARY3);
dc.setClippingRect(100, 400, 50, 200);
@@ -297,6 +302,8 @@ TEST(Lcd_colorlcd, bitmap)
TEST(Lcd_colorlcd, masks)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR_THEME_SECONDARY3);
BitmapBuffer* mask = BitmapBuffer::loadMask(TESTS_PATH "/mask_menu_radio.png");
@@ -320,14 +327,16 @@ const uint8_t LBM_USB_PLUGGED[] = {
TEST(Lcd_colorlcd, darkmode)
{
BitmapBuffer dc(BMP_RGB565, LCD_W, LCD_H);
init_fake_disp(&dc);
dc.clear(COLOR2FLAGS(BLACK));
dc.drawText(20, 28, "The quick brown fox jumps over the lazy dog", COLOR2FLAGS(WHITE));
dc.drawSolidFilledRect(28, 56, 422, 2, COLOR2FLAGS(RED));
dc.drawSolidFilledRect(28, 56, 422, 2, COLOR2FLAGS(RGB(0xFF, 0, 0)));
dc.drawBitmapPattern(LCD_W/2 - LBM_USB_PLUGGED_W/2,
LCD_H/2 - LBM_USB_PLUGGED_H/2,
LBM_USB_PLUGGED,
COLOR2FLAGS(BLUE));
COLOR2FLAGS(RGB(0, 0, 0xFF)));
EXPECT_TRUE(checkScreenshot_colorlcd(&dc, "darkmode_" TRANSLATIONS));
}