#pragma once #include "Tactility/hal/spi/Spi.h" #include #include #include #include #include #include #include class St7789Display final : public EspLcdDisplay { std::shared_ptr lock; public: class Configuration { public: Configuration( spi_host_device_t spiHostDevice, gpio_num_t csPin, gpio_num_t dcPin, unsigned int horizontalResolution, unsigned int verticalResolution, std::shared_ptr touch, bool swapXY = false, bool mirrorX = false, bool mirrorY = false, bool invertColor = false, uint32_t bufferSize = 0, // Size in pixel count. 0 means default, which is 1/10 of the screen size int gapX = 0, int gapY = 0 ) : spiHostDevice(spiHostDevice), csPin(csPin), dcPin(dcPin), horizontalResolution(horizontalResolution), verticalResolution(verticalResolution), gapX(gapX), gapY(gapY), swapXY(swapXY), mirrorX(mirrorX), mirrorY(mirrorY), invertColor(invertColor), bufferSize(bufferSize), touch(std::move(touch)) { if (this->bufferSize == 0) { this->bufferSize = horizontalResolution * verticalResolution / 10; } } spi_host_device_t spiHostDevice; gpio_num_t csPin; gpio_num_t dcPin; gpio_num_t resetPin = GPIO_NUM_NC; unsigned int pixelClockFrequency = 80'000'000; // Hertz size_t transactionQueueDepth = 10; unsigned int horizontalResolution; unsigned int verticalResolution; int gapX; int gapY; bool swapXY = false; bool mirrorX = false; bool mirrorY = false; bool invertColor = false; uint32_t bufferSize = 0; // Size in pixel count. 0 means default, which is 1/10 of the screen size std::shared_ptr touch; std::function _Nullable backlightDutyFunction = nullptr; }; private: std::unique_ptr configuration; bool createIoHandle(esp_lcd_panel_io_handle_t& ioHandle) override; bool createPanelHandle(esp_lcd_panel_io_handle_t ioHandle, esp_lcd_panel_handle_t& panelHandle) override; lvgl_port_display_cfg_t getLvglPortDisplayConfig(esp_lcd_panel_io_handle_t ioHandle, esp_lcd_panel_handle_t panelHandle) override; public: explicit St7789Display(std::unique_ptr inConfiguration) : EspLcdDisplay(tt::hal::spi::getLock(inConfiguration->spiHostDevice)), configuration(std::move(inConfiguration) ) { assert(configuration != nullptr); assert(getLock() != nullptr); } std::string getName() const override { return "ST7789"; } std::string getDescription() const override { return "ST7789 display"; } std::shared_ptr _Nullable getTouchDevice() override { return configuration->touch; } void setBacklightDuty(uint8_t backlightDuty) override { if (configuration->backlightDutyFunction != nullptr) { configuration->backlightDutyFunction(backlightDuty); } } bool supportsBacklightDuty() const override { return configuration->backlightDutyFunction != nullptr; } void setGammaCurve(uint8_t index) override; uint8_t getGammaCurveCount() const override { return 4; }; }; std::shared_ptr createDisplay();