diff --git a/esp/cpp/07_lcd-panel/main/display.cpp b/esp/cpp/07_lcd-panel/main/display.cpp index 7c68426..6550611 100644 --- a/esp/cpp/07_lcd-panel/main/display.cpp +++ b/esp/cpp/07_lcd-panel/main/display.cpp @@ -13,7 +13,8 @@ _lock_t Display::ScopedLock::lv_lock_; Display::Display(IPanelDevice &device) : - panel_(device) + panel_(device), + lv_tick_timer_(nullptr) { if (!lv_is_initialized()) { ESP_LOGI(TAG, "Initialize LVGL"); @@ -47,19 +48,11 @@ Display::Display(IPanelDevice &device) : .on_color_trans_done = Display::lvgl_flush_ready, }; ESP_ERROR_CHECK( - esp_lcd_panel_io_register_event_callbacks(panel_.esp_io_handle_, &cbs, + esp_lcd_panel_io_register_event_callbacks(panel_.esp_io_, &cbs, lv_display_)); + register_lvgl_tick_timer(); - ESP_LOGI(TAG, "Use esp_timer to increase LVGL tick"); - const esp_timer_create_args_t lvgl_tick_timer_args = { - .callback = &Display::lvgl_increase_tick, - .name = "lvgl_tick" - }; - esp_timer_handle_t lvgl_tick_timer = nullptr; - ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer)); - ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, - LVGL_TICK_PERIOD_MS * 1000)); - + // TODO: What is this ESP_LOGI(TAG, "Create LVGL task"); xTaskCreate(Display::lvgl_port_task, "LVGL", LVGL_TASK_STACK_SIZE, nullptr, LVGL_TASK_PRIORITY, nullptr); @@ -98,7 +91,7 @@ bool Display::lvgl_flush_ready(esp_lcd_panel_io_handle_t, } void Display::lvgl_flush_cb(lv_display_t *display, const lv_area_t *area, - uint8_t *px_map) + uint8_t *px_map) // NOLINT(*-non-const-parameter) { auto panel_handle = (esp_lcd_panel_handle_t) lv_display_get_user_data(display); @@ -158,3 +151,16 @@ void Display::lvgl_increase_tick(void *) usleep(1000 * time_till_next_ms); } } + +void Display::register_lvgl_tick_timer() // NOLINT(*-convert-member-functions-to-static) +{ + ESP_LOGI(TAG, "Use esp_timer to increase LVGL tick"); + const esp_timer_create_args_t lvgl_tick_timer_args = { + .callback = &Display::lvgl_increase_tick, + .name = "lvgl_tick" + }; + esp_timer_handle_t lvgl_tick_timer = nullptr; + ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer)); + ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, + LVGL_TICK_PERIOD_MS * 1000)); +} diff --git a/esp/cpp/07_lcd-panel/main/display.h b/esp/cpp/07_lcd-panel/main/display.h index 43e65c0..365afd7 100644 --- a/esp/cpp/07_lcd-panel/main/display.h +++ b/esp/cpp/07_lcd-panel/main/display.h @@ -4,6 +4,7 @@ #include #include +#include #include "panel.h" @@ -43,6 +44,8 @@ public: [[noreturn]] static void lvgl_port_task(void *arg); private: + void register_lvgl_tick_timer(); + Panel panel_; lv_display_t *lv_display_; @@ -55,6 +58,9 @@ private: // @sa lv_display_get_screen_active std::unordered_map lv_objects_; + // TODO: This could be a private struct + esp_timer_handle_t lv_tick_timer_; + struct ScopedLock { explicit ScopedLock() { _lock_acquire(&lv_lock_); } diff --git a/esp/cpp/07_lcd-panel/main/i2c.h b/esp/cpp/07_lcd-panel/main/i2c.h index ac51b5e..9c7143c 100644 --- a/esp/cpp/07_lcd-panel/main/i2c.h +++ b/esp/cpp/07_lcd-panel/main/i2c.h @@ -30,6 +30,7 @@ struct I2C { ~I2C() = default; + // TODO: Can you use the I2C get_master_bus API in a static method? i2c_master_bus_handle_t esp_i2c_bus_; int rst_num_; diff --git a/esp/cpp/07_lcd-panel/main/main.cpp b/esp/cpp/07_lcd-panel/main/main.cpp index 68a52d2..9335442 100644 --- a/esp/cpp/07_lcd-panel/main/main.cpp +++ b/esp/cpp/07_lcd-panel/main/main.cpp @@ -4,7 +4,7 @@ // Pin may vary based on your schematic. #define PIN_SDA GPIO_NUM_21 #define PIN_SCL GPIO_NUM_22 -#define PIN_RST -1 +#define PIN_RST (-1) I2C i2c(PIN_SDA, PIN_SCL, PIN_RST); diff --git a/esp/cpp/07_lcd-panel/main/panel.cpp b/esp/cpp/07_lcd-panel/main/panel.cpp index 0bc778a..694ab54 100644 --- a/esp/cpp/07_lcd-panel/main/panel.cpp +++ b/esp/cpp/07_lcd-panel/main/panel.cpp @@ -3,7 +3,7 @@ Panel::Panel(IPanelDevice &device) : device_(&device), - esp_io_handle_(nullptr), + esp_io_(nullptr), esp_panel_(nullptr), esp_panel_config_( (esp_lcd_panel_dev_config_t) { @@ -13,9 +13,9 @@ Panel::Panel(IPanelDevice &device) : } ) { - esp_io_handle_ = device_->create_io_handle(); + esp_io_ = device_->create_io_handle(); - device_->create_panel(esp_panel_config_, esp_io_handle_, esp_panel_); + device_->create_panel(esp_panel_config_, esp_io_, esp_panel_); ESP_LOGI(TAG, "Resetting panel display"); ESP_ERROR_CHECK(esp_lcd_panel_reset(esp_panel_)); diff --git a/esp/cpp/07_lcd-panel/main/panel.h b/esp/cpp/07_lcd-panel/main/panel.h index 4ddeadd..f1ca325 100644 --- a/esp/cpp/07_lcd-panel/main/panel.h +++ b/esp/cpp/07_lcd-panel/main/panel.h @@ -11,7 +11,7 @@ public: IPanelDevice *device_; - esp_lcd_panel_io_handle_t esp_io_handle_; + esp_lcd_panel_io_handle_t esp_io_; esp_lcd_panel_handle_t esp_panel_; diff --git a/esp/cpp/07_lcd-panel/main/ssd1306.cpp b/esp/cpp/07_lcd-panel/main/ssd1306.cpp index bd7a902..ed06643 100644 --- a/esp/cpp/07_lcd-panel/main/ssd1306.cpp +++ b/esp/cpp/07_lcd-panel/main/ssd1306.cpp @@ -22,12 +22,3 @@ SSD1306::SSD1306(I2C& i2c, ), ssd1306_config_(config) { } - -void SSD1306::init_panel(esp_lcd_panel_dev_config_t &config, - esp_lcd_panel_io_handle_t io, - esp_lcd_panel_handle_t &panel) -{ - // Allocate SSD1306 panel handle. - config.vendor_config = &ssd1306_config_; - ESP_ERROR_CHECK(esp_lcd_new_panel_ssd1306(io, &config, &panel)); -} diff --git a/esp/cpp/07_lcd-panel/main/ssd1306.h b/esp/cpp/07_lcd-panel/main/ssd1306.h index 2537466..9548406 100644 --- a/esp/cpp/07_lcd-panel/main/ssd1306.h +++ b/esp/cpp/07_lcd-panel/main/ssd1306.h @@ -1,3 +1,16 @@ +/* + * https://docs.espressif.com/projects/esp-idf/en/v5.3.2/esp32/api-reference/peripherals/lcd/index.html#functional-overview + * + * Implementing the interface draw to an LCD using various interface modes. + * I2C interface mode is SSD1306 + * SPI interface mode is ST7789 + * I80 interface mode is NT35510 or ST7789 + * + * Actually, I think any driver can be used with any interface mode + * Along with additional third party drivers via the component manager + * https://github.com/espressif/esp-idf/tree/0d6099ec533c4b647fb7a7b0b8942bc7aeb82f90/examples/peripherals/lcd/spi_lcd_touch#spi-lcd-and-touch-panel-example + */ + #ifndef SSD1306_H #define SSD1306_H @@ -45,7 +58,10 @@ public: private: void init_panel(esp_lcd_panel_dev_config_t &config, esp_lcd_panel_io_handle_t io, - esp_lcd_panel_handle_t &panel) override; + esp_lcd_panel_handle_t &panel) override + { + ESP_ERROR_CHECK(esp_lcd_new_panel_ssd1306(io, &config, &panel)); + } }; #endif // SSD1306_H