summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-02-22 10:28:11 +1100
committerjacqueline <me@jacqueline.id.au>2023-02-22 10:28:11 +1100
commitfed7b450b36d0d0ce8c270127f9e9c3a22f1b699 (patch)
treedc5f7e304ccaa707c8520eeda6d55da4e525b46e
parent47ae601d417d0ef99eb6fe433ef695614d8d2786 (diff)
downloadtangara-fw-fed7b450b36d0d0ce8c270127f9e9c3a22f1b699.tar.gz
Fix up display artficacts and clean up unused features
-rw-r--r--lib/lv_conf.h759
-rw-r--r--src/drivers/display.cpp197
-rw-r--r--src/drivers/include/display.hpp41
-rw-r--r--src/main/main.cpp20
4 files changed, 106 insertions, 911 deletions
diff --git a/lib/lv_conf.h b/lib/lv_conf.h
deleted file mode 100644
index a32b33d5..00000000
--- a/lib/lv_conf.h
+++ /dev/null
@@ -1,759 +0,0 @@
-/**
- * @file lv_conf.h
- * Configuration file for v8.3.3
- */
-
-/*
- * Copy this file as `lv_conf.h`
- * 1. simply next to the `lvgl` folder
- * 2. or any other places and
- * - define `LV_CONF_INCLUDE_SIMPLE`
- * - add the path as include path
- */
-
-/* clang-format off */
-#if 1 /*Set it to "1" to enable content*/
-
-#ifndef LV_CONF_H
-#define LV_CONF_H
-
-#include <stdint.h>
-
-/*====================
- COLOR SETTINGS
- *====================*/
-
-/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
-#define LV_COLOR_DEPTH 16
-
-/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
-#define LV_COLOR_16_SWAP 1
-
-/*Enable features to draw on transparent background.
- *It's required if opa, and transform_* style properties are used.
- *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/
-#define LV_COLOR_SCREEN_TRANSP 0
-
-/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
- * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */
-#define LV_COLOR_MIX_ROUND_OFS 0
-
-/*Images pixels with this color will not be drawn if they are chroma keyed)*/
-#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/
-
-/*=========================
- MEMORY SETTINGS
- *=========================*/
-
-/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/
-#define LV_MEM_CUSTOM 0
-#if LV_MEM_CUSTOM == 0
- /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
- #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/
-
- /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
- #define LV_MEM_ADR 0 /*0: unused*/
- /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
- #if LV_MEM_ADR == 0
- #undef LV_MEM_POOL_INCLUDE
- #undef LV_MEM_POOL_ALLOC
- #endif
-
-#else /*LV_MEM_CUSTOM*/
- #define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/
- #define LV_MEM_CUSTOM_ALLOC malloc
- #define LV_MEM_CUSTOM_FREE free
- #define LV_MEM_CUSTOM_REALLOC realloc
-#endif /*LV_MEM_CUSTOM*/
-
-/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms.
- *You will see an error log message if there wasn't enough buffers. */
-#define LV_MEM_BUF_MAX_NUM 16
-
-/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/
-#define LV_MEMCPY_MEMSET_STD 0
-
-/*====================
- HAL SETTINGS
- *====================*/
-
-/*Default display refresh period. LVG will redraw changed areas with this period time*/
-#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/
-
-/*Input device read period in milliseconds*/
-#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/
-
-/*Use a custom tick source that tells the elapsed time in milliseconds.
- *It removes the need to manually update the tick with `lv_tick_inc()`)*/
-#define LV_TICK_CUSTOM 0
-#if LV_TICK_CUSTOM
- #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
- #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
-#endif /*LV_TICK_CUSTOM*/
-
-/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings.
- *(Not so important, you can adjust it to modify default sizes and spaces)*/
-#define LV_DPI_DEF 130 /*[px/inch]*/
-
-/*=======================
- * FEATURE CONFIGURATION
- *=======================*/
-
-/*-------------
- * Drawing
- *-----------*/
-
-/*Enable complex draw engine.
- *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/
-#define LV_DRAW_COMPLEX 1
-#if LV_DRAW_COMPLEX != 0
-
- /*Allow buffering some shadow calculation.
- *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius`
- *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/
- #define LV_SHADOW_CACHE_SIZE 0
-
- /* Set number of maximally cached circle data.
- * The circumference of 1/4 circle are saved for anti-aliasing
- * radius * 4 bytes are used per circle (the most often used radiuses are saved)
- * 0: to disable caching */
- #define LV_CIRCLE_CACHE_SIZE 4
-#endif /*LV_DRAW_COMPLEX*/
-
-/**
- * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer
- * and blend it as an image with the given opacity.
- * Note that `bg_opa`, `text_opa` etc don't require buffering into layer)
- * The widget can be buffered in smaller chunks to avoid using large buffers.
- *
- * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it
- * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
- *
- * Both buffer sizes are in bytes.
- * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers
- * and can't be drawn in chunks. So these settings affects only widgets with opacity.
- */
-#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024)
-#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024)
-
-/*Default image cache size. Image caching keeps the images opened.
- *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
- *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
- *However the opened images might consume additional RAM.
- *0: to disable caching*/
-#define LV_IMG_CACHE_DEF_SIZE 0
-
-/*Number of stops allowed per gradient. Increase this to allow more stops.
- *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/
-#define LV_GRADIENT_MAX_STOPS 2
-
-/*Default gradient buffer size.
- *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
- *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
- *If the cache is too small the map will be allocated only while it's required for the drawing.
- *0 mean no caching.*/
-#define LV_GRAD_CACHE_DEF_SIZE 0
-
-/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
- *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
- *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */
-#define LV_DITHER_GRADIENT 0
-#if LV_DITHER_GRADIENT
- /*Add support for error diffusion dithering.
- *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
- *The increase in memory consumption is (24 bits * object's width)*/
- #define LV_DITHER_ERROR_DIFFUSION 0
-#endif
-
-/*Maximum buffer size to allocate for rotation.
- *Only used if software rotation is enabled in the display driver.*/
-#define LV_DISP_ROT_MAX_BUF (10*1024)
-
-/*-------------
- * GPU
- *-----------*/
-
-/*Use Arm's 2D acceleration library Arm-2D */
-#define LV_USE_GPU_ARM2D 0
-
-/*Use STM32's DMA2D (aka Chrom Art) GPU*/
-#define LV_USE_GPU_STM32_DMA2D 0
-#if LV_USE_GPU_STM32_DMA2D
- /*Must be defined to include path of CMSIS header of target processor
- e.g. "stm32f769xx.h" or "stm32f429xx.h"*/
- #define LV_GPU_DMA2D_CMSIS_INCLUDE
-#endif
-
-/*Use SWM341's DMA2D GPU*/
-#define LV_USE_GPU_SWM341_DMA2D 0
-#if LV_USE_GPU_SWM341_DMA2D
- #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h"
-#endif
-
-/*Use NXP's PXP GPU iMX RTxxx platforms*/
-#define LV_USE_GPU_NXP_PXP 0
-#if LV_USE_GPU_NXP_PXP
- /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
- * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS
- * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.
- *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()
- */
- #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
-#endif
-
-/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/
-#define LV_USE_GPU_NXP_VG_LITE 0
-
-/*Use SDL renderer API*/
-#define LV_USE_GPU_SDL 0
-#if LV_USE_GPU_SDL
- #define LV_GPU_SDL_INCLUDE_PATH <SDL2/SDL.h>
- /*Texture cache size, 8MB by default*/
- #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8)
- /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/
- #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6))
-#endif
-
-/*-------------
- * Logging
- *-----------*/
-
-/*Enable the log module*/
-#define LV_USE_LOG 0
-#if LV_USE_LOG
-
- /*How important log should be added:
- *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
- *LV_LOG_LEVEL_INFO Log important events
- *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
- *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
- *LV_LOG_LEVEL_USER Only logs added by the user
- *LV_LOG_LEVEL_NONE Do not log anything*/
- #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
-
- /*1: Print the log with 'printf';
- *0: User need to register a callback with `lv_log_register_print_cb()`*/
- #define LV_LOG_PRINTF 0
-
- /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/
- #define LV_LOG_TRACE_MEM 1
- #define LV_LOG_TRACE_TIMER 1
- #define LV_LOG_TRACE_INDEV 1
- #define LV_LOG_TRACE_DISP_REFR 1
- #define LV_LOG_TRACE_EVENT 1
- #define LV_LOG_TRACE_OBJ_CREATE 1
- #define LV_LOG_TRACE_LAYOUT 1
- #define LV_LOG_TRACE_ANIM 1
-
-#endif /*LV_USE_LOG*/
-
-/*-------------
- * Asserts
- *-----------*/
-
-/*Enable asserts if an operation is failed or an invalid data is found.
- *If LV_USE_LOG is enabled an error message will be printed on failure*/
-#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/
-#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/
-#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/
-#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/
-#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/
-
-/*Add a custom handler when assert happens e.g. to restart the MCU*/
-#define LV_ASSERT_HANDLER_INCLUDE <stdint.h>
-#define LV_ASSERT_HANDLER while(1); /*Halt by default*/
-
-/*-------------
- * Others
- *-----------*/
-
-/*1: Show CPU usage and FPS count*/
-#define LV_USE_PERF_MONITOR 1
-#if LV_USE_PERF_MONITOR
- #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
-#endif
-
-/*1: Show the used memory and the memory fragmentation
- * Requires LV_MEM_CUSTOM = 0*/
-#define LV_USE_MEM_MONITOR 1
-#if LV_USE_MEM_MONITOR
- #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
-#endif
-
-/*1: Draw random colored rectangles over the redrawn areas*/
-#define LV_USE_REFR_DEBUG 0
-
-/*Change the built in (v)snprintf functions*/
-#define LV_SPRINTF_CUSTOM 0
-#if LV_SPRINTF_CUSTOM
- #define LV_SPRINTF_INCLUDE <stdio.h>
- #define lv_snprintf snprintf
- #define lv_vsnprintf vsnprintf
-#else /*LV_SPRINTF_CUSTOM*/
- #define LV_SPRINTF_USE_FLOAT 0
-#endif /*LV_SPRINTF_CUSTOM*/
-
-#define LV_USE_USER_DATA 1
-
-/*Garbage Collector settings
- *Used if lvgl is bound to higher level language and the memory is managed by that language*/
-#define LV_ENABLE_GC 0
-#if LV_ENABLE_GC != 0
- #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/
-#endif /*LV_ENABLE_GC*/
-
-/*=====================
- * COMPILER SETTINGS
- *====================*/
-
-/*For big endian systems set to 1*/
-#define LV_BIG_ENDIAN_SYSTEM 0
-
-/*Define a custom attribute to `lv_tick_inc` function*/
-#define LV_ATTRIBUTE_TICK_INC
-
-/*Define a custom attribute to `lv_timer_handler` function*/
-#define LV_ATTRIBUTE_TIMER_HANDLER
-
-/*Define a custom attribute to `lv_disp_flush_ready` function*/
-#define LV_ATTRIBUTE_FLUSH_READY
-
-/*Required alignment size for buffers*/
-#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1
-
-/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default).
- * E.g. __attribute__((aligned(4)))*/
-#define LV_ATTRIBUTE_MEM_ALIGN
-
-/*Attribute to mark large constant arrays for example font's bitmaps*/
-#define LV_ATTRIBUTE_LARGE_CONST
-
-/*Compiler prefix for a big array declaration in RAM*/
-#define LV_ATTRIBUTE_LARGE_RAM_ARRAY
-
-/*Place performance critical functions into a faster memory (e.g RAM)*/
-#define LV_ATTRIBUTE_FAST_MEM
-
-/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/
-#define LV_ATTRIBUTE_DMA
-
-/*Export integer constant to binding. This macro is used with constants in the form of LV_<CONST> that
- *should also appear on LVGL binding API such as Micropython.*/
-#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/
-
-/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/
-#define LV_USE_LARGE_COORD 0
-
-/*==================
- * FONT USAGE
- *===================*/
-
-/*Montserrat fonts with ASCII range and some symbols using bpp = 4
- *https://fonts.google.com/specimen/Montserrat*/
-#define LV_FONT_MONTSERRAT_8 0
-#define LV_FONT_MONTSERRAT_10 0
-#define LV_FONT_MONTSERRAT_12 0
-#define LV_FONT_MONTSERRAT_14 1
-#define LV_FONT_MONTSERRAT_16 0
-#define LV_FONT_MONTSERRAT_18 0
-#define LV_FONT_MONTSERRAT_20 0
-#define LV_FONT_MONTSERRAT_22 0
-#define LV_FONT_MONTSERRAT_24 0
-#define LV_FONT_MONTSERRAT_26 0
-#define LV_FONT_MONTSERRAT_28 0
-#define LV_FONT_MONTSERRAT_30 0
-#define LV_FONT_MONTSERRAT_32 0
-#define LV_FONT_MONTSERRAT_34 0
-#define LV_FONT_MONTSERRAT_36 0
-#define LV_FONT_MONTSERRAT_38 0
-#define LV_FONT_MONTSERRAT_40 0
-#define LV_FONT_MONTSERRAT_42 0
-#define LV_FONT_MONTSERRAT_44 0
-#define LV_FONT_MONTSERRAT_46 0
-#define LV_FONT_MONTSERRAT_48 0
-
-/*Demonstrate special features*/
-#define LV_FONT_MONTSERRAT_12_SUBPX 0
-#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/
-#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/
-#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/
-
-/*Pixel perfect monospace fonts*/
-#define LV_FONT_UNSCII_8 0
-#define LV_FONT_UNSCII_16 0
-
-/*Optionally declare custom fonts here.
- *You can use these fonts as default font too and they will be available globally.
- *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/
-#define LV_FONT_CUSTOM_DECLARE
-
-/*Always set a default font*/
-#define LV_FONT_DEFAULT &lv_font_montserrat_14
-
-/*Enable handling large font and/or fonts with a lot of characters.
- *The limit depends on the font size, font face and bpp.
- *Compiler error will be triggered if a font needs it.*/
-#define LV_FONT_FMT_TXT_LARGE 0
-
-/*Enables/disables support for compressed fonts.*/
-#define LV_USE_FONT_COMPRESSED 0
-
-/*Enable subpixel rendering*/
-#define LV_USE_FONT_SUBPX 0
-#if LV_USE_FONT_SUBPX
- /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/
- #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/
-#endif
-
-/*Enable drawing placeholders when glyph dsc is not found*/
-#define LV_USE_FONT_PLACEHOLDER 1
-
-/*=================
- * TEXT SETTINGS
- *=================*/
-
-/**
- * Select a character encoding for strings.
- * Your IDE or editor should have the same character encoding
- * - LV_TXT_ENC_UTF8
- * - LV_TXT_ENC_ASCII
- */
-#define LV_TXT_ENC LV_TXT_ENC_UTF8
-
-/*Can break (wrap) texts on these chars*/
-#define LV_TXT_BREAK_CHARS " ,.;:-_"
-
-/*If a word is at least this long, will break wherever "prettiest"
- *To disable, set to a value <= 0*/
-#define LV_TXT_LINE_BREAK_LONG_LEN 0
-
-/*Minimum number of characters in a long word to put on a line before a break.
- *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
-#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3
-
-/*Minimum number of characters in a long word to put on a line after a break.
- *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
-#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3
-
-/*The control character to use for signalling text recoloring.*/
-#define LV_TXT_COLOR_CMD "#"
-
-/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts.
- *The direction will be processed according to the Unicode Bidirectional Algorithm:
- *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/
-#define LV_USE_BIDI 0
-#if LV_USE_BIDI
- /*Set the default direction. Supported values:
- *`LV_BASE_DIR_LTR` Left-to-Right
- *`LV_BASE_DIR_RTL` Right-to-Left
- *`LV_BASE_DIR_AUTO` detect texts base direction*/
- #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO
-#endif
-
-/*Enable Arabic/Persian processing
- *In these languages characters should be replaced with an other form based on their position in the text*/
-#define LV_USE_ARABIC_PERSIAN_CHARS 0
-
-/*==================
- * WIDGET USAGE
- *================*/
-
-/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/
-
-#define LV_USE_ARC 1
-
-#define LV_USE_BAR 1
-
-#define LV_USE_BTN 1
-
-#define LV_USE_BTNMATRIX 1
-
-#define LV_USE_CANVAS 1
-
-#define LV_USE_CHECKBOX 1
-
-#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/
-
-#define LV_USE_IMG 1 /*Requires: lv_label*/
-
-#define LV_USE_LABEL 1
-#if LV_USE_LABEL
- #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/
- #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/
-#endif
-
-#define LV_USE_LINE 1
-
-#define LV_USE_ROLLER 1 /*Requires: lv_label*/
-#if LV_USE_ROLLER
- #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/
-#endif
-
-#define LV_USE_SLIDER 1 /*Requires: lv_bar*/
-
-#define LV_USE_SWITCH 1
-
-#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/
-#if LV_USE_TEXTAREA != 0
- #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/
-#endif
-
-#define LV_USE_TABLE 1
-
-/*==================
- * EXTRA COMPONENTS
- *==================*/
-
-/*-----------
- * Widgets
- *----------*/
-#define LV_USE_ANIMIMG 1
-
-#define LV_USE_CALENDAR 1
-#if LV_USE_CALENDAR
- #define LV_CALENDAR_WEEK_STARTS_MONDAY 0
- #if LV_CALENDAR_WEEK_STARTS_MONDAY
- #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}
- #else
- #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}
- #endif
-
- #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
- #define LV_USE_CALENDAR_HEADER_ARROW 1
- #define LV_USE_CALENDAR_HEADER_DROPDOWN 1
-#endif /*LV_USE_CALENDAR*/
-
-#define LV_USE_CHART 1
-
-#define LV_USE_COLORWHEEL 1
-
-#define LV_USE_IMGBTN 1
-
-#define LV_USE_KEYBOARD 1
-
-#define LV_USE_LED 1
-
-#define LV_USE_LIST 1
-
-#define LV_USE_MENU 1
-
-#define LV_USE_METER 1
-
-#define LV_USE_MSGBOX 1
-
-#define LV_USE_SPAN 1
-#if LV_USE_SPAN
- /*A line text can contain maximum num of span descriptor */
- #define LV_SPAN_SNIPPET_STACK_SIZE 64
-#endif
-
-#define LV_USE_SPINBOX 1
-
-#define LV_USE_SPINNER 1
-
-#define LV_USE_TABVIEW 1
-
-#define LV_USE_TILEVIEW 1
-
-#define LV_USE_WIN 1
-
-/*-----------
- * Themes
- *----------*/
-
-/*A simple, impressive and very complete theme*/
-#define LV_USE_THEME_DEFAULT 0
-#if LV_USE_THEME_DEFAULT
-
- /*0: Light mode; 1: Dark mode*/
- #define LV_THEME_DEFAULT_DARK 0
-
- /*1: Enable grow on press*/
- #define LV_THEME_DEFAULT_GROW 1
-
- /*Default transition time in [ms]*/
- #define LV_THEME_DEFAULT_TRANSITION_TIME 80
-#endif /*LV_USE_THEME_DEFAULT*/
-
-/*A very simple theme that is a good starting point for a custom theme*/
-#define LV_USE_THEME_BASIC 1
-
-/*A theme designed for monochrome displays*/
-#define LV_USE_THEME_MONO 0
-
-/*-----------
- * Layouts
- *----------*/
-
-/*A layout similar to Flexbox in CSS.*/
-#define LV_USE_FLEX 1
-
-/*A layout similar to Grid in CSS.*/
-#define LV_USE_GRID 1
-
-/*---------------------
- * 3rd party libraries
- *--------------------*/
-
-/*File system interfaces for common APIs */
-
-/*API for fopen, fread, etc*/
-#define LV_USE_FS_STDIO 1
-#if LV_USE_FS_STDIO
- #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
- #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
- #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
-#endif
-
-/*API for open, read, etc*/
-#define LV_USE_FS_POSIX 0
-#if LV_USE_FS_POSIX
- #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
- #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
- #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
-#endif
-
-/*API for CreateFile, ReadFile, etc*/
-#define LV_USE_FS_WIN32 0
-#if LV_USE_FS_WIN32
- #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
- #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/
- #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
-#endif
-
-/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/
-#define LV_USE_FS_FATFS 0
-#if LV_USE_FS_FATFS
- #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
- #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/
-#endif
-
-/*PNG decoder library*/
-#define LV_USE_PNG 0
-
-/*BMP decoder library*/
-#define LV_USE_BMP 0
-
-/* JPG + split JPG decoder library.
- * Split JPG is a custom format optimized for embedded systems. */
-#define LV_USE_SJPG 0
-
-/*GIF decoder library*/
-#define LV_USE_GIF 0
-
-/*QR code library*/
-#define LV_USE_QRCODE 0
-
-/*FreeType library*/
-#define LV_USE_FREETYPE 0
-#if LV_USE_FREETYPE
- /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/
- #define LV_FREETYPE_CACHE_SIZE (16 * 1024)
- #if LV_FREETYPE_CACHE_SIZE >= 0
- /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */
- /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */
- /* if font size >= 256, must be configured as image cache */
- #define LV_FREETYPE_SBIT_CACHE 0
- /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */
- /* (0:use system defaults) */
- #define LV_FREETYPE_CACHE_FT_FACES 0
- #define LV_FREETYPE_CACHE_FT_SIZES 0
- #endif
-#endif
-
-/*Rlottie library*/
-#define LV_USE_RLOTTIE 0
-
-/*FFmpeg library for image decoding and playing videos
- *Supports all major image formats so do not enable other image decoder with it*/
-#define LV_USE_FFMPEG 0
-#if LV_USE_FFMPEG
- /*Dump input information to stderr*/
- #define LV_FFMPEG_DUMP_FORMAT 0
-#endif
-
-/*-----------
- * Others
- *----------*/
-
-/*1: Enable API to take snapshot for object*/
-#define LV_USE_SNAPSHOT 0
-
-/*1: Enable Monkey test*/
-#define LV_USE_MONKEY 0
-
-/*1: Enable grid navigation*/
-#define LV_USE_GRIDNAV 0
-
-/*1: Enable lv_obj fragment*/
-#define LV_USE_FRAGMENT 0
-
-/*1: Support using images as font in label or span widgets */
-#define LV_USE_IMGFONT 0
-
-/*1: Enable a published subscriber based messaging system */
-#define LV_USE_MSG 0
-
-/*1: Enable Pinyin input method*/
-/*Requires: lv_keyboard*/
-#define LV_USE_IME_PINYIN 0
-#if LV_USE_IME_PINYIN
- /*1: Use default thesaurus*/
- /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/
- #define LV_IME_PINYIN_USE_DEFAULT_DICT 1
- /*Set the maximum number of candidate panels that can be displayed*/
- /*This needs to be adjusted according to the size of the screen*/
- #define LV_IME_PINYIN_CAND_TEXT_NUM 6
-
- /*Use 9 key input(k9)*/
- #define LV_IME_PINYIN_USE_K9_MODE 1
- #if LV_IME_PINYIN_USE_K9_MODE == 1
- #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3
- #endif // LV_IME_PINYIN_USE_K9_MODE
-#endif
-
-/*==================
-* EXAMPLES
-*==================*/
-
-/*Enable the examples to be built with the library*/
-#define LV_BUILD_EXAMPLES 0
-
-/*===================
- * DEMO USAGE
- ====================*/
-
-/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
-#define LV_USE_DEMO_WIDGETS 0
-#if LV_USE_DEMO_WIDGETS
-#define LV_DEMO_WIDGETS_SLIDESHOW 0
-#endif
-
-/*Demonstrate the usage of encoder and keyboard*/
-#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
-
-/*Benchmark your system*/
-#define LV_USE_DEMO_BENCHMARK 0
-#if LV_USE_DEMO_BENCHMARK
-/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/
-#define LV_DEMO_BENCHMARK_RGB565A8 0
-#endif
-
-/*Stress test for LVGL*/
-#define LV_USE_DEMO_STRESS 0
-
-/*Music player demo*/
-#define LV_USE_DEMO_MUSIC 0
-#if LV_USE_DEMO_MUSIC
- #define LV_DEMO_MUSIC_SQUARE 0
- #define LV_DEMO_MUSIC_LANDSCAPE 0
- #define LV_DEMO_MUSIC_ROUND 0
- #define LV_DEMO_MUSIC_LARGE 0
- #define LV_DEMO_MUSIC_AUTO_PLAY 0
-#endif
-
-/*--END OF LV_CONF_H--*/
-
-#endif /*LV_CONF_H*/
-
-#endif /*End of "Content enable"*/
diff --git a/src/drivers/display.cpp b/src/drivers/display.cpp
index 951a45eb..6ec82787 100644
--- a/src/drivers/display.cpp
+++ b/src/drivers/display.cpp
@@ -1,29 +1,31 @@
#include "display.hpp"
-#include <atomic>
#include <cstdint>
#include <cstring>
#include <memory>
-#include <mutex>
#include "assert.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_attr.h"
+#include "esp_err.h"
#include "esp_heap_caps.h"
#include "freertos/portable.h"
#include "freertos/portmacro.h"
#include "freertos/projdefs.h"
#include "hal/gpio_types.h"
+#include "hal/lv_hal_disp.h"
#include "hal/spi_types.h"
#include "lvgl/lvgl.h"
#include "display_init.hpp"
+#include "gpio_expander.hpp"
static const char* kTag = "DISPLAY";
-static const uint8_t kDisplayWidth = 128;
-static const uint8_t kDisplayHeight = 160;
+// TODO(jacqueline): Encode width and height variations in the init data.
+static const uint8_t kDisplayWidth = 128 + 2;
+static const uint8_t kDisplayHeight = 160 + 1;
static const uint8_t kTransactionQueueSize = 10;
/*
@@ -37,43 +39,27 @@ static const int kDisplayBufferSize = (kDisplayWidth * kDisplayHeight) / 10;
// Allocate both buffers in static memory to ensure that they're in DRAM, with
// minimal fragmentation. We most cases we always need these buffers anyway, so
-// it's not a memory hit we can avoid anyway.
+// it's not a memory hit we can avoid.
// Note: 128 * 160 / 10 * 2 bpp * 2 buffers = 8 KiB
DMA_ATTR static lv_color_t sBuffer1[kDisplayBufferSize];
DMA_ATTR static lv_color_t sBuffer2[kDisplayBufferSize];
namespace drivers {
-// Static functions for interrop with the LVGL display driver API, which
-// requires a function pointer.
-namespace callback {
-static std::atomic<Display*> instance = nullptr;
-
-extern "C" void flush_cb(lv_disp_drv_t* disp_drv,
- const lv_area_t* area,
- lv_color_t* color_map) {
- auto instance_unwrapped = instance.load();
- if (instance_unwrapped == nullptr) {
- ESP_LOGW(kTag, "uncaught flush callback");
- return;
- }
- // TODO: what if a transaction comes in right now?
- instance_unwrapped->Flush(disp_drv, area, color_map);
-}
-
-static void IRAM_ATTR post_cb(spi_transaction_t* transaction) {
- auto instance_unwrapped = instance.load();
- if (instance_unwrapped == nullptr) {
- // Can't log in ISR.
- return;
- }
- instance_unwrapped->PostTransaction(*transaction);
+/*
+ * Callback invoked by LVGL when there is new data to be written to the display.
+ */
+extern "C" void FlushDataCallback(lv_disp_drv_t* disp_drv,
+ const lv_area_t* area,
+ lv_color_t* color_map) {
+ Display* instance = static_cast<Display*>(disp_drv->user_data);
+ instance->OnLvglFlush(disp_drv, area, color_map);
}
-} // namespace callback
auto Display::create(GpioExpander* expander,
const displays::InitialisationData& init_data)
- -> cpp::result<std::unique_ptr<Display>, Error> {
+ -> std::unique_ptr<Display> {
+ // First, turn on the LED backlight.
expander->set_pin(GpioExpander::DISPLAY_LED, 0);
expander->set_pin(GpioExpander::DISPLAY_POWER_ENABLE, 1);
expander->Write();
@@ -94,16 +80,15 @@ auto Display::create(GpioExpander* expander,
.flags = 0,
.queue_size = kTransactionQueueSize,
.pre_cb = NULL,
- .post_cb = &callback::post_cb,
+ .post_cb = NULL,
};
spi_device_handle_t handle;
spi_bus_add_device(VSPI_HOST, &spi_cfg, &handle);
- // TODO: ideally create this later? a bit awkward rn.
auto display = std::make_unique<Display>(expander, handle);
// Now we reset the display into a known state, then configure it
- // TODO: set rotatoin
+ // TODO(jacqueline): set rotation
ESP_LOGI(kTag, "Sending init sequences");
for (int i = 0; i < init_data.num_sequences; i++) {
display->SendInitialisationSequence(init_data.sequences[i]);
@@ -118,7 +103,8 @@ auto Display::create(GpioExpander* expander,
display->driver_.draw_buf = &display->buffers_;
display->driver_.hor_res = kDisplayWidth;
display->driver_.ver_res = kDisplayHeight;
- display->driver_.flush_cb = &callback::flush_cb;
+ display->driver_.flush_cb = &FlushDataCallback;
+ display->driver_.user_data = display.get();
ESP_LOGI(kTag, "Registering driver");
display->display_ = lv_disp_drv_register(&display->driver_);
@@ -127,23 +113,19 @@ auto Display::create(GpioExpander* expander,
}
Display::Display(GpioExpander* gpio, spi_device_handle_t handle)
- : gpio_(gpio), handle_(handle) {
- callback::instance = this;
-}
+ : gpio_(gpio), handle_(handle) {}
-Display::~Display() {
- callback::instance = nullptr;
- // TODO.
-}
+Display::~Display() {}
void Display::SendInitialisationSequence(const uint8_t* data) {
- uint8_t command, num_args;
- uint16_t sleep_duration_ms;
+ // Hold onto the bus for the entire sequence so that we're not interrupted
+ // part way through.
+ spi_device_acquire_bus(handle_, portMAX_DELAY);
// First byte of the data is the number of commands.
for (int i = *(data++); i > 0; i--) {
- command = *(data++);
- num_args = *(data++);
+ uint8_t command = *(data++);
+ uint8_t num_args = *(data++);
bool has_delay = (num_args & displays::kDelayBit) > 0;
num_args &= ~displays::kDelayBit;
@@ -151,123 +133,100 @@ void Display::SendInitialisationSequence(const uint8_t* data) {
data += num_args;
if (has_delay) {
- sleep_duration_ms = *(data++);
+ uint16_t sleep_duration_ms = *(data++);
if (sleep_duration_ms == 0xFF) {
sleep_duration_ms = 500;
}
+
+ // Avoid hanging on to the bus whilst delaying.
+ spi_device_release_bus(handle_);
vTaskDelay(pdMS_TO_TICKS(sleep_duration_ms));
+ spi_device_acquire_bus(handle_, portMAX_DELAY);
}
}
+
+ spi_device_release_bus(handle_);
}
void Display::SendCommandWithData(uint8_t command,
const uint8_t* data,
- size_t length,
- uintptr_t flags) {
- SendCmd(&command, 1, flags);
- SendData(data, length, flags);
+ size_t length) {
+ SendCmd(&command, 1);
+ SendData(data, length);
}
-void Display::SendCmd(const uint8_t* data, size_t length, uintptr_t flags) {
- SendTransaction(COMMAND, data, length, flags);
+void Display::SendCmd(const uint8_t* data, size_t length) {
+ SendTransaction(COMMAND, data, length);
}
-void Display::SendData(const uint8_t* data, size_t length, uintptr_t flags) {
- SendTransaction(DATA, data, length, flags);
+void Display::SendData(const uint8_t* data, size_t length) {
+ SendTransaction(DATA, data, length);
}
void Display::SendTransaction(TransactionType type,
const uint8_t* data,
- size_t length,
- uint32_t flags) {
+ size_t length) {
+ // TODO(jacqueline): What's sending this?
if (length == 0) {
return;
}
- // TODO: Use a memory pool for these.
- spi_transaction_t* transaction = (spi_transaction_t*)heap_caps_calloc(
- 1, sizeof(spi_transaction_t), MALLOC_CAP_DMA);
+ spi_transaction_t transaction;
+ memset(&transaction, 0, sizeof(transaction));
- transaction->rx_buffer = NULL;
+ transaction.rx_buffer = NULL;
// Length is in bits, so multiply by 8.
- transaction->length = length * 8;
- transaction->rxlength = 0; // Match `length` value.
+ transaction.length = length * 8;
+ transaction.rxlength = 0; // Match `length` value.
// If the data to transmit is very short, then we can fit it directly
// inside the transaction struct.
- if (length * 8 <= 32) {
- transaction->flags = SPI_TRANS_USE_TXDATA;
- std::memcpy(&transaction->tx_data, data, length);
+ if (transaction.length <= 32) {
+ transaction.flags = SPI_TRANS_USE_TXDATA;
+ std::memcpy(&transaction.tx_data, data, length);
} else {
- // TODO: copy data to a DMA-capable transaction buffer
- transaction->tx_buffer = const_cast<uint8_t*>(data);
+ // Note: LVGL's buffers are in DMA-accessible memory, so whatever pointer
+ // it handed us should be DMA-accessible already. No need to copy.
+ transaction.tx_buffer = data;
}
- transaction->user = reinterpret_cast<void*>(flags);
-
- // TODO: acquire the bus first? Or in an outer scope?
- // TODO: fail gracefully
- // ESP_ERROR_CHECK(spi_device_queue_trans(handle_, transaction,
- // portMAX_DELAY));
- //
+ // TODO(jacqueline): Move this to an on-board GPIO for speed.
+ gpio_->set_pin(GpioExpander::DISPLAY_DR, type);
+ gpio_->Write();
- ServiceTransactions();
-
- gpio_->with(
- [&](auto& gpio) { gpio.set_pin(GpioExpander::DISPLAY_DR, type); });
-
- ESP_ERROR_CHECK(spi_device_polling_transmit(handle_, transaction));
-
- free(transaction);
+ // TODO(jacqueline): Handle these errors.
+ esp_err_t ret = spi_device_polling_transmit(handle_, &transaction);
+ ESP_ERROR_CHECK(ret);
}
-void Display::Flush(lv_disp_drv_t* disp_drv,
- const lv_area_t* area,
- lv_color_t* color_map) {
+void Display::OnLvglFlush(lv_disp_drv_t* disp_drv,
+ const lv_area_t* area,
+ lv_color_t* color_map) {
+ // Ideally we want to complete a single flush as quickly as possible, so grab
+ // the bus for this entire transaction sequence.
+ spi_device_acquire_bus(handle_, portMAX_DELAY);
+
+ // First we need to specify the rectangle of the display we're writing into.
uint16_t data[2] = {0, 0};
data[0] = SPI_SWAP_DATA_TX(area->x1, 16);
data[1] = SPI_SWAP_DATA_TX(area->x2, 16);
- SendCommandWithData(displays::ST77XX_CASET, (uint8_t*)data, 4);
+ SendCommandWithData(displays::ST77XX_CASET, reinterpret_cast<uint8_t*>(data),
+ 4);
data[0] = SPI_SWAP_DATA_TX(area->y1, 16);
data[1] = SPI_SWAP_DATA_TX(area->y2, 16);
- SendCommandWithData(displays::ST77XX_RASET, (uint8_t*)data, 4);
+ SendCommandWithData(displays::ST77XX_RASET, reinterpret_cast<uint8_t*>(data),
+ 4);
+ // Now send the pixels for this region.
uint32_t size = lv_area_get_width(area) * lv_area_get_height(area);
- SendCommandWithData(displays::ST77XX_RAMWR, (uint8_t*)color_map, size * 2,
- LVGL_FLUSH);
-
- // ESP_LOGI(kTag, "finished flush.");
- // lv_disp_flush_ready(&driver_);
-}
+ SendCommandWithData(displays::ST77XX_RAMWR,
+ reinterpret_cast<uint8_t*>(color_map), size * 2);
-void Display::PostTransaction(const spi_transaction_t& transaction) {
- if (reinterpret_cast<uintptr_t>(transaction.user) & LVGL_FLUSH) {
- lv_disp_flush_ready(&driver_);
- }
-}
-
-void Display::ServiceTransactions() {
- // todo
- if (1)
- return;
- spi_transaction_t* transaction = nullptr;
- // TODO: just wait '1' here, provide mechanism to wait for sure (poll?)
- while (spi_device_get_trans_result(handle_, &transaction, pdMS_TO_TICKS(1)) !=
- ESP_ERR_TIMEOUT) {
- ESP_LOGI(kTag, "cleaning up finished transaction");
-
- // TODO: a bit dodge lmao
- // TODO: also this should happen in the post callback instead i guess?
- if (transaction->length > 1000) {
- ESP_LOGI(kTag, "finished flush.");
- lv_disp_flush_ready(&driver_);
- }
+ spi_device_release_bus(handle_);
- // TODO: place back into pool.
- free(transaction);
- }
+ lv_disp_flush_ready(&driver_);
}
} // namespace drivers
diff --git a/src/drivers/include/display.hpp b/src/drivers/include/display.hpp
index 5f6d6f58..8157c3a5 100644
--- a/src/drivers/include/display.hpp
+++ b/src/drivers/include/display.hpp
@@ -1,6 +1,7 @@
#pragma once
#include <cstdint>
+#include <memory>
#include "driver/spi_master.h"
#include "lvgl/lvgl.h"
@@ -8,32 +9,30 @@
#include "display_init.hpp"
#include "gpio_expander.hpp"
-#include "sys/_stdint.h"
namespace drivers {
/*
- * Display driver for LVGL.
+ * LVGL display driver for ST77XX family displays.
*/
class Display {
public:
- enum Error {};
+ /*
+ * Creates the display driver, and resets and reinitialises the display
+ * over SPI. This never fails, since unfortunately these display don't give
+ * us back any kind of signal to tell us we're actually using them correctly.
+ */
static auto create(GpioExpander* expander,
const displays::InitialisationData& init_data)
- -> cpp::result<std::unique_ptr<Display>, Error>;
+ -> std::unique_ptr<Display>;
Display(GpioExpander* gpio, spi_device_handle_t handle);
~Display();
- void WriteData();
-
- void Flush(lv_disp_drv_t* disp_drv,
- const lv_area_t* area,
- lv_color_t* color_map);
-
- void IRAM_ATTR PostTransaction(const spi_transaction_t& transaction);
-
- void ServiceTransactions();
+ /* Driver callback invoked by LVGL when there is new data to display. */
+ void OnLvglFlush(lv_disp_drv_t* disp_drv,
+ const lv_area_t* area,
+ lv_color_t* color_map);
private:
GpioExpander* gpio_;
@@ -48,23 +47,15 @@ class Display {
DATA = 1,
};
- enum TransactionFlags {
- LVGL_FLUSH = 1,
- };
-
void SendInitialisationSequence(const uint8_t* data);
- void SendCommandWithData(uint8_t command,
- const uint8_t* data,
- size_t length,
- uintptr_t flags = 0);
+ void SendCommandWithData(uint8_t command, const uint8_t* data, size_t length);
+ void SendCmd(const uint8_t* data, size_t length);
+ void SendData(const uint8_t* data, size_t length);
- void SendCmd(const uint8_t* data, size_t length, uintptr_t flags = 0);
- void SendData(const uint8_t* data, size_t length, uintptr_t flags = 0);
void SendTransaction(TransactionType type,
const uint8_t* data,
- size_t length,
- uint32_t flags = 0);
+ size_t length);
};
} // namespace drivers
diff --git a/src/main/main.cpp b/src/main/main.cpp
index 1bbd2cca..ddde84e3 100644
--- a/src/main/main.cpp
+++ b/src/main/main.cpp
@@ -15,11 +15,13 @@
#include "esp_freertos_hooks.h"
#include "esp_intr_alloc.h"
#include "esp_log.h"
+#include "font/lv_font.h"
#include "freertos/portmacro.h"
#include "hal/gpio_types.h"
#include "hal/spi_types.h"
#include "lvgl/lvgl.h"
#include "misc/lv_color.h"
+#include "misc/lv_style.h"
#include "misc/lv_timer.h"
#include "widgets/lv_label.h"
@@ -63,22 +65,24 @@ extern "C" void lvgl_main(void* voidArgs) {
esp_register_freertos_tick_hook(&tick_hook);
ESP_LOGI(TAG, "init display");
- auto display_res =
+ std::unique_ptr<drivers::Display> display =
drivers::Display::create(gpio_expander, drivers::displays::kST7735R);
- if (display_res.has_error()) {
- ESP_LOGE(TAG, "Failed: %d", display_res.error());
- return;
- }
- std::unique_ptr<drivers::Display> display = std::move(display_res.value());
+
+ lv_style_t style;
+ lv_style_init(&style);
+ lv_style_set_text_color(&style, LV_COLOR_MAKE(0xFF, 0, 0));
+ // TODO: find a nice bitmap font for this display size and density.
+ // lv_style_set_text_font(&style, &lv_font_montserrat_24);
auto label = lv_label_create(NULL);
- lv_label_set_text(label, "g'day, cunts!");
+ lv_label_set_text(label, "COLOURS!!");
+ lv_obj_add_style(label, &style, 0);
+
lv_obj_center(label);
lv_scr_load(label);
while (1) {
lv_timer_handler();
- // display->ServiceTransactions();
vTaskDelay(pdMS_TO_TICKS(10));
}