diff --git a/code/espurna/alexa.cpp b/code/espurna/alexa.cpp index 82588bb7..fe7e8f04 100644 --- a/code/espurna/alexa.cpp +++ b/code/espurna/alexa.cpp @@ -94,7 +94,7 @@ String hostname() { } // namespace alexa void _alexaSettingsMigrate(int version) { - if (version && (version < 3)) { + if (version < 3) { moveSetting("fauxmoEnabled", "alexaEnabled"); } } @@ -183,7 +183,7 @@ bool alexaEnabled() { void alexaSetup() { // Backwards compatibility - _alexaSettingsMigrate(migrateVersion()); + migrateVersion(_alexaSettingsMigrate); // Basic fauxmoESP configuration _alexa.createServer(alexa::build::createServer()); diff --git a/code/espurna/button.cpp b/code/espurna/button.cpp index 7327f2f1..dea0265d 100644 --- a/code/espurna/button.cpp +++ b/code/espurna/button.cpp @@ -796,12 +796,10 @@ bool _buttonSetupProvider(size_t index, ButtonProvider provider) { } void _buttonSettingsMigrate(int version) { - if (!version || (version >= 5)) { - return; + if (version < 5) { + delSettingPrefix("btnGPIO"); + moveSetting("btnDelay", "btnRepDel"); } - - delSettingPrefix("btnGPIO"); - moveSetting("btnDelay", "btnRepDel"); } bool buttonAdd() { @@ -817,7 +815,7 @@ bool buttonAdd() { } void buttonSetup() { - _buttonSettingsMigrate(migrateVersion()); + migrateVersion(_buttonSettingsMigrate); for (size_t index = 0; index < ButtonsMax; ++index) { auto provider = getSetting({"btnProv", index}, button::build::provider(index)); diff --git a/code/espurna/led.cpp b/code/espurna/led.cpp index d5907461..ee796825 100644 --- a/code/espurna/led.cpp +++ b/code/espurna/led.cpp @@ -538,19 +538,17 @@ void ledLoop() { } void _ledSettingsMigrate(int version) { - if (!version || (version >= 5)) { - return; + if (version < 5) { + delSettingPrefix({ + "ledGPIO", + "ledGpio", + "ledLogic" + }); } - - delSettingPrefix({ - "ledGPIO", - "ledGpio", - "ledLogic" - }); } void ledSetup() { - _ledSettingsMigrate(migrateVersion()); + migrateVersion(_ledSettingsMigrate); _leds.reserve(led::build::preconfiguredLeds()); for (size_t index = 0; index < led::build::LedsMax; ++index) { diff --git a/code/espurna/light.cpp b/code/espurna/light.cpp index 8078bc7c..fbcb0008 100644 --- a/code/espurna/light.cpp +++ b/code/espurna/light.cpp @@ -2502,23 +2502,21 @@ void _lightProviderDebug() { } void _lightSettingsMigrate(int version) { - if (!version || (version >= 5)) { - return; + if (version < 5) { + delSettingPrefix({ + "chGPIO", + "chLogic", + "myChips", + "myDCKGPIO", + "myDIGPIO" + }); + delSetting("lightProvider"); + delSetting("useCSS"); + + moveSetting("lightTime", "ltTime"); + moveSetting("lightColdMired", "ltColdMired"); + moveSetting("lightWarmMired", "ltWarmMired"); } - - delSettingPrefix({ - "chGPIO", - "chLogic", - "myChips", - "myDCKGPIO", - "myDIGPIO" - }); - delSetting("lightProvider"); - delSetting("useCSS"); - - moveSetting("lightTime", "ltTime"); - moveSetting("lightColdMired", "ltColdMired"); - moveSetting("lightWarmMired", "ltWarmMired"); } } // namespace @@ -2526,7 +2524,7 @@ void _lightSettingsMigrate(int version) { // ----------------------------------------------------------------------------- void lightSetup() { - _lightSettingsMigrate(migrateVersion()); + migrateVersion(_lightSettingsMigrate); const auto enable_pin = getSetting("ltEnableGPIO", Light::build::enablePin()); if (enable_pin != GPIO_NONE) { diff --git a/code/espurna/migrate.cpp b/code/espurna/migrate.cpp index 2100b96f..0e52ee93 100644 --- a/code/espurna/migrate.cpp +++ b/code/espurna/migrate.cpp @@ -48,11 +48,18 @@ void delSettingPrefix(const String& prefix) { int migrateVersion() { const static auto version = getSetting("cfg", CFG_VERSION); - if (version == CFG_VERSION) { - return 0; + if (version != CFG_VERSION) { + return version; } - return version; + return 0; +} + +void migrateVersion(MigrateVersionCallback callback) { + int version = migrateVersion(); + if (version) { + callback(version); + } } void migrate() { @@ -61,19 +68,17 @@ void migrate() { const auto version = migrateVersion(); setSetting("cfg", CFG_VERSION); - if (!version) { - return; - } - // get rid of old keys that were never used until now // and some very old keys that were forced via migrate.ino - switch (version) { - case 2: - case 3: - case 4: - delSetting("board"); - break; - } + if (version) { + switch (version) { + case 2: + case 3: + case 4: + delSetting("board"); + break; + } - saveSettings(); + saveSettings(); + } } diff --git a/code/espurna/relay.cpp b/code/espurna/relay.cpp index a74a4915..2944f59b 100644 --- a/code/espurna/relay.cpp +++ b/code/espurna/relay.cpp @@ -1044,7 +1044,7 @@ PayloadStatus relayParsePayload(const char * payload) { } void _relaySettingsMigrate(int version) { - if (version && (version < 5)) { + if (version < 5) { // just a rename moveSetting("relayDelayInterlock", "relayIlkDelay"); @@ -2017,7 +2017,7 @@ void _relaySetup() { } void relaySetup() { - _relaySettingsMigrate(migrateVersion()); + migrateVersion(_relaySettingsMigrate); _relaySetup(); diff --git a/code/espurna/rfbridge.cpp b/code/espurna/rfbridge.cpp index 2f9736b6..5c6efd2d 100644 --- a/code/espurna/rfbridge.cpp +++ b/code/espurna/rfbridge.cpp @@ -1209,60 +1209,59 @@ void rfbForget(size_t id, bool status) { #if RELAY_SUPPORT && (RFB_PROVIDER == RFB_PROVIDER_RCSWITCH) +namespace { + // TODO: remove this in 1.16.0 -void _rfbSettingsMigrate(int version) { - if (!version || (version > 4)) { - return; +bool _rfbSettingsMigrateCode(String& out, const String& in) { + out = ""; + + if (18 == in.length()) { + uint8_t bits { 0u }; + if (!hexDecode(in.c_str() + 8, 2, &bits, 1)) { + return false; + } + + auto bytes = _rfb_bytes_for_bits(bits); + out = in.substring(0, 10); + out += (in.c_str() + in.length() - (2 * bytes)); + + return in != out; } - auto migrate_code = [](String& out, const String& in) -> bool { - out = ""; + return false; +} - if (18 == in.length()) { - uint8_t bits { 0u }; - if (!hexDecode(in.c_str() + 8, 2, &bits, 1)) { - return false; +void _rfbSettingsMigrate(int version) { + if (version < 4) { + String buffer; + + auto relays = relayCount(); + for (decltype(relays) id = 0; id < relays; ++id) { + SettingsKey on_key {F("rfbON"), id}; + if (_rfbSettingsMigrateCode(buffer, getSetting(on_key))) { + setSetting(on_key, buffer); } - auto bytes = _rfb_bytes_for_bits(bits); - out = in.substring(0, 10); - out += (in.c_str() + in.length() - (2 * bytes)); - - return in != out; - } - - return false; - }; - - String buffer; - - auto relays = relayCount(); - for (decltype(relays) id = 0; id < relays; ++id) { - SettingsKey on_key {F("rfbON"), id}; - if (migrate_code(buffer, getSetting(on_key))) { - setSetting(on_key, buffer); - } - - SettingsKey off_key {F("rfbOFF"), id}; - if (migrate_code(buffer, getSetting(off_key))) { - setSetting(off_key, buffer); + SettingsKey off_key {F("rfbOFF"), id}; + if (_rfbSettingsMigrateCode(buffer, getSetting(off_key))) { + setSetting(off_key, buffer); + } } } } +} // namespace + #endif void rfbSetup() { - #if RFB_PROVIDER == RFB_PROVIDER_EFM8BB1 - _rfb_parser.reserve(RfbParser::MessageSizeBasic); - #elif RFB_PROVIDER == RFB_PROVIDER_RCSWITCH #if RELAY_SUPPORT - _rfbSettingsMigrate(migrateVersion()); + migrateVersion(_rfbSettingsMigrate); #endif { diff --git a/code/espurna/rfm69.cpp b/code/espurna/rfm69.cpp index 0c7b5221..31afa7e6 100644 --- a/code/espurna/rfm69.cpp +++ b/code/espurna/rfm69.cpp @@ -424,8 +424,8 @@ void _rfm69Loop() { } } -void _rfm69Migrate(int version) { - if (version && (version < 8)) { +void _rfm69SettingsMigrate(int version) { + if (version < 8) { moveSettings("node", "rfm69Node"); moveSettings("key", "rfm69Key"); moveSettings("topic", "rfm69Topic"); @@ -441,7 +441,7 @@ void _rfm69Migrate(int version) { void rfm69Setup() { delay(10); - _rfm69Migrate(migrateVersion()); + migrateVersion(_rfm69SettingsMigrate); _rfm69Configure(); _rfm69_radio = std::make_unique(rfm69::build::cs(), rfm69::build::irq(), rfm69::build::hardware()); diff --git a/code/espurna/scheduler.cpp b/code/espurna/scheduler.cpp index 4d75964d..2adb2473 100644 --- a/code/espurna/scheduler.cpp +++ b/code/espurna/scheduler.cpp @@ -287,7 +287,7 @@ Schedules schedules() { } void migrate(int version) { - if (version && (version < 6)) { + if (version < 6) { moveSettings("schSwitch", "schTarget"); } } @@ -577,7 +577,7 @@ void check(time_t timestamp, const Schedules& schedules) { // ----------------------------------------------------------------------------- void schSetup() { - scheduler::settings::migrate(migrateVersion()); + migrateVersion(scheduler::settings::migrate); #if WEB_SUPPORT wsRegister() diff --git a/code/espurna/sensor.cpp b/code/espurna/sensor.cpp index 1aa15d38..f0bb5bb8 100644 --- a/code/espurna/sensor.cpp +++ b/code/espurna/sensor.cpp @@ -2728,7 +2728,9 @@ String magnitudeTopicIndex(unsigned char index) { // ----------------------------------------------------------------------------- -void _sensorBackwards(int version) { +namespace { + +void _sensorSettingsMigrate(int version) { // Some keys from older versions were longer if (version < 3) { moveSetting("powerUnits", "pwrUnits"); @@ -2767,10 +2769,12 @@ void _sensorBackwards(int version) { #endif } +} // namespace + void sensorSetup() { // Settings backwards compatibility - _sensorBackwards(migrateVersion()); + migrateVersion(_sensorSettingsMigrate); // Load configured sensors and set up all of magnitudes _sensorLoad(); diff --git a/code/espurna/settings.h b/code/espurna/settings.h index ed6c045d..a3e8b11c 100644 --- a/code/espurna/settings.h +++ b/code/espurna/settings.h @@ -264,6 +264,9 @@ void settingsSetup(); // Configuration updates // ----------------------------------------------------------------------------- +using MigrateVersionCallback = void(*)(int); + +void migrateVersion(MigrateVersionCallback); int migrateVersion(); void migrate(); diff --git a/code/espurna/wifi.cpp b/code/espurna/wifi.cpp index 450dedb2..25e90fda 100644 --- a/code/espurna/wifi.cpp +++ b/code/espurna/wifi.cpp @@ -525,7 +525,7 @@ String opmode(uint8_t mode) { namespace settings { void migrate(int version) { - if (version && (version < 5)) { + if (version < 5) { moveSetting("apmode", "wifiApMode"); } } @@ -2613,7 +2613,8 @@ size_t wifiApStations() { void wifiSetup() { wifi::internal::init(); - wifi::settings::migrate(migrateVersion()); + + migrateVersion(wifi::settings::migrate); wifi::settings::configure(); #if SYSTEM_CHECK_ENABLED