klips/esp/cpp/07_lcd-panel-i2c/main/panel_device.h

90 lines
2.3 KiB
C
Raw Normal View History

2025-02-15 10:11:49 -05:00
#ifndef PANEL_DEVICE_H
#define PANEL_DEVICE_H
#include <esp_lcd_panel_dev.h>
#include <esp_lcd_panel_ops.h>
2025-02-15 17:12:06 -05:00
#include <esp_lcd_panel_io.h>
#include <esp_log.h>
2025-02-15 18:26:26 -05:00
#include <display/lv_display.h>
2025-02-15 10:11:49 -05:00
2025-02-15 17:44:58 -05:00
#include "i2c.h"
2025-02-15 10:11:49 -05:00
2025-02-15 17:44:58 -05:00
#define LVGL_PALETTE_SIZE 8
2025-02-15 10:11:49 -05:00
2025-02-15 17:12:06 -05:00
class IPanelDevice {
public:
2025-02-15 18:16:25 -05:00
explicit IPanelDevice(I2C &i2c,
esp_lcd_panel_io_i2c_config_t config,
int width,
int height) :
IPanelDevice(i2c, config, width, height,
width * height / 8 + LVGL_PALETTE_SIZE) { }
explicit IPanelDevice(I2C &i2c,
esp_lcd_panel_io_i2c_config_t io_config,
int width,
int height,
size_t draw_buf_size) :
width_(width),
height_(height),
rst_num_(i2c.rst_num_),
lv_buf_size_(draw_buf_size),
2025-02-15 18:26:26 -05:00
esp_i2c_bus_(i2c.esp_i2c_bus_),
esp_io_config_(io_config) { }
2025-02-15 10:11:49 -05:00
2025-02-15 17:12:06 -05:00
virtual ~IPanelDevice() = default;
2025-02-15 10:11:49 -05:00
2025-02-15 17:12:06 -05:00
[[nodiscard]] lv_display_t *create_display() const
2025-02-15 10:11:49 -05:00
{
2025-02-15 17:12:06 -05:00
auto display = lv_display_create(width_, height_);
assert(display);
return display;
2025-02-15 10:11:49 -05:00
}
2025-02-15 18:26:26 -05:00
[[nodiscard]] esp_lcd_panel_io_handle_t create_io_handle()
{
ESP_LOGI(TAG, "Creating panel IO handle");
esp_lcd_panel_io_handle_t handle = nullptr;
ESP_ERROR_CHECK(
esp_lcd_new_panel_io_i2c(esp_i2c_bus_, &esp_io_config_, &handle));
return handle;
}
2025-02-15 17:12:06 -05:00
void create_panel(esp_lcd_panel_dev_config_t &config,
esp_lcd_panel_io_handle_t io,
esp_lcd_panel_handle_t &panel)
2025-02-15 10:11:49 -05:00
{
2025-02-15 17:12:06 -05:00
// If the passed handle is already allocated, delete it.
if (panel != nullptr) {
ESP_LOGI(TAG, "Removing unused panel");
esp_lcd_panel_del(panel);
}
ESP_LOGI(TAG, "Install SSD1306 panel driver");
init_panel(config, io, panel);
2025-02-15 10:11:49 -05:00
}
2025-02-15 18:26:26 -05:00
virtual void *vendor_config() = 0;
2025-02-15 17:12:06 -05:00
int32_t width_;
2025-02-15 18:26:26 -05:00
2025-02-15 17:12:06 -05:00
int32_t height_;
2025-02-15 18:26:26 -05:00
2025-02-15 18:16:25 -05:00
int rst_num_;
2025-02-15 10:11:49 -05:00
2025-02-15 17:12:06 -05:00
// LVGL reserves 2x4 bytes in the buffer to be used as a palette.
size_t lv_buf_size_;
2025-02-15 10:11:49 -05:00
2025-02-15 18:26:26 -05:00
i2c_master_bus_handle_t esp_i2c_bus_;
esp_lcd_panel_io_i2c_config_t esp_io_config_;
2025-02-15 10:11:49 -05:00
2025-02-15 17:12:06 -05:00
private:
virtual void init_panel(esp_lcd_panel_dev_config_t &config,
esp_lcd_panel_io_handle_t io,
esp_lcd_panel_handle_t &panel) = 0;
2025-02-15 10:11:49 -05:00
};
#endif // PANEL_DEVICE_H