#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 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