Add new screen that allows the user to manually validate the new firmware he's just OTA'ed.
Still need to find a way to display this screen when needed.
This commit is contained in:
parent
27fa273d83
commit
bbfc20c3ff
|
@ -337,6 +337,7 @@ list(APPEND SOURCE_FILES
|
||||||
DisplayApp/Screens/Label.cpp
|
DisplayApp/Screens/Label.cpp
|
||||||
DisplayApp/Screens/FirmwareUpdate.cpp
|
DisplayApp/Screens/FirmwareUpdate.cpp
|
||||||
DisplayApp/Screens/Music.cpp
|
DisplayApp/Screens/Music.cpp
|
||||||
|
DisplayApp/Screens/FirmwareValidation.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
drivers/St7789.cpp
|
drivers/St7789.cpp
|
||||||
drivers/SpiNorFlash.cpp
|
drivers/SpiNorFlash.cpp
|
||||||
|
@ -358,6 +359,7 @@ list(APPEND SOURCE_FILES
|
||||||
Components/Ble/CurrentTimeService.cpp
|
Components/Ble/CurrentTimeService.cpp
|
||||||
Components/Ble/AlertNotificationService.cpp
|
Components/Ble/AlertNotificationService.cpp
|
||||||
Components/Ble/MusicService.cpp
|
Components/Ble/MusicService.cpp
|
||||||
|
Components/FirmwareValidator/FirmwareValidator.cpp
|
||||||
drivers/Cst816s.cpp
|
drivers/Cst816s.cpp
|
||||||
FreeRTOS/port.c
|
FreeRTOS/port.c
|
||||||
FreeRTOS/port_cmsis_systick.c
|
FreeRTOS/port_cmsis_systick.c
|
||||||
|
@ -415,6 +417,7 @@ set(INCLUDE_FILES
|
||||||
DisplayApp/Screens/ScreenList.h
|
DisplayApp/Screens/ScreenList.h
|
||||||
DisplayApp/Screens/Label.h
|
DisplayApp/Screens/Label.h
|
||||||
DisplayApp/Screens/FirmwareUpdate.h
|
DisplayApp/Screens/FirmwareUpdate.h
|
||||||
|
DisplayApp/Screens/FirmwareValidation.h
|
||||||
drivers/St7789.h
|
drivers/St7789.h
|
||||||
drivers/SpiNorFlash.h
|
drivers/SpiNorFlash.h
|
||||||
drivers/SpiMaster.h
|
drivers/SpiMaster.h
|
||||||
|
@ -432,7 +435,8 @@ set(INCLUDE_FILES
|
||||||
Components/Ble/CurrentTimeClient.h
|
Components/Ble/CurrentTimeClient.h
|
||||||
Components/Ble/AlertNotificationClient.h
|
Components/Ble/AlertNotificationClient.h
|
||||||
Components/Ble/DfuService.h
|
Components/Ble/DfuService.h
|
||||||
drivers/Cst816s.h
|
Components/FirmwareValidator/FirmwareValidator.h
|
||||||
|
drivers/Cst816s.h
|
||||||
FreeRTOS/portmacro.h
|
FreeRTOS/portmacro.h
|
||||||
FreeRTOS/portmacro_cmsis.h
|
FreeRTOS/portmacro_cmsis.h
|
||||||
libs/date/includes/date/tz.h
|
libs/date/includes/date/tz.h
|
||||||
|
|
20
src/Components/FirmwareValidator/FirmwareValidator.cpp
Normal file
20
src/Components/FirmwareValidator/FirmwareValidator.cpp
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#include <drivers/InternalFlash.h>
|
||||||
|
#include <hal/nrf_rtc.h>
|
||||||
|
|
||||||
|
#include "FirmwareValidator.h"
|
||||||
|
|
||||||
|
using namespace Pinetime::Controllers;
|
||||||
|
|
||||||
|
bool FirmwareValidator::IsValidated() const {
|
||||||
|
auto* imageOkPtr = reinterpret_cast<uint32_t *>(validBitAdress);
|
||||||
|
return (*imageOkPtr) == validBitValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FirmwareValidator::Validate() {
|
||||||
|
if(!IsValidated())
|
||||||
|
Pinetime::Drivers::InternalFlash::WriteWord(validBitAdress, validBitValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FirmwareValidator::Reset() {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
18
src/Components/FirmwareValidator/FirmwareValidator.h
Normal file
18
src/Components/FirmwareValidator/FirmwareValidator.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace Pinetime {
|
||||||
|
namespace Controllers {
|
||||||
|
class FirmwareValidator {
|
||||||
|
public:
|
||||||
|
void Validate();
|
||||||
|
bool IsValidated() const;
|
||||||
|
|
||||||
|
void Reset();
|
||||||
|
private:
|
||||||
|
static constexpr uint32_t validBitAdress {0x7BFE8};
|
||||||
|
static constexpr uint32_t validBitValue {1};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@
|
||||||
#include <DisplayApp/Screens/Music.h>
|
#include <DisplayApp/Screens/Music.h>
|
||||||
#include <Components/Ble/NotificationManager.h>
|
#include <Components/Ble/NotificationManager.h>
|
||||||
#include <DisplayApp/Screens/FirmwareUpdate.h>
|
#include <DisplayApp/Screens/FirmwareUpdate.h>
|
||||||
|
#include <DisplayApp/Screens/FirmwareValidation.h>
|
||||||
#include "../SystemTask/SystemTask.h"
|
#include "../SystemTask/SystemTask.h"
|
||||||
|
|
||||||
using namespace Pinetime::Applications;
|
using namespace Pinetime::Applications;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <drivers/Watchdog.h>
|
#include <drivers/Watchdog.h>
|
||||||
#include <DisplayApp/Screens/Modal.h>
|
#include <DisplayApp/Screens/Modal.h>
|
||||||
#include <Components/Ble/NotificationManager.h>
|
#include <Components/Ble/NotificationManager.h>
|
||||||
|
#include <Components/FirmwareValidator/FirmwareValidator.h>
|
||||||
#include "TouchEvents.h"
|
#include "TouchEvents.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,6 +81,7 @@ namespace Pinetime {
|
||||||
Controllers::BrightnessController brightnessController;
|
Controllers::BrightnessController brightnessController;
|
||||||
std::unique_ptr<Screens::Modal> modal;
|
std::unique_ptr<Screens::Modal> modal;
|
||||||
Pinetime::Controllers::NotificationManager& notificationManager;
|
Pinetime::Controllers::NotificationManager& notificationManager;
|
||||||
|
Pinetime::Controllers::FirmwareValidator validator;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
91
src/DisplayApp/Screens/FirmwareValidation.cpp
Normal file
91
src/DisplayApp/Screens/FirmwareValidation.cpp
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#include <libs/lvgl/lvgl.h>
|
||||||
|
#include "FirmwareValidation.h"
|
||||||
|
#include "../DisplayApp.h"
|
||||||
|
#include "../../Version.h"
|
||||||
|
#include "../../Components/FirmwareValidator/FirmwareValidator.h"
|
||||||
|
|
||||||
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
extern lv_font_t jetbrains_mono_extrabold_compressed;
|
||||||
|
extern lv_font_t jetbrains_mono_bold_20;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
static void ButtonEventHandler(lv_obj_t * obj, lv_event_t event)
|
||||||
|
{
|
||||||
|
FirmwareValidation* screen = static_cast<FirmwareValidation *>(obj->user_data);
|
||||||
|
screen->OnButtonEvent(obj, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FirmwareValidation::FirmwareValidation(Pinetime::Applications::DisplayApp *app,
|
||||||
|
Pinetime::Controllers::FirmwareValidator &validator)
|
||||||
|
: Screen{app}, validator{validator} {
|
||||||
|
labelVersionInfo = lv_label_create(lv_scr_act(), NULL);
|
||||||
|
lv_obj_align(labelVersionInfo, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);
|
||||||
|
lv_label_set_text(labelVersionInfo, "Version : ");
|
||||||
|
lv_label_set_align(labelVersionInfo, LV_LABEL_ALIGN_LEFT);
|
||||||
|
|
||||||
|
|
||||||
|
labelVersionValue = lv_label_create(lv_scr_act(), NULL);
|
||||||
|
lv_obj_align(labelVersionValue, labelVersionInfo, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
|
||||||
|
lv_label_set_recolor(labelVersionValue, true);
|
||||||
|
sprintf(version, "%d.%d.%d", Version::Major(), Version::Minor(), Version::Patch());
|
||||||
|
lv_label_set_text(labelVersionValue, version);
|
||||||
|
|
||||||
|
labelIsValidated = lv_label_create(lv_scr_act(), NULL);
|
||||||
|
lv_obj_align(labelIsValidated, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 50);
|
||||||
|
lv_label_set_recolor(labelIsValidated, true);
|
||||||
|
lv_label_set_long_mode(labelIsValidated, LV_LABEL_LONG_BREAK);
|
||||||
|
lv_obj_set_width(labelIsValidated, 240);
|
||||||
|
|
||||||
|
if(validator.IsValidated())
|
||||||
|
lv_label_set_text(labelIsValidated, "You have already\n#00ff00 validated# this firmware#");
|
||||||
|
else {
|
||||||
|
lv_label_set_text(labelIsValidated,
|
||||||
|
"Please #00ff00 Validate# this version or\n#ff0000 Reset# to rollback to the previous version.");
|
||||||
|
|
||||||
|
buttonValidate = lv_btn_create(lv_scr_act(), NULL);
|
||||||
|
lv_obj_align(buttonValidate, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
||||||
|
buttonValidate->user_data = this;
|
||||||
|
lv_obj_set_event_cb(buttonValidate, ButtonEventHandler);
|
||||||
|
|
||||||
|
labelButtonValidate = lv_label_create(buttonValidate, NULL);
|
||||||
|
lv_label_set_recolor(labelButtonValidate, true);
|
||||||
|
lv_label_set_text(labelButtonValidate, "#00ff00 Validate#");
|
||||||
|
|
||||||
|
buttonReset = lv_btn_create(lv_scr_act(), NULL);
|
||||||
|
buttonReset->user_data = this;
|
||||||
|
lv_obj_align(buttonReset, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
|
||||||
|
lv_obj_set_event_cb(buttonReset, ButtonEventHandler);
|
||||||
|
|
||||||
|
labelButtonReset = lv_label_create(buttonReset, NULL);
|
||||||
|
lv_label_set_recolor(labelButtonReset, true);
|
||||||
|
lv_label_set_text(labelButtonReset, "#ff0000 Reset#");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FirmwareValidation::~FirmwareValidation() {
|
||||||
|
lv_obj_clean(lv_scr_act());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FirmwareValidation::Refresh() {
|
||||||
|
return running;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FirmwareValidation::OnButtonPushed() {
|
||||||
|
running = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FirmwareValidation::OnButtonEvent(lv_obj_t *object, lv_event_t event) {
|
||||||
|
if(object == buttonValidate && event == LV_EVENT_PRESSED) {
|
||||||
|
validator.Validate();
|
||||||
|
running = false;
|
||||||
|
} else if(object == buttonReset && event == LV_EVENT_PRESSED) {
|
||||||
|
validator.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
42
src/DisplayApp/Screens/FirmwareValidation.h
Normal file
42
src/DisplayApp/Screens/FirmwareValidation.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include "Screen.h"
|
||||||
|
#include <bits/unique_ptr.h>
|
||||||
|
#include <libs/lvgl/src/lv_core/lv_style.h>
|
||||||
|
#include <libs/lvgl/src/lv_core/lv_obj.h>
|
||||||
|
|
||||||
|
namespace Pinetime {
|
||||||
|
namespace Controllers {
|
||||||
|
class FirmwareValidator;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Applications {
|
||||||
|
namespace Screens {
|
||||||
|
|
||||||
|
class FirmwareValidation : public Screen{
|
||||||
|
public:
|
||||||
|
FirmwareValidation(DisplayApp* app, Pinetime::Controllers::FirmwareValidator& validator);
|
||||||
|
~FirmwareValidation() override;
|
||||||
|
|
||||||
|
bool Refresh() override;
|
||||||
|
bool OnButtonPushed() override;
|
||||||
|
|
||||||
|
void OnButtonEvent(lv_obj_t *object, lv_event_t event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Pinetime::Controllers::FirmwareValidator& validator;
|
||||||
|
|
||||||
|
lv_obj_t* labelVersionInfo;
|
||||||
|
lv_obj_t* labelVersionValue;
|
||||||
|
char version[9];
|
||||||
|
lv_obj_t* labelIsValidated;
|
||||||
|
lv_obj_t* buttonValidate;
|
||||||
|
lv_obj_t* labelButtonValidate;
|
||||||
|
lv_obj_t* buttonReset;
|
||||||
|
lv_obj_t* labelButtonReset;
|
||||||
|
bool running = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -58,14 +58,6 @@ void SystemTask::Work() {
|
||||||
|
|
||||||
spi.Init();
|
spi.Init();
|
||||||
spiNorFlash.Init();
|
spiNorFlash.Init();
|
||||||
|
|
||||||
// Write the 'image OK' flag if it's not already done
|
|
||||||
// TODO implement a better verification mecanism for the image (ask for user confirmation via UI/BLE ?)
|
|
||||||
uint32_t* imageOkPtr = reinterpret_cast<uint32_t *>(0x7BFE8);
|
|
||||||
uint32_t imageOk = *imageOkPtr;
|
|
||||||
if(imageOk != 1)
|
|
||||||
Pinetime::Drivers::InternalFlash::WriteWord(0x7BFE8, 1);
|
|
||||||
|
|
||||||
nimbleController.Init();
|
nimbleController.Init();
|
||||||
nimbleController.StartAdvertising();
|
nimbleController.StartAdvertising();
|
||||||
lcd.Init();
|
lcd.Init();
|
||||||
|
|
Loading…
Reference in a new issue