#include "CST816D.h"

CST816D::CST816D(int8_t sda_pin, int8_t scl_pin, int8_t rst_pin, int8_t int_pin)
{
  _sda = sda_pin;
  _scl = scl_pin;
  _rst = rst_pin;
  _int = int_pin;
}

void CST816D::begin(void)
{
  // Initialize I2C
  if (_sda != -1 && _scl != -1)
  {
    Wire.begin(_sda, _scl);
  }
  else
  {
    Wire.begin();
  }

  // Int Pin Configuration
  if (_int != -1)
  {
    pinMode(_int, OUTPUT);
    digitalWrite(_int, HIGH); //高电平
    delay(1);
    digitalWrite(_int, LOW); //低电平
    delay(1);
  }

  // Reset Pin Configuration
  if (_rst != -1)
  {
    pinMode(_rst, OUTPUT);
    digitalWrite(_rst, LOW);
    delay(10);
    digitalWrite(_rst, HIGH);
    delay(300);
  }

  // Initialize Touch
  i2c_write(0xFE, 0XFF); //禁止自动进入低功耗模式。
}

bool CST816D::getTouch(uint16_t *x, uint16_t *y, uint8_t *gesture)
{
  bool FingerIndex = false;
  FingerIndex = (bool)i2c_read(0x02);

  *gesture = i2c_read(0x01);
  if (!(*gesture == SlideUp || *gesture == SlideDown))
  {
    *gesture = None;
  }

  uint8_t data[4];
  i2c_read_continuous(0x03, data, 4);
  *x = ((data[0] & 0x0f) << 8) | data[1];
  *y = ((data[2] & 0x0f) << 8) | data[3];

  //Flip X , if you x-axis is reversed,please uncomment the following code
  //*x=240-*x;

  return FingerIndex;
}

uint8_t CST816D::i2c_read(uint8_t addr)
{
  uint8_t rdData;
  uint8_t rdDataCount;
  do
  {
    Wire.beginTransmission(I2C_ADDR_CST816D);
    Wire.write(addr);
    Wire.endTransmission(false); // Restart
    rdDataCount = Wire.requestFrom(I2C_ADDR_CST816D, 1);
  } while (rdDataCount == 0);
  while (Wire.available())
  {
    rdData = Wire.read();
  }
  return rdData;
}

uint8_t CST816D::i2c_read_continuous(uint8_t addr, uint8_t *data, uint32_t length)
{
  Wire.beginTransmission(I2C_ADDR_CST816D);
  Wire.write(addr);
  if ( Wire.endTransmission(true))return -1;
  Wire.requestFrom(I2C_ADDR_CST816D, length);
  for (int i = 0; i < length; i++) {
    *data++ = Wire.read();
  }
  return 0;
}

void CST816D::i2c_write(uint8_t addr, uint8_t data)
{
  Wire.beginTransmission(I2C_ADDR_CST816D);
  Wire.write(addr);
  Wire.write(data);
  Wire.endTransmission();
}

uint8_t CST816D::i2c_write_continuous(uint8_t addr, const uint8_t *data, uint32_t length)
{
  Wire.beginTransmission(I2C_ADDR_CST816D);
  Wire.write(addr);
  for (int i = 0; i < length; i++) {
    Wire.write(*data++);
  }
  if ( Wire.endTransmission(true))return -1;
  return 0;
}
