SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
TouchDrvCST3530.cpp
Go to the documentation of this file.
1
29#include "../SensorBuildOpt.h"
30#if !SENSORLIB_EXCLUDE_TOUCH_CST3530
31
32#include "TouchDrvCST3530.hpp"
33
34uint16_t TouchDrvCST3530::check_sum_16(int val, uint8_t *buf, uint16_t len)
35{
36 uint16_t sum = val;
37 while (len--) sum += *buf++;
38 return sum;
39}
40
42{
43 uint8_t numPoints = 0;
44 uint8_t keyNumber = 0;
45 uint8_t read_buffer[MAX_READ_BYTES] = {0};
46
47 // Clear cached touch points
49
50 // If read command fails, return zero points
51 if (!writeCommand(READ_COMMAND, read_buffer, sizeof(read_buffer))) {
52 writeCommand(CLEAR_COMMAND);
53 return _touchPoints;
54 }
55 // If status is not 0xFF, clear points
56 if (read_buffer[2] != 0xFF) {
57 writeCommand(CLEAR_COMMAND);
58 return _touchPoints;
59 }
60
61 numPoints = read_buffer[3] & 0x0F; // Get number of touch points (lower 4 bits)
62 keyNumber = (read_buffer[3] & 0xF0) >> 4; // Get key number (upper 4 bits)
63
64 if (numPoints == 0 || numPoints > MAX_FINGER_NUM) {
65 writeCommand(CLEAR_COMMAND);
66 return _touchPoints;
67 }
68
69 for (uint8_t i = 0; i < numPoints; i++) {
70 uint16_t idx = (keyNumber + i) * 5;
71 if (idx + 8 >= MAX_READ_BYTES) {
72 break;
73 }
74 const uint8_t pos_id = read_buffer[idx + 8] & 0x0F;
75 const uint8_t event = read_buffer[idx + 8] >> 4;
76 const uint16_t pos_x = read_buffer[idx + 4] + ((uint16_t)(read_buffer[idx + 7] & 0x0F) << 8);
77 const uint16_t pos_y = read_buffer[idx + 5] + ((uint16_t)(read_buffer[idx + 7] & 0xF0) << 4);
78 const uint8_t pressure = read_buffer[idx + 6];
79
80 if (check_sum_16(0x55, &read_buffer[4], (keyNumber + numPoints) * 5) != (read_buffer[0] | read_buffer[1] << 8)) {
81 writeCommand(CLEAR_COMMAND);
82 return _touchPoints;
83 }
84 if (event != 0x00) {
85 _touchPoints.addPoint(pos_x, pos_y, pressure, pos_id, event);
86 }
87 }
88 // Clear cached touch points
89 writeCommand(CLEAR_COMMAND);
90 // Swap XY or mirroring coordinates,if set
92 return _touchPoints;
93}
94
96{
97 return "CST3530";
98}
99
101{
102 writeCommand(0xD0000400);
103 hal->delay(1);
104 writeCommand(0xD0000400);
105 writeCommand(SLEEP_COMMAND);
106}
107
109{
110 reset();
111 writeCommand(0xD0000400);
112 hal->delay(1);
113 writeCommand(0xD0000400);
114 writeCommand(0xD0000000);
115 writeCommand(0xD0000C00);
116 writeCommand(0xD0000100);
117}
118
119bool TouchDrvCST3530::initImpl(uint8_t)
120{
121 int retry = 5;
122 uint8_t buffer[50];
123 while (retry--) {
124 if (writeCommand(INFO_COMMAND, buffer, sizeof(buffer))) {
125 if (buffer[2] == 0xCA && buffer[3] == 0xCA) {
127 _touchConfig.resolutionY = (buffer[31] << 8) | buffer[30];
128 _touchConfig.resolutionX = (buffer[29] << 8) | buffer[28];
129 _chipID = buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
130 SENSORLIB_LOG_D("Model:CST3530");
131 SENSORLIB_LOG_D("RST Pin:%d", _pinsCfg.rstPin);
132 SENSORLIB_LOG_D("IRQ Pin:%d", _pinsCfg.irqPin);
133 SENSORLIB_LOG_D("Tx Channel:%d", buffer[48]);
134 SENSORLIB_LOG_D("Rx Channel:%d", buffer[49]);
135 SENSORLIB_LOG_D("Key Number:%d", buffer[27]);
137 SENSORLIB_LOG_D("Project ID:%04X", buffer[39] << 24 | buffer[38] << 16 | buffer[37] << 8 | buffer[36]);
138 SENSORLIB_LOG_D("Chip Type:%04" PRIX32, _chipID);
139 SENSORLIB_LOG_D("Firmware Version:%04X", buffer[35] << 24 | buffer[34] << 16 | buffer[33] << 8 | buffer[32]);
140 return true;
141 }
142 }
143 hal->delay(10);
144 }
145 return false;
146}
147
148
149#endif
#define SENSORLIB_LOG_D(...)
@license MIT License
SensorPressure pressure(bhy)
std::unique_ptr< SensorHal > hal
static constexpr uint32_t SLEEP_COMMAND
static constexpr uint8_t MAX_FINGER_NUM
void wakeup() override
Wake up the touch driver.
static constexpr uint8_t MAX_READ_BYTES
const char * getModelName() override
Get the model name.
static constexpr uint32_t INFO_COMMAND
const TouchPoints & getTouchPoints() override
Get the touch points.
static constexpr uint32_t READ_COMMAND
static constexpr uint32_t CLEAR_COMMAND
void sleep() override
Puts the touch driver to sleep.
uint32_t _chipID
Chip identification value.
TouchConfig _touchConfig
Configuration for coordinate transformations.
virtual void reset()
Reset the touch controller.
virtual void updateXY(TouchPoints &points) const
Apply coordinate transformations (swap, scale, mirror) to all touch points.
TouchPinsCfg _pinsCfg
Configuration for reset and interrupt pins.
TouchPoints _touchPoints
Touch points data.
uint8_t _maxTouchPoints
Maximum supported touch points.
Container for touch point data and optional gesture information.
bool addPoint(uint16_t x, uint16_t y, uint16_t pressure=0, uint8_t id=0, uint8_t event=0)
Adds a touch point to the container.
void clear()
Clears all stored touch points and gesture.
uint8_t i
char buf[64]