From 28d73ad8660e27f9c7b20b6e978d3d0c412dec00 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 7 Nov 2022 12:01:29 +1100 Subject: Split driver-y things into a separate component --- src/drivers/include/display.hpp | 67 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/drivers/include/display.hpp (limited to 'src/drivers/include/display.hpp') diff --git a/src/drivers/include/display.hpp b/src/drivers/include/display.hpp new file mode 100644 index 00000000..2d6e9cd6 --- /dev/null +++ b/src/drivers/include/display.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include +#include "display-init.hpp" +#include "driver/spi_master.h" +#include "gpio-expander.hpp" +#include "lvgl/lvgl.h" +#include "result.hpp" + +namespace gay_ipod { + +/* + * Display driver for LVGL. + */ +class Display { + public: + enum Error {}; + static auto create(GpioExpander* expander, + const displays::InitialisationData& init_data) + -> cpp::result, Error>; + + 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(); + + private: + GpioExpander* gpio_; + spi_device_handle_t handle_; + + lv_disp_draw_buf_t buffers_; + lv_disp_drv_t driver_; + lv_disp_t* display_ = nullptr; + + enum TransactionType { + COMMAND = 0, + 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 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, + uintptr_t flags = 0); +}; + +} // namespace gay_ipod -- cgit v1.2.3