mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-25 20:26:41 +00:00
Rework tft as driver for gui only
This commit is contained in:
parent
df9af1cc3a
commit
509b29e741
@ -9,6 +9,7 @@
|
|||||||
#include "lv_zifont.h"
|
#include "lv_zifont.h"
|
||||||
|
|
||||||
#include "hasp_log.h"
|
#include "hasp_log.h"
|
||||||
|
#include "hasp_tft.h"
|
||||||
#include "hasp_debug.h"
|
#include "hasp_debug.h"
|
||||||
#include "hasp_config.h"
|
#include "hasp_config.h"
|
||||||
#include "hasp_dispatch.h"
|
#include "hasp_dispatch.h"
|
||||||
@ -29,6 +30,7 @@
|
|||||||
/* ---------- Screenshot Variables ---------- */
|
/* ---------- Screenshot Variables ---------- */
|
||||||
File pFileOut;
|
File pFileOut;
|
||||||
uint8_t guiSnapshot = 0;
|
uint8_t guiSnapshot = 0;
|
||||||
|
size_t guiVDBsize = 0;
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP8266)
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
#include <ESP8266WebServer.h>
|
#include <ESP8266WebServer.h>
|
||||||
@ -100,6 +102,12 @@ void debugLvgl(lv_log_level_t level, const char * file, uint32_t line, const cha
|
|||||||
/* Display flushing */
|
/* Display flushing */
|
||||||
void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
|
void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p)
|
||||||
{
|
{
|
||||||
|
uint16_t c;
|
||||||
|
|
||||||
|
tft.startWrite(); /* Start new TFT transaction */
|
||||||
|
tft.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1),
|
||||||
|
(area->y2 - area->y1 + 1)); /* set the working window */
|
||||||
|
|
||||||
if(guiSnapshot != 0) {
|
if(guiSnapshot != 0) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
uint8_t pixel[1024];
|
uint8_t pixel[1024];
|
||||||
@ -121,12 +129,14 @@ void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * c
|
|||||||
// pixel[i++] = (LV_COLOR_GET_R(*color_p) << 3);
|
// pixel[i++] = (LV_COLOR_GET_R(*color_p) << 3);
|
||||||
// pixel[i++] = 0xFF;
|
// pixel[i++] = 0xFF;
|
||||||
|
|
||||||
|
c = color_p->full;
|
||||||
|
tft.writeColor(c, 1); // also update tft
|
||||||
|
|
||||||
// Simple 16 bpp
|
// Simple 16 bpp
|
||||||
pixel[i++] = color_p->full & 0xFF;
|
pixel[i++] = c & 0xFF;
|
||||||
pixel[i++] = (color_p->full >> 8) & 0xFF;
|
pixel[i++] = (c >> 8) & 0xFF;
|
||||||
|
|
||||||
color_p++;
|
color_p++;
|
||||||
// i += 4;
|
|
||||||
|
|
||||||
if(i + 4 >= sizeof(pixel)) {
|
if(i + 4 >= sizeof(pixel)) {
|
||||||
switch(guiSnapshot) {
|
switch(guiSnapshot) {
|
||||||
@ -161,11 +171,6 @@ void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t c;
|
|
||||||
|
|
||||||
tft.startWrite(); /* Start new TFT transaction */
|
|
||||||
tft.setAddrWindow(area->x1, area->y1, (area->x2 - area->x1 + 1),
|
|
||||||
(area->y2 - area->y1 + 1)); /* set the working window */
|
|
||||||
for(int y = area->y1; y <= area->y2; y++) {
|
for(int y = area->y1; y <= area->y2; y++) {
|
||||||
for(int x = area->x1; x <= area->x2; x++) {
|
for(int x = area->x1; x <= area->x2; x++) {
|
||||||
c = color_p->full;
|
c = color_p->full;
|
||||||
@ -173,8 +178,8 @@ void tft_espi_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * c
|
|||||||
color_p++;
|
color_p++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tft.endWrite(); /* terminate TFT transaction */
|
|
||||||
}
|
}
|
||||||
|
tft.endWrite(); /* terminate TFT transaction */
|
||||||
|
|
||||||
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
|
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
|
||||||
}
|
}
|
||||||
@ -208,6 +213,7 @@ void guiFirstCalibration()
|
|||||||
|
|
||||||
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
|
bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
|
||||||
{
|
{
|
||||||
|
#ifdef TOUCH_CS
|
||||||
uint16_t touchX, touchY;
|
uint16_t touchX, touchY;
|
||||||
|
|
||||||
bool touched = tft.getTouch(&touchX, &touchY, 600);
|
bool touched = tft.getTouch(&touchX, &touchY, 600);
|
||||||
@ -239,12 +245,14 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data)
|
|||||||
Serial.print("Data y");
|
Serial.print("Data y");
|
||||||
Serial.println(touchY);*/
|
Serial.println(touchY);*/
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return false; /*Return `false` because we are not buffering and no more data to read*/
|
return false; /*Return `false` because we are not buffering and no more data to read*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void guiCalibrate()
|
void guiCalibrate()
|
||||||
{
|
{
|
||||||
|
#ifdef TOUCH_CS
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.setCursor(20, 0);
|
tft.setCursor(20, 0);
|
||||||
tft.setTextFont(1);
|
tft.setTextFont(1);
|
||||||
@ -265,51 +273,56 @@ void guiCalibrate()
|
|||||||
tft.setTouch(calData);
|
tft.setTouch(calData);
|
||||||
delay(500);
|
delay(500);
|
||||||
lv_obj_invalidate(lv_disp_get_layer_sys(NULL));
|
lv_obj_invalidate(lv_disp_get_layer_sys(NULL));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void guiSetup(TFT_eSPI & screen, JsonObject settings)
|
void guiSetup(JsonObject settings)
|
||||||
{
|
{
|
||||||
size_t buffer_size;
|
|
||||||
tft = screen;
|
|
||||||
|
|
||||||
guiSetConfig(settings);
|
guiSetConfig(settings);
|
||||||
// guiBacklightIsOn = guiDimLevel > 0;
|
// guiBacklightIsOn = guiDimLevel > 0;
|
||||||
|
|
||||||
tft.begin(); /* TFT init */
|
tft.begin(); /* TFT init */
|
||||||
|
#ifdef TOUCH_CS
|
||||||
tft.setTouch(calData);
|
tft.setTouch(calData);
|
||||||
|
#endif
|
||||||
|
tftSetup(tft, settings[F("tft")]);
|
||||||
|
|
||||||
tft.setRotation(guiRotation); /* 1/3=Landscape or 0/2=Portrait orientation */
|
// tft.setRotation(guiRotation); /* 1/3=Landscape or 0/2=Portrait orientation */
|
||||||
lv_init();
|
lv_init();
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
/* allocate on iram (or psram ?) */
|
/* allocate on iram (or psram ?) */
|
||||||
buffer_size = 16 * 1024u; // 32 KBytes *2
|
guiVDBsize = 16 * 1024u; // 32 KBytes * 2
|
||||||
static lv_color_t * guiVdbBuffer1 = (lv_color_t *)malloc(sizeof(lv_color_t) * buffer_size);
|
static lv_color_t * guiVdbBuffer1 = (lv_color_t *)malloc(sizeof(lv_color_t) * guiVDBsize);
|
||||||
static lv_color_t * guiVdbBuffer2 = (lv_color_t *)malloc(sizeof(lv_color_t) * buffer_size);
|
static lv_color_t * guiVdbBuffer2 = (lv_color_t *)malloc(sizeof(lv_color_t) * guiVDBsize);
|
||||||
static lv_disp_buf_t disp_buf;
|
static lv_disp_buf_t disp_buf;
|
||||||
lv_disp_buf_init(&disp_buf, guiVdbBuffer1, guiVdbBuffer2, buffer_size);
|
lv_disp_buf_init(&disp_buf, guiVdbBuffer1, guiVdbBuffer2, guiVDBsize);
|
||||||
#else
|
#else
|
||||||
/* allocate on heap */
|
/* allocate on heap */
|
||||||
static lv_color_t guiVdbBuffer1[3 * 1024u]; // 6 KBytes
|
static lv_color_t guiVdbBuffer1[5 * 512u]; // 6 KBytes
|
||||||
// static lv_color_t guiVdbBuffer2[3 * 1024u]; // 6 KBytes
|
// static lv_color_t guiVdbBuffer2[3 * 1024u]; // 6 KBytes
|
||||||
buffer_size = sizeof(guiVdbBuffer1) / sizeof(guiVdbBuffer1[0]);
|
guiVDBsize = sizeof(guiVdbBuffer1) / sizeof(guiVdbBuffer1[0]);
|
||||||
static lv_disp_buf_t disp_buf;
|
static lv_disp_buf_t disp_buf;
|
||||||
lv_disp_buf_init(&disp_buf, guiVdbBuffer1, NULL, buffer_size);
|
lv_disp_buf_init(&disp_buf, guiVdbBuffer1, NULL, guiVDBsize);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char buffer[128];
|
char buffer[128];
|
||||||
|
snprintf_P(buffer, sizeof(buffer), PSTR("LVGL: Version : %u.%u.%u %s"), LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR,
|
||||||
|
LVGL_VERSION_PATCH, F(LVGL_VERSION_INFO));
|
||||||
|
debugPrintln(buffer);
|
||||||
|
|
||||||
snprintf_P(buffer, sizeof(buffer), PSTR("LVGL: Rotation : %d"), guiRotation);
|
snprintf_P(buffer, sizeof(buffer), PSTR("LVGL: Rotation : %d"), guiRotation);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
|
|
||||||
snprintf_P(buffer, sizeof(buffer), PSTR("LVGL: MEM size : %d"), LV_MEM_SIZE);
|
snprintf_P(buffer, sizeof(buffer), PSTR("LVGL: MEM size : %d"), LV_MEM_SIZE);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
|
|
||||||
snprintf_P(buffer, sizeof(buffer), PSTR("LVGL: VFB size : %d"), (size_t)sizeof(lv_color_t) * buffer_size);
|
snprintf_P(buffer, sizeof(buffer), PSTR("LVGL: VFB size : %d"), (size_t)sizeof(lv_color_t) * guiVDBsize);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
|
|
||||||
#if LV_USE_LOG != 0
|
#if LV_USE_LOG != 0
|
||||||
debugPrintln(F("LVGL: Registering lvgl logging handler"));
|
debugPrintln(F("LVGL: NOT Registering lvgl logging handler"));
|
||||||
lv_log_register_print_cb(debugLvgl); /* register print function for debugging */
|
// lv_log_register_print_cb(debugLvgl); /* register print function for debugging */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Initialize PNG decoder */
|
/* Initialize PNG decoder */
|
||||||
@ -388,7 +401,7 @@ void guiSetup(TFT_eSPI & screen, JsonObject settings)
|
|||||||
|
|
||||||
/* Setup Backlight Control Pin */
|
/* Setup Backlight Control Pin */
|
||||||
if(guiBacklightPin >= 0) {
|
if(guiBacklightPin >= 0) {
|
||||||
snprintf(buffer, sizeof(buffer), PSTR("LVGL: Backlight Pin = %i"), guiBacklightPin);
|
snprintf(buffer, sizeof(buffer), PSTR("LVGL: Backlight: Pin %i"), guiBacklightPin);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
@ -650,6 +663,9 @@ void guiTakeScreenshot(ESP8266WebServer & client)
|
|||||||
webClient = &client;
|
webClient = &client;
|
||||||
|
|
||||||
guiSnapshot = 2;
|
guiSnapshot = 2;
|
||||||
|
webClient->setContentLength(122 + 320 * 240 * 2);
|
||||||
|
webClient->send(200, PSTR("image/bmp"), "");
|
||||||
|
|
||||||
guiSendBmpHeader();
|
guiSendBmpHeader();
|
||||||
|
|
||||||
lv_obj_invalidate(lv_scr_act());
|
lv_obj_invalidate(lv_scr_act());
|
||||||
|
@ -26,6 +26,40 @@ void tftLoop()
|
|||||||
void tftStop()
|
void tftStop()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
String tftDriverName()
|
||||||
|
{
|
||||||
|
#if defined(ILI9341_DRIVER)
|
||||||
|
return F("ILI9341");
|
||||||
|
#elif defined(ST7735_DRIVER)
|
||||||
|
return F("ST7735");
|
||||||
|
#elif defined(ILI9163_DRIVER)
|
||||||
|
return F("ILI9163");
|
||||||
|
#elif defined(S6D02A1_DRIVER)
|
||||||
|
return F("S6D02A1");
|
||||||
|
#elif defined(ST7796_DRIVER)
|
||||||
|
return F("ST7796");
|
||||||
|
#elif defined(ILI9486_DRIVER)
|
||||||
|
return F("ILI9486");
|
||||||
|
#elif defined(ILI9481_DRIVER)
|
||||||
|
return F("ILI9481");
|
||||||
|
#elif defined(ILI9488_DRIVER)
|
||||||
|
return F("ILI9488");
|
||||||
|
#elif defined(HX8357D_DRIVER)
|
||||||
|
return F("HX8357D");
|
||||||
|
#elif defined(EPD_DRIVER)
|
||||||
|
return F("EPD");
|
||||||
|
#elif defined(ST7789_DRIVER)
|
||||||
|
return F("ST7789");
|
||||||
|
#elif defined(R61581_DRIVER)
|
||||||
|
return F("R61581");
|
||||||
|
#elif defined(ST7789_2_DRIVER)
|
||||||
|
return F("ST7789_2");
|
||||||
|
#elif defined(RM68140_DRIVER)
|
||||||
|
return F("RM68140");
|
||||||
|
#endif
|
||||||
|
return F("Unknown");
|
||||||
|
}
|
||||||
|
|
||||||
void tftOffsetInfo(uint8_t pin, uint8_t x_offset, uint8_t y_offset)
|
void tftOffsetInfo(uint8_t pin, uint8_t x_offset, uint8_t y_offset)
|
||||||
{
|
{
|
||||||
char buffer[128];
|
char buffer[128];
|
||||||
@ -56,7 +90,7 @@ void tftShowConfig(TFT_eSPI & tft)
|
|||||||
|
|
||||||
sprintf_P(buffer, PSTR("TFT: TFT_eSPI ver = %s"), tftSetup.version.c_str());
|
sprintf_P(buffer, PSTR("TFT: TFT_eSPI ver = %s"), tftSetup.version.c_str());
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
sprintf_P(buffer, PSTR("TFT: Processor = ESP%i"), tftSetup.esp);
|
sprintf_P(buffer, PSTR("TFT: Processor = ESP%x"), tftSetup.esp);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
sprintf_P(buffer, PSTR("TFT: Frequency = %i MHz"), ESP.getCpuFreqMHz());
|
sprintf_P(buffer, PSTR("TFT: Frequency = %i MHz"), ESP.getCpuFreqMHz());
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
@ -75,7 +109,7 @@ void tftShowConfig(TFT_eSPI & tft)
|
|||||||
#endif
|
#endif
|
||||||
if(tftSetup.tft_driver != 0xE9D) // For ePaper displays the size is defined in the sketch
|
if(tftSetup.tft_driver != 0xE9D) // For ePaper displays the size is defined in the sketch
|
||||||
{
|
{
|
||||||
sprintf_P(buffer, PSTR("TFT: Display driver = %i"), tftSetup.tft_driver);
|
sprintf_P(buffer, PSTR("TFT: Display driver = %s"), tftDriverName().c_str()); // tftSetup.tft_driver);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
sprintf_P(buffer, PSTR("TFT: Display width = %i"), tftSetup.tft_width);
|
sprintf_P(buffer, PSTR("TFT: Display width = %i"), tftSetup.tft_width);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
@ -106,10 +140,10 @@ void tftShowConfig(TFT_eSPI & tft)
|
|||||||
if(tftSetup.overlap == true) {
|
if(tftSetup.overlap == true) {
|
||||||
debugPrintln(F("Overlap selected, following pins MUST be used:\n"));
|
debugPrintln(F("Overlap selected, following pins MUST be used:\n"));
|
||||||
|
|
||||||
debugPrintln(F("MOSI = SD1 (GPIO 8)\n"));
|
debugPrintln(F("MOSI = SD1 (GPIO 8)"));
|
||||||
debugPrintln(F("MISO = SD0 (GPIO 7)\n"));
|
debugPrintln(F("MISO = SD0 (GPIO 7)"));
|
||||||
debugPrintln(F("SCK = CLK (GPIO 6)\n"));
|
debugPrintln(F("SCK = CLK (GPIO 6)"));
|
||||||
debugPrintln(F("TFT_CS = D3 (GPIO 0)\n\n"));
|
debugPrintln(F("TFT_CS = D3 (GPIO 0)"));
|
||||||
|
|
||||||
debugPrintln(F("TFT_DC and TFT_RST pins can be tftSetup defined\n"));
|
debugPrintln(F("TFT_DC and TFT_RST pins can be tftSetup defined\n"));
|
||||||
}
|
}
|
||||||
@ -133,17 +167,19 @@ void tftShowConfig(TFT_eSPI & tft)
|
|||||||
tftPinInfo(F("TFT_D6 "), tftSetup.pin_tft_d6);
|
tftPinInfo(F("TFT_D6 "), tftSetup.pin_tft_d6);
|
||||||
tftPinInfo(F("TFT_D7 "), tftSetup.pin_tft_d7);
|
tftPinInfo(F("TFT_D7 "), tftSetup.pin_tft_d7);
|
||||||
|
|
||||||
uint16_t fonts = tft.fontsLoaded();
|
/*
|
||||||
if(fonts & (1 << 1)) debugPrintln(F("Font GLCD loaded\n"));
|
uint16_t fonts = tft.fontsLoaded();
|
||||||
if(fonts & (1 << 2)) debugPrintln(F("Font 2 loaded\n"));
|
if(fonts & (1 << 1)) debugPrintln(F("Font GLCD loaded\n"));
|
||||||
if(fonts & (1 << 4)) debugPrintln(F("Font 4 loaded\n"));
|
if(fonts & (1 << 2)) debugPrintln(F("Font 2 loaded\n"));
|
||||||
if(fonts & (1 << 6)) debugPrintln(F("Font 6 loaded\n"));
|
if(fonts & (1 << 4)) debugPrintln(F("Font 4 loaded\n"));
|
||||||
if(fonts & (1 << 7)) debugPrintln(F("Font 7 loaded\n"));
|
if(fonts & (1 << 6)) debugPrintln(F("Font 6 loaded\n"));
|
||||||
if(fonts & (1 << 9))
|
if(fonts & (1 << 7)) debugPrintln(F("Font 7 loaded\n"));
|
||||||
debugPrintln(F("Font 8N loaded\n"));
|
if(fonts & (1 << 9))
|
||||||
else if(fonts & (1 << 8))
|
debugPrintln(F("Font 8N loaded\n"));
|
||||||
debugPrintln(F("Font 8 loaded\n"));
|
else if(fonts & (1 << 8))
|
||||||
if(fonts & (1 << 15)) debugPrintln(F("Smooth font enabled\n"));
|
debugPrintln(F("Font 8 loaded\n"));
|
||||||
|
if(fonts & (1 << 15)) debugPrintln(F("Smooth font enabled\n"));
|
||||||
|
*/
|
||||||
|
|
||||||
if(tftSetup.serial == 1) {
|
if(tftSetup.serial == 1) {
|
||||||
sprintf_P(buffer, PSTR("TFT: Display SPI frequency = %2.1f MHz"), tftSetup.tft_spi_freq / 10.0);
|
sprintf_P(buffer, PSTR("TFT: Display SPI frequency = %2.1f MHz"), tftSetup.tft_spi_freq / 10.0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user