From b88ec7f5a99d4bb6b578de9f59631c922e772030 Mon Sep 17 00:00:00 2001 From: arendst Date: Mon, 19 Jun 2017 22:54:49 +0200 Subject: [PATCH] v5.2.0 5.2.0 20170619 * Add command SetOption12 1 to disable newly released configuration flash rotate to reduce flash wear * Fix command CounterDebounce by removing test for active GPIO (#524) * Add command SetOption33 1..250 to allow user configure POW Max_Power_Retry count (#525) --- README.md | 2 +- sonoff/_releasenotes.ino | 7 +++- sonoff/settings.h | 2 +- sonoff/settings.ino | 88 +++++++++++++++++++++++++--------------- sonoff/sonoff.ino | 24 +++++++---- sonoff/webserver.ino | 1 + sonoff/xsns_hlw8012.ino | 2 +- 7 files changed, 83 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index e4bf0dcaf..7fab856ac 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Sonoff-Tasmota Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. -Current version is **5.1.7** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information. +Current version is **5.2.0** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information. ### **** ATTENTION Version 5.x.x specific information **** diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index ce5456f8b..0c6f2e2b8 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,9 @@ -/* 5.1.7 20170616 +/* 5.2.0 20170619 + * Add command SetOption12 1 to disable newly released configuration flash rotate to reduce flash wear + * Fix command CounterDebounce by removing test for active GPIO (#524) + * Add command SetOption33 1..250 to allow user configure POW Max_Power_Retry count (#525) + * + * 5.1.7 20170616 * Prep removal of SetOptions alternatives * Restore webpage upgrade error messages removed in 5.1.5 * Add hold button functionality to buttons 2 to 4 diff --git a/sonoff/settings.h b/sonoff/settings.h index c85818be5..47a51f886 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -34,7 +34,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t mqtt_sensor_retain : 1; uint32_t mqtt_offline : 1; // bit 10 uint32_t button_swap : 1; // bit 11 (v5.1.6) - uint32_t spare12 : 1; + uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0) uint32_t spare13 : 1; uint32_t spare14 : 1; uint32_t spare15 : 1; diff --git a/sonoff/settings.ino b/sonoff/settings.ino index 9b060631c..bc215452b 100644 --- a/sonoff/settings.ino +++ b/sonoff/settings.ino @@ -124,13 +124,13 @@ extern "C" uint32_t _SPIFFS_end; #define SPIFFS_END ((uint32_t)&_SPIFFS_end - 0x40200000) / SPI_FLASH_SEC_SIZE -// Version 3.x config -#define CFG_LOCATION_3 SPIFFS_END - 4 - // Version 4.2 config = eeprom area #define CFG_LOCATION SPIFFS_END // No need for SPIFFS as it uses EEPROM area +// Version 5.2 allow for more flash space +#define CFG_ROTATES 8 // Number of additional flash sectors used (handles uploads) uint32_t _cfgHash = 0; +uint32_t _cfgLocation = CFG_LOCATION; /********************************************************************************************/ /* @@ -192,18 +192,38 @@ uint32_t getHash() * Config Save - Save parameters to Flash ONLY if any parameter has changed \*********************************************************************************************/ -void CFG_Save() +void CFG_Save(byte force) { char log[LOGSZ]; #ifndef BE_MINIMAL - if (getHash() != _cfgHash) { - noInterrupts(); + if ((getHash() != _cfgHash) || force) { + if (sysCfg.flag.stop_flash_rotate) { + _cfgLocation = CFG_LOCATION; + } else { + if (force) { + _cfgLocation = CFG_LOCATION; + } else { + _cfgLocation--; + if (_cfgLocation <= (CFG_LOCATION - CFG_ROTATES)) { + _cfgLocation = CFG_LOCATION; + } + } + } sysCfg.saveFlag++; - spi_flash_erase_sector(CFG_LOCATION); - spi_flash_write(CFG_LOCATION * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof(SYSCFG)); + noInterrupts(); + spi_flash_erase_sector(_cfgLocation); + spi_flash_write(_cfgLocation * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof(SYSCFG)); interrupts(); - snprintf_P(log, sizeof(log), PSTR("Config: Saved configuration (%d bytes) to flash at %X and count %d"), sizeof(SYSCFG), CFG_LOCATION, sysCfg.saveFlag); + if (!sysCfg.flag.stop_flash_rotate && force) { + for (byte i = 1; i < CFG_ROTATES; i++) { + noInterrupts(); + spi_flash_erase_sector(_cfgLocation -i); // Delete previous configurations by resetting to 0xFF + interrupts(); + delay(1); + } + } + snprintf_P(log, sizeof(log), PSTR("Cnfg: %s (%d bytes) to flash at %X and count %d"), (force) ? "Backup" : "Save", sizeof(SYSCFG), _cfgLocation, sysCfg.saveFlag); addLog(LOG_LEVEL_DEBUG, log); _cfgHash = getHash(); } @@ -220,28 +240,26 @@ void CFG_Load() unsigned long saveFlag; } _sysCfgH; - noInterrupts(); - spi_flash_read(CFG_LOCATION * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof(SYSCFG)); - interrupts(); - snprintf_P(log, sizeof(log), PSTR("Config: Loaded configuration from flash at %X and count %d"), CFG_LOCATION, sysCfg.saveFlag); - addLog(LOG_LEVEL_DEBUG, log); + _cfgLocation = CFG_LOCATION +1; + for (byte i = 0; i < CFG_ROTATES; i++) { + _cfgLocation--; + noInterrupts(); + spi_flash_read(_cfgLocation * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof(SYSCFG)); + spi_flash_read((_cfgLocation -1) * SPI_FLASH_SEC_SIZE, (uint32*)&_sysCfgH, sizeof(SYSCFGH)); + interrupts(); - if (sysCfg.cfg_holder != CFG_HOLDER) { - if ((sysCfg.version < 0x04020000) || (sysCfg.version > 0x06000000)) { - noInterrupts(); - spi_flash_read((CFG_LOCATION_3) * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof(SYSCFG)); - spi_flash_read((CFG_LOCATION_3 + 1) * SPI_FLASH_SEC_SIZE, (uint32*)&_sysCfgH, sizeof(SYSCFGH)); - if (sysCfg.saveFlag < _sysCfgH.saveFlag) - spi_flash_read((CFG_LOCATION_3 + 1) * SPI_FLASH_SEC_SIZE, (uint32*)&sysCfg, sizeof(SYSCFG)); - interrupts(); - if (sysCfg.cfg_holder != CFG_HOLDER) { - CFG_Default(); - } else { - sysCfg.saveFlag = 0; - } - } else { - CFG_Default(); +// snprintf_P(log, sizeof(log), PSTR("Cnfg: Check at %X with count %d and holder %X"), _cfgLocation -1, _sysCfgH.saveFlag, _sysCfgH.cfg_holder); +// addLog(LOG_LEVEL_DEBUG, log); + + if (sysCfg.flag.stop_flash_rotate || (sysCfg.cfg_holder != _sysCfgH.cfg_holder) || (sysCfg.saveFlag > _sysCfgH.saveFlag)) { + break; } + delay(1); + } + snprintf_P(log, sizeof(log), PSTR("Cnfg: Load from flash at %X and count %d"), _cfgLocation, sysCfg.saveFlag); + addLog(LOG_LEVEL_DEBUG, log); + if (sysCfg.cfg_holder != CFG_HOLDER) { + CFG_Default(); } _cfgHash = getHash(); @@ -257,7 +275,7 @@ void CFG_Erase() uint32_t _sectorEnd = ESP.getFlashChipRealSize() / SPI_FLASH_SEC_SIZE; boolean _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level); - snprintf_P(log, sizeof(log), PSTR("Config: Erasing %d flash sectors"), _sectorEnd - _sectorStart); + snprintf_P(log, sizeof(log), PSTR("Cnfg: Erase %d flash sectors"), _sectorEnd - _sectorStart); addLog(LOG_LEVEL_DEBUG, log); for (uint32_t _sector = _sectorStart; _sector < _sectorEnd; _sector++) { @@ -325,10 +343,10 @@ void CFG_Dump(uint16_t srow, uint16_t mrow) void CFG_Default() { - addLog_P(LOG_LEVEL_NONE, PSTR("Config: Use default configuration")); + addLog_P(LOG_LEVEL_NONE, PSTR("Cnfg: Use defaults")); CFG_DefaultSet1(); CFG_DefaultSet2(); - CFG_Save(); + CFG_Save(1); } void CFG_DefaultSet1() @@ -460,6 +478,9 @@ void CFG_DefaultSet2() // 5.1.7 sysCfg.param[P_HOLD_TIME] = KEY_HOLD_TIME; // Default 4 seconds hold time + // 5.2.0 + sysCfg.param[P_MAX_POWER_RETRY] = MAX_POWER_RETRY; + } /********************************************************************************************/ @@ -657,6 +678,9 @@ void CFG_Delta() if (sysCfg.version < 0x05010700) { sysCfg.param[P_HOLD_TIME] = KEY_HOLD_TIME; // Default 4 seconds hold time } + if (sysCfg.version < 0x05020000) { + sysCfg.param[P_MAX_POWER_RETRY] = MAX_POWER_RETRY; + } sysCfg.version = VERSION; } diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 704161dd0..31f5fd6da 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -24,7 +24,7 @@ - Select IDE Tools - Flash size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x05010700 // 5.1.7 +#define VERSION 0x05020000 // 5.2.0 enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL}; enum week_t {Last, First, Second, Third, Fourth}; @@ -149,7 +149,7 @@ enum emul_t {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX}; #define MAX_STATUS 11 // Max number of status lines enum butt_t {PRESSED, NOT_PRESSED}; -enum opt_t {P_HOLD_TIME, P_MAX_PARAM8}; // Index in sysCfg.param +enum opt_t {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8}; // Index in sysCfg.param #include "support.h" // Global support @@ -1001,13 +1001,13 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) if (sysCfg.flag.savestate) { sysCfg.power = power; } - CFG_Save(); + CFG_Save(0); if (sysCfg.savedata > 1) { snprintf_P(stemp1, sizeof(stemp1), PSTR("Every %d seconds"), sysCfg.savedata); } snprintf_P(svalue, sizeof(svalue), PSTR("{\"SaveData\":\"%s\"}"), (sysCfg.savedata > 1) ? stemp1 : getStateText(sysCfg.savedata)); } - else if (!strcmp_P(type,PSTR("SETOPTION")) && ((index >= 0) && (index <= 11)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) { + else if (!strcmp_P(type,PSTR("SETOPTION")) && ((index >= 0) && (index <= 12)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) { if (index <= 31) { ptype = 0; // SetOption0 .. 31 } else { @@ -1027,8 +1027,12 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) case 8: // temperature_conversion case 10: // mqtt_offline case 11: // button_swap + case 12: // stop_flash_rotate bitWrite(sysCfg.flag.data, index, payload); } + if (12 == index) { + CFG_Save(1); + } } } else { // SetOption32 .. @@ -1038,6 +1042,11 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) sysCfg.param[P_HOLD_TIME] = payload; } break; + case P_MAX_POWER_RETRY: + if ((payload >= 1) && (payload <= 250)) { + sysCfg.param[P_MAX_POWER_RETRY] = payload; + } + break; } } } @@ -1238,7 +1247,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) snprintf_P(svalue, sizeof(svalue), PSTR("{\"CounterType%d\":%d}"), index, bitRead(sysCfg.pCounterType, index -1)); } else if (!strcmp_P(type,PSTR("COUNTERDEBOUNCE"))) { - if ((data_len > 0) && (payload16 < 32001) && (pin[GPIO_CNTR1 + index -1] < 99)) { + if ((data_len > 0) && (payload16 < 32001)) { sysCfg.pCounterDebounce = payload16; } snprintf_P(svalue, sizeof(svalue), PSTR("{\"CounterDebounce\":%d}"), sysCfg.pCounterDebounce); @@ -2248,6 +2257,7 @@ void stateloop() if (2 == otaflag) { otaretry = OTA_ATTEMPTS; ESPhttpUpdate.rebootOnUpdate(false); + CFG_Save(1); // Free flash for OTA update } if (otaflag <= 0) { #ifdef USE_WEBSERVER @@ -2298,7 +2308,7 @@ void stateloop() sysCfg.power = power; } } - CFG_Save(); + CFG_Save(0); savedatacounter = sysCfg.savedata; } } @@ -2319,7 +2329,7 @@ void stateloop() hlw_savestate(); } counter_savestate(); - CFG_Save(); + CFG_Save(0); restartflag--; if (restartflag <= 0) { addLog_P(LOG_LEVEL_INFO, PSTR("APP: Restarting")); diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index 55238b838..1d05d4d28 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -1177,6 +1177,7 @@ void handleUploadLoop() _uploaderror = 1; return; } + CFG_Save(1); // Free flash for upload snprintf_P(log, sizeof(log), PSTR("Upload: File %s ..."), upload.filename.c_str()); addLog(LOG_LEVEL_INFO, log); if (!_uploadfiletype) { diff --git a/sonoff/xsns_hlw8012.ino b/sonoff/xsns_hlw8012.ino index a4f92875a..a8c159ae8 100644 --- a/sonoff/xsns_hlw8012.ino +++ b/sonoff/xsns_hlw8012.ino @@ -380,7 +380,7 @@ void hlw_margin_chk() mqtt_publish_topic_P(1, PSTR("WARNING"), svalue); do_cmnd_power(1, 0); if (!hlw_mplr_counter) { - hlw_mplr_counter = MAX_POWER_RETRY +1; + hlw_mplr_counter = sysCfg.param[P_MAX_POWER_RETRY] +1; } hlw_mplw_counter = sysCfg.hlw_mplw; }