diff --git a/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.cpp b/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.cpp index d9dc1ca6..427d4f7f 100644 --- a/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.cpp +++ b/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.cpp @@ -35,5 +35,6 @@ std::shared_ptr createDisplay() { configuration->mirrorX = true; configuration->backlightDutyFunction = driver::pwmbacklight::setBacklightDuty; - return std::make_shared(std::move(configuration)); + auto display = std::make_shared(std::move(configuration)); + return std::reinterpret_pointer_cast(display); } diff --git a/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.h b/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.h index 6c0fde39..5a0d81b3 100644 --- a/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.h +++ b/Boards/ElecrowCrowpanelBasic28/Source/hal/CrowPanelDisplay.h @@ -1,40 +1,5 @@ #pragma once #include "Tactility/hal/display/DisplayDevice.h" -#include -#include - -class CrowPanelDisplay : public tt::hal::display::DisplayDevice { - -private: - - esp_lcd_panel_io_handle_t ioHandle = nullptr; - esp_lcd_panel_handle_t panelHandle = nullptr; - lv_display_t* displayHandle = nullptr; - bool poweredOn = false; - -public: - - std::string getName() const final { return "ST7789"; } - std::string getDescription() const final { return "SPI display"; } - - bool start() override; - - bool stop() override; - - void setPowerOn(bool turnOn) override; - bool isPoweredOn() const override { return poweredOn; }; - bool supportsPowerControl() const override { return true; } - - std::shared_ptr _Nullable createTouch() override; - - void setBacklightDuty(uint8_t backlightDuty) override; - bool supportsBacklightDuty() const override { return true; } - - void setGammaCurve(uint8_t index) override; - uint8_t getGammaCurveCount() const override { return 4; }; - - lv_display_t* _Nullable getLvglDisplay() const override { return displayHandle; } -}; std::shared_ptr createDisplay(); diff --git a/Drivers/EspLcdCompat/Source/EspLcdTouch.h b/Drivers/EspLcdCompat/Source/EspLcdTouch.h index 5f4c6a19..3480a0ae 100644 --- a/Drivers/EspLcdCompat/Source/EspLcdTouch.h +++ b/Drivers/EspLcdCompat/Source/EspLcdTouch.h @@ -15,6 +15,8 @@ class EspLcdTouch : public tt::hal::touch::TouchDevice { protected: + esp_lcd_touch_handle_t _Nullable getTouchHandle() const { return touchHandle; } + virtual bool createIoHandle(esp_lcd_panel_io_handle_t& ioHandle) = 0; virtual bool createTouchHandle(esp_lcd_panel_io_handle_t ioHandle, const esp_lcd_touch_config_t& configuration, esp_lcd_touch_handle_t& touchHandle) = 0; diff --git a/Drivers/XPT2046/CMakeLists.txt b/Drivers/XPT2046/CMakeLists.txt index 6697b708..3d442aa9 100644 --- a/Drivers/XPT2046/CMakeLists.txt +++ b/Drivers/XPT2046/CMakeLists.txt @@ -1,5 +1,5 @@ idf_component_register( SRC_DIRS "Source" INCLUDE_DIRS "Source" - REQUIRES Tactility esp_lcd_touch esp_lcd_touch_xpt2046 + REQUIRES Tactility EspLcdCompat esp_lcd_touch_xpt2046 ) diff --git a/Drivers/XPT2046/Source/Xpt2046Power.cpp b/Drivers/XPT2046/Source/Xpt2046Power.cpp index 8715d74c..45780d15 100644 --- a/Drivers/XPT2046/Source/Xpt2046Power.cpp +++ b/Drivers/XPT2046/Source/Xpt2046Power.cpp @@ -2,11 +2,28 @@ #include "Xpt2046Touch.h" #include +#include -#define TAG "xpt2046_power" +constexpr auto TAG = "Xpt2046Power"; +constexpr auto BATTERY_VOLTAGE_MIN = 3.2f; +constexpr auto BATTERY_VOLTAGE_MAX = 4.2f; +constexpr auto MAX_VOLTAGE_SAMPLES = 15; -#define BATTERY_VOLTAGE_MIN 3.2f -#define BATTERY_VOLTAGE_MAX 4.2f +static std::shared_ptr findXp2046TouchDevice() { + // Make a safe copy + auto touch = tt::hal::findFirstDevice(tt::hal::Device::Type::Touch); + if (touch == nullptr) { + TT_LOG_E(TAG, "Touch device not found"); + return nullptr; + } + + if (touch->getName() != "XPT2046") { + TT_LOG_E(TAG, "Touch device name mismatch"); + return nullptr; + } + + return std::reinterpret_pointer_cast(touch); +} static uint8_t estimateChargeLevelFromVoltage(uint32_t milliVolt) { float volts = std::min((float)milliVolt / 1000.f, BATTERY_VOLTAGE_MAX); @@ -47,25 +64,26 @@ bool Xpt2046Power::getMetric(MetricType type, MetricData& data) { } } -bool Xpt2046Power::readBatteryVoltageOnce(uint32_t& output) const { - // Make a safe copy - auto touch = Xpt2046Touch::getInstance(); - if (touch != nullptr) { - float vbat; - if (touch->getVBat(vbat)) { - // Convert to mV - output = (uint32_t)(vbat * 1000.f); - return true; +bool Xpt2046Power::readBatteryVoltageOnce(uint32_t& output) { + if (xptTouch == nullptr) { + xptTouch = findXp2046TouchDevice(); + if (xptTouch == nullptr) { + TT_LOG_E(TAG, "XPT2046 touch device not found"); + return false; } } - return false; + float vbat; + if (!xptTouch->getVBat(vbat)) { + return false; + } + + // Convert to mV + output = (uint32_t)(vbat * 1000.f); + return true; } - -#define MAX_VOLTAGE_SAMPLES 15 - -bool Xpt2046Power::readBatteryVoltageSampled(uint32_t& output) const { +bool Xpt2046Power::readBatteryVoltageSampled(uint32_t& output) { size_t samples_read = 0; uint32_t sample_accumulator = 0; uint32_t sample_read_buffer; diff --git a/Drivers/XPT2046/Source/Xpt2046Power.h b/Drivers/XPT2046/Source/Xpt2046Power.h index 3615c885..68b1e93e 100644 --- a/Drivers/XPT2046/Source/Xpt2046Power.h +++ b/Drivers/XPT2046/Source/Xpt2046Power.h @@ -1,8 +1,8 @@ #pragma once #include -#include +class Xpt2046Touch; using tt::hal::power::PowerDevice; /** @@ -11,9 +11,13 @@ using tt::hal::power::PowerDevice; */ class Xpt2046Power : public PowerDevice { + std::shared_ptr xptTouch; + + bool readBatteryVoltageOnce(uint32_t& output); + bool readBatteryVoltageSampled(uint32_t& output); + public: - Xpt2046Power() = default; ~Xpt2046Power() = default; std::string getName() const final { return "XPT2046 Power Measurement"; } @@ -22,10 +26,6 @@ public: bool supportsMetric(MetricType type) const override; bool getMetric(MetricType type, MetricData& data) override; -private: - - bool readBatteryVoltageOnce(uint32_t& output) const; - bool readBatteryVoltageSampled(uint32_t& output) const; }; std::shared_ptr getOrCreatePower(); diff --git a/Drivers/XPT2046/Source/Xpt2046Touch.cpp b/Drivers/XPT2046/Source/Xpt2046Touch.cpp index 8bc3e767..fa3b0b4c 100644 --- a/Drivers/XPT2046/Source/Xpt2046Touch.cpp +++ b/Drivers/XPT2046/Source/Xpt2046Touch.cpp @@ -7,19 +7,19 @@ #include #include -#define TAG "xpt2046_touch" - Xpt2046Touch* Xpt2046Touch::instance = nullptr; -bool Xpt2046Touch::start(lv_display_t* display) { +bool Xpt2046Touch::createIoHandle(esp_lcd_panel_io_handle_t& outHandle) { const esp_lcd_panel_io_spi_config_t io_config = ESP_LCD_TOUCH_IO_SPI_XPT2046_CONFIG(configuration->spiPinCs); + return esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &outHandle) == ESP_OK; +} - if (esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &ioHandle) != ESP_OK) { - TT_LOG_E(TAG, "Touch IO SPI creation failed"); - return false; - } +bool Xpt2046Touch::createTouchHandle(esp_lcd_panel_io_handle_t ioHandle, const esp_lcd_touch_config_t& config, esp_lcd_touch_handle_t& panelHandle) { + return esp_lcd_touch_new_spi_xpt2046(ioHandle, &config, &panelHandle) == ESP_OK; +} - esp_lcd_touch_config_t config = { +esp_lcd_touch_config_t Xpt2046Touch::createEspLcdTouchConfig() { + return { .x_max = configuration->xMax, .y_max = configuration->yMax, .rst_gpio_num = GPIO_NUM_NC, @@ -38,61 +38,20 @@ bool Xpt2046Touch::start(lv_display_t* display) { .user_data = nullptr, .driver_data = nullptr }; - - if (esp_lcd_touch_new_spi_xpt2046(ioHandle, &config, &touchHandle) != ESP_OK) { - TT_LOG_E(TAG, "XPT2046 driver init failed"); - cleanup(); - return false; - } - - const lvgl_port_touch_cfg_t touch_cfg = { - .disp = display, - .handle = touchHandle, - }; - - TT_LOG_I(TAG, "Adding touch to LVGL"); - deviceHandle = lvgl_port_add_touch(&touch_cfg); - if (deviceHandle == nullptr) { - TT_LOG_E(TAG, "Adding touch failed"); - cleanup(); - return false; - } - - instance = this; - return true; -} - -bool Xpt2046Touch::stop() { - instance = nullptr; - cleanup(); - return true; -} - -void Xpt2046Touch::cleanup() { - if (deviceHandle != nullptr) { - lv_indev_delete(deviceHandle); - deviceHandle = nullptr; - } - - if (touchHandle != nullptr) { - esp_lcd_touch_del(touchHandle); - touchHandle = nullptr; - } - - if (ioHandle != nullptr) { - esp_lcd_panel_io_del(ioHandle); - ioHandle = nullptr; - } } bool Xpt2046Touch::getVBat(float& outputVbat) { - if (touchHandle != nullptr) { - // Shares the SPI bus with the display, so we have to sync/lock as this method might be called from anywhere - if (tt::lvgl::lock(50 / portTICK_PERIOD_MS)) { - esp_lcd_touch_xpt2046_read_battery_level(touchHandle, &outputVbat); - tt::lvgl::unlock(); - return true; - } + auto touch_handle = getTouchHandle(); + if (touch_handle == nullptr) { + return false; } - return false; + + // Shares the SPI bus with the display, so we have to sync/lock as this method might be called from anywhere + if (!tt::lvgl::lock(50 / portTICK_PERIOD_MS)) { + return false; + } + + esp_lcd_touch_xpt2046_read_battery_level(touch_handle, &outputVbat); + tt::lvgl::unlock(); + return true; } diff --git a/Drivers/XPT2046/Source/Xpt2046Touch.h b/Drivers/XPT2046/Source/Xpt2046Touch.h index 21fe3660..e1d65007 100644 --- a/Drivers/XPT2046/Source/Xpt2046Touch.h +++ b/Drivers/XPT2046/Source/Xpt2046Touch.h @@ -1,13 +1,11 @@ #pragma once -#include "Tactility/hal/touch/TouchDevice.h" - -#include +#include #include -#include +#include -class Xpt2046Touch : public tt::hal::touch::TouchDevice { +class Xpt2046Touch : public EspLcdTouch { public: @@ -45,11 +43,12 @@ private: static Xpt2046Touch* instance; std::unique_ptr configuration; - esp_lcd_panel_io_handle_t _Nullable ioHandle = nullptr; - esp_lcd_touch_handle_t _Nullable touchHandle = nullptr; - lv_indev_t* _Nullable deviceHandle = nullptr; - void cleanup(); + bool createIoHandle(esp_lcd_panel_io_handle_t& outHandle) override; + + bool createTouchHandle(esp_lcd_panel_io_handle_t ioHandle, const esp_lcd_touch_config_t& configuration, esp_lcd_touch_handle_t& panelHandle) override; + + esp_lcd_touch_config_t createEspLcdTouchConfig() override; public: @@ -58,14 +57,8 @@ public: } std::string getName() const final { return "XPT2046"; } - std::string getDescription() const final { return "I2C touch driver"; } - bool start(lv_display_t* display) override; - bool stop() override; - lv_indev_t* _Nullable getLvglIndev() override { return deviceHandle; } + std::string getDescription() const final { return "XPT2046 I2C touch driver"; } bool getVBat(float& outputVbat); - - /** Used for accessing getVBat() in Power driver */ - static Xpt2046Touch* getInstance() { return instance; } };