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/FirmwareUpdate.cpp
 | 
			
		||||
  DisplayApp/Screens/Music.cpp
 | 
			
		||||
  DisplayApp/Screens/FirmwareValidation.cpp
 | 
			
		||||
  main.cpp
 | 
			
		||||
  drivers/St7789.cpp
 | 
			
		||||
  drivers/SpiNorFlash.cpp
 | 
			
		||||
@ -358,6 +359,7 @@ list(APPEND SOURCE_FILES
 | 
			
		||||
  Components/Ble/CurrentTimeService.cpp
 | 
			
		||||
  Components/Ble/AlertNotificationService.cpp
 | 
			
		||||
  Components/Ble/MusicService.cpp
 | 
			
		||||
  Components/FirmwareValidator/FirmwareValidator.cpp
 | 
			
		||||
  drivers/Cst816s.cpp
 | 
			
		||||
  FreeRTOS/port.c
 | 
			
		||||
  FreeRTOS/port_cmsis_systick.c
 | 
			
		||||
@ -415,6 +417,7 @@ set(INCLUDE_FILES
 | 
			
		||||
  DisplayApp/Screens/ScreenList.h
 | 
			
		||||
  DisplayApp/Screens/Label.h
 | 
			
		||||
  DisplayApp/Screens/FirmwareUpdate.h
 | 
			
		||||
  DisplayApp/Screens/FirmwareValidation.h
 | 
			
		||||
  drivers/St7789.h
 | 
			
		||||
  drivers/SpiNorFlash.h
 | 
			
		||||
  drivers/SpiMaster.h
 | 
			
		||||
@ -432,7 +435,8 @@ set(INCLUDE_FILES
 | 
			
		||||
  Components/Ble/CurrentTimeClient.h
 | 
			
		||||
  Components/Ble/AlertNotificationClient.h
 | 
			
		||||
  Components/Ble/DfuService.h
 | 
			
		||||
    drivers/Cst816s.h
 | 
			
		||||
  Components/FirmwareValidator/FirmwareValidator.h
 | 
			
		||||
  drivers/Cst816s.h
 | 
			
		||||
  FreeRTOS/portmacro.h
 | 
			
		||||
  FreeRTOS/portmacro_cmsis.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 <Components/Ble/NotificationManager.h>
 | 
			
		||||
#include <DisplayApp/Screens/FirmwareUpdate.h>
 | 
			
		||||
#include <DisplayApp/Screens/FirmwareValidation.h>
 | 
			
		||||
#include "../SystemTask/SystemTask.h"
 | 
			
		||||
 | 
			
		||||
using namespace Pinetime::Applications;
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,7 @@
 | 
			
		||||
#include <drivers/Watchdog.h>
 | 
			
		||||
#include <DisplayApp/Screens/Modal.h>
 | 
			
		||||
#include <Components/Ble/NotificationManager.h>
 | 
			
		||||
#include <Components/FirmwareValidator/FirmwareValidator.h>
 | 
			
		||||
#include "TouchEvents.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -80,6 +81,7 @@ namespace Pinetime {
 | 
			
		||||
        Controllers::BrightnessController brightnessController;
 | 
			
		||||
        std::unique_ptr<Screens::Modal> modal;
 | 
			
		||||
        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();
 | 
			
		||||
  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.StartAdvertising();
 | 
			
		||||
  lcd.Init();
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user