More cleanup.
This commit is contained in:
parent
5c61fbd378
commit
c9ec16d70c
@ -13,7 +13,8 @@
|
|||||||
_lock_t Display::ScopedLock::lv_lock_;
|
_lock_t Display::ScopedLock::lv_lock_;
|
||||||
|
|
||||||
Display::Display(IPanelDevice &device) :
|
Display::Display(IPanelDevice &device) :
|
||||||
panel_(device)
|
panel_(device),
|
||||||
|
lv_tick_timer_(nullptr)
|
||||||
{
|
{
|
||||||
if (!lv_is_initialized()) {
|
if (!lv_is_initialized()) {
|
||||||
ESP_LOGI(TAG, "Initialize LVGL");
|
ESP_LOGI(TAG, "Initialize LVGL");
|
||||||
@ -47,19 +48,11 @@ Display::Display(IPanelDevice &device) :
|
|||||||
.on_color_trans_done = Display::lvgl_flush_ready,
|
.on_color_trans_done = Display::lvgl_flush_ready,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(
|
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_));
|
lv_display_));
|
||||||
|
register_lvgl_tick_timer();
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Use esp_timer to increase LVGL tick");
|
// TODO: What is this
|
||||||
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));
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Create LVGL task");
|
ESP_LOGI(TAG, "Create LVGL task");
|
||||||
xTaskCreate(Display::lvgl_port_task, "LVGL", LVGL_TASK_STACK_SIZE,
|
xTaskCreate(Display::lvgl_port_task, "LVGL", LVGL_TASK_STACK_SIZE,
|
||||||
nullptr, LVGL_TASK_PRIORITY, nullptr);
|
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,
|
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 =
|
auto panel_handle =
|
||||||
(esp_lcd_panel_handle_t) lv_display_get_user_data(display);
|
(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);
|
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));
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <widgets/label/lv_label.h>
|
#include <widgets/label/lv_label.h>
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <esp_timer.h>
|
||||||
|
|
||||||
#include "panel.h"
|
#include "panel.h"
|
||||||
|
|
||||||
@ -43,6 +44,8 @@ public:
|
|||||||
[[noreturn]] static void lvgl_port_task(void *arg);
|
[[noreturn]] static void lvgl_port_task(void *arg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void register_lvgl_tick_timer();
|
||||||
|
|
||||||
Panel panel_;
|
Panel panel_;
|
||||||
|
|
||||||
lv_display_t *lv_display_;
|
lv_display_t *lv_display_;
|
||||||
@ -55,6 +58,9 @@ private:
|
|||||||
// @sa lv_display_get_screen_active
|
// @sa lv_display_get_screen_active
|
||||||
std::unordered_map<const char *, lv_obj_t *> lv_objects_;
|
std::unordered_map<const char *, lv_obj_t *> lv_objects_;
|
||||||
|
|
||||||
|
// TODO: This could be a private struct
|
||||||
|
esp_timer_handle_t lv_tick_timer_;
|
||||||
|
|
||||||
struct ScopedLock {
|
struct ScopedLock {
|
||||||
explicit ScopedLock() { _lock_acquire(&lv_lock_); }
|
explicit ScopedLock() { _lock_acquire(&lv_lock_); }
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ struct I2C {
|
|||||||
|
|
||||||
~I2C() = default;
|
~I2C() = default;
|
||||||
|
|
||||||
|
// TODO: Can you use the I2C get_master_bus API in a static method?
|
||||||
i2c_master_bus_handle_t esp_i2c_bus_;
|
i2c_master_bus_handle_t esp_i2c_bus_;
|
||||||
|
|
||||||
int rst_num_;
|
int rst_num_;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
// Pin may vary based on your schematic.
|
// Pin may vary based on your schematic.
|
||||||
#define PIN_SDA GPIO_NUM_21
|
#define PIN_SDA GPIO_NUM_21
|
||||||
#define PIN_SCL GPIO_NUM_22
|
#define PIN_SCL GPIO_NUM_22
|
||||||
#define PIN_RST -1
|
#define PIN_RST (-1)
|
||||||
|
|
||||||
I2C i2c(PIN_SDA, PIN_SCL, PIN_RST);
|
I2C i2c(PIN_SDA, PIN_SCL, PIN_RST);
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
Panel::Panel(IPanelDevice &device) :
|
Panel::Panel(IPanelDevice &device) :
|
||||||
device_(&device),
|
device_(&device),
|
||||||
esp_io_handle_(nullptr),
|
esp_io_(nullptr),
|
||||||
esp_panel_(nullptr),
|
esp_panel_(nullptr),
|
||||||
esp_panel_config_(
|
esp_panel_config_(
|
||||||
(esp_lcd_panel_dev_config_t) {
|
(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_LOGI(TAG, "Resetting panel display");
|
||||||
ESP_ERROR_CHECK(esp_lcd_panel_reset(esp_panel_));
|
ESP_ERROR_CHECK(esp_lcd_panel_reset(esp_panel_));
|
||||||
|
@ -11,7 +11,7 @@ public:
|
|||||||
|
|
||||||
IPanelDevice *device_;
|
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_;
|
esp_lcd_panel_handle_t esp_panel_;
|
||||||
|
|
||||||
|
@ -22,12 +22,3 @@ SSD1306::SSD1306(I2C& i2c,
|
|||||||
),
|
),
|
||||||
ssd1306_config_(config)
|
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));
|
|
||||||
}
|
|
||||||
|
@ -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
|
#ifndef SSD1306_H
|
||||||
#define SSD1306_H
|
#define SSD1306_H
|
||||||
|
|
||||||
@ -45,7 +58,10 @@ public:
|
|||||||
private:
|
private:
|
||||||
void init_panel(esp_lcd_panel_dev_config_t &config,
|
void init_panel(esp_lcd_panel_dev_config_t &config,
|
||||||
esp_lcd_panel_io_handle_t io,
|
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
|
#endif // SSD1306_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user