Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for CST816S touch interface #20213

Merged
merged 9 commits into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 67 additions & 4 deletions tasmota/tasmota_xdrv_driver/xdrv_55_touch.ino
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ typedef struct TSGlobal_t {

TSGlobal_t TSGlobal;

bool CST816S_found = false;
bool FT5206_found = false;
bool GT911_found = false;
bool XPT2046_found = false;
Expand All @@ -97,7 +98,7 @@ void Touch_SetStatus(uint8_t touches, uint16_t raw_x, uint16_t raw_y, uint8_t ge
// return true if succesful, false if not configured
bool Touch_GetStatus(uint8_t* touches, uint16_t* x, uint16_t* y, uint8_t* gesture,
uint16_t* raw_x, uint16_t* raw_y) {
if (TSGlobal.external_ts || FT5206_found || XPT2046_found) {
if (TSGlobal.external_ts || CST816S_found || FT5206_found || XPT2046_found) {
if (touches) { *touches = TSGlobal.touches; }
if (x) { *x = TSGlobal.touch_xp; }
if (y) { *y = TSGlobal.touch_yp; }
Expand All @@ -110,7 +111,7 @@ bool Touch_GetStatus(uint8_t* touches, uint16_t* x, uint16_t* y, uint8_t* gestur
}

uint32_t Touch_Status(int32_t sel) {
if (TSGlobal.external_ts || FT5206_found || GT911_found || XPT2046_found || SRES_found) {
if (TSGlobal.external_ts || CST816S_found || FT5206_found || GT911_found || XPT2046_found || SRES_found) {
switch (sel) {
case 0:
return TSGlobal.touched;
Expand Down Expand Up @@ -185,6 +186,62 @@ int16_t SRES_y() {
}
#endif

#ifdef USE_CST816S
#undef CST816S_address
#define CST816S_address 0x15

bool CST816S_event_available = false;
uint8_t CST816S_bus = 0;

uint8_t CST816S_map_gesture(uint8_t gesture) {
switch (gesture) {
case 0x01: return TS_Gest_Move_Up; // SWIPE_UP
case 0x02: return TS_Gest_Move_Down; // SWIPE_DOWN
case 0x03: return TS_Gest_Move_Left; // SWIPE_LEFT
case 0x04: return TS_Gest_Move_Right; // SWIPE_RIGHT
case 0x05: return TS_Gest_None; // SINGLE_CLICK
case 0x0B: return TS_Gest_None; // DOUBLE_CLICK
case 0x0C: return TS_Gest_None; // LONG_PRESS
default: return TS_Gest_None; // NONE
}
}

bool CST816S_available() {
if (CST816S_event_available) {
byte data_raw[8];
I2cReadBuffer(CST816S_address, 0x01, data_raw, 6, CST816S_bus);
TSGlobal.raw_touch_xp = ((data_raw[2] & 0xF) << 8) + data_raw[3];
TSGlobal.raw_touch_yp = ((data_raw[4] & 0xF) << 8) + data_raw[5];
TSGlobal.gesture = CST816S_map_gesture(data_raw[0]);
CST816S_event_available = false;
return true;
}
return false;
}

bool CST816S_Touch_Init(uint8_t bus, int8_t irq_pin, int8_t rst_pin, int interrupt = RISING) {
CST816S_found = false;
CST816S_bus = bus;
pinMode(irq_pin, INPUT);
pinMode(rst_pin, OUTPUT);
digitalWrite(rst_pin, HIGH);
delay(50);
digitalWrite(rst_pin, LOW);
delay(5);
digitalWrite(rst_pin, HIGH);
delay(50);
uint8_t version;
I2cReadBuffer(CST816S_address, 0x15, &version, 1, CST816S_bus);
delay(5);
uint8_t versionInfo[3];
I2cReadBuffer(CST816S_address, 0xA7, versionInfo, 3, CST816S_bus);
attachInterrupt(irq_pin, []{ CST816S_event_available = true; }, interrupt);
CST816S_found = true;
AddLog(LOG_LEVEL_INFO, PSTR("TI: CST816S, version: %d, versionInfo: %d.%d.%d"), version, versionInfo[0], versionInfo[1], versionInfo[2]);
return CST816S_found;
}
#endif // USE_CST816S

#ifdef USE_FT5206
#include <FT5206.h>
// touch panel controller
Expand Down Expand Up @@ -307,6 +364,12 @@ void Touch_Check(void(*rotconvert)(int16_t *x, int16_t *y)) {
}
#endif

#ifdef USE_CST816S
if (CST816S_found) {
TSGlobal.touched = CST816S_available();
}
#endif // USE_CST816S

#ifdef USE_FT5206
if (FT5206_found) {
TSGlobal.touched = FT5206_touched();
Expand Down Expand Up @@ -360,7 +423,7 @@ void Touch_Check(void(*rotconvert)(int16_t *x, int16_t *y)) {
#endif // USE_TOUCH_BUTTONS

rotconvert(&TSGlobal.touch_xp, &TSGlobal.touch_yp);
AddLog(LOG_LEVEL_DEBUG_MORE, "TS : TSGlobal.touched x=%i y=%i (raw x=%i y=%i)", TSGlobal.touch_xp, TSGlobal.touch_yp, TSGlobal.raw_touch_xp, TSGlobal.raw_touch_yp);
AddLog(LOG_LEVEL_DEBUG_MORE, "TS : TSGlobal.touched x=%i y=%i gest=0x%02x (raw x=%i y=%i)", TSGlobal.touch_xp, TSGlobal.touch_yp, TSGlobal.gesture, TSGlobal.raw_touch_xp, TSGlobal.raw_touch_yp);

#ifdef USE_TOUCH_BUTTONS
CheckTouchButtons(TSGlobal.touched, TSGlobal.touch_xp, TSGlobal.touch_yp);
Expand Down Expand Up @@ -522,7 +585,7 @@ bool Xdrv55(uint32_t function) {
case FUNC_INIT:
break;
case FUNC_EVERY_100_MSECOND:
if (FT5206_found || XPT2046_found || GT911_found || SRES_found) {
if (CST816S_found || FT5206_found || XPT2046_found || GT911_found || SRES_found) {
Touch_Check(TS_RotConvert);
}
break;
Expand Down
16 changes: 15 additions & 1 deletion tasmota/tasmota_xdsp_display/xdsp_17_universal.ino
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ extern FS *ffsp;

#undef GT911_address
#define GT911_address 0x5D
#undef CST816S_address
#define CST816S_address 0x15

enum {GPIO_DP_RES=GPIO_SENSOR_END-1,GPIO_DP_CS,GPIO_DP_RS,GPIO_DP_WR,GPIO_DP_RD,GPIO_DPAR0,GPIO_DPAR1,GPIO_DPAR2,GPIO_DPAR3,GPIO_DPAR4,GPIO_DPAR5,GPIO_DPAR6,GPIO_DPAR7,GPIO_DPAR8,GPIO_DPAR9,GPIO_DPAR10,GPIO_DPAR11,GPIO_DPAR12,GPIO_DPAR13,GPIO_DPAR14,GPIO_DPAR15};

Expand Down Expand Up @@ -312,7 +314,7 @@ int8_t cs;
udisp = new uDisplay(ddesc);

// checck for touch option TI1 or TI2
#if defined(USE_FT5206) || defined(USE_GT911)
#if defined (USE_CST816S) || defined(USE_FT5206) || defined(USE_GT911)
cp = strstr(ddesc, ":TI");
if (cp) {
uint8_t wire_n = 1;
Expand Down Expand Up @@ -350,6 +352,8 @@ int8_t cs;
if (I2cSetDevice(i2caddr, wire_n)) {
if (i2caddr == GT911_address) {
I2cSetActiveFound(i2caddr, "GT911", wire_n);
} else if (i2caddr == CST816S_address) {
I2cSetActiveFound(i2caddr, "CST816S", wire_n);
} else {
I2cSetActiveFound(i2caddr, "FT5206", wire_n);
}
Expand All @@ -361,6 +365,8 @@ int8_t cs;
if (I2cSetDevice(i2caddr)) {
if (i2caddr == GT911_address) {
I2cSetActiveFound(i2caddr, "GT911");
} else if (i2caddr == CST816S_address) {
I2cSetActiveFound(i2caddr, "CST816S");
} else {
I2cSetActiveFound(i2caddr, "FT5206");
}
Expand All @@ -373,6 +379,10 @@ int8_t cs;
#ifdef USE_GT911
if (!wire_n) GT911_Touch_Init(&Wire, irq, rst, xs, ys);
else GT911_Touch_Init(&Wire1, irq, rst, xs, ys);
#endif
} else if (i2caddr == CST816S_address) {
#ifdef USE_CST816S
CST816S_Touch_Init(wire_n, irq, rst);
#endif
} else {
#ifdef USE_FT5206
Expand All @@ -386,6 +396,10 @@ int8_t cs;
if (i2caddr == GT911_address) {
#ifdef USE_GT911
if (!wire_n) GT911_Touch_Init(&Wire, irq, rst, xs, ys);
#endif
} else if (i2caddr == CST816S_address) {
#ifdef USE_CST816S
CST816S_Touch_Init(wire_n, irq, rst);
#endif
} else {
#ifdef USE_FT5206
Expand Down