116 lines
2.9 KiB
C++
116 lines
2.9 KiB
C++
#ifdef ARDUINO
|
|
|
|
#include "touch.h"
|
|
|
|
bool TouchClass::begin(TwoWire &port, uint8_t addr)
|
|
{
|
|
_i2cPort = &port;
|
|
_address = addr;
|
|
_i2cPort->beginTransmission(_address);
|
|
if (0 == _i2cPort->endTransmission()) {
|
|
wakeup();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void TouchClass::readBytes(uint8_t *data, uint8_t nbytes)
|
|
{
|
|
_i2cPort->beginTransmission(_address); // Initialize the Tx buffer
|
|
_i2cPort->write(data, 2); // Put data in Tx buffer
|
|
if (0 != _i2cPort->endTransmission()) {
|
|
Serial.println("readBytes error!");
|
|
}
|
|
uint8_t i = 0;
|
|
_i2cPort->requestFrom(_address, nbytes); // Read bytes from slave register address
|
|
while (_i2cPort->available()) {
|
|
data[i++] = _i2cPort->read();
|
|
}
|
|
}
|
|
|
|
void TouchClass::clearFlags(void)
|
|
{
|
|
uint8_t buf[3] = {0xD0, 0X00, 0XAB};
|
|
_i2cPort->beginTransmission(_address);
|
|
_i2cPort->write(buf, 3);
|
|
_i2cPort->endTransmission();
|
|
}
|
|
|
|
uint8_t TouchClass::scanPoint()
|
|
{
|
|
uint8_t point = 0;
|
|
uint8_t buffer[40] = {0};
|
|
|
|
buffer[0] = 0xD0;
|
|
buffer[1] = 0x00;
|
|
readBytes(buffer, 7);
|
|
|
|
if (buffer[0] == 0xAB) {
|
|
clearFlags();
|
|
return 0;
|
|
}
|
|
|
|
point = buffer[5] & 0xF;
|
|
|
|
if (point == 1) {
|
|
buffer[5] = 0xD0;
|
|
buffer[6] = 0x07;
|
|
readBytes( &buffer[5], 2);
|
|
|
|
} else if (point > 1) {
|
|
buffer[5] = 0xD0;
|
|
buffer[6] = 0x07;
|
|
readBytes( &buffer[5], 5 * (point - 1) + 3);
|
|
}
|
|
clearFlags();
|
|
|
|
if (point) {
|
|
for (int i = 0; i < point; ++i) {
|
|
data[i].id = (buffer[i * 5] >> 4) & 0x0F;
|
|
data[i].state = buffer[i * 5] & 0x0F;
|
|
if (data[i].state == 0x06) {
|
|
data[i].state = 0x07;
|
|
} else {
|
|
data[i].state = 0x06;
|
|
}
|
|
data[i].y = (uint16_t)((buffer[i * 5 + 1] << 4) | ((buffer[i * 5 + 3] >> 4) & 0x0F));
|
|
data[i].x = (uint16_t)((buffer[i * 5 + 2] << 4) | (buffer[i * 5 + 3] & 0x0F));
|
|
}
|
|
} else {
|
|
point = 1;
|
|
data[0].id = (buffer[0] >> 4) & 0x0F;
|
|
data[0].state = 0x06;
|
|
data[0].y = (uint16_t)((buffer[0 * 5 + 1] << 4) | ((buffer[0 * 5 + 3] >> 4) & 0x0F));
|
|
data[0].x = (uint16_t)((buffer[0 * 5 + 2] << 4) | (buffer[0 * 5 + 3] & 0x0F));
|
|
}
|
|
// Serial.printf("X:%d Y:%d\n", data[0].x, data[0].y);
|
|
return point;
|
|
}
|
|
|
|
|
|
void TouchClass::getPoint(uint16_t &x, uint16_t &y, uint8_t index)
|
|
{
|
|
if (index >= 4)return;
|
|
x = data[index].x;
|
|
y = data[index].y;
|
|
}
|
|
|
|
|
|
void TouchClass::sleep(void)
|
|
{
|
|
uint8_t buf[2] = {0xD1, 0X05};
|
|
_i2cPort->beginTransmission(_address);
|
|
_i2cPort->write(buf, 2);
|
|
_i2cPort->endTransmission();
|
|
}
|
|
|
|
void TouchClass::wakeup(void)
|
|
{
|
|
uint8_t buf[2] = {0xD1, 0X06};
|
|
_i2cPort->beginTransmission(_address);
|
|
_i2cPort->write(buf, 2);
|
|
_i2cPort->endTransmission();
|
|
}
|
|
|
|
#endif
|