Files
yoradio/yoRadio/src/core/touchscreen.cpp
2022-10-31 10:15:17 +03:00

197 lines
4.7 KiB
C++

#include "options.h"
#if TS_MODEL!=TS_MODEL_UNDEFINED
#include "touchscreen.h"
#include "config.h"
#include "controls.h"
#include "display.h"
#include "player.h"
#ifndef TS_X_MIN
#define TS_X_MIN 400
#endif
#ifndef TS_X_MAX
#define TS_X_MAX 3800
#endif
#ifndef TS_Y_MIN
#define TS_Y_MIN 260
#endif
#ifndef TS_Y_MAX
#define TS_Y_MAX 3800
#endif
#ifndef TS_STEPS
#define TS_STEPS 40
#endif
#if TS_MODEL==TS_MODEL_XPT2046
#ifdef TS_SPIPINS
SPIClass TSSPI(HSPI);
#endif
#include <XPT2046_Touchscreen.h>
XPT2046_Touchscreen ts(TS_CS);
typedef TS_Point TSPoint;
#elif TS_MODEL==TS_MODEL_GT911
#include "../GT911_Touchscreen/TAMC_GT911.h"
TAMC_GT911 ts = TAMC_GT911(TS_SDA, TS_SCL, TS_INT, TS_RST, 0, 0);
typedef TP_Point TSPoint;
#endif
void TouchScreen::init(){
#if TS_MODEL==TS_MODEL_XPT2046
#ifdef TS_SPIPINS
TSSPI.begin(TS_SPIPINS);
ts.begin(TSSPI);
#else
#if TS_HSPI
ts.begin(SPI2);
#else
ts.begin();
#endif
#endif
ts.setRotation(config.store.fliptouch?3:1);
#endif
#if TS_MODEL==TS_MODEL_GT911
ts.begin();
ts.setRotation(config.store.fliptouch?0:2);
#endif
_width = dsp.width();
_height = dsp.height();
#if TS_MODEL==TS_MODEL_GT911
ts.setResolution(_width, _height);
#endif
}
tsDirection_e TouchScreen::_tsDirection(uint16_t x, uint16_t y) {
int16_t dX = x - _oldTouchX;
int16_t dY = y - _oldTouchY;
if (abs(dX) > 20 || abs(dY) > 20) {
if (abs(dX) > abs(dY)) {
if (dX > 0) {
return TSD_RIGHT;
} else {
return TSD_LEFT;
}
} else {
if (dY > 0) {
return TSD_DOWN;
} else {
return TSD_UP;
}
}
} else {
return TDS_REQUEST;
}
}
void TouchScreen::flip(){
#if TS_MODEL==TS_MODEL_XPT2046
ts.setRotation(config.store.fliptouch?3:1);
#endif
#if TS_MODEL==TS_MODEL_GT911
ts.setRotation(config.store.fliptouch?0:2);
#endif
}
void TouchScreen::loop(){
uint16_t touchX, touchY;
static bool wastouched = true;
static uint32_t touchLongPress;
static tsDirection_e direct;
static uint16_t touchVol, touchStation;
if (!_checklpdelay(20, _touchdelay)) return;
#if TS_MODEL==TS_MODEL_GT911
ts.read();
#endif
bool istouched = _istouched();
if(istouched){
#if TS_MODEL==TS_MODEL_XPT2046
TSPoint p = ts.getPoint();
touchX = map(p.x, TS_X_MIN, TS_X_MAX, 0, _width);
touchY = map(p.y, TS_Y_MIN, TS_Y_MAX, 0, _height);
#elif TS_MODEL==TS_MODEL_GT911
TSPoint p = ts.points[0];
touchX = p.x;
touchY = p.y;
#endif
if (!wastouched) { /* START TOUCH */
_oldTouchX = touchX;
_oldTouchY = touchY;
touchVol = touchX;
touchStation = touchY;
direct = TDS_REQUEST;
touchLongPress=millis();
} else { /* SWIPE TOUCH */
direct = _tsDirection(touchX, touchY);
switch (direct) {
case TSD_LEFT:
case TSD_RIGHT: {
touchLongPress=millis();
if(display.mode()==PLAYER || display.mode()==VOL){
int16_t xDelta = map(abs(touchVol - touchX), 0, _width, 0, TS_STEPS);
display.putRequest(NEWMODE, VOL);
if (xDelta>1) {
controlsEvent((touchVol - touchX)<0);
touchVol = touchX;
}
}
break;
}
case TSD_UP:
case TSD_DOWN: {
touchLongPress=millis();
if(display.mode()==PLAYER || display.mode()==STATIONS){
int16_t yDelta = map(abs(touchStation - touchY), 0, _height, 0, TS_STEPS);
display.putRequest(NEWMODE, STATIONS);
if (yDelta>1) {
controlsEvent((touchStation - touchY)<0);
touchStation = touchY;
}
}
break;
}
default:
break;
}
}
if (config.store.dbgtouch) {
Serial.print(", x = ");
Serial.print(p.x);
Serial.print(", y = ");
Serial.println(p.y);
}
}else{
if (wastouched) {/* END TOUCH */
if (direct == TDS_REQUEST) {
uint32_t pressTicks = millis()-touchLongPress;
if( pressTicks < BTN_PRESS_TICKS*2){
if(pressTicks > 50) onBtnClick(EVT_BTNCENTER);
}else{
display.putRequest(NEWMODE, display.mode() == PLAYER ? STATIONS : PLAYER);
}
}
direct = TSD_STAY;
}
}
wastouched = istouched;
}
bool TouchScreen::_checklpdelay(int m, uint32_t &tstamp) {
if (millis() - tstamp > m) {
tstamp = millis();
return true;
} else {
return false;
}
}
bool TouchScreen::_istouched(){
#if TS_MODEL==TS_MODEL_XPT2046
return ts.touched();
#elif TS_MODEL==TS_MODEL_GT911
return ts.isTouched;
#endif
}
#endif // TS_MODEL!=TS_MODEL_UNDEFINED