Merge pull request #811 from InfiniTimeOrg/cst816-add-validity-check

Add data validity check and retries in CST816S driver
This commit is contained in:
JF 2021-11-08 21:59:25 +01:00 committed by GitHub
commit 755ab72495
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 22 deletions

View File

@ -32,6 +32,18 @@ bool Cst816S::Init() {
twiMaster.Read(twiAddress, 0xa7, &dummy, 1); twiMaster.Read(twiAddress, 0xa7, &dummy, 1);
vTaskDelay(5); vTaskDelay(5);
static constexpr uint8_t maxRetries = 3;
bool isDeviceOk;
uint8_t retries = 0;
do {
isDeviceOk = CheckDeviceIds();
retries++;
} while (!isDeviceOk && retries < maxRetries);
if (!isDeviceOk) {
return false;
}
/* /*
[2] EnConLR - Continuous operation can slide around [2] EnConLR - Continuous operation can slide around
[1] EnConUD - Slide up and down to enable continuous operation [1] EnConUD - Slide up and down to enable continuous operation
@ -50,21 +62,7 @@ bool Cst816S::Init() {
static constexpr uint8_t irqCtl = 0b01110000; static constexpr uint8_t irqCtl = 0b01110000;
twiMaster.Write(twiAddress, 0xFA, &irqCtl, 1); twiMaster.Write(twiAddress, 0xFA, &irqCtl, 1);
// There's mixed information about which register contains which information return true;
if (twiMaster.Read(twiAddress, 0xA7, &chipId, 1) == TwiMaster::ErrorCodes::TransactionFailed) {
chipId = 0xFF;
return false;
}
if (twiMaster.Read(twiAddress, 0xA8, &vendorId, 1) == TwiMaster::ErrorCodes::TransactionFailed) {
vendorId = 0xFF;
return false;
}
if (twiMaster.Read(twiAddress, 0xA9, &fwVersion, 1) == TwiMaster::ErrorCodes::TransactionFailed) {
fwVersion = 0xFF;
return false;
}
return chipId == 0xb4 && vendorId == 0 && fwVersion == 1;
} }
Cst816S::TouchInfos Cst816S::GetTouchInfo() { Cst816S::TouchInfos Cst816S::GetTouchInfo() {
@ -79,18 +77,33 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() {
// This can only be 0 or 1 // This can only be 0 or 1
uint8_t nbTouchPoints = touchData[touchPointNumIndex] & 0x0f; uint8_t nbTouchPoints = touchData[touchPointNumIndex] & 0x0f;
uint8_t xHigh = touchData[touchXHighIndex] & 0x0f; uint8_t xHigh = touchData[touchXHighIndex] & 0x0f;
uint8_t xLow = touchData[touchXLowIndex]; uint8_t xLow = touchData[touchXLowIndex];
info.x = (xHigh << 8) | xLow; uint16_t x = (xHigh << 8) | xLow;
uint8_t yHigh = touchData[touchYHighIndex] & 0x0f; uint8_t yHigh = touchData[touchYHighIndex] & 0x0f;
uint8_t yLow = touchData[touchYLowIndex]; uint8_t yLow = touchData[touchYLowIndex];
info.y = (yHigh << 8) | yLow; uint16_t y = (yHigh << 8) | yLow;
Gestures gesture = static_cast<Gestures>(touchData[gestureIndex]);
// Validity check
if(x >= maxX || y >= maxY ||
(gesture != Gestures::None &&
gesture != Gestures::SlideDown &&
gesture != Gestures::SlideUp &&
gesture != Gestures::SlideLeft &&
gesture != Gestures::SlideRight &&
gesture != Gestures::SingleTap &&
gesture != Gestures::DoubleTap &&
gesture != Gestures::LongPress)) {
info.isValid = false;
return info;
}
info.x = x;
info.y = y;
info.touching = (nbTouchPoints > 0); info.touching = (nbTouchPoints > 0);
info.gesture = static_cast<Gestures>(touchData[gestureIndex]); info.gesture = gesture;
info.isValid = true;
return info; return info;
} }
@ -108,3 +121,21 @@ void Cst816S::Wakeup() {
Init(); Init();
NRF_LOG_INFO("[TOUCHPANEL] Wakeup"); NRF_LOG_INFO("[TOUCHPANEL] Wakeup");
} }
bool Cst816S::CheckDeviceIds() {
// There's mixed information about which register contains which information
if (twiMaster.Read(twiAddress, 0xA7, &chipId, 1) == TwiMaster::ErrorCodes::TransactionFailed) {
chipId = 0xFF;
return false;
}
if (twiMaster.Read(twiAddress, 0xA8, &vendorId, 1) == TwiMaster::ErrorCodes::TransactionFailed) {
vendorId = 0xFF;
return false;
}
if (twiMaster.Read(twiAddress, 0xA9, &fwVersion, 1) == TwiMaster::ErrorCodes::TransactionFailed) {
fwVersion = 0xFF;
return false;
}
return chipId == 0xb4 && vendorId == 0 && fwVersion == 1;
}

View File

@ -21,7 +21,7 @@ namespace Pinetime {
uint16_t y = 0; uint16_t y = 0;
Gestures gesture = Gestures::None; Gestures gesture = Gestures::None;
bool touching = false; bool touching = false;
bool isValid = true; bool isValid = false;
}; };
Cst816S(TwiMaster& twiMaster, uint8_t twiAddress); Cst816S(TwiMaster& twiMaster, uint8_t twiAddress);
@ -45,6 +45,8 @@ namespace Pinetime {
return fwVersion; return fwVersion;
} }
private: private:
bool CheckDeviceIds();
// Unused/Unavailable commented out // Unused/Unavailable commented out
static constexpr uint8_t gestureIndex = 1; static constexpr uint8_t gestureIndex = 1;
static constexpr uint8_t touchPointNumIndex = 2; static constexpr uint8_t touchPointNumIndex = 2;
@ -58,6 +60,9 @@ namespace Pinetime {
//static constexpr uint8_t touchXYIndex = 7; //static constexpr uint8_t touchXYIndex = 7;
//static constexpr uint8_t touchMiscIndex = 8; //static constexpr uint8_t touchMiscIndex = 8;
static constexpr uint8_t maxX = 240;
static constexpr uint8_t maxY = 240;
TwiMaster& twiMaster; TwiMaster& twiMaster;
uint8_t twiAddress; uint8_t twiAddress;