From b16839cc5d6a6ef04d57d2bd82901b044aba80a8 Mon Sep 17 00:00:00 2001 From: Olivier Date: Sat, 26 Nov 2016 09:12:55 +0100 Subject: [PATCH] ESP8266: Reorganize EEPROM handling --- core/MyHwESP8266.cpp | 73 +++++++++++++++----------------------------- core/MyHwESP8266.h | 14 +++------ 2 files changed, 30 insertions(+), 57 deletions(-) diff --git a/core/MyHwESP8266.cpp b/core/MyHwESP8266.cpp index 7901e4d..e43fafd 100644 --- a/core/MyHwESP8266.cpp +++ b/core/MyHwESP8266.cpp @@ -20,73 +20,50 @@ #include "MyHwESP8266.h" #include -/* -int8_t pinIntTrigger = 0; -void wakeUp() //place to send the interrupts +void hwInit(void) { - pinIntTrigger = 1; -} -void wakeUp2() //place to send the second interrupts -{ - pinIntTrigger = 2; +#if !defined(MY_DISABLED_SERIAL) + MY_SERIALDEVICE.begin(MY_BAUD_RATE, SERIAL_8N1, MY_ESP8266_SERIAL_MODE, 1); + MY_SERIALDEVICE.setDebugOutput(true); +#endif + EEPROM.begin(EEPROM_size); } -// Watchdog Timer interrupt service routine. This routine is required -// to allow automatic WDIF and WDIE bit clearance in hardware. -ISR (WDT_vect) +void hwReadConfigBlock(void* buf, void* addr, size_t length) { - // WDIE & WDIF is cleared in hardware upon entering this ISR - wdt_disable(); -} -*/ - -static void hwInitConfigBlock( size_t length = 1024 /*ATMega328 has 1024 bytes*/ ) -{ - static bool initDone = false; - if (!initDone) - { - EEPROM.begin(length); - initDone = true; - } -} - -void hwReadConfigBlock(void* buf, void* adr, size_t length) -{ - hwInitConfigBlock(); uint8_t* dst = static_cast(buf); - int offs = reinterpret_cast(adr); + int pos = reinterpret_cast(addr); while (length-- > 0) { - *dst++ = EEPROM.read(offs++); + *dst++ = EEPROM.read(pos++); } } -void hwWriteConfigBlock(void* buf, void* adr, size_t length) +void hwWriteConfigBlock(void* buf, void* addr, size_t length) { - hwInitConfigBlock(); - uint8_t* src = static_cast(buf); - int offs = reinterpret_cast(adr); - while (length-- > 0) - { - EEPROM.write(offs++, *src++); - } - EEPROM.commit(); + uint8_t* src = static_cast(buf); + int pos = reinterpret_cast(addr); + bool doCommit = false; + while (length-- > 0) { + doCommit |= EEPROM.read(pos) != *src; + EEPROM.write(pos++, *src++); + } + // only commit if there are changes + if (doCommit) { + EEPROM.commit(); + } } -uint8_t hwReadConfig(int adr) +uint8_t hwReadConfig(const int addr) { uint8_t value; - hwReadConfigBlock(&value, reinterpret_cast(adr), 1); + hwReadConfigBlock(&value, reinterpret_cast(addr), 1); return value; } -void hwWriteConfig(int adr, uint8_t value) +void hwWriteConfig(const int addr, uint8_t value) { - uint8_t curr = hwReadConfig(adr); - if (curr != value) - { - hwWriteConfigBlock(&value, reinterpret_cast(adr), 1); - } + hwWriteConfigBlock(&value, reinterpret_cast(addr), 1); } diff --git a/core/MyHwESP8266.h b/core/MyHwESP8266.h index 3b92169..f95ace0 100644 --- a/core/MyHwESP8266.h +++ b/core/MyHwESP8266.h @@ -30,27 +30,23 @@ #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) +#define EEPROM_size (1024) + // Define these as macros to save valuable space #define hwDigitalWrite(__pin, __value) digitalWrite(__pin, __value) #define hwDigitalRead(__pin) digitalRead(__pin) #define hwPinMode(__pin, __value) pinMode(__pin, __value) - -#if defined(MY_DISABLED_SERIAL) - #define hwInit() -#else - #define hwInit() MY_SERIALDEVICE.begin(MY_BAUD_RATE, SERIAL_8N1, MY_ESP8266_SERIAL_MODE, 1); MY_SERIALDEVICE.setDebugOutput(true) -#endif - #define hwWatchdogReset() wdt_reset() #define hwReboot() ESP.restart() #define hwMillis() millis() #define hwRandomNumberInit() randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN)) +void hwInit(void); void hwReadConfigBlock(void* buf, void* adr, size_t length); void hwWriteConfigBlock(void* buf, void* adr, size_t length); -void hwWriteConfig(int adr, uint8_t value); -uint8_t hwReadConfig(int adr); +void hwWriteConfig(const int addr, uint8_t value); +uint8_t hwReadConfig(const int addr); /** * Restore interrupt state.