Fixed settings save/load

This commit is contained in:
Spacehuhn
2020-07-05 16:34:46 +02:00
parent 83cd397494
commit f16b1f6ec9
3 changed files with 25 additions and 42 deletions

View File

@@ -453,8 +453,7 @@
#define EEPROM_SIZE 4095 #define EEPROM_SIZE 4095
#define BOOT_COUNTER_ADDR 1 #define BOOT_COUNTER_ADDR 1
#define SETTINGS_HASH_ADDR BOOT_COUNTER_ADDR + sizeof(boot) #define SETTINGS_ADDR 100
#define SETTINGS_ADDR SETTINGS_HASH_ADDR + sizeof(settings_hash_t)
// ======== AVAILABLE SETTINGS ========== // // ======== AVAILABLE SETTINGS ========== //

View File

@@ -6,35 +6,25 @@
#include "settings.h" #include "settings.h"
#include <Hash.h> // sha1() used in calc_hash()
#include "A_config.h" // Default Settings #include "A_config.h" // Default Settings
#include "language.h" // prnt and prntln #include "language.h" // prnt and prntln
#include "EEPROMHelper.h" // To load and save settings_t #include "EEPROMHelper.h" // To load and save settings_t
#include "debug.h" #include "debug.h"
#define MAGIC_NUM 3416245
extern bool writeFile(String path, String& buf); extern bool writeFile(String path, String& buf);
extern void getRandomMac(uint8_t* mac); extern void getRandomMac(uint8_t* mac);
extern bool macValid(uint8_t* mac); extern bool macValid(uint8_t* mac);
// ===== INTERNAL ===== //
bool operator==(settings_hash_t a, settings_hash_t b) {
for (int i = 0; i<20; i++)
if (a.hash[i] != b.hash[i]) return false;
return true;
}
bool operator==(version_t a, version_t b) {
return a.major == b.major && a.minor == b.minor && a.revision == b.revision;
}
#define JSON_FLAG(_NAME,_VALUE)\ #define JSON_FLAG(_NAME,_VALUE)\
str += String('"') + str(_NAME) + String(F("\":")) + String(_VALUE?"true":"false") + String(','); str += String('"') + String(FPSTR(_NAME)) + String(F("\":")) + String(_VALUE?"true":"false") + String(',');
#define JSON_VALUE(_NAME,_VALUE)\ #define JSON_VALUE(_NAME,_VALUE)\
str += String('"') + str(_NAME) + String(F("\":")) + String(_VALUE) + String(','); str += String('"') + String(FPSTR(_NAME)) + String(F("\":")) + String(_VALUE) + String(',');
#define JSON_HEX(_NAME,_BYTES,_LEN)\ #define JSON_HEX(_NAME,_BYTES,_LEN)\
str += String('"') + str(_NAME) + String(F("\":"));\ str += String('"') + String(FPSTR(_NAME)) + String(F("\":"));\
for (int i = 0; i<_LEN; i++) {\ for (int i = 0; i<_LEN; i++) {\
if (i > 0) str += ':';\ if (i > 0) str += ':';\
if (_BYTES[i] < 0x10) str += '0';\ if (_BYTES[i] < 0x10) str += '0';\
@@ -43,7 +33,7 @@ bool operator==(version_t a, version_t b) {
str += String(F("\",")); str += String(F("\","));
#define JSON_DEC(_NAME,_BYTES,_LEN)\ #define JSON_DEC(_NAME,_BYTES,_LEN)\
str += String('"') + str(_NAME) + String(F("\":"));\ str += String('"') + String(FPSTR(_NAME)) + String(F("\":"));\
for (int i = 0; i<_LEN; i++) {\ for (int i = 0; i<_LEN; i++) {\
if (i > 0) str += '.';\ if (i > 0) str += '.';\
str += String(_BYTES[i]);\ str += String(_BYTES[i]);\
@@ -58,13 +48,6 @@ namespace settings {
settings_t data; settings_t data;
bool changed = false; bool changed = false;
settings_hash_t calc_hash(settings_t data) {
settings_hash_t hash;
sha1((uint8_t*)&data, sizeof(settings_t), hash.hash);
return hash;
}
void get_json(String& str) { void get_json(String& str) {
str = String(); str = String();
str.reserve(600); str.reserve(600);
@@ -126,20 +109,24 @@ namespace settings {
void load() { void load() {
debugF("Loading settings..."); debugF("Loading settings...");
// read hash from eeprom
settings_hash_t hash;
EEPROMHelper::getObject(SETTINGS_HASH_ADDR, hash);
// read data from eeproms // read data from eeproms
settings_t newData; settings_t newData;
EEPROMHelper::getObject(SETTINGS_ADDR, newData); EEPROMHelper::getObject(SETTINGS_ADDR, newData);
// calc and check hash // calc and check hash
if ((newData.version == data.version) && (calc_hash(newData) == hash)) { if (newData.magic_num == MAGIC_NUM) {
data = newData; data = newData;
data.version.major = DEAUTHER_VERSION_MAJOR;
data.version.minor = DEAUTHER_VERSION_MINOR;
data.version.revision = DEAUTHER_VERSION_REVISION;
debuglnF("OK"); debuglnF("OK");
} else { } else {
debuglnF("Invalid Hash - reseted to default"); debuglnF("Invalid Hash");
debug(data.magic_num);
debugF(" != ");
debugln(MAGIC_NUM);
reset();
} }
// check and fix mac // check and fix mac
@@ -150,6 +137,8 @@ namespace settings {
} }
void reset() { void reset() {
data.magic_num = MAGIC_NUM;
data.version.major = DEAUTHER_VERSION_MAJOR; data.version.major = DEAUTHER_VERSION_MAJOR;
data.version.minor = DEAUTHER_VERSION_MINOR; data.version.minor = DEAUTHER_VERSION_MINOR;
data.version.revision = DEAUTHER_VERSION_REVISION; data.version.revision = DEAUTHER_VERSION_REVISION;
@@ -180,7 +169,7 @@ namespace settings {
data.web.use_spiffs = WEB_USE_SPIFFS; data.web.use_spiffs = WEB_USE_SPIFFS;
memcpy(data.web.lang, DEFAULT_LANG, 3); memcpy(data.web.lang, DEFAULT_LANG, 3);
data.cli.enabled = true; data.cli.enabled = CLI_ENABLED;
data.cli.serial_echo = CLI_ECHO; data.cli.serial_echo = CLI_ECHO;
data.led.enabled = USE_LED; data.led.enabled = USE_LED;
@@ -188,12 +177,11 @@ namespace settings {
data.display.enabled = USE_DISPLAY; data.display.enabled = USE_DISPLAY;
data.display.timeout = DISPLAY_TIMEOUT; data.display.timeout = DISPLAY_TIMEOUT;
debuglnF("Settings reset"); debuglnF("Settings reset to default");
} }
void save(bool force) { void save(bool force) {
if (force || changed) { if (force || changed) {
EEPROMHelper::saveObject(SETTINGS_HASH_ADDR, calc_hash(data));
EEPROMHelper::saveObject(SETTINGS_ADDR, data); EEPROMHelper::saveObject(SETTINGS_ADDR, data);
changed = false; changed = false;
@@ -215,9 +203,9 @@ namespace settings {
String json_buffer; String json_buffer;
get_json(json_buffer); get_json(json_buffer);
json_buffer.replace("\":", " = "); json_buffer.replace("\":", ": ");
json_buffer.replace("= 0\r\n", "= false\r\n"); json_buffer.replace(": 0\r\n", ": false\r\n");
json_buffer.replace("= 1\r\n", "= true\r\n"); json_buffer.replace(": 1\r\n", ": true\r\n");
json_buffer.replace("\"", ""); json_buffer.replace("\"", "");
json_buffer.replace("{", ""); json_buffer.replace("{", "");
json_buffer.replace("}", ""); json_buffer.replace("}", "");

View File

@@ -93,6 +93,7 @@ typedef struct display_settings_t {
// ===== SETTINGS ===== // // ===== SETTINGS ===== //
typedef struct settings_t { typedef struct settings_t {
uint32_t magic_num;
version_t version; version_t version;
autosave_settings_t autosave; autosave_settings_t autosave;
attack_settings_t attack; attack_settings_t attack;
@@ -105,11 +106,6 @@ typedef struct settings_t {
display_settings_t display; display_settings_t display;
} settings_t; } settings_t;
// ===== CHECK SUM / HASH ====== //
typedef struct settings_hash_t {
uint8_t hash[20];
} settings_hash_t;
namespace settings { namespace settings {
void load(); void load();
void save(bool force = false); void save(bool force = false);