diff options
| author | Jean-François Milants <jf@codingfield.com> | 2021-04-09 18:47:24 (GMT) |
|---|---|---|
| committer | Jean-François Milants <jf@codingfield.com> | 2021-04-09 18:47:24 (GMT) |
| commit | 63584b6561cbc31095354b06e356f700dcf0e32b (patch) | |
| tree | b8ee17d8bfdc57c3b80b7c918f3431d198939856 /src/components/settings/Settings.cpp | |
| parent | 3934e9bef20c5c2ad393e20cfff3a5a1b0d24569 (diff) | |
| parent | 9096d1db4c6be9f4a2cc8af99a994c219f25108c (diff) | |
Merge branch 'develop' into notification-title
# Conflicts:
# src/displayapp/screens/Notifications.cpp
Diffstat (limited to 'src/components/settings/Settings.cpp')
| -rw-r--r-- | src/components/settings/Settings.cpp | 110 |
1 files changed, 104 insertions, 6 deletions
diff --git a/src/components/settings/Settings.cpp b/src/components/settings/Settings.cpp index 0c6cf61..454df57 100644 --- a/src/components/settings/Settings.cpp +++ b/src/components/settings/Settings.cpp @@ -1,16 +1,114 @@ #include "Settings.h" +#include <cstdlib> +#include <cstring> using namespace Pinetime::Controllers; +struct SettingsHeader { + uint8_t isActive; // 0xF1 = Block is active, 0xF0 = Block is inactive + uint16_t version; // Current version, to verify if the saved data is for the current Version +}; + +#define HEADER_SIZE sizeof(SettingsHeader) + + +Settings::Settings( Pinetime::Drivers::SpiNorFlash &spiNorFlash ) : spiNorFlash{spiNorFlash} {} -// TODO (team): -// Read and write the settings to Flash -// void Settings::Init() { - // default Clock face - clockFace = 0; - clockType = ClockType::H24; + // Load default settings from Flash + LoadSettingsFromFlash(); + +} + +void Settings::SaveSettings() { + + // verify if is necessary to save + if ( settingsChanged ) { + SaveSettingsToFlash(); + } + settingsChanged = false; +} + + +bool Settings::FindHeader() { + SettingsHeader settingsHeader; + uint8_t bufferHead[sizeof(settingsHeader)]; + + for (uint8_t block = 0; block < 10; block++) { + + spiNorFlash.Read( settingsBaseAddr + (block * 0x1000), bufferHead, sizeof(settingsHeader) ); + std::memcpy(&settingsHeader, bufferHead, sizeof(settingsHeader)); + if ( settingsHeader.isActive == 0xF1 && settingsHeader.version == settingsVersion ) { + settingsFlashBlock = block; + return true; + } + } + return false; +} + +void Settings::ReadSettingsData() { + uint8_t bufferSettings[sizeof(settings)]; + spiNorFlash.Read( settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings) ); + std::memcpy(&settings, bufferSettings, sizeof(settings)); +} + +void Settings::EraseBlock() { + spiNorFlash.SectorErase(settingsBaseAddr + (settingsFlashBlock * 0x1000)); } +void Settings::SetHeader( bool state ) { + SettingsHeader settingsHeader; + uint8_t bufferHead[sizeof(settingsHeader)]; + settingsHeader.isActive = state ? 0xF1 : 0xF0; + settingsHeader.version = settingsVersion; + + std::memcpy(bufferHead, &settingsHeader, sizeof(settingsHeader)); + spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000), bufferHead, sizeof(settingsHeader)); + +} + +void Settings::SaveSettingsData() { + uint8_t bufferSettings[sizeof(settings)]; + std::memcpy(bufferSettings, &settings, sizeof(settings)); + spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings)); +} + +void Settings::LoadSettingsFromFlash() { + + if ( settingsFlashBlock == 99 ) { + // Find current Block, if can't find use default settings and set block to 0 ans save ! + if ( FindHeader() ) { + ReadSettingsData(); + } else { + SaveSettingsToFlash(); + } + } else { + // Read Settings from flash... + // never used :) + ReadSettingsData(); + } + +} + +void Settings::SaveSettingsToFlash() { + + // calculate where to save... + // mark current to inactive + // erase the new location and save + // set settingsFlashBlock + + // if first time hever, only saves to block 0 and set settingsFlashBlock + + if ( settingsFlashBlock != 99 ) { + SetHeader( false ); + } + + settingsFlashBlock++; + if ( settingsFlashBlock > 9 ) settingsFlashBlock = 0; + + EraseBlock(); + SetHeader( true ); + SaveSettingsData(); +} |
