Commit 26d7e403 authored by Bodmer's avatar Bodmer

Fix touch screen handler

The touch screen handler was broken for the ESP8266 only. The library
uses SPI write only configuration for ESP8266 so the SPI buffer can be
recycled and it was left in write only mode. The library now switches
back to read & write mode at the end of a transaction.
parent d6e07078
......@@ -16,11 +16,8 @@
***************************************************************************************/
uint8_t TFT_eSPI::getTouchRaw(uint16_t *x, uint16_t *y){
uint16_t tmp;
CS_H;
spi_begin_touch();
T_CS_L;
// Start YP sample request for x position, read 4 times and keep last sample
spi.transfer(0xd0); // Start new YP conversion
......@@ -51,8 +48,6 @@ uint8_t TFT_eSPI::getTouchRaw(uint16_t *x, uint16_t *y){
*y = tmp;
T_CS_H;
spi_end_touch();
return true;
......@@ -63,20 +58,15 @@ uint8_t TFT_eSPI::getTouchRaw(uint16_t *x, uint16_t *y){
** Description: read raw pressure on touchpad and return Z value.
***************************************************************************************/
uint16_t TFT_eSPI::getTouchRawZ(void){
CS_H;
spi_begin_touch();
T_CS_L;
// Calculate Z
// Z sample request
int16_t tz = 0xFFF;
spi.transfer(0xb0); // Start new Z1 conversion
tz += spi.transfer16(0xc0) >> 3; // Read Z1 and start Z2 conversion
tz -= spi.transfer16(0x00) >> 3; // Read Z2
T_CS_H;
spi_end_touch();
return (uint16_t)tz;
......@@ -86,7 +76,7 @@ uint16_t TFT_eSPI::getTouchRawZ(void){
** Function name: validTouch
** Description: read validated position. Return false if not pressed.
***************************************************************************************/
#define _RAWERR 10 // Deadband error allowed in successive position samples
#define _RAWERR 20 // Deadband error allowed in successive position samples
uint8_t TFT_eSPI::validTouch(uint16_t *x, uint16_t *y, uint16_t threshold){
uint16_t x_tmp, y_tmp, x_tmp2, y_tmp2;
......
......@@ -55,11 +55,17 @@ inline void TFT_eSPI::spi_begin(void){
#else
CS_L;
#endif
#ifdef ESP8266
SPI1U = SPI1U_WRITE;
#endif
}
inline void TFT_eSPI::spi_end(void){
#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) && !defined(ESP32_PARALLEL)
if(!inTransaction) {if (!locked) {locked = true; CS_H; spi.endTransaction();}}
#ifdef ESP8266
SPI1U = SPI1U_READ;
#endif
#else
if(!inTransaction) CS_H;
#endif
......@@ -96,19 +102,33 @@ inline void TFT_eSPI::spi_end_read(void){
#if defined (TOUCH_CS) && defined (SPI_TOUCH_FREQUENCY) // && !defined(ESP32_PARALLEL)
inline void TFT_eSPI::spi_begin_touch(void){
CS_H; // Just in case it has been left low
#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS)
if (locked) {locked = false; spi.beginTransaction(SPISettings(SPI_TOUCH_FREQUENCY, MSBFIRST, SPI_MODE0));}
#else
spi.setFrequency(SPI_TOUCH_FREQUENCY);
#endif
#ifdef ESP8266
SPI1U = SPI1U_READ;
#endif
T_CS_L;
}
inline void TFT_eSPI::spi_end_touch(void){
T_CS_H;
#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS)
if(!inTransaction) {if (!locked) {locked = true; spi.endTransaction();}}
#else
spi.setFrequency(SPI_FREQUENCY);
#endif
#ifdef ESP8266
SPI1U = SPI1U_WRITE;
#endif
}
#endif
......@@ -325,6 +345,7 @@ void TFT_eSPI::init(uint8_t tc)
#endif
_booted = false;
spi_end();
} // end of: if just _booted
// Toggle RST low to reset
......@@ -475,8 +496,6 @@ void TFT_eSPI::commandList (const uint8_t *addr)
uint8_t numArgs;
uint8_t ms;
spi_begin();
numCommands = pgm_read_byte(addr++); // Number of commands to follow
while (numCommands--) // For each command...
......@@ -497,7 +516,7 @@ void TFT_eSPI::commandList (const uint8_t *addr)
delay( (ms==255 ? 500 : ms) );
}
}
spi_end();
}
......@@ -2671,7 +2690,6 @@ void TFT_eSPI::setWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye)
// Column addr set
DC_C;
SPI1U = SPI1U_WRITE;
SPI1U1 = (CMD_BITS << SPILMOSI) | (CMD_BITS << SPILMISO);
SPI1W0 = TFT_CASET;
......@@ -2733,7 +2751,6 @@ void TFT_eSPI::setWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye)
// Column addr set
DC_C;
SPI1U = SPI1U_WRITE;
SPI1U1 = (CMD_BITS << SPILMOSI) | (CMD_BITS << SPILMISO);
SPI1W0 = TFT_CASET<<8;
......@@ -2779,7 +2796,6 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
{
//spi_begin(); // Must be called before setWimdow
SPI1U = SPI1U_WRITE;
SPI1U1 = (CMD_BITS << SPILMOSI) | (CMD_BITS << SPILMISO);
// Column addr set
......@@ -2912,7 +2928,6 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
#if defined (ESP8266) && !defined (RPI_WRITE_STROBE)
void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h)
{
spi_begin();
int32_t xe = xs + w - 1;
int32_t ye = ys + h - 1;
......@@ -2930,7 +2945,6 @@ void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h)
// Column addr set
DC_C;
SPI1U = SPI1U_WRITE;
SPI1U1 = (CMD_BITS << SPILMOSI) | (CMD_BITS << SPILMISO);
SPI1W0 = TFT_CASET;
......@@ -2971,14 +2985,13 @@ void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h)
while(SPI1CMD & SPIBUSY) {}
DC_D;
//spi_end();
}
#else //ESP32
void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h)
{
spi_begin();
int32_t xe = xs + w - 1;
int32_t ye = ys + h - 1;
......@@ -3017,7 +3030,6 @@ ye += rowstart;
DC_D;
//spi_end();
}
#endif
......@@ -3039,7 +3051,6 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color)
spi_begin();
SPI1U = SPI1U_WRITE;
// No need to send x if it has not changed (speeds things up)
if (addr_col != x) {
......@@ -3129,7 +3140,6 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color)
spi_begin();
SPI1U = SPI1U_WRITE;
SPI1U1 = (CMD_BITS << SPILMOSI) | (CMD_BITS << SPILMISO);
// No need to send x if it has not changed (speeds things up)
if (addr_col != x) {
......@@ -3398,7 +3408,6 @@ void TFT_eSPI::pushColors(uint16_t *data, uint32_t len, bool swap)
uint32_t color[8];
SPI1U = SPI1U_WRITE;
SPI1U1 = (255 << SPILMOSI) | (255 << SPILMISO);
......@@ -4351,14 +4360,10 @@ int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font)
pc += line;
}
}
inTransaction = false;
spi_end();
}
else // Text colour != background && textsize = 1
// so use faster drawing of characters and background using block write
{
//spi_begin();
setWindow(x, y, x + width - 1, y + height - 1);
#ifdef RPI_WRITE_STROBE
......@@ -4398,9 +4403,9 @@ int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font)
#endif
}
}
spi_end();
}
inTransaction = false;
spi_end();
}
// End of RLE font rendering
#endif
......@@ -4616,6 +4621,7 @@ int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY, uint8
{
poX +=xo; // Adjust for negative offset start character
poY -= glyph_ab * textsize;
sumX += poX;
}
#endif
switch(padding) {
......@@ -4668,7 +4674,7 @@ int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY, uint8
#endif
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DEBUG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return sumX + poX;
return sumX;
}
......@@ -4896,8 +4902,6 @@ void writeBlock(uint16_t color, uint32_t repeat)
uint16_t color16 = (color >> 8) | (color << 8);
uint32_t color32 = color16 | color16 << 16;
SPI1U = SPI1U_WRITE;
SPI1W0 = color32;
SPI1W1 = color32;
SPI1W2 = color32;
......@@ -4954,8 +4958,6 @@ void writeBlock(uint16_t color, uint32_t repeat)
void writeBlock(uint16_t color, uint32_t repeat)
{
SPI1U = SPI1U_WRITE;
// Split out the colours
uint8_t r = (color & 0xF800)>>8;
uint8_t g = (color & 0x07E0)>>3;
......
......@@ -15,7 +15,7 @@
#ifndef _TFT_eSPIH_
#define _TFT_eSPIH_
#define TFT_ESPI_VERSION "1.4.4"
#define TFT_ESPI_VERSION "1.4.5"
//#define ESP32 //Just used to test ESP32 options
......
......@@ -42,7 +42,7 @@ tft.getSetup(user); //
Serial.printf("\n[code]\n");
Serial.print ("TFT_eSPI ver = " + user.version +"\n");
Serial.print ("TFT_eSPI ver = " + user.version + "\n");
Serial.printf("Processor = ESP%i\n", user.esp, HEX);
Serial.printf("Frequency = %i MHz\n", ESP.getCpuFreqMHz());
#ifdef ESP8266
......
{
"name": "TFT_eSPI",
"version": "1.4.4",
"version": "1.4.5",
"keywords": "tft, ePaper, display, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9486, ST7789",
"description": "A TFT and ePaper SPI graphics library for ESP8266 and ESP32",
"repository":
......
name=TFT_eSPI
version=1.4.4
version=1.4.5
author=Bodmer
maintainer=Bodmer
sentence=A fast TFT graphics library for ESP8266 and ESP32 processors for the Arduino IDE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment