From 8b7f2a14b65f1c85d9b97682e76691332505db15 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Sun, 10 Apr 2022 16:57:24 +0200 Subject: [PATCH] Added configuration handling --- include/Configuration.h | 22 +++++++++++++++++ src/Configuration.cpp | 53 +++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 21 ++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 include/Configuration.h create mode 100644 src/Configuration.cpp diff --git a/include/Configuration.h b/include/Configuration.h new file mode 100644 index 0000000..e3dd74f --- /dev/null +++ b/include/Configuration.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#define CONFIG_FILENAME "/config.bin" +#define CONFIG_VERSION 0x00010000 // 0.1.0 + +struct CONFIG_T { + uint32_t Cfg_Version; + uint Cfg_SaveCount; +}; + +class ConfigurationClass { +public: + void init(); + bool read(); + bool write(); + void migrate(); + CONFIG_T& get(); +}; + +extern ConfigurationClass Configuration; \ No newline at end of file diff --git a/src/Configuration.cpp b/src/Configuration.cpp new file mode 100644 index 0000000..1efbf8d --- /dev/null +++ b/src/Configuration.cpp @@ -0,0 +1,53 @@ +#include "Configuration.h" +#include + +CONFIG_T config; + +void ConfigurationClass::init() +{ + memset(&config, 0x0, sizeof(config)); + config.Cfg_SaveCount = 0; + config.Cfg_Version = CONFIG_VERSION; +} + +bool ConfigurationClass::write() +{ + File f = LITTLEFS.open(CONFIG_FILENAME, "w"); + if (!f) { + return false; + } + config.Cfg_SaveCount++; + uint8_t* bytes = (uint8_t*)&config; + for (unsigned int i = 0; i < sizeof(CONFIG_T); i++) { + f.write(bytes[i]); + } + f.close(); + return true; +} + +bool ConfigurationClass::read() +{ + File f = LITTLEFS.open(CONFIG_FILENAME, "r"); + if (!f) { + return false; + } + uint8_t* bytes = (uint8_t*)&config; + for (unsigned int i = 0; i < sizeof(CONFIG_T); i++) { + bytes[i] = f.read(); + } + f.close(); + return true; +} + +void ConfigurationClass::migrate() +{ + config.Cfg_Version = CONFIG_VERSION; + write(); +} + +CONFIG_T& ConfigurationClass::get() +{ + return config; +} + +ConfigurationClass Configuration; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3ed2e11..754cd77 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,3 +1,4 @@ +#include "Configuration.h" #include "defaults.h" #include #include @@ -18,6 +19,26 @@ void setup() } else { Serial.println(F("done")); } + + // Read configuration values + Serial.print(F("Reading configuration... ")); + if (!Configuration.read()) { + Serial.print(F("initializing... ")); + Configuration.init(); + if (Configuration.write()) { + Serial.print(F("written... ")); + } else { + Serial.print(F("failed... ")); + } + } + if (Configuration.get().Cfg_Version != CONFIG_VERSION) { + Serial.print(F("migrated... ")); + Configuration.migrate(); + } + Serial.println(F("done")); + + // Initialize WiFi + Serial.print(F("Initialize WiFi... ")); } void loop()