ILI9341 driver replaced with uDisplay (#21169)

This commit is contained in:
s-hadinger 2024-04-14 10:26:37 +02:00 committed by GitHub
parent 2321d66ba6
commit ff43dc29b2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 356 additions and 1199 deletions

View File

@ -251,7 +251,6 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
| USE_DISPLAY_SSD1306 | - | - / - | - | - | - | x |
| USE_DISPLAY_MATRIX | - | - / - | - | - | - | x |
| USE_DISPLAY_SH1106 | - | - / - | - | - | - | x |
| USE_DISPLAY_ILI9341 | - | - / - | - | - | - | x |
| USE_DISPLAY_EPAPER_29 | - | - / - | - | - | - | x |
| USE_DISPLAY_EPAPER_42 | - | - / - | - | - | - | x |
| USE_DISPLAY_SSD1351 | - | - / - | - | - | - | x |
@ -280,4 +279,6 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
| USE_DINGTIAN_RELAY | | / - | | | | |
| USE_MATTER_DEVICE | | / x | | | | | See SetOption151 |
The following specific display drivers are replaced with uDisplay, see [uDisplay/uTouch documentation](https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay): `USE_DISPLAY_ILI9341`
- USE_MQTT_TLS is enabled by default in every ESP32 variants

View File

@ -26,6 +26,7 @@ All notable changes to this project will be documented in this file.
### Removed
- Unused `#define MQTT_DATA_STRING` support
- ILI9341 driver replaced with uDisplay
## [13.4.0.3] 20240402
### Added

View File

@ -1,678 +0,0 @@
/*!
* @file ILI9341_2.cpp
*
* @mainpage Adafruit ILI9341 TFT Displays
*
* @section intro_sec Introduction
*
* This is the documentation for Adafruit's ILI9341 driver for the
* Arduino platform.
*
* This library works with the Adafruit 2.8" Touch Shield V2 (SPI)
* http://www.adafruit.com/products/1651
*
* Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341
* https://www.adafruit.com/product/2478
*
* 2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341
* https://www.adafruit.com/product/1770
*
* 2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340
* https://www.adafruit.com/product/1770
*
* TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers
* https://www.adafruit.com/product/3315
*
* These displays use SPI to communicate, 4 or 5 pins are required
* to interface (RST is optional).
*
* Adafruit invests time and resources providing this open source code,
* please support Adafruit and open-source hardware by purchasing
* products from Adafruit!
*
* @section dependencies Dependencies
*
* This library depends on <a href="https://github.com/adafruit/Adafruit_GFX">
* Adafruit_GFX</a> being present on your system. Please make sure you have
* installed the latest version before using this library.
*
* @section author Author
*
* Written by Limor "ladyada" Fried for Adafruit Industries.
*
* @section license License
*
* BSD license, all text here must be included in any redistribution.
*
*/
//#ifdef ESP32
#include "ILI9341_2.h"
#include <limits.h>
// ESP32 uses 2. SPI BUS, ESP8266 uses software spi
#ifdef ESP32
#include "esp8266toEsp32.h"
#undef ILI9341_2_DIMMER
#define ILI9341_2_DIMMER
#undef ESP32_PWM_CHANNEL
#define ESP32_PWM_CHANNEL 1
#endif
#define ILI9341_2_HWSPI
#if defined (ILI9341_2_HWSPI)
#define SPI_BEGIN_TRANSACTION() if (_hwspi) spi2->beginTransaction(sspi2)
#define SPI_END_TRANSACTION() if (_hwspi) spi2->endTransaction()
#else
#define SPI_BEGIN_TRANSACTION()
#define SPI_END_TRANSACTION()
#endif
const uint16_t ili9341_2_colors[]={ILI9341_BLACK,ILI9341_WHITE,ILI9341_RED,ILI9341_GREEN,ILI9341_BLUE,ILI9341_CYAN,ILI9341_MAGENTA,\
ILI9341_YELLOW,ILI9341_NAVY,ILI9341_DARKGREEN,ILI9341_DARKCYAN,ILI9341_MAROON,ILI9341_PURPLE,ILI9341_OLIVE,\
ILI9341_LIGHTGREY,ILI9341_DARKGREY,ILI9341_ORANGE,ILI9341_GREENYELLOW,ILI9341_PINK};
uint16_t ILI9341_2::GetColorFromIndex(uint8_t index) {
if (index >= sizeof(ili9341_2_colors) / 2) index = 0;
return ili9341_2_colors[index];
}
static const uint8_t PROGMEM ili9341_2_initcmd[] = {
0xEF, 3, 0x03, 0x80, 0x02,
0xCF, 3, 0x00, 0xC1, 0x30,
0xED, 4, 0x64, 0x03, 0x12, 0x81,
0xE8, 3, 0x85, 0x00, 0x78,
0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02,
0xF7, 1, 0x20,
0xEA, 2, 0x00, 0x00,
ILI9341_2_PWCTR1 , 1, 0x23, // Power control VRH[5:0]
ILI9341_2_PWCTR2 , 1, 0x10, // Power control SAP[2:0];BT[3:0]
ILI9341_2_VMCTR1 , 2, 0x3e, 0x28, // VCM control
ILI9341_2_VMCTR2 , 1, 0x86, // VCM control2
ILI9341_2_MADCTL , 1, 0x48, // Memory Access Control
ILI9341_2_VSCRSADD, 1, 0x00, // Vertical scroll zero
ILI9341_2_PIXFMT , 1, 0x55,
ILI9341_2_FRMCTR1 , 2, 0x00, 0x18,
ILI9341_2_DFUNCTR , 3, 0x08, 0x82, 0x27, // Display Function Control
0xF2, 1, 0x00, // 3Gamma Function Disable
ILI9341_2_GAMMASET , 1, 0x01, // Gamma curve selected
ILI9341_2_GMCTRP1 , 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, // Set Gamma
0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00,
ILI9341_2_GMCTRN1 , 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, // Set Gamma
0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F,
ILI9341_2_SLPOUT , 0x80, // Exit Sleep
ILI9341_2_DISPON , 0x80, // Display on
// ILI9341_2_DISPOFF , 0x80, // Display on
0x00 // End of list
};
static const uint8_t PROGMEM ili9342_initcmd[] = {
0xEF, 3, 0x03, 0x80, 0x02,
0xCF, 3, 0x00, 0xC1, 0x30,
0xED, 4, 0x64, 0x03, 0x12, 0x81,
0xE8, 3, 0x85, 0x00, 0x78,
0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02,
0xF7, 1, 0x20,
0xEA, 2, 0x00, 0x00,
ILI9341_2_PWCTR1 , 1, 0x23, // Power control VRH[5:0]
ILI9341_2_PWCTR2 , 1, 0x10, // Power control SAP[2:0];BT[3:0]
ILI9341_2_VMCTR1 , 2, 0x2B, 0x2B, // 0x3e, 0x28, // VCM control
ILI9341_2_VMCTR2 , 1, 0xC0, // VCM control2
ILI9341_2_MADCTL , 1, 0x48, // Memory Access Control
ILI9341_2_VSCRSADD, 1, 0x00, // Vertical scroll zero
ILI9341_2_PIXFMT , 1, 0x55,
ILI9341_2_FRMCTR1 , 2, 0x00, 0x1B,
ILI9341_2_DFUNCTR , 3, 0x08, 0x82, 0x27, // Display Function Control
0xF2, 1, 0x00, // 3Gamma Function Disable
ILI9341_2_GAMMASET , 1, 0x01, // Gamma curve selected
ILI9341_2_GMCTRP1 , 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00,
ILI9341_2_GMCTRN1 , 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F,
ILI9341_2_INVON , 0x80,
ILI9341_2_SLPOUT , 0x80, // Exit Sleep
ILI9341_2_DISPON , 0x80, // Display on
0x00 // End of list
};
ILI9341_2::ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp, int8_t spibus, uint8_t dtype) : Renderer(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) {
_cs = cs;
_mosi = mosi;
_miso = miso;
_sclk = sclk;
_res = res;
_dc = dc;
_bp = bp;
_hwspi = dtype; // sign ili9341 or 2
_spibus = spibus;
}
// special init for ILI9342 uses SPI1 previously defined with SDCard
ILI9341_2::ILI9341_2(int8_t cs, int8_t res, int8_t dc, int8_t bp) : Renderer(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) {
_cs = cs;
_res = res;
_dc = dc;
_bp = bp;
_hwspi = 2; // sign ili9342
_spibus = 1;
}
#define ILI9341_2_CS_LOW if (_cs>=0) digitalWrite( _cs, LOW);
#define ILI9341_2_CS_HIGH if (_cs>=0) digitalWrite( _cs, HIGH);
void ILI9341_2::writecmd(uint8_t d) {
digitalWrite( _dc, LOW);
#ifdef ILI9341_2_HWSPI
spi2->write(d);
#else
spiwrite(d);
#endif
digitalWrite( _dc, HIGH);
}
void ILI9341_2::init(uint16_t width, uint16_t height) {
//sspi2 = SPISettings(2500000, MSBFIRST, SPI_MODE3);
if (_hwspi >= 2) {
iwidth = ILI9341_TFTWIDTH;
iheight = ILI9341_TFTHEIGHT;
} else {
iwidth = ILI9341_TFTHEIGHT;
iheight = ILI9341_TFTWIDTH;
}
#ifdef ILI9341_2_HWSPI
sspi2 = SPISettings(40000000, MSBFIRST, SPI_MODE0);
if (_hwspi >= 2) {
spi2 = &SPI;
#ifdef ESP32
if (_hwspi > 2) {
spi2->begin(_sclk, _miso, _mosi, -1);
}
#else
SPI.begin();
#endif // ESP32
} else {
#ifdef ESP32
if (_spibus == 2) {
spi2 = new SPIClass(HSPI);
} else {
spi2 = &SPI;
}
spi2->begin(_sclk, _miso, _mosi, -1);
#else
SPI.begin();
spi2 = &SPI;
#endif
}
#else
pinMode(_mosi, OUTPUT);
digitalWrite(_mosi,HIGH);
pinMode(_sclk, OUTPUT);
digitalWrite(_sclk,LOW);
pinMode(_miso, INPUT);
#endif
pinMode(_cs, OUTPUT);
digitalWrite(_cs,HIGH);
pinMode(_dc, OUTPUT);
digitalWrite(_dc,HIGH);
if (_bp >= 0) {
pinMode(_bp, OUTPUT);
digitalWrite(_bp,HIGH);
}
if (_res >= 0) {
pinMode(_res, OUTPUT);
digitalWrite(_res, HIGH);
delay(100);
digitalWrite(_res, LOW);
delay(100);
digitalWrite(_res, HIGH);
delay(200);
} else {
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
writecmd(ILI9341_2_SWRESET); // software reset
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
delay(150);
}
if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER
analogWrite(_bp, 511);
#else
pinMode(_bp, OUTPUT);
#endif
}
uint8_t cmd, x, numArgs;
const uint8_t *addr;
if (_hwspi<2) {
addr = ili9341_2_initcmd;
} else {
addr = ili9342_initcmd;
}
SPI_BEGIN_TRANSACTION();
while ((cmd = pgm_read_byte(addr++)) > 0) {
ILI9341_2_CS_LOW
writecmd(cmd);
x = pgm_read_byte(addr++);
numArgs = x & 0x7F;
#ifdef ILI9341_2_HWSPI
while (numArgs--) spi2->write(pgm_read_byte(addr++));
#else
while (numArgs--) spiwrite(pgm_read_byte(addr++));
#endif
ILI9341_2_CS_HIGH
if (x & 0x80) delay(120);
}
SPI_END_TRANSACTION();
}
void ILI9341_2::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) {
// SPI_BEGIN_TRANSACTION();
// writecmd(ILI9341_2_INVOFF);
// SPI_END_TRANSACTION();
setRotation(rot);
setTextFont(font&3);
setTextSize(size&7);
setTextColor(ILI9341_WHITE,ILI9341_BLACK);
setCursor(0,0);
fillScreen(ILI9341_BLACK);
}
void ILI9341_2::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
if (!x0 && !y0 && !x1 && !y1) {
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
} else {
ILI9341_2_CS_LOW
SPI_BEGIN_TRANSACTION();
setAddrWindow_int(x0,y0,x1-x0,y1-y0);
}
}
void ILI9341_2::pushColors(uint16_t *data, uint16_t len, boolean first) {
uint16_t color;
while (len--) {
color = *data++;
#ifdef ILI9341_2_HWSPI
spi2->write16(color);
#else
spiwrite16(color);
#endif
}
}
void ILI9341_2::setAddrWindow_int(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
uint32_t xa = ((uint32_t)x << 16) | (x+w-1);
uint32_t ya = ((uint32_t)y << 16) | (y+h-1);
writecmd(ILI9341_2_CASET); // Column addr set
#ifdef ILI9341_2_HWSPI
spi2->write32(xa);
#else
spiwrite32(xa);
#endif
writecmd(ILI9341_2_PASET); // Row addr set
#ifdef ILI9341_2_HWSPI
spi2->write32(ya);
#else
spiwrite32(ya);
#endif
writecmd(ILI9341_2_RAMWR); // write to RAM
}
void ILI9341_2::drawPixel(int16_t x, int16_t y, uint16_t color) {
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
setAddrWindow_int(x,y,1,1);
#ifdef ILI9341_2_HWSPI
spi2->write16(color);
#else
spiwrite16(color);
#endif
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ILI9341_2::setRotation(uint8_t m) {
if (_hwspi < 2) {
rotation = m % 4; // can't be higher than 3
switch (rotation) {
case 0:
m = (MADCTL_2_MX | MADCTL_2_BGR);
_width = iwidth;
_height = iheight;
break;
case 1:
m = (MADCTL_2_MV | MADCTL_2_BGR);
_width = iheight;
_height = iwidth;
break;
case 2:
m = (MADCTL_2_MY | MADCTL_2_BGR);
_width = iwidth;
_height = iheight;
break;
case 3:
m = (MADCTL_2_MX | MADCTL_2_MY | MADCTL_2_MV | MADCTL_2_BGR);
_width = iheight;
_height = iwidth;
break;
}
} else {
#define MADCTL_MY 0x80 ///< Bottom to top
#define MADCTL_MX 0x40 ///< Right to left
#define MADCTL_MV 0x20 ///< Reverse Mode
#define MADCTL_ML 0x10 ///< LCD refresh Bottom to top
#define MADCTL_RGB 0x00 ///< Red-Green-Blue pixel order
#define MADCTL_BGR 0x08 ///< Blue-Green-Red pixel order
#define MADCTL_MH 0x04 ///< LCD refresh right to left
rotation = m % 4; // can't be higher than 3
switch (rotation) {
case 0:
m = (MADCTL_BGR);
_width = iwidth;
_height = iheight;
break;
case 1:
m = (MADCTL_MY | MADCTL_MV | MADCTL_BGR);
_width = iheight;
_height = iwidth;
break;
case 2:
m = (MADCTL_MY | MADCTL_MX | MADCTL_BGR);
_width = iwidth;
_height = iheight;
break;
case 3:
m = (MADCTL_MX | MADCTL_MV | MADCTL_BGR);
_width = iheight;
_height = iwidth;
break;
}
}
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
writecmd(ILI9341_2_MADCTL);
spiwrite(m);
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ILI9341_2::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
// Rudimentary clipping
if ((x >= _width) || (y >= _height)) return;
if ((y + h - 1) >= _height) h = _height - y;
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
setAddrWindow_int(x, y, 1, h);
while (h--) {
#ifdef ILI9341_2_HWSPI
spi2->write16(color);
#else
spiwrite16(color);
#endif
}
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ILI9341_2::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
// Rudimentary clipping
if((x >= _width) || (y >= _height)) return;
if((x+w-1) >= _width) w = _width-x;
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
setAddrWindow_int(x, y, w, 1);
while (w--) {
#ifdef ILI9341_2_HWSPI
spi2->write16(color);
#else
spiwrite16(color);
#endif
}
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ILI9341_2::fillScreen(uint16_t color) {
fillRect(0, 0, _width, _height, color);
}
// fill a rectangle
void ILI9341_2::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
// rudimentary clipping (drawChar w/big text requires this)
if((x >= _width) || (y >= _height)) return;
if((x + w - 1) >= _width) w = _width - x;
if((y + h - 1) >= _height) h = _height - y;
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
setAddrWindow_int(x, y, w, h);
for (y=h; y>0; y--) {
for (x=w; x>0; x--) {
#ifdef ILI9341_2_HWSPI
spi2->write16(color);
#else
spiwrite16(color);
#endif
}
}
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ili9342_bpwr(uint8_t on);
void ILI9341_2::DisplayOnff(int8_t on) {
if ((_hwspi >= 2) && (_bp < 0)) {
//ili9342_bpwr(on);
if (pwr_cbp) {
pwr_cbp(on);
}
}
if (on) {
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
writecmd(ILI9341_2_DISPON);
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER
analogWrite(_bp, dimmer * 4);
// ledcWrite(ESP32_PWM_CHANNEL, dimmer);
#else
digitalWrite(_bp, HIGH);
#endif
}
} else {
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
writecmd(ILI9341_2_DISPOFF);
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER
analogWrite(_bp, 0);
// ledcWrite(ESP32_PWM_CHANNEL, 0);
#else
digitalWrite(_bp, LOW);
#endif
}
}
}
void ILI9341_2::invertDisplay(boolean i) {
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
writecmd(i ? ILI9341_2_INVON : ILI9341_2_INVOFF);
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ILI9341_2::reverseDisplay(boolean i) {
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
if (i) {
writecmd(ILI9341_2_FRMCTR1);
spiwrite(0x00);
spiwrite(0x13);
writecmd(ILI9341_2_MADCTL);
spiwrite(0x01);
spiwrite(0x08);
} else {
writecmd(ILI9341_2_FRMCTR1);
spiwrite(0x00);
spiwrite(0x18);
writecmd(ILI9341_2_MADCTL);
spiwrite(0x01);
spiwrite(0x48);
}
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ili9342_dimm(uint8_t dim);
// dimmer 0-100
void ILI9341_2::dim(uint8_t dim) {
dimmer = dim;
if (dimmer>15) dimmer=15;
dimmer=((float)dimmer/15.0)*255.0;
#ifdef ESP32
if (_bp>=0) {
analogWrite(_bp, dimmer * 4);
// ledcWrite(ESP32_PWM_CHANNEL,dimmer);
} else {
if (_hwspi>=2) {
//ili9342_dimm(dim);
if (dim_cbp) {
dim_cbp(dim);
}
}
}
#endif
}
void ILI9341_2::spiwrite(uint8_t c) {
#ifdef ILI9341_2_HWSPI
spi2->write(c);
#else
for (uint8_t bit = 0x80; bit; bit >>= 1) {
digitalWrite(_sclk, LOW);
if (c & bit) digitalWrite(_mosi, HIGH);
else digitalWrite(_mosi, LOW);
digitalWrite(_sclk, HIGH);
}
#endif
}
void ILI9341_2::spiwrite16(uint16_t c) {
#ifdef ILI9341_2_HWSPI
spi2->write16(c);
#else
spiwrite(c>>8);
spiwrite(c);
#endif
}
void ILI9341_2::spiwrite32(uint32_t c) {
#ifdef ILI9341_2_HWSPI
spi2->write32(c);
#else
spiwrite(c>>24);
spiwrite(c>>16);
spiwrite(c>>8);
spiwrite(c);
#endif
}
void ILI9341_2::setScrollMargins(uint16_t top, uint16_t bottom) {
uint16_t height = _height - (top + bottom);
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
writecmd(0x33);
spiwrite16(top);
spiwrite16(height);
spiwrite16(bottom);
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}
void ILI9341_2::scrollTo(uint16_t y) {
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW
writecmd(ILI9341_2_VSCRSADD);
spiwrite16(y);
ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
}

View File

@ -1,163 +0,0 @@
/***************************************************
STM32 Support added by Jaret Burkett at OSHlab.com
This is our library for the Adafruit ILI9341_2 Breakout and Shield
----> http://www.adafruit.com/products/1651
Check out the links above for our tutorials and wiring diagrams
These displays use SPI to communicate, 4 or 5 pins are required to
interface (RST is optional)
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/
#ifndef _ILI9341_2H_
#define _ILI9341_2H_
#include "Arduino.h"
#include <renderer.h>
#include <SPI.h>
#define ILI9341_TFTWIDTH 320
#define ILI9341_TFTHEIGHT 240
#define ILI9341_2_NOP 0x00 ///< No-op register
#define ILI9341_2_SWRESET 0x01 ///< Software reset register
#define ILI9341_2_RDDID 0x04 ///< Read display identification information
#define ILI9341_2_RDDST 0x09 ///< Read Display Status
#define ILI9341_2_SLPIN 0x10 ///< Enter Sleep Mode
#define ILI9341_2_SLPOUT 0x11 ///< Sleep Out
#define ILI9341_2_PTLON 0x12 ///< Partial Mode ON
#define ILI9341_2_NORON 0x13 ///< Normal Display Mode ON
#define ILI9341_2_RDMODE 0x0A ///< Read Display Power Mode
#define ILI9341_2_RDMADCTL 0x0B ///< Read Display MADCTL
#define ILI9341_2_RDPIXFMT 0x0C ///< Read Display Pixel Format
#define ILI9341_2_RDIMGFMT 0x0D ///< Read Display Image Format
#define ILI9341_2_RDSELFDIAG 0x0F ///< Read Display Self-Diagnostic Result
#define ILI9341_2_INVOFF 0x20 ///< Display Inversion OFF
#define ILI9341_2_INVON 0x21 ///< Display Inversion ON
#define ILI9341_2_GAMMASET 0x26 ///< Gamma Set
#define ILI9341_2_DISPOFF 0x28 ///< Display OFF
#define ILI9341_2_DISPON 0x29 ///< Display ON
#define ILI9341_2_CASET 0x2A ///< Column Address Set
#define ILI9341_2_PASET 0x2B ///< Page Address Set
#define ILI9341_2_RAMWR 0x2C ///< Memory Write
#define ILI9341_2_RAMRD 0x2E ///< Memory Read
#define ILI9341_2_PTLAR 0x30 ///< Partial Area
#define ILI9341_2_MADCTL 0x36 ///< Memory Access Control
#define ILI9341_2_VSCRSADD 0x37 ///< Vertical Scrolling Start Address
#define ILI9341_2_PIXFMT 0x3A ///< COLMOD: Pixel Format Set
#define ILI9341_2_FRMCTR1 0xB1 ///< Frame Rate Control (In Normal Mode/Full Colors)
#define ILI9341_2_FRMCTR2 0xB2 ///< Frame Rate Control (In Idle Mode/8 colors)
#define ILI9341_2_FRMCTR3 0xB3 ///< Frame Rate control (In Partial Mode/Full Colors)
#define ILI9341_2_INVCTR 0xB4 ///< Display Inversion Control
#define ILI9341_2_DFUNCTR 0xB6 ///< Display Function Control
#define ILI9341_2_PWCTR1 0xC0 ///< Power Control 1
#define ILI9341_2_PWCTR2 0xC1 ///< Power Control 2
#define ILI9341_2_PWCTR3 0xC2 ///< Power Control 3
#define ILI9341_2_PWCTR4 0xC3 ///< Power Control 4
#define ILI9341_2_PWCTR5 0xC4 ///< Power Control 5
#define ILI9341_2_VMCTR1 0xC5 ///< VCOM Control 1
#define ILI9341_2_VMCTR2 0xC7 ///< VCOM Control 2
#define ILI9341_2_RDID1 0xDA ///< Read ID 1
#define ILI9341_2_RDID2 0xDB ///< Read ID 2
#define ILI9341_2_RDID3 0xDC ///< Read ID 3
#define ILI9341_2_RDID4 0xDD ///< Read ID 4
#define ILI9341_2_GMCTRP1 0xE0 ///< Positive Gamma Correction
#define ILI9341_2_GMCTRN1 0xE1 ///< Negative Gamma Correction
// Color definitions
#define ILI9341_BLACK 0x0000 /* 0, 0, 0 */
#define ILI9341_NAVY 0x000F /* 0, 0, 128 */
#define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */
#define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */
#define ILI9341_MAROON 0x7800 /* 128, 0, 0 */
#define ILI9341_PURPLE 0x780F /* 128, 0, 128 */
#define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */
#define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */
#define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */
#define ILI9341_BLUE 0x001F /* 0, 0, 255 */
#define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */
#define ILI9341_CYAN 0x07FF /* 0, 255, 255 */
#define ILI9341_RED 0xF800 /* 255, 0, 0 */
#define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */
#define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */
#define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */
#define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */
#define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */
#define ILI9341_PINK 0xF81F
#define MADCTL_2_MY 0x80 ///< Bottom to top
#define MADCTL_2_MX 0x40 ///< Right to left
#define MADCTL_2_MV 0x20 ///< Reverse Mode
#define MADCTL_2_ML 0x10 ///< LCD refresh Bottom to top
#define MADCTL_2_RGB 0x00 ///< Red-Green-Blue pixel order
#define MADCTL_2_BGR 0x08 ///< Blue-Green-Red pixel order
#define MADCTL_2_MH 0x04 ///< LCD refresh right to left
class ILI9341_2 : public Renderer {
public:
ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp, int8_t spibus, uint8_t dtype);
ILI9341_2(int8_t cs, int8_t res, int8_t dc, int8_t bp);
void init(uint16_t width, uint16_t height);
uint16_t GetColorFromIndex(uint8_t index);
private:
SPIClass *spi2;
SPISettings sspi2;
void writecmd(uint8_t d);
void setAddrWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void setAddrWindow_int(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
void drawPixel(int16_t x, int16_t y, uint16_t color);
void DisplayOnff(int8_t on);
void setRotation(uint8_t m);
void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font);
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
void fillScreen(uint16_t color);
void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
void dim(uint8_t dim);
void pushColors(uint16_t *data, uint16_t len, boolean first);
void invertDisplay(boolean i);
void reverseDisplay(boolean i);
void spiwrite(uint8_t c);
void spiwrite16(uint16_t c);
void spiwrite32(uint32_t c);
void setScrollMargins(uint16_t top, uint16_t bottom);
void scrollTo(uint16_t y);
uint8_t tabcolor;
uint8_t dimmer;
int8_t _cs;
int8_t _mosi;
int8_t _miso;
int8_t _sclk;
int8_t _res;
int8_t _dc;
int8_t _bp;
int8_t _spibus;
int8_t _hwspi;
uint16_t iwidth;
uint16_t iheight;
};
#endif

View File

@ -1,9 +0,0 @@
name=ILI9341
version=1.0.0
author=Gerhard Mutz
maintainer=Gerhard Mutz
sentence=ILI9341 ESP8266 ESP32 display driver for Tasmota
paragraph=ILI9341 ESP8266 ESP32 display driver for Tasmota
category=Display
url=https://github.com/arendst/Tasmota
architectures=*

View File

@ -658,10 +658,11 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_TS_RST), // Touch Reset
AGPIO(GPIO_TS_IRQ), // Touch IRQ
#endif // USE_UNIVERSAL_TOUCH
#ifdef USE_DISPLAY_ILI9341
AGPIO(GPIO_ILI9341_CS),
AGPIO(GPIO_ILI9341_DC),
#endif // USE_DISPLAY_ILI9341
// REMOVED
// #ifdef USE_DISPLAY_ILI9341
// AGPIO(GPIO_ILI9341_CS),
// AGPIO(GPIO_ILI9341_DC),
// #endif // USE_DISPLAY_ILI9341
#ifdef USE_XPT2046
AGPIO(GPIO_XPT2046_CS), // XPT2046 SPI Chip Select

View File

@ -804,7 +804,7 @@ https://rya.nc/tasmota-fingerprint.html"
// #define USE_NRF24 // Add SPI support for NRF24L01(+) (+2k6 code)
#define USE_MIBLE // BLE-bridge for some Mijia-BLE-sensors (+4k7 code)
// #define USE_DISPLAY // Add SPI Display support for 320x240 and 480x320 TFT
#define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code)
// REMOVED -- #define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code)
// #define USE_DISPLAY_EPAPER_29 // [DisplayModel 5] Enable e-paper 2.9 inch display (+19k code)
// #define USE_DISPLAY_EPAPER_42 // [DisplayModel 6] Enable e-paper 4.2 inch display
// #define USE_DISPLAY_SSD1351 // [DisplayModel 9] Enable SSD1351 module

View File

@ -151,9 +151,10 @@ constexpr uint32_t feature[] = {
#if defined(USE_I2C) && defined(USE_DISPLAY) && defined(USE_DISPLAY_MATRIX)
0x00000200 | // xdsp_03_matrix.ino
#endif
#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_ILI9341)
0x00000400 | // xdsp_04_ili9341.ino
#endif
// REMOVED
// #if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_ILI9341)
// 0x00000400 | // xdsp_04_ili9341.ino
// #endif
#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_EPAPER_29)
0x00000800 | // xdsp_05_epaper.ino
#endif

View File

@ -17,397 +17,400 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef USE_SPI
#ifdef USE_DISPLAY
#ifdef USE_DISPLAY_ILI9341
// REMOVED
// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay
#define XDSP_04 4
// #ifdef USE_SPI
// #ifdef USE_DISPLAY
// #ifdef USE_DISPLAY_ILI9341
enum IliModes { ILIMODE_9341 = 1, ILIMODE_9342, ILIMODE_MAX };
// #define XDSP_04 4
#include <ILI9341_2.h>
// enum IliModes { ILIMODE_9341 = 1, ILIMODE_9342, ILIMODE_MAX };
extern uint8_t color_type;
ILI9341_2 *ili9341_2;
// #include <ILI9341_2.h>
#if defined(USE_FT5206)
#include <FT5206.h>
uint8_t ili9342_ctouch_counter = 0;
#elif defined(USE_XPT2046)
#include <XPT2046_Touchscreen.h>
uint8_t ili9342_ctouch_counter = 0;
#endif // USE_FT5206
// extern uint8_t color_type;
// ILI9341_2 *ili9341_2;
bool tft_init_done = false;
// #if defined(USE_FT5206)
// #include <FT5206.h>
// uint8_t ili9342_ctouch_counter = 0;
// #elif defined(USE_XPT2046)
// #include <XPT2046_Touchscreen.h>
// uint8_t ili9342_ctouch_counter = 0;
// #endif // USE_FT5206
void Core2DisplayPower(uint8_t on);
void Core2DisplayDim(uint8_t dim);
// bool tft_init_done = false;
//Settings->display_options.type = ILIMODE_9341;
// void Core2DisplayPower(uint8_t on);
// void Core2DisplayDim(uint8_t dim);
/*********************************************************************************************/
// //Settings->display_options.type = ILIMODE_9341;
void ILI9341_InitDriver()
{
// /*********************************************************************************************/
// There are displays without CS
if (PinUsed(GPIO_ILI9341_CS) || PinUsed(GPIO_ILI9341_DC) &&
(TasmotaGlobal.spi_enabled || TasmotaGlobal.soft_spi_enabled)) {
// void ILI9341_InitDriver()
// {
Settings->display_model = XDSP_04;
// // There are displays without CS
// if (PinUsed(GPIO_ILI9341_CS) || PinUsed(GPIO_ILI9341_DC) &&
// (TasmotaGlobal.spi_enabled || TasmotaGlobal.soft_spi_enabled)) {
if (Settings->display_width != ILI9341_TFTWIDTH) {
Settings->display_width = ILI9341_TFTWIDTH;
}
if (Settings->display_height != ILI9341_TFTHEIGHT) {
Settings->display_height = ILI9341_TFTHEIGHT;
}
// Settings->display_model = XDSP_04;
if (!Settings->display_options.type || (Settings->display_options.type >= ILIMODE_MAX)) {
Settings->display_options.type = ILIMODE_9341;
}
// if (Settings->display_width != ILI9341_TFTWIDTH) {
// Settings->display_width = ILI9341_TFTWIDTH;
// }
// if (Settings->display_height != ILI9341_TFTHEIGHT) {
// Settings->display_height = ILI9341_TFTHEIGHT;
// }
// default colors
fg_color = ILI9341_WHITE;
bg_color = ILI9341_BLACK;
// if (!Settings->display_options.type || (Settings->display_options.type >= ILIMODE_MAX)) {
// Settings->display_options.type = ILIMODE_9341;
// }
// check for special case with 2 SPI busses (ESP32 bitcoin)
if (TasmotaGlobal.soft_spi_enabled) {
// Init renderer, may use hardware spi, however we use SSPI defintion because SD card uses SPI definition (2 spi busses)
if (PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_MISO) && PinUsed(GPIO_SSPI_SCLK)) {
ili9341_2 = new ILI9341_2(Pin(GPIO_ILI9341_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_MISO), Pin(GPIO_SSPI_SCLK), Pin(GPIO_OLED_RESET), Pin(GPIO_ILI9341_DC), Pin(GPIO_BACKLIGHT), 2, Settings->display_options.type & 3);
}
} else if (TasmotaGlobal.spi_enabled) {
if (PinUsed(GPIO_ILI9341_DC)) {
ili9341_2 = new ILI9341_2(Pin(GPIO_ILI9341_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK), Pin(GPIO_OLED_RESET), Pin(GPIO_ILI9341_DC), Pin(GPIO_BACKLIGHT), 1, Settings->display_options.type & 3);
}
}
// // default colors
// fg_color = ILI9341_WHITE;
// bg_color = ILI9341_BLACK;
if (ili9341_2 == nullptr) {
AddLog(LOG_LEVEL_INFO, PSTR("DSP: ILI934x invalid GPIOs"));
return;
}
// // check for special case with 2 SPI busses (ESP32 bitcoin)
// if (TasmotaGlobal.soft_spi_enabled) {
// // Init renderer, may use hardware spi, however we use SSPI defintion because SD card uses SPI definition (2 spi busses)
// if (PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_MISO) && PinUsed(GPIO_SSPI_SCLK)) {
// ili9341_2 = new ILI9341_2(Pin(GPIO_ILI9341_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_MISO), Pin(GPIO_SSPI_SCLK), Pin(GPIO_OLED_RESET), Pin(GPIO_ILI9341_DC), Pin(GPIO_BACKLIGHT), 2, Settings->display_options.type & 3);
// }
// } else if (TasmotaGlobal.spi_enabled) {
// if (PinUsed(GPIO_ILI9341_DC)) {
// ili9341_2 = new ILI9341_2(Pin(GPIO_ILI9341_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK), Pin(GPIO_OLED_RESET), Pin(GPIO_ILI9341_DC), Pin(GPIO_BACKLIGHT), 1, Settings->display_options.type & 3);
// }
// }
ili9341_2->init(Settings->display_width, Settings->display_height);
renderer = ili9341_2;
// if (ili9341_2 == nullptr) {
// AddLog(LOG_LEVEL_INFO, PSTR("DSP: ILI934x invalid GPIOs"));
// return;
// }
#ifdef USE_M5STACK_CORE2
renderer->SetPwrCB(Core2DisplayPower);
renderer->SetDimCB(Core2DisplayDim);
#endif
// ili9341_2->init(Settings->display_width, Settings->display_height);
// renderer = ili9341_2;
renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font);
renderer->dim(GetDisplayDimmer16());
// #ifdef USE_M5STACK_CORE2
// renderer->SetPwrCB(Core2DisplayPower);
// renderer->SetDimCB(Core2DisplayDim);
// #endif
#ifdef SHOW_SPLASH
if (!Settings->flag5.display_no_splash) {
// Welcome text
renderer->setTextFont(2);
renderer->setTextSize(1);
renderer->setTextColor(ILI9341_WHITE, ILI9341_BLACK);
renderer->DrawStringAt(50, (Settings->display_height/2)-12, (Settings->display_options.type & 3)==ILIMODE_9341?"ILI9341 TFT!":"ILI9342 TFT!", ILI9341_WHITE, 0);
delay(1000);
}
#endif // SHOW_SPLASH
// renderer->DisplayInit(DISPLAY_INIT_MODE, Settings->display_size, Settings->display_rotate, Settings->display_font);
// renderer->dim(GetDisplayDimmer16());
color_type = COLOR_COLOR;
// #ifdef SHOW_SPLASH
// if (!Settings->flag5.display_no_splash) {
// // Welcome text
// renderer->setTextFont(2);
// renderer->setTextSize(1);
// renderer->setTextColor(ILI9341_WHITE, ILI9341_BLACK);
// renderer->DrawStringAt(50, (Settings->display_height/2)-12, (Settings->display_options.type & 3)==ILIMODE_9341?"ILI9341 TFT!":"ILI9342 TFT!", ILI9341_WHITE, 0);
// delay(1000);
// }
// #endif // SHOW_SPLASH
#ifdef USE_DISPLAY_MODES1TO5
if (Settings->display_rotate) {
DisplayAllocScreenBuffer();
}
Ili9341InitMode();
#endif // USE_DISPLAY_MODES1TO5
// color_type = COLOR_COLOR;
#ifdef ESP32
#ifdef USE_FT5206
// start digitizer with fixed adress and pins for esp32
#undef SDA_2
#define SDA_2 21
#undef SCL_2
#define SCL_2 22
Wire1.begin(SDA_2, SCL_2, (uint32_t)400000);
FT5206_Touch_Init(Wire1);
#endif // USE_FT5206
#endif // ESP32
// #ifdef USE_DISPLAY_MODES1TO5
// if (Settings->display_rotate) {
// DisplayAllocScreenBuffer();
// }
// Ili9341InitMode();
// #endif // USE_DISPLAY_MODES1TO5
#ifdef USE_XPT2046
XPT2046_Touch_Init(Pin(GPIO_XPT2046_CS),-1,0);
#endif
// #ifdef ESP32
// #ifdef USE_FT5206
// // start digitizer with fixed adress and pins for esp32
// #undef SDA_2
// #define SDA_2 21
// #undef SCL_2
// #define SCL_2 22
// Wire1.begin(SDA_2, SCL_2, (uint32_t)400000);
// FT5206_Touch_Init(Wire1);
// #endif // USE_FT5206
// #endif // ESP32
tft_init_done = true;
AddLog(LOG_LEVEL_INFO, PSTR("DSP: ILI9341"));
}
}
// #ifdef USE_XPT2046
// XPT2046_Touch_Init(Pin(GPIO_XPT2046_CS),-1,0);
// #endif
#if defined(USE_FT5206) || defined(USE_XPT2046)
#ifdef USE_TOUCH_BUTTONS
// tft_init_done = true;
// AddLog(LOG_LEVEL_INFO, PSTR("DSP: ILI9341"));
// }
// }
#ifdef USE_FT5206
void FT5206_TS_RotConvert(int16_t *x, int16_t *y) {
// #if defined(USE_FT5206) || defined(USE_XPT2046)
// #ifdef USE_TOUCH_BUTTONS
int16_t temp;
if (renderer) {
uint8_t rot = renderer->getRotation();
switch (rot) {
case 0:
break;
case 1:
temp = *y;
*y = renderer->height() - *x;
*x = temp;
break;
case 2:
*x = renderer->width() - *x;
*y = renderer->height() - *y;
break;
case 3:
temp = *y;
*y = *x;
*x = renderer->width() - temp;
break;
}
}
}
#endif // USE_FT5206
// #ifdef USE_FT5206
// void FT5206_TS_RotConvert(int16_t *x, int16_t *y) {
#ifdef USE_XPT2046
void XPT2046_TS_RotConvert(int16_t *x, int16_t *y) {
// int16_t temp;
// if (renderer) {
// uint8_t rot = renderer->getRotation();
// switch (rot) {
// case 0:
// break;
// case 1:
// temp = *y;
// *y = renderer->height() - *x;
// *x = temp;
// break;
// case 2:
// *x = renderer->width() - *x;
// *y = renderer->height() - *y;
// break;
// case 3:
// temp = *y;
// *y = *x;
// *x = renderer->width() - temp;
// break;
// }
// }
// }
// #endif // USE_FT5206
int16_t temp;
if (renderer) {
uint8_t rot = renderer->getRotation();
// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(" TS: before convert x:%d / y:%d screen r:%d / w:%d / h:%d"), *x, *y,rot,renderer->width(),renderer->height());
temp = map(*x,XPT2046_MINX,XPT2046_MAXX, renderer->height(), 0);
*x = map(*y,XPT2046_MINY,XPT2046_MAXY, renderer->width(), 0);
*y = temp;
switch (rot) {
case 0:
break;
case 1:
temp = *y;
*y = renderer->width() - *x;
*x = temp;
break;
case 2:
*x = renderer->width() - *x;
*y = renderer->height() - *y;
break;
case 3:
temp = *y;
*y = *x;
*x = renderer->height() - temp;
break;
}
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(" TS: after convert x:%d / y:%d screen r:%d / w:%d / h:%d"), *x, *y,rot,renderer->width(),renderer->height());
}
}
#endif
// #ifdef USE_XPT2046
// void XPT2046_TS_RotConvert(int16_t *x, int16_t *y) {
// check digitizer hit
void ili9342_CheckTouch() {
ili9342_ctouch_counter++;
if (2 == ili9342_ctouch_counter) {
// every 100 ms should be enough
ili9342_ctouch_counter = 0;
#ifdef USE_FT5206
if (FT5206_found) {
Touch_Check(FT5206_TS_RotConvert);
}
#endif // USE_FT5206
#ifdef USE_XPT2046
if (XPT2046_found) {
Touch_Check(XPT2046_TS_RotConvert);
}
#endif // USE_XPT2046
}
}
#endif // USE_TOUCH_BUTTONS
#endif // USE_FT5206
// int16_t temp;
// if (renderer) {
// uint8_t rot = renderer->getRotation();
// // AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(" TS: before convert x:%d / y:%d screen r:%d / w:%d / h:%d"), *x, *y,rot,renderer->width(),renderer->height());
// temp = map(*x,XPT2046_MINX,XPT2046_MAXX, renderer->height(), 0);
// *x = map(*y,XPT2046_MINY,XPT2046_MAXY, renderer->width(), 0);
// *y = temp;
// switch (rot) {
// case 0:
// break;
// case 1:
// temp = *y;
// *y = renderer->width() - *x;
// *x = temp;
// break;
// case 2:
// *x = renderer->width() - *x;
// *y = renderer->height() - *y;
// break;
// case 3:
// temp = *y;
// *y = *x;
// *x = renderer->height() - temp;
// break;
// }
// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(" TS: after convert x:%d / y:%d screen r:%d / w:%d / h:%d"), *x, *y,rot,renderer->width(),renderer->height());
// }
// }
// #endif
// // check digitizer hit
// void ili9342_CheckTouch() {
// ili9342_ctouch_counter++;
// if (2 == ili9342_ctouch_counter) {
// // every 100 ms should be enough
// ili9342_ctouch_counter = 0;
// #ifdef USE_FT5206
// if (FT5206_found) {
// Touch_Check(FT5206_TS_RotConvert);
// }
// #endif // USE_FT5206
// #ifdef USE_XPT2046
// if (XPT2046_found) {
// Touch_Check(XPT2046_TS_RotConvert);
// }
// #endif // USE_XPT2046
// }
// }
// #endif // USE_TOUCH_BUTTONS
// #endif // USE_FT5206
#ifdef USE_DISPLAY_MODES1TO5
// #ifdef USE_DISPLAY_MODES1TO5
#define TFT_TOP 16
#define TFT_BOTTOM 16
#define TFT_FONT_WIDTH 6
#define TFT_FONT_HEIGTH 8 // Adafruit minimal font heigth pixels
// #define TFT_TOP 16
// #define TFT_BOTTOM 16
// #define TFT_FONT_WIDTH 6
// #define TFT_FONT_HEIGTH 8 // Adafruit minimal font heigth pixels
uint16_t tft_top = TFT_TOP;
uint16_t tft_bottom = TFT_BOTTOM;
uint16_t tft_scroll = TFT_TOP;
uint16_t tft_cols = 0;
// uint16_t tft_top = TFT_TOP;
// uint16_t tft_bottom = TFT_BOTTOM;
// uint16_t tft_scroll = TFT_TOP;
// uint16_t tft_cols = 0;
bool Ili9341Header(void) {
if (Settings->display_cols[0] != tft_cols) {
tft_cols = Settings->display_cols[0];
if (tft_cols > 17) {
tft_top = TFT_TOP;
tft_bottom = TFT_BOTTOM;
} else {
tft_top = 0;
tft_bottom = 0;
}
tft_scroll = tft_top;
renderer->setScrollMargins(tft_top, tft_bottom);
}
return (tft_cols > 17);
}
// bool Ili9341Header(void) {
// if (Settings->display_cols[0] != tft_cols) {
// tft_cols = Settings->display_cols[0];
// if (tft_cols > 17) {
// tft_top = TFT_TOP;
// tft_bottom = TFT_BOTTOM;
// } else {
// tft_top = 0;
// tft_bottom = 0;
// }
// tft_scroll = tft_top;
// renderer->setScrollMargins(tft_top, tft_bottom);
// }
// return (tft_cols > 17);
// }
void Ili9341InitMode(void) {
// renderer->setRotation(Settings->display_rotate); // 0
#ifdef USE_DISPLAY_ILI9341
// renderer->invertDisplay(0);
#endif
renderer->fillScreen(ILI9341_BLACK);
renderer->setTextWrap(false); // Allow text to run off edges
renderer->cp437(true);
if (!Settings->display_mode) {
renderer->setCursor(0, 0);
renderer->setTextColor(ILI9341_WHITE, ILI9341_BLACK);
renderer->setTextSize(1);
} else {
Ili9341Header();
renderer->setCursor(0, 0);
renderer->setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
renderer->setTextSize(2);
// tft->println("HEADER");
}
}
// void Ili9341InitMode(void) {
// // renderer->setRotation(Settings->display_rotate); // 0
// #ifdef USE_DISPLAY_ILI9341
// // renderer->invertDisplay(0);
// #endif
// renderer->fillScreen(ILI9341_BLACK);
// renderer->setTextWrap(false); // Allow text to run off edges
// renderer->cp437(true);
// if (!Settings->display_mode) {
// renderer->setCursor(0, 0);
// renderer->setTextColor(ILI9341_WHITE, ILI9341_BLACK);
// renderer->setTextSize(1);
// } else {
// Ili9341Header();
// renderer->setCursor(0, 0);
// renderer->setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
// renderer->setTextSize(2);
// // tft->println("HEADER");
// }
// }
void Ili9341PrintLog(void) {
disp_refresh--;
if (!disp_refresh) {
disp_refresh = Settings->display_refresh;
if (Settings->display_rotate) {
if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); }
}
// void Ili9341PrintLog(void) {
// disp_refresh--;
// if (!disp_refresh) {
// disp_refresh = Settings->display_refresh;
// if (Settings->display_rotate) {
// if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); }
// }
char* txt = DisplayLogBuffer('\370');
if (txt != nullptr) {
uint8_t size = Settings->display_size;
uint16_t theight = size * TFT_FONT_HEIGTH;
// char* txt = DisplayLogBuffer('\370');
// if (txt != nullptr) {
// uint8_t size = Settings->display_size;
// uint16_t theight = size * TFT_FONT_HEIGTH;
renderer->setTextSize(size);
renderer->setTextColor(ILI9341_CYAN, ILI9341_BLACK); // Add background color to solve flicker
if (!Settings->display_rotate) { // Use hardware scroll
renderer->setCursor(0, tft_scroll);
renderer->fillRect(0, tft_scroll, renderer->width(), theight, ILI9341_BLACK); // Erase line
renderer->print(txt);
tft_scroll += theight;
if (tft_scroll >= (renderer->height() - tft_bottom)) {
tft_scroll = tft_top;
}
renderer->scrollTo(tft_scroll);
} else {
uint8_t last_row = Settings->display_rows -1;
// renderer->setTextSize(size);
// renderer->setTextColor(ILI9341_CYAN, ILI9341_BLACK); // Add background color to solve flicker
// if (!Settings->display_rotate) { // Use hardware scroll
// renderer->setCursor(0, tft_scroll);
// renderer->fillRect(0, tft_scroll, renderer->width(), theight, ILI9341_BLACK); // Erase line
// renderer->print(txt);
// tft_scroll += theight;
// if (tft_scroll >= (renderer->height() - tft_bottom)) {
// tft_scroll = tft_top;
// }
// renderer->scrollTo(tft_scroll);
// } else {
// uint8_t last_row = Settings->display_rows -1;
tft_scroll = (tft_top) ? theight : 0; // Start below header
renderer->setCursor(0, tft_scroll);
for (uint32_t i = 0; i < last_row; i++) {
strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols);
// tft->fillRect(0, tft_scroll, tft->width(), theight, ILI9341_BLACK); // Erase line
renderer->print(disp_screen_buffer[i]);
tft_scroll += theight;
renderer->setCursor(0, tft_scroll);
delay(1); // Fix background runs heap usage due to long runtime of this loop (up to 1 second)
}
strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols);
DisplayFillScreen(last_row);
renderer->print(disp_screen_buffer[last_row]);
}
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "[%s]"), txt);
}
}
}
// tft_scroll = (tft_top) ? theight : 0; // Start below header
// renderer->setCursor(0, tft_scroll);
// for (uint32_t i = 0; i < last_row; i++) {
// strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols);
// // tft->fillRect(0, tft_scroll, tft->width(), theight, ILI9341_BLACK); // Erase line
// renderer->print(disp_screen_buffer[i]);
// tft_scroll += theight;
// renderer->setCursor(0, tft_scroll);
// delay(1); // Fix background runs heap usage due to long runtime of this loop (up to 1 second)
// }
// strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols);
// DisplayFillScreen(last_row);
// renderer->print(disp_screen_buffer[last_row]);
// }
// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "[%s]"), txt);
// }
// }
// }
void ILI9341_Refresh(void) { // Every second
if (Settings->display_mode) { // Mode 0 is User text
// 24-04-2017 13:45:43 = 19 + 1 ('\0') = 20
// 24-04-2017 13:45 = 16 + 1 ('\0') = 17
// void ILI9341_Refresh(void) { // Every second
// if (Settings->display_mode) { // Mode 0 is User text
// // 24-04-2017 13:45:43 = 19 + 1 ('\0') = 20
// // 24-04-2017 13:45 = 16 + 1 ('\0') = 17
if (Ili9341Header()) {
char tftdt[Settings->display_cols[0] +1];
char date4[11]; // 24-04-2017
uint8_t time_size = (Settings->display_cols[0] >= 20) ? 9 : 6; // 13:45:43 or 13:45
char spaces[Settings->display_cols[0] - (8 + time_size)];
char time[time_size]; // 13:45:43
// if (Ili9341Header()) {
// char tftdt[Settings->display_cols[0] +1];
// char date4[11]; // 24-04-2017
// uint8_t time_size = (Settings->display_cols[0] >= 20) ? 9 : 6; // 13:45:43 or 13:45
// char spaces[Settings->display_cols[0] - (8 + time_size)];
// char time[time_size]; // 13:45:43
renderer->setTextSize(Settings->display_size);
renderer->setTextColor(ILI9341_YELLOW, ILI9341_RED); // Add background color to solve flicker
renderer->setCursor(0, 0);
// renderer->setTextSize(Settings->display_size);
// renderer->setTextColor(ILI9341_YELLOW, ILI9341_RED); // Add background color to solve flicker
// renderer->setCursor(0, 0);
snprintf_P(date4, sizeof(date4), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year);
memset(spaces, 0x20, sizeof(spaces));
spaces[sizeof(spaces) -1] = '\0';
snprintf_P(time, sizeof(time), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second);
snprintf_P(tftdt, sizeof(tftdt), PSTR("%s%s%s"), date4, spaces, time);
// snprintf_P(date4, sizeof(date4), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year);
// memset(spaces, 0x20, sizeof(spaces));
// spaces[sizeof(spaces) -1] = '\0';
// snprintf_P(time, sizeof(time), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second);
// snprintf_P(tftdt, sizeof(tftdt), PSTR("%s%s%s"), date4, spaces, time);
renderer->print(tftdt);
} else {
renderer->setCursor(0, 0);
}
// renderer->print(tftdt);
// } else {
// renderer->setCursor(0, 0);
// }
switch (Settings->display_mode) {
case 1: // Text
case 2: // Local
case 3: // Local
case 4: // Mqtt
case 5: // Mqtt
Ili9341PrintLog();
break;
}
}
}
#endif // USE_DISPLAY_MODES1TO5
// switch (Settings->display_mode) {
// case 1: // Text
// case 2: // Local
// case 3: // Local
// case 4: // Mqtt
// case 5: // Mqtt
// Ili9341PrintLog();
// break;
// }
// }
// }
// #endif // USE_DISPLAY_MODES1TO5
/*********************************************************************************************/
/*********************************************************************************************\
* Interface
\*********************************************************************************************/
bool Xdsp04(uint32_t function)
{
bool result = false;
// /*********************************************************************************************/
// /*********************************************************************************************\
// * Interface
// \*********************************************************************************************/
// bool Xdsp04(uint32_t function)
// {
// bool result = false;
if (FUNC_DISPLAY_INIT_DRIVER == function) {
ILI9341_InitDriver();
}
else if (tft_init_done && (XDSP_04 == Settings->display_model)) {
switch (function) {
case FUNC_DISPLAY_MODEL:
result = true;
break;
case FUNC_DISPLAY_TEXT_SIZE:
case FUNC_DISPLAY_FONT_SIZE:
case DISPLAY_INIT_MODE:
renderer->clearDisplay();
break;
#if defined(USE_FT5206) || defined(USE_XPT2046)
#ifdef USE_TOUCH_BUTTONS
case FUNC_DISPLAY_EVERY_50_MSECOND:
#if defined(USE_FT5206)
if (FT5206_found) {
#elif defined(USE_XPT2046)
if (XPT2046_found) {
#endif
// if (FUNC_DISPLAY_INIT_DRIVER == function) {
// ILI9341_InitDriver();
// }
// else if (tft_init_done && (XDSP_04 == Settings->display_model)) {
// switch (function) {
// case FUNC_DISPLAY_MODEL:
// result = true;
// break;
// case FUNC_DISPLAY_TEXT_SIZE:
// case FUNC_DISPLAY_FONT_SIZE:
// case DISPLAY_INIT_MODE:
// renderer->clearDisplay();
// break;
// #if defined(USE_FT5206) || defined(USE_XPT2046)
// #ifdef USE_TOUCH_BUTTONS
// case FUNC_DISPLAY_EVERY_50_MSECOND:
// #if defined(USE_FT5206)
// if (FT5206_found) {
// #elif defined(USE_XPT2046)
// if (XPT2046_found) {
// #endif
ili9342_CheckTouch();
}
break;
#endif // USE_TOUCH_BUTTONS
#endif // USE_FT5206
#ifdef USE_DISPLAY_MODES1TO5
case FUNC_DISPLAY_EVERY_SECOND:
ILI9341_Refresh();
break;
#endif // USE_DISPLAY_MODES1TO5
// ili9342_CheckTouch();
// }
// break;
// #endif // USE_TOUCH_BUTTONS
// #endif // USE_FT5206
// #ifdef USE_DISPLAY_MODES1TO5
// case FUNC_DISPLAY_EVERY_SECOND:
// ILI9341_Refresh();
// break;
// #endif // USE_DISPLAY_MODES1TO5
}
}
return result;
}
// }
// }
// return result;
// }
#endif // USE_DISPLAY_ILI9341
#endif // USE_DISPLAY
#endif // USE_SPI
// #endif // USE_DISPLAY_ILI9341
// #endif // USE_DISPLAY
// #endif // USE_SPI