158 lines
4.3 KiB
C++
158 lines
4.3 KiB
C++
#include "Touch_CST820.h"
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// I2C读写
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool I2C_Read_Touch(uint8_t Driver_addr, uint8_t Reg_addr, uint8_t *Reg_data, uint32_t Length)
|
|
{
|
|
Wire.beginTransmission(Driver_addr);
|
|
Wire.write(Reg_addr);
|
|
if ( Wire.endTransmission(true)){
|
|
printf("The I2C transmission fails. - I2C Read\r\n");
|
|
return -1;
|
|
}
|
|
Wire.requestFrom(Driver_addr, Length);
|
|
for (int i = 0; i < Length; i++) {
|
|
*Reg_data++ = Wire.read();
|
|
}
|
|
return 0;
|
|
}
|
|
bool I2C_Write_Touch(uint8_t Driver_addr, uint8_t Reg_addr, const uint8_t *Reg_data, uint32_t Length)
|
|
{
|
|
Wire.beginTransmission(Driver_addr);
|
|
Wire.write(Reg_addr);
|
|
for (int i = 0; i < Length; i++) {
|
|
Wire.write(*Reg_data++);
|
|
}
|
|
if ( Wire.endTransmission(true))
|
|
{
|
|
printf("The I2C transmission fails. - I2C Write\r\n");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
struct CST820_Touch touch_data = {0};
|
|
uint8_t Touch_Init(void) {
|
|
pinMode(CST820_INT_PIN, INPUT_PULLUP);
|
|
CST820_Touch_Reset();
|
|
CST820_AutoSleep(false);
|
|
uint16_t Verification = CST820_Read_cfg();
|
|
|
|
// attachInterrupt(CST820_INT_PIN, Touch_CST820_ISR, interrupt);
|
|
|
|
return true;
|
|
}
|
|
/* Reset controller */
|
|
uint8_t CST820_Touch_Reset(void)
|
|
{
|
|
Set_EXIO(EXIO_PIN2,Low);
|
|
vTaskDelay(pdMS_TO_TICKS(10));
|
|
Set_EXIO(EXIO_PIN2,High);
|
|
vTaskDelay(pdMS_TO_TICKS(50));
|
|
return true;
|
|
}
|
|
uint16_t CST820_Read_cfg(void) {
|
|
|
|
uint8_t buf[3]={0};
|
|
I2C_Read_Touch(CST820_ADDR, CST820_REG_Version,buf, 1);
|
|
printf("TouchPad_Version:0x%02x\r\n", buf[0]);
|
|
I2C_Read_Touch(CST820_ADDR, CST820_REG_ChipID, buf, 3);
|
|
printf("ChipID:0x%02x ProjID:0x%02x FwVersion:0x%02x \r\n",buf[0], buf[1], buf[2]);
|
|
|
|
return true;
|
|
}
|
|
/*!
|
|
@brief Fall asleep automatically
|
|
*/
|
|
void CST820_AutoSleep(bool Sleep_State) {
|
|
CST820_Touch_Reset();
|
|
uint8_t Sleep_State_Set = 0;
|
|
if(Sleep_State)
|
|
Sleep_State_Set = 0;
|
|
else
|
|
Sleep_State_Set = 0xFF;
|
|
I2C_Write_Touch(CST820_ADDR, CST820_REG_DisAutoSleep, &Sleep_State_Set, 1);
|
|
}
|
|
|
|
// reads sensor and touches
|
|
// updates Touch Points
|
|
uint8_t Touch_Read_Data(void) {
|
|
uint8_t buf[6];
|
|
uint8_t touchpad_cnt = 0;
|
|
I2C_Read_Touch(CST820_ADDR, CST820_REG_GestureID, buf, 6);
|
|
/* touched gesture */
|
|
if (buf[0] != 0x00)
|
|
touch_data.gesture = (GESTURE)buf[0];
|
|
if (buf[1] != 0x00) {
|
|
|
|
noInterrupts();
|
|
/* Number of touched points */
|
|
touch_data.points = (uint8_t)buf[1];
|
|
if(touch_data.points > CST820_LCD_TOUCH_MAX_POINTS)
|
|
touch_data.points = CST820_LCD_TOUCH_MAX_POINTS;
|
|
/* Fill coordinates */
|
|
touch_data.x = ((buf[2] & 0x0F) << 8) + buf[3];
|
|
touch_data.y = ((buf[4] & 0x0F) << 8) + buf[5];
|
|
|
|
interrupts();
|
|
// printf(" points=%d \r\n",touch_data.points);
|
|
}
|
|
return true;
|
|
}
|
|
void example_touchpad_read(void){
|
|
Touch_Read_Data();
|
|
if (touch_data.gesture != NONE || touch_data.points != 0x00) {
|
|
// printf("Touch : X=%u Y=%u points=%d\r\n", touch_data.x , touch_data.y,touch_data.points);
|
|
} else {
|
|
// data->state = LV_INDEV_STATE_REL;
|
|
}
|
|
}
|
|
void Touch_Loop(void){
|
|
if(Touch_interrupts){
|
|
Touch_interrupts = false;
|
|
example_touchpad_read();
|
|
}
|
|
}
|
|
|
|
/*!
|
|
@brief handle interrupts
|
|
*/
|
|
uint8_t Touch_interrupts;
|
|
void IRAM_ATTR Touch_CST820_ISR(void) {
|
|
Touch_interrupts = true;
|
|
}
|
|
|
|
/*!
|
|
@brief get the gesture event name
|
|
*/
|
|
String Touch_GestureName(void) {
|
|
switch (touch_data.gesture) {
|
|
case NONE:
|
|
return "NONE";
|
|
break;
|
|
case SWIPE_DOWN:
|
|
return "SWIPE DOWN";
|
|
break;
|
|
case SWIPE_UP:
|
|
return "SWIPE UP";
|
|
break;
|
|
case SWIPE_LEFT:
|
|
return "SWIPE LEFT";
|
|
break;
|
|
case SWIPE_RIGHT:
|
|
return "SWIPE RIGHT";
|
|
break;
|
|
case SINGLE_CLICK:
|
|
return "SINGLE CLICK";
|
|
break;
|
|
case DOUBLE_CLICK:
|
|
return "DOUBLE CLICK";
|
|
break;
|
|
case LONG_PRESS:
|
|
return "LONG PRESS";
|
|
break;
|
|
default:
|
|
return "UNKNOWN";
|
|
break;
|
|
}
|
|
}
|