mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-25 22:20:27 +00:00

Some checks are pending
CI / setup (check) (push) Waiting to run
CI / setup (esp32) (push) Waiting to run
CI / setup (esp32c3) (push) Waiting to run
CI / setup (esp32c6) (push) Waiting to run
CI / setup (esp32s3) (push) Waiting to run
CI / setup (nrf52840) (push) Waiting to run
CI / setup (rp2040) (push) Waiting to run
CI / setup (stm32) (push) Waiting to run
CI / check (push) Blocked by required conditions
CI / build-esp32 (push) Blocked by required conditions
CI / build-esp32-s3 (push) Blocked by required conditions
CI / build-esp32-c3 (push) Blocked by required conditions
CI / build-esp32-c6 (push) Blocked by required conditions
CI / build-nrf52 (push) Blocked by required conditions
CI / build-rpi2040 (push) Blocked by required conditions
CI / build-stm32 (push) Blocked by required conditions
CI / build-debian-src (push) Waiting to run
CI / package-pio-deps-native-tft (push) Waiting to run
CI / test-native (push) Waiting to run
CI / docker-deb-amd64 (push) Waiting to run
CI / docker-deb-amd64-tft (push) Waiting to run
CI / docker-alp-amd64 (push) Waiting to run
CI / docker-alp-amd64-tft (push) Waiting to run
CI / docker-deb-arm64 (push) Waiting to run
CI / docker-deb-armv7 (push) Waiting to run
CI / gather-artifacts (esp32) (push) Blocked by required conditions
CI / gather-artifacts (esp32c3) (push) Blocked by required conditions
CI / gather-artifacts (esp32c6) (push) Blocked by required conditions
CI / gather-artifacts (esp32s3) (push) Blocked by required conditions
CI / gather-artifacts (nrf52840) (push) Blocked by required conditions
CI / gather-artifacts (rp2040) (push) Blocked by required conditions
CI / gather-artifacts (stm32) (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
CI / release-firmware (esp32) (push) Blocked by required conditions
CI / release-firmware (esp32c3) (push) Blocked by required conditions
CI / release-firmware (esp32c6) (push) Blocked by required conditions
CI / release-firmware (esp32s3) (push) Blocked by required conditions
CI / release-firmware (nrf52840) (push) Blocked by required conditions
CI / release-firmware (rp2040) (push) Blocked by required conditions
CI / release-firmware (stm32) (push) Blocked by required conditions
CI / publish-firmware (push) Blocked by required conditions
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
137 lines
7.2 KiB
C++
137 lines
7.2 KiB
C++
#if HAS_TFT
|
|
|
|
#include "SPILock.h"
|
|
#include "sleep.h"
|
|
|
|
#include "api/PacketAPI.h"
|
|
#include "comms/PacketClient.h"
|
|
#include "comms/PacketServer.h"
|
|
#include "graphics/DeviceScreen.h"
|
|
#include "graphics/driver/DisplayDriverConfig.h"
|
|
|
|
#ifdef ARCH_PORTDUINO
|
|
#include "PortduinoGlue.h"
|
|
#include <thread>
|
|
#endif
|
|
|
|
DeviceScreen *deviceScreen = nullptr;
|
|
|
|
#ifdef ARCH_ESP32
|
|
// Get notified when the system is entering light sleep
|
|
CallbackObserver<DeviceScreen, void *> tftSleepObserver =
|
|
CallbackObserver<DeviceScreen, void *>(deviceScreen, &DeviceScreen::prepareSleep);
|
|
CallbackObserver<DeviceScreen, esp_sleep_wakeup_cause_t> endSleepObserver =
|
|
CallbackObserver<DeviceScreen, esp_sleep_wakeup_cause_t>(deviceScreen, &DeviceScreen::wakeUp);
|
|
#endif
|
|
|
|
void tft_task_handler(void *param = nullptr)
|
|
{
|
|
while (true) {
|
|
spiLock->lock();
|
|
deviceScreen->task_handler();
|
|
spiLock->unlock();
|
|
deviceScreen->sleep();
|
|
}
|
|
}
|
|
|
|
void tftSetup(void)
|
|
{
|
|
#ifndef ARCH_PORTDUINO
|
|
deviceScreen = &DeviceScreen::create();
|
|
PacketAPI::create(PacketServer::init());
|
|
deviceScreen->init(new PacketClient);
|
|
#else
|
|
if (settingsMap[displayPanel] != no_screen) {
|
|
DisplayDriverConfig displayConfig;
|
|
static char *panels[] = {"NOSCREEN", "X11", "FB", "ST7789", "ST7735", "ST7735S",
|
|
"ST7796", "ILI9341", "ILI9342", "ILI9486", "ILI9488", "HX8357D"};
|
|
static char *touch[] = {"NOTOUCH", "XPT2046", "STMPE610", "GT911", "FT5x06"};
|
|
#if defined(USE_X11)
|
|
if (settingsMap[displayPanel] == x11) {
|
|
if (settingsMap[displayWidth] && settingsMap[displayHeight])
|
|
displayConfig = DisplayDriverConfig(DisplayDriverConfig::device_t::X11, (uint16_t)settingsMap[displayWidth],
|
|
(uint16_t)settingsMap[displayHeight]);
|
|
else
|
|
displayConfig.device(DisplayDriverConfig::device_t::X11);
|
|
} else
|
|
#elif defined(USE_FRAMEBUFFER)
|
|
if (settingsMap[displayPanel] == fb) {
|
|
if (settingsMap[displayWidth] && settingsMap[displayHeight])
|
|
displayConfig = DisplayDriverConfig(DisplayDriverConfig::device_t::FB, (uint16_t)settingsMap[displayWidth],
|
|
(uint16_t)settingsMap[displayHeight]);
|
|
else
|
|
displayConfig.device(DisplayDriverConfig::device_t::FB);
|
|
} else
|
|
#endif
|
|
{
|
|
displayConfig.device(DisplayDriverConfig::device_t::CUSTOM_TFT)
|
|
.panel(DisplayDriverConfig::panel_config_t{.type = panels[settingsMap[displayPanel]],
|
|
.panel_width = (uint16_t)settingsMap[displayWidth],
|
|
.panel_height = (uint16_t)settingsMap[displayHeight],
|
|
.rotation = (bool)settingsMap[displayRotate],
|
|
.pin_cs = (int16_t)settingsMap[displayCS],
|
|
.pin_rst = (int16_t)settingsMap[displayReset],
|
|
.offset_x = (uint16_t)settingsMap[displayOffsetX],
|
|
.offset_y = (uint16_t)settingsMap[displayOffsetY],
|
|
.offset_rotation = (uint8_t)settingsMap[displayOffsetRotate],
|
|
.invert = settingsMap[displayInvert] ? true : false,
|
|
.rgb_order = (bool)settingsMap[displayRGBOrder],
|
|
.dlen_16bit = settingsMap[displayPanel] == ili9486 ||
|
|
settingsMap[displayPanel] == ili9488})
|
|
.bus(DisplayDriverConfig::bus_config_t{.freq_write = (uint32_t)settingsMap[displayBusFrequency],
|
|
.freq_read = 16000000,
|
|
.spi{.pin_dc = (int8_t)settingsMap[displayDC],
|
|
.use_lock = true,
|
|
.spi_host = (uint16_t)settingsMap[displayspidev]}})
|
|
.input(DisplayDriverConfig::input_config_t{.keyboardDevice = settingsStrings[keyboardDevice],
|
|
.pointerDevice = settingsStrings[pointerDevice]})
|
|
.light(DisplayDriverConfig::light_config_t{.pin_bl = (int16_t)settingsMap[displayBacklight],
|
|
.pwm_channel = (int8_t)settingsMap[displayBacklightPWMChannel],
|
|
.invert = (bool)settingsMap[displayBacklightInvert]});
|
|
if (settingsMap[touchscreenI2CAddr] == -1) {
|
|
displayConfig.touch(
|
|
DisplayDriverConfig::touch_config_t{.type = touch[settingsMap[touchscreenModule]],
|
|
.freq = (uint32_t)settingsMap[touchscreenBusFrequency],
|
|
.pin_int = (int16_t)settingsMap[touchscreenIRQ],
|
|
.offset_rotation = (uint8_t)settingsMap[touchscreenRotate],
|
|
.spi{
|
|
.spi_host = (int8_t)settingsMap[touchscreenspidev],
|
|
},
|
|
.pin_cs = (int16_t)settingsMap[touchscreenCS]});
|
|
} else {
|
|
displayConfig.touch(DisplayDriverConfig::touch_config_t{
|
|
.type = touch[settingsMap[touchscreenModule]],
|
|
.freq = (uint32_t)settingsMap[touchscreenBusFrequency],
|
|
.x_min = 0,
|
|
.x_max =
|
|
(int16_t)((settingsMap[touchscreenRotate] & 1 ? settingsMap[displayWidth] : settingsMap[displayHeight]) -
|
|
1),
|
|
.y_min = 0,
|
|
.y_max =
|
|
(int16_t)((settingsMap[touchscreenRotate] & 1 ? settingsMap[displayHeight] : settingsMap[displayWidth]) -
|
|
1),
|
|
.pin_int = (int16_t)settingsMap[touchscreenIRQ],
|
|
.offset_rotation = (uint8_t)settingsMap[touchscreenRotate],
|
|
.i2c{.i2c_addr = (uint8_t)settingsMap[touchscreenI2CAddr]}});
|
|
}
|
|
}
|
|
deviceScreen = &DeviceScreen::create(&displayConfig);
|
|
PacketAPI::create(PacketServer::init());
|
|
deviceScreen->init(new PacketClient);
|
|
} else {
|
|
LOG_INFO("Running without TFT display!");
|
|
}
|
|
#endif
|
|
|
|
if (deviceScreen) {
|
|
#ifdef ARCH_ESP32
|
|
tftSleepObserver.observe(¬ifyLightSleep);
|
|
endSleepObserver.observe(¬ifyLightSleepEnd);
|
|
xTaskCreatePinnedToCore(tft_task_handler, "tft", 10240, NULL, 1, NULL, 0);
|
|
#elif defined(ARCH_PORTDUINO)
|
|
std::thread *tft_task = new std::thread([] { tft_task_handler(); });
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#endif |