diff --git a/radio/src/FreeRTOSConfig.h b/radio/src/FreeRTOSConfig.h index b2f754f88..7e07caff7 100644 --- a/radio/src/FreeRTOSConfig.h +++ b/radio/src/FreeRTOSConfig.h @@ -25,7 +25,11 @@ #define configUSE_PREEMPTION 1 #define configUSE_IDLE_HOOK 0 -#define configUSE_TICK_HOOK 0 +#if defined(COLORLCD) + #define configUSE_TICK_HOOK 1 +#else + #define configUSE_TICK_HOOK 0 +#endif #define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configMAX_PRIORITIES ( 5 ) diff --git a/radio/src/gui/colorlcd/CMakeLists.txt b/radio/src/gui/colorlcd/CMakeLists.txt index 6d4e8546b..c9589059e 100644 --- a/radio/src/gui/colorlcd/CMakeLists.txt +++ b/radio/src/gui/colorlcd/CMakeLists.txt @@ -143,6 +143,11 @@ if(WINDOWS_INSPECT_BORDERS) add_definitions(-DWINDOWS_INSPECT_BORDERS) endif() +option(UI_PERF_MONITOR "Draw frame rate and CPU usage" OFF) +if(UI_PERF_MONITOR) + add_definition(-DUI_PERF_MONITOR) +endif() + # includes libopenui set(LIBOPENUI_SRC_DIR thirdparty/libopenui) set(LVGL_SRC_DIR ${LIBOPENUI_SRC_DIR}/thirdparty/lvgl/src) diff --git a/radio/src/gui/colorlcd/LvglWrapper.cpp b/radio/src/gui/colorlcd/LvglWrapper.cpp index adddc7c8f..947d9a544 100644 --- a/radio/src/gui/colorlcd/LvglWrapper.cpp +++ b/radio/src/gui/colorlcd/LvglWrapper.cpp @@ -62,13 +62,8 @@ extern "C" void keyboardDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data) static void copy_ts_to_indev_data(const TouchState &st, lv_indev_data_t *data) { -#if defined(LCD_VERTICAL_INVERT) - data->point.x = LCD_W - st.x; - data->point.y = LCD_H - st.y; -#else data->point.x = st.x; data->point.y = st.y; -#endif } static lv_indev_data_t indev_data_backup; @@ -386,8 +381,10 @@ LvglWrapper::LvglWrapper() void LvglWrapper::run() { +#if defined(SIMU) tmr10ms_t tick = get_tmr10ms(); lv_tick_inc((tick - lastTick) * 10); lastTick = tick; +#endif lv_timer_handler(); } diff --git a/radio/src/gui/colorlcd/lcd.cpp b/radio/src/gui/colorlcd/lcd.cpp index 83754c142..9923de3ef 100644 --- a/radio/src/gui/colorlcd/lcd.cpp +++ b/radio/src/gui/colorlcd/lcd.cpp @@ -58,6 +58,41 @@ void lcdSetFlushCb(void (*cb)(lv_disp_drv_t *, uint16_t*, const rect_t&)) static lv_disp_drv_t* refr_disp = nullptr; +#if defined (LCD_VERTICAL_INVERT) +static void buf_rotate_180(lv_area_t * area, uint16_t* color_p) +{ + lv_coord_t area_w = lv_area_get_width(area); + lv_coord_t area_h = lv_area_get_height(area); + uint32_t total = area_w * area_h; + /*Swap the beginning and end values*/ + + uint32_t tmp; + uint32_t* c_tail = (uint32_t*)(color_p + (total & 1)); + uint32_t* c_head = (uint32_t*)color_p; + uint32_t i = total/2 - 1, j = 0; + while(i > j) { + tmp = c_tail[i]; + c_tail[i] = ((c_head[j] & 0xFFFF0000) >> 16) | ((c_head[j] & 0xFFFF) << 16); + c_head[j] = ((tmp & 0xFFFF0000) >> 16) | ((tmp & 0xFFFF) << 16); + i--; + j++; + } + if (total & 1) { + uint16_t tmp = color_p[i * 2 + 1]; + color_p[j * 2] = color_p[i * 2 + 1]; + color_p[i * 2 + 1] = tmp; + } + + lv_coord_t tmp_coord; + tmp_coord = area->y2; + area->y2 = LCD_H - area->y1 - 1; + area->y1 = LCD_H - tmp_coord - 1; + tmp_coord = area->x2; + area->x2 = LCD_W - area->x1 - 1; + area->x1 = LCD_W - tmp_coord - 1; +} +#endif + static void flushLcd(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { lv_area_t refr_area; @@ -73,12 +108,17 @@ static void flushLcd(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_ } #endif - rect_t copy_area = {refr_area.x1, refr_area.y1, - refr_area.x2 - refr_area.x1 + 1, - refr_area.y2 - refr_area.y1 + 1}; - if (lcd_flush_cb) { refr_disp = disp_drv; + +#if defined (LCD_VERTICAL_INVERT) + buf_rotate_180(&refr_area, (uint16_t*)color_p); +#endif + + rect_t copy_area = {refr_area.x1, refr_area.y1, + refr_area.x2 - refr_area.x1 + 1, + refr_area.y2 - refr_area.y1 + 1}; + lcd_flush_cb(disp_drv, (uint16_t*)color_p, copy_area); } else { lv_disp_flush_ready(disp_drv); @@ -105,11 +145,6 @@ void lcdInitDisplayDriver() disp_drv.full_refresh = 0; disp_drv.direct_mode = 0; -#if defined (LCD_VERTICAL_INVERT) - disp_drv.rotated = LV_DISP_ROT_180; - disp_drv.sw_rotate = 1; -#endif - // Register the driver and save the created display object disp = lv_disp_drv_register(&disp_drv); diff --git a/radio/src/lv_conf.h b/radio/src/lv_conf.h index f257f5b92..574c543e5 100644 --- a/radio/src/lv_conf.h +++ b/radio/src/lv_conf.h @@ -268,7 +268,11 @@ *-----------*/ /*1: Show CPU usage and FPS count*/ -#define LV_USE_PERF_MONITOR 0 +#if !defined(BOOT) && defined(UI_PERF_MONITOR) + #define LV_USE_PERF_MONITOR 1 +#else + #define LV_USE_PERF_MONITOR 0 +#endif #if LV_USE_PERF_MONITOR #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT #endif diff --git a/radio/src/rtos.c b/radio/src/rtos.c index a6dd417fb..00e91da26 100644 --- a/radio/src/rtos.c +++ b/radio/src/rtos.c @@ -84,3 +84,12 @@ void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, #endif // configUSE_TIMERS #endif // configSUPPORT_STATIC_ALLOCATION + +#if configUSE_TICK_HOOK > 0 +#include + +void vApplicationTickHook( void ) +{ + lv_tick_inc(1); +} +#endif