Merge pull request #10 from scotty007/fix/read-touch-input

Fix touch input reading
This commit is contained in:
dude.eth
2026-03-23 17:56:30 -06:00
committed by GitHub
4 changed files with 26 additions and 16 deletions

View File

@@ -52,7 +52,8 @@
// --- Touchscreen (GT911 capacitive) ---
#define TOUCH_INT 16
// GT911 I2C address: typically 0x5D or 0x14 (depends on INT state at boot)
#define TOUCH_I2C_ADDR 0x5D
#define TOUCH_I2C_ADDR_1 0x5D
#define TOUCH_I2C_ADDR_2 0x14
// --- Trackball ---
#define TBALL_UP 3

View File

@@ -9,19 +9,21 @@ bool TouchInput::begin() {
pinMode(TOUCH_INT, INPUT);
// Try GT911 at both possible addresses
Wire.beginTransmission(TOUCH_I2C_ADDR);
Wire.beginTransmission(TOUCH_I2C_ADDR_1);
uint8_t err = Wire.endTransmission();
if (err != 0) {
Wire.beginTransmission(0x14);
Wire.beginTransmission(TOUCH_I2C_ADDR_2);
err = Wire.endTransmission();
if (err != 0) {
Serial.println("[TOUCH] GT911 not found at 0x5D or 0x14");
return false;
}
Serial.println("[TOUCH] GT911 found at 0x14");
_i2cAddress = TOUCH_I2C_ADDR_2;
} else {
Serial.println("[TOUCH] GT911 found at 0x5D");
_i2cAddress = TOUCH_I2C_ADDR_1;
}
Serial.print("[TOUCH] GT911 found at 0x");
Serial.println(_i2cAddress, HEX);
Serial.println("[TOUCH] Touch input registered");
return true;
@@ -33,7 +35,7 @@ void TouchInput::update() {
bool TouchInput::readGT911() {
// Read touch status register (0x814E)
Wire.beginTransmission(TOUCH_I2C_ADDR);
Wire.beginTransmission(_i2cAddress);
Wire.write(0x81);
Wire.write(0x4E);
if (Wire.endTransmission() != 0) {
@@ -41,7 +43,7 @@ bool TouchInput::readGT911() {
return false;
}
Wire.requestFrom((uint8_t)TOUCH_I2C_ADDR, (uint8_t)1);
Wire.requestFrom(_i2cAddress, (uint8_t)1);
if (!Wire.available()) {
_touched = false;
return false;
@@ -53,7 +55,7 @@ bool TouchInput::readGT911() {
if (!bufferReady || touchCount == 0) {
_touched = false;
Wire.beginTransmission(TOUCH_I2C_ADDR);
Wire.beginTransmission(_i2cAddress);
Wire.write(0x81);
Wire.write(0x4E);
Wire.write(0x00);
@@ -61,34 +63,38 @@ bool TouchInput::readGT911() {
return false;
}
// Read first touch point (0x8150-0x8157)
Wire.beginTransmission(TOUCH_I2C_ADDR);
// Read first touch point (0x814F-0x8155)
Wire.beginTransmission(_i2cAddress);
Wire.write(0x81);
Wire.write(0x50);
Wire.write(0x4F);
if (Wire.endTransmission() != 0) {
_touched = false;
return false;
}
Wire.requestFrom((uint8_t)TOUCH_I2C_ADDR, (uint8_t)6);
if (Wire.available() < 6) {
Wire.requestFrom(_i2cAddress, (uint8_t)7);
if (Wire.available() < 7) {
_touched = false;
return false;
}
Wire.read(); // track ID
uint8_t trackId = Wire.read();
_x = Wire.read() | (Wire.read() << 8);
_y = Wire.read() | (Wire.read() << 8);
Wire.read(); // size (unused)
Wire.read() | (Wire.read() << 8); // size (unused)
_touched = true;
// Clear buffer status
Wire.beginTransmission(TOUCH_I2C_ADDR);
Wire.beginTransmission(_i2cAddress);
Wire.write(0x81);
Wire.write(0x4E);
Wire.write(0x00);
Wire.endTransmission();
// TODO: remove
Serial.write("[TOUCH] id "); Serial.print(trackId); Serial.write(" @ ");
Serial.print(_x); Serial.write(' '); Serial.println(_y);
return true;
}

View File

@@ -18,6 +18,8 @@ public:
private:
bool readGT911();
uint8_t _i2cAddress = 0;
bool _touched = false;
int16_t _x = 0;
int16_t _y = 0;

View File

@@ -121,6 +121,7 @@ void InputManager::update() {
unsigned long now = millis();
if (now - _lastTouchPoll >= TOUCH_POLL_MS) {
_lastTouchPoll = now;
// _touch->update();
if (_touch->isTouched()) {
_activity = true;
_strongActivity = true;