summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/BootErrors.h10
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/displayapp/Apps.h3
-rw-r--r--src/displayapp/DisplayApp.cpp17
-rw-r--r--src/displayapp/DisplayApp.h5
-rw-r--r--src/displayapp/screens/Error.cpp54
-rw-r--r--src/displayapp/screens/Error.h22
-rw-r--r--src/drivers/Cst816s.cpp7
-rw-r--r--src/drivers/Cst816s.h2
-rw-r--r--src/systemtask/SystemTask.cpp9
10 files changed, 121 insertions, 9 deletions
diff --git a/src/BootErrors.h b/src/BootErrors.h
new file mode 100644
index 00000000..d00418cc
--- /dev/null
+++ b/src/BootErrors.h
@@ -0,0 +1,10 @@
+#pragma once
+
+namespace Pinetime {
+ namespace System {
+ enum class BootErrors {
+ None,
+ TouchController,
+ };
+ }
+}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 40e1f2a5..0d41a244 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -418,6 +418,7 @@ list(APPEND SOURCE_FILES
displayapp/screens/BatteryInfo.cpp
displayapp/screens/Steps.cpp
displayapp/screens/Timer.cpp
+ displayapp/screens/Error.cpp
## Settings
displayapp/screens/settings/QuickSettings.cpp
diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h
index 684e3a46..0b102100 100644
--- a/src/displayapp/Apps.h
+++ b/src/displayapp/Apps.h
@@ -30,7 +30,8 @@ namespace Pinetime {
SettingTimeFormat,
SettingDisplay,
SettingWakeUp,
- SettingSteps
+ SettingSteps,
+ Error,
};
}
}
diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index 7fe69397..41fa7d80 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -28,6 +28,7 @@
#include "displayapp/screens/FlashLight.h"
#include "displayapp/screens/BatteryInfo.h"
#include "displayapp/screens/Steps.h"
+#include "displayapp/screens/Error.h"
#include "drivers/Cst816s.h"
#include "drivers/St7789.h"
@@ -107,11 +108,16 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
timerController {timerController} {
}
-void DisplayApp::Start() {
+void DisplayApp::Start(System::BootErrors error) {
msgQueue = xQueueCreate(queueSize, itemSize);
- // Start clock when smartwatch boots
- LoadApp(Apps::Clock, DisplayApp::FullRefreshDirections::None);
+ bootError = error;
+
+ if (error == System::BootErrors::TouchController) {
+ LoadApp(Apps::Error, DisplayApp::FullRefreshDirections::None);
+ } else {
+ LoadApp(Apps::Clock, DisplayApp::FullRefreshDirections::None);
+ }
if (pdPASS != xTaskCreate(DisplayApp::Process, "displayapp", 800, this, 0, &taskHandle)) {
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
@@ -325,6 +331,11 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
motionController);
break;
+ case Apps::Error:
+ currentScreen = std::make_unique<Screens::Error>(this, bootError);
+ ReturnApp(Apps::Clock, FullRefreshDirections::Down, TouchEvents::None);
+ break;
+
case Apps::FirmwareValidation:
currentScreen = std::make_unique<Screens::FirmwareValidation>(this, validator);
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h
index 574be63f..ba119133 100644
--- a/src/displayapp/DisplayApp.h
+++ b/src/displayapp/DisplayApp.h
@@ -15,6 +15,7 @@
#include "displayapp/screens/Screen.h"
#include "components/timer/TimerController.h"
#include "Messages.h"
+#include "BootErrors.h"
namespace Pinetime {
@@ -56,7 +57,7 @@ namespace Pinetime {
Pinetime::Controllers::MotorController& motorController,
Pinetime::Controllers::MotionController& motionController,
Pinetime::Controllers::TimerController& timerController);
- void Start();
+ void Start(System::BootErrors error);
void PushMessage(Display::Messages msg);
void StartApp(Apps app, DisplayApp::FullRefreshDirections direction);
@@ -114,6 +115,8 @@ namespace Pinetime {
Apps nextApp = Apps::None;
DisplayApp::FullRefreshDirections nextDirection;
TickType_t lastWakeTime;
+
+ System::BootErrors bootError;
};
}
}
diff --git a/src/displayapp/screens/Error.cpp b/src/displayapp/screens/Error.cpp
new file mode 100644
index 00000000..7ad52ade
--- /dev/null
+++ b/src/displayapp/screens/Error.cpp
@@ -0,0 +1,54 @@
+#include "Error.h"
+
+using namespace Pinetime::Applications::Screens;
+
+namespace {
+ void ButtonEventCallback(lv_obj_t* obj, lv_event_t /*event*/) {
+ auto* errorScreen = static_cast<Error*>(obj->user_data);
+ errorScreen->ButtonEventHandler();
+ }
+}
+
+Error::Error(Pinetime::Applications::DisplayApp* app, System::BootErrors error)
+ : Screen(app) {
+
+ lv_obj_t* warningLabel = lv_label_create(lv_scr_act(), nullptr);
+ lv_obj_set_style_local_text_color(warningLabel, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
+ lv_label_set_text_static(warningLabel, "Warning");
+ lv_obj_align(warningLabel, nullptr, LV_ALIGN_IN_TOP_MID, 0, 0);
+
+ lv_obj_t* causeLabel = lv_label_create(lv_scr_act(), nullptr);
+ lv_label_set_long_mode(causeLabel, LV_LABEL_LONG_BREAK);
+ lv_obj_set_width(causeLabel, LV_HOR_RES);
+ lv_obj_align(causeLabel, warningLabel, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);
+
+ if (error == System::BootErrors::TouchController) {
+ lv_label_set_text_static(causeLabel, "Touch controller error detected.");
+ }
+
+ lv_obj_t* tipLabel = lv_label_create(lv_scr_act(), nullptr);
+ lv_label_set_long_mode(tipLabel, LV_LABEL_LONG_BREAK);
+ lv_obj_set_width(tipLabel, LV_HOR_RES);
+ lv_label_set_text_static(tipLabel, "If you encounter problems and your device is under warranty, contact the devices seller.");
+ lv_obj_align(tipLabel, causeLabel, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);
+
+ btnOk = lv_btn_create(lv_scr_act(), nullptr);
+ btnOk->user_data = this;
+ lv_obj_set_event_cb(btnOk, ButtonEventCallback);
+ lv_obj_set_size(btnOk, LV_HOR_RES, 50);
+ lv_obj_align(btnOk, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+ lv_obj_set_style_local_value_str(btnOk, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Proceed");
+ lv_obj_set_style_local_bg_color(btnOk, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
+}
+
+void Error::ButtonEventHandler() {
+ running = false;
+}
+
+Error::~Error() {
+ lv_obj_clean(lv_scr_act());
+}
+
+bool Error::Refresh() {
+ return running;
+}
diff --git a/src/displayapp/screens/Error.h b/src/displayapp/screens/Error.h
new file mode 100644
index 00000000..58016d82
--- /dev/null
+++ b/src/displayapp/screens/Error.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "Screen.h"
+#include "BootErrors.h"
+#include <lvgl/lvgl.h>
+
+namespace Pinetime {
+ namespace Applications {
+ namespace Screens {
+ class Error : public Screen {
+ public:
+ Error(DisplayApp* app, System::BootErrors error);
+ ~Error() override;
+
+ bool Refresh() override;
+ void ButtonEventHandler();
+ private:
+ lv_obj_t* btnOk;
+ };
+ }
+ }
+}
diff --git a/src/drivers/Cst816s.cpp b/src/drivers/Cst816s.cpp
index 2a6809b1..3db712e6 100644
--- a/src/drivers/Cst816s.cpp
+++ b/src/drivers/Cst816s.cpp
@@ -17,7 +17,7 @@ using namespace Pinetime::Drivers;
Cst816S::Cst816S(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, twiAddress {twiAddress} {
}
-void Cst816S::Init() {
+bool Cst816S::Init() {
nrf_gpio_cfg_output(pinReset);
nrf_gpio_pin_set(pinReset);
vTaskDelay(50);
@@ -44,13 +44,18 @@ void Cst816S::Init() {
// 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;
}
Cst816S::TouchInfos Cst816S::GetTouchInfo() {
diff --git a/src/drivers/Cst816s.h b/src/drivers/Cst816s.h
index 394cc40f..5b2e4e46 100644
--- a/src/drivers/Cst816s.h
+++ b/src/drivers/Cst816s.h
@@ -31,7 +31,7 @@ namespace Pinetime {
Cst816S(Cst816S&&) = delete;
Cst816S& operator=(Cst816S&&) = delete;
- void Init();
+ bool Init();
TouchInfos GetTouchInfo();
void Sleep();
void Wakeup();
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 500bc8b8..718e6ccd 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -22,6 +22,7 @@
#include "drivers/TwiMaster.h"
#include "drivers/Hrs3300.h"
#include "main.h"
+#include "BootErrors.h"
#include <memory>
@@ -106,6 +107,8 @@ void SystemTask::Process(void* instance) {
}
void SystemTask::Work() {
+ BootErrors bootError = BootErrors::None;
+
watchdog.Setup(7);
watchdog.Start();
NRF_LOG_INFO("Last reset reason : %s", Pinetime::Drivers::Watchdog::ResetReasonToString(watchdog.ResetReason()));
@@ -124,7 +127,9 @@ void SystemTask::Work() {
lcd.Init();
twiMaster.Init();
- touchPanel.Init();
+ if (!touchPanel.Init()) {
+ bootError = BootErrors::TouchController;
+ }
dateTimeController.Register(this);
batteryController.Init();
motorController.Init();
@@ -141,7 +146,7 @@ void SystemTask::Work() {
settingsController.Init();
displayApp.Register(this);
- displayApp.Start();
+ displayApp.Start(bootError);
displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);