Merge remote-tracking branch 'upstream/develop' into pts-settings

This commit is contained in:
Kieran Cawthray 2021-11-15 19:38:29 +01:00
commit 5a0cf8e348
5 changed files with 68 additions and 24 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.10)
project(pinetime VERSION 1.6.0 LANGUAGES C CXX ASM) project(pinetime VERSION 1.7.0 LANGUAGES C CXX ASM)
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)

View File

@ -40,7 +40,9 @@ namespace Pinetime {
Controllers::AlarmController& alarmController; Controllers::AlarmController& alarmController;
lv_obj_t *time, *btnEnable, *txtEnable, *btnMinutesUp, *btnMinutesDown, *btnHoursUp, *btnHoursDown, *txtMinUp, *txtMinDown, lv_obj_t *time, *btnEnable, *txtEnable, *btnMinutesUp, *btnMinutesDown, *btnHoursUp, *btnHoursDown, *txtMinUp, *txtMinDown,
*txtHrUp, *txtHrDown, *btnRecur, *txtRecur, *btnMessage, *txtMessage, *btnInfo, *txtInfo; *txtHrUp, *txtHrDown, *btnRecur, *txtRecur, *btnInfo, *txtInfo;
lv_obj_t* txtMessage = nullptr;
lv_obj_t* btnMessage = nullptr;
enum class EnableButtonState { On, Off, Alerting }; enum class EnableButtonState { On, Off, Alerting };
void SetEnableButtonState(); void SetEnableButtonState();

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;

View File

@ -144,9 +144,15 @@ void SystemTask::Work() {
lcd.Init(); lcd.Init();
twiMaster.Init(); twiMaster.Init();
/*
* TODO We disable this warning message until we ensure it won't be displayed
* on legitimate PineTime equipped with a compatible touch controller.
* (some users reported false positive). See https://github.com/InfiniTimeOrg/InfiniTime/issues/763
if (!touchPanel.Init()) { if (!touchPanel.Init()) {
bootError = BootErrors::TouchController; bootError = BootErrors::TouchController;
} }
*/
touchPanel.Init();
dateTimeController.Register(this); dateTimeController.Register(this);
batteryController.Register(this); batteryController.Register(this);
motorController.Init(); motorController.Init();