Browse Source

0.6.5 - 2023-04-11

* merge PR #876, check JSON settings during read for existance
* **NOTE:** incompatible change: renamed `led_high_active` to `act_high`, maybe setting must be changed after update
pull/883/head
lumapu 2 years ago
parent
commit
33186a9833
  1. 2
      src/CHANGES.md
  2. 144
      src/config/settings.h
  3. 2
      src/utils/dbg.h

2
src/CHANGES.md

@ -2,6 +2,8 @@
## 0.6.5 - 2023-04-11 ## 0.6.5 - 2023-04-11
* fix #845 MqTT subscription for `ctrl/power/[IV-ID]` was missing * fix #845 MqTT subscription for `ctrl/power/[IV-ID]` was missing
* merge PR #876, check JSON settings during read for existance
* **NOTE:** incompatible change: renamed `led_high_active` to `act_high`, maybe setting must be changed after update
## 0.6.4 - 2023-04-06 ## 0.6.4 - 2023-04-06
* merge PR #846, improved NRF24 communication and MI, thx @beegee3 & @rejoe2 * merge PR #846, improved NRF24 communication and MI, thx @beegee3 & @rejoe2

144
src/config/settings.h

@ -6,6 +6,11 @@
#ifndef __SETTINGS_H__ #ifndef __SETTINGS_H__
#define __SETTINGS_H__ #define __SETTINGS_H__
#if defined(F) && defined(ESP32)
#undef F
#define F(sl) (sl)
#endif
#include <Arduino.h> #include <Arduino.h>
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <LittleFS.h> #include <LittleFS.h>
@ -410,12 +415,12 @@ class settings {
ah::ip2Char(mCfg.sys.ip.dns2, buf); obj[F("dns2")] = String(buf); ah::ip2Char(mCfg.sys.ip.dns2, buf); obj[F("dns2")] = String(buf);
ah::ip2Char(mCfg.sys.ip.gateway, buf); obj[F("gtwy")] = String(buf); ah::ip2Char(mCfg.sys.ip.gateway, buf); obj[F("gtwy")] = String(buf);
} else { } else {
if(obj.containsKey(F("ssid"))) snprintf(mCfg.sys.stationSsid, SSID_LEN, "%s", obj[F("ssid")].as<const char*>()); getChar(obj, F("ssid"), mCfg.sys.stationSsid, SSID_LEN);
if(obj.containsKey(F("pwd"))) snprintf(mCfg.sys.stationPwd, PWD_LEN, "%s", obj[F("pwd")].as<const char*>()); getChar(obj, F("pwd"), mCfg.sys.stationPwd, PWD_LEN);
if(obj.containsKey(F("dev"))) snprintf(mCfg.sys.deviceName, DEVNAME_LEN, "%s", obj[F("dev")].as<const char*>()); getChar(obj, F("adm"), mCfg.sys.deviceName, DEVNAME_LEN);
if(obj.containsKey(F("adm"))) snprintf(mCfg.sys.adminPwd, PWD_LEN, "%s", obj[F("adm")].as<const char*>()); getChar(obj, F("dev"), mCfg.sys.adminPwd, PWD_LEN);
if(obj.containsKey(F("prot_mask"))) mCfg.sys.protectionMask = obj[F("prot_mask")]; getVal<uint16_t>(obj, F("prot_mask"), &mCfg.sys.protectionMask);
if(obj.containsKey(F("dark"))) mCfg.sys.darkMode = obj[F("dark")]; getVal<bool>(obj, F("dark"), &mCfg.sys.darkMode);
if(obj.containsKey(F("ip"))) ah::ip2Arr(mCfg.sys.ip.ip, obj[F("ip")].as<const char*>()); if(obj.containsKey(F("ip"))) ah::ip2Arr(mCfg.sys.ip.ip, obj[F("ip")].as<const char*>());
if(obj.containsKey(F("mask"))) ah::ip2Arr(mCfg.sys.ip.mask, obj[F("mask")].as<const char*>()); if(obj.containsKey(F("mask"))) ah::ip2Arr(mCfg.sys.ip.mask, obj[F("mask")].as<const char*>());
if(obj.containsKey(F("dns1"))) ah::ip2Arr(mCfg.sys.ip.dns1, obj[F("dns1")].as<const char*>()); if(obj.containsKey(F("dns1"))) ah::ip2Arr(mCfg.sys.ip.dns1, obj[F("dns1")].as<const char*>());
@ -440,15 +445,15 @@ class settings {
obj[F("miso")] = mCfg.nrf.pinMiso; obj[F("miso")] = mCfg.nrf.pinMiso;
obj[F("pwr")] = mCfg.nrf.amplifierPower; obj[F("pwr")] = mCfg.nrf.amplifierPower;
} else { } else {
if(obj.containsKey(F("ssid"))) mCfg.nrf.sendInterval = obj[F("intvl")]; getVal<uint16_t>(obj, F("intvl"), &mCfg.nrf.sendInterval);
if(obj.containsKey(F("maxRetry"))) mCfg.nrf.maxRetransPerPyld = obj[F("maxRetry")]; getVal<uint8_t>(obj, F("maxRetry"), &mCfg.nrf.maxRetransPerPyld);
if(obj.containsKey(F("cs"))) mCfg.nrf.pinCs = obj[F("cs")]; getVal<uint8_t>(obj, F("cs"), &mCfg.nrf.pinCs);
if(obj.containsKey(F("ce"))) mCfg.nrf.pinCe = obj[F("ce")]; getVal<uint8_t>(obj, F("ce"), &mCfg.nrf.pinCe);
if(obj.containsKey(F("irq"))) mCfg.nrf.pinIrq = obj[F("irq")]; getVal<uint8_t>(obj, F("irq"), &mCfg.nrf.pinIrq);
if(obj.containsKey(F("sclk"))) mCfg.nrf.pinSclk = obj[F("sclk")]; getVal<uint8_t>(obj, F("sclk"), &mCfg.nrf.pinSclk);
if(obj.containsKey(F("mosi"))) mCfg.nrf.pinMosi = obj[F("mosi")]; getVal<uint8_t>(obj, F("mosi"), &mCfg.nrf.pinMosi);
if(obj.containsKey(F("miso"))) mCfg.nrf.pinMiso = obj[F("miso")]; getVal<uint8_t>(obj, F("miso"), &mCfg.nrf.pinMiso);
if(obj.containsKey(F("pwr"))) mCfg.nrf.amplifierPower = obj[F("pwr")]; getVal<uint8_t>(obj, F("pwr"), &mCfg.nrf.amplifierPower);
if((obj[F("cs")] == obj[F("ce")])) { if((obj[F("cs")] == obj[F("ce")])) {
mCfg.nrf.pinCs = DEF_CS_PIN; mCfg.nrf.pinCs = DEF_CS_PIN;
mCfg.nrf.pinCe = DEF_CE_PIN; mCfg.nrf.pinCe = DEF_CE_PIN;
@ -465,8 +470,8 @@ class settings {
obj[F("addr")] = mCfg.ntp.addr; obj[F("addr")] = mCfg.ntp.addr;
obj[F("port")] = mCfg.ntp.port; obj[F("port")] = mCfg.ntp.port;
} else { } else {
if(obj.containsKey(F("addr"))) snprintf(mCfg.ntp.addr, NTP_ADDR_LEN, "%s", obj[F("addr")].as<const char*>()); getChar(obj, F("addr"), mCfg.ntp.addr, NTP_ADDR_LEN);
if(obj.containsKey(F("port"))) mCfg.ntp.port = obj[F("port")]; getVal<uint16_t>(obj, F("port"), &mCfg.ntp.port);
} }
} }
@ -477,10 +482,10 @@ class settings {
obj[F("dis")] = mCfg.sun.disNightCom; obj[F("dis")] = mCfg.sun.disNightCom;
obj[F("offs")] = mCfg.sun.offsetSec; obj[F("offs")] = mCfg.sun.offsetSec;
} else { } else {
if(obj.containsKey(F("lat"))) mCfg.sun.lat = obj[F("lat")]; getVal<float>(obj, F("lat"), &mCfg.sun.lat);
if(obj.containsKey(F("lon"))) mCfg.sun.lon = obj[F("lon")]; getVal<float>(obj, F("lon"), &mCfg.sun.lon);
if(obj.containsKey(F("dis"))) mCfg.sun.disNightCom = obj[F("dis")]; getVal<bool>(obj, F("dis"), &mCfg.sun.disNightCom);
if(obj.containsKey(F("offs"))) mCfg.sun.offsetSec = obj[F("offs")]; getVal<uint16_t>(obj, F("offs"), &mCfg.sun.offsetSec);
} }
} }
@ -490,9 +495,9 @@ class settings {
obj[F("show")] = mCfg.serial.showIv; obj[F("show")] = mCfg.serial.showIv;
obj[F("debug")] = mCfg.serial.debug; obj[F("debug")] = mCfg.serial.debug;
} else { } else {
if(obj.containsKey(F("intvl"))) mCfg.serial.interval = obj[F("intvl")]; getVal<uint16_t>(obj, F("intvl"), &mCfg.serial.interval);
if(obj.containsKey(F("show"))) mCfg.serial.showIv = obj[F("show")]; getVal<bool>(obj, F("show"), &mCfg.serial.showIv);
if(obj.containsKey(F("debug"))) mCfg.serial.debug = obj[F("debug")]; getVal<bool>(obj, F("debug"), &mCfg.serial.debug);
} }
} }
@ -506,12 +511,12 @@ class settings {
obj[F("intvl")] = mCfg.mqtt.interval; obj[F("intvl")] = mCfg.mqtt.interval;
} else { } else {
if(obj.containsKey(F("port"))) mCfg.mqtt.port = obj[F("port")]; getVal<uint16_t>(obj, F("port"), &mCfg.mqtt.port);
if(obj.containsKey(F("intvl"))) mCfg.mqtt.interval = obj[F("intvl")]; getVal<uint16_t>(obj, F("intvl"), &mCfg.mqtt.interval);
if(obj.containsKey(F("broker"))) snprintf(mCfg.mqtt.broker, MQTT_ADDR_LEN, "%s", obj[F("broker")].as<const char*>()); getChar(obj, F("broker"), mCfg.mqtt.broker, MQTT_ADDR_LEN);
if(obj.containsKey(F("user"))) snprintf(mCfg.mqtt.user, MQTT_USER_LEN, "%s", obj[F("user")].as<const char*>()); getChar(obj, F("user"), mCfg.mqtt.user, MQTT_USER_LEN);
if(obj.containsKey(F("pwd"))) snprintf(mCfg.mqtt.pwd, MQTT_PWD_LEN, "%s", obj[F("pwd")].as<const char*>()); getChar(obj, F("pwd"), mCfg.mqtt.pwd, MQTT_PWD_LEN);
if(obj.containsKey(F("topic"))) snprintf(mCfg.mqtt.topic, MQTT_TOPIC_LEN, "%s", obj[F("topic")].as<const char*>()); getChar(obj, F("topic"), mCfg.mqtt.topic, MQTT_TOPIC_LEN);
} }
} }
@ -519,11 +524,11 @@ class settings {
if(set) { if(set) {
obj[F("0")] = mCfg.led.led0; obj[F("0")] = mCfg.led.led0;
obj[F("1")] = mCfg.led.led1; obj[F("1")] = mCfg.led.led1;
obj[F("led_high_active")] = mCfg.led.led_high_active; obj[F("act_high")] = mCfg.led.led_high_active;
} else { } else {
if(obj.containsKey(F("0"))) mCfg.led.led0 = obj[F("0")]; getVal<uint8_t>(obj, F("0"), &mCfg.led.led0);
if(obj.containsKey(F("1"))) mCfg.led.led1 = obj[F("1")]; getVal<uint8_t>(obj, F("1"), &mCfg.led.led1);
if(obj.containsKey(F("led_high_active"))) mCfg.led.led_high_active = obj[F("led_high_active")]; getVal<uint8_t>(obj, F("act_high"), &mCfg.led.led_high_active);
} }
} }
@ -545,19 +550,19 @@ class settings {
disp[F("dc")] = mCfg.plugin.display.disp_dc; disp[F("dc")] = mCfg.plugin.display.disp_dc;
} else { } else {
JsonObject disp = obj["disp"]; JsonObject disp = obj["disp"];
if(disp.containsKey(F("type"))) mCfg.plugin.display.type = disp[F("type")]; getVal<uint8_t>(disp, F("type"), &mCfg.plugin.display.type);
if(disp.containsKey(F("pwrSafe"))) mCfg.plugin.display.pwrSaveAtIvOffline = (bool)disp[F("pwrSafe")]; getVal<bool>(disp, F("pwrSafe"), &mCfg.plugin.display.pwrSaveAtIvOffline);
if(disp.containsKey(F("pxShift"))) mCfg.plugin.display.pxShift = (bool)disp[F("pxShift")]; getVal<bool>(disp, F("pxShift"), &mCfg.plugin.display.pxShift);
if(disp.containsKey(F("rotation"))) mCfg.plugin.display.rot = disp[F("rotation")]; getVal<uint8_t>(disp, F("rotation"), &mCfg.plugin.display.rot);
//mCfg.plugin.display.wakeUp = disp[F("wake")]; //mCfg.plugin.display.wakeUp = disp[F("wake")];
//mCfg.plugin.display.sleepAt = disp[F("sleep")]; //mCfg.plugin.display.sleepAt = disp[F("sleep")];
if(disp.containsKey(F("contrast"))) mCfg.plugin.display.contrast = disp[F("contrast")]; getVal<uint8_t>(disp, F("contrast"), &mCfg.plugin.display.contrast);
if(disp.containsKey(F("data"))) mCfg.plugin.display.disp_data = disp[F("data")]; getVal<uint8_t>(disp, F("data"), &mCfg.plugin.display.disp_data);
if(disp.containsKey(F("clock"))) mCfg.plugin.display.disp_clk = disp[F("clock")]; getVal<uint8_t>(disp, F("clock"), &mCfg.plugin.display.disp_clk);
if(disp.containsKey(F("cs"))) mCfg.plugin.display.disp_cs = disp[F("cs")]; getVal<uint8_t>(disp, F("cs"), &mCfg.plugin.display.disp_cs);
if(disp.containsKey(F("reset"))) mCfg.plugin.display.disp_reset = disp[F("reset")]; getVal<uint8_t>(disp, F("reset"), &mCfg.plugin.display.disp_reset);
if(disp.containsKey(F("busy"))) mCfg.plugin.display.disp_busy = disp[F("busy")]; getVal<uint8_t>(disp, F("busy"), &mCfg.plugin.display.disp_busy);
if(disp.containsKey(F("dc"))) mCfg.plugin.display.disp_dc = disp[F("dc")]; getVal<uint8_t>(disp, F("dc"), &mCfg.plugin.display.disp_dc);
} }
} }
@ -569,10 +574,10 @@ class settings {
obj[F("rstComStop")] = (bool)mCfg.inst.rstValsCommStop; obj[F("rstComStop")] = (bool)mCfg.inst.rstValsCommStop;
} }
else { else {
if(obj.containsKey(F("en"))) mCfg.inst.enabled = (bool)obj[F("en")]; getVal<bool>(obj, F("en"), &mCfg.inst.enabled);
if(obj.containsKey(F("rstMidNight"))) mCfg.inst.rstYieldMidNight = (bool)obj["rstMidNight"]; getVal<bool>(obj, F("rstMidNight"), &mCfg.inst.rstYieldMidNight);
if(obj.containsKey(F("rstNotAvail"))) mCfg.inst.rstValsNotAvail = (bool)obj["rstNotAvail"]; getVal<bool>(obj, F("rstNotAvail"), &mCfg.inst.rstValsNotAvail);
if(obj.containsKey(F("rstComStop"))) mCfg.inst.rstValsCommStop = (bool)obj["rstComStop"]; getVal<bool>(obj, F("rstComStop"), &mCfg.inst.rstValsCommStop);
} }
JsonArray ivArr; JsonArray ivArr;
@ -582,13 +587,10 @@ class settings {
if(set) { if(set) {
if(mCfg.inst.iv[i].serial.u64 != 0ULL) if(mCfg.inst.iv[i].serial.u64 != 0ULL)
jsonIv(ivArr.createNestedObject(), &mCfg.inst.iv[i], true); jsonIv(ivArr.createNestedObject(), &mCfg.inst.iv[i], true);
} } else if(!obj[F("iv")][i].isNull())
else {
if(!obj[F("iv")][i].isNull())
jsonIv(obj[F("iv")][i], &mCfg.inst.iv[i]); jsonIv(obj[F("iv")][i], &mCfg.inst.iv[i]);
} }
} }
}
void jsonIv(JsonObject obj, cfgIv_t *cfg, bool set = false) { void jsonIv(JsonObject obj, cfgIv_t *cfg, bool set = false) {
if(set) { if(set) {
@ -601,17 +603,41 @@ class settings {
obj[F("chName")][i] = cfg->chName[i]; obj[F("chName")][i] = cfg->chName[i];
} }
} else { } else {
if(obj.containsKey(F("en"))) cfg->enabled = (bool)obj[F("en")]; getVal<bool>(obj, F("en"), &cfg->enabled);
if(obj.containsKey(F("name"))) snprintf(cfg->name, MAX_NAME_LENGTH, "%s", obj[F("name")].as<const char*>()); getChar(obj, F("name"), cfg->name, MAX_NAME_LENGTH);
if(obj.containsKey(F("sn"))) cfg->serial.u64 = obj[F("sn")]; getVal<uint64_t>(obj, F("sn"), &cfg->serial.u64);
for(uint8_t i = 0; i < 4; i++) { for(uint8_t i = 0; i < 4; i++) {
if(obj.containsKey(F("yield"))) cfg->yieldCor[i] = obj[F("yield")][i]; getVal<int32_t>(obj, F("yield"), &cfg->yieldCor[i]);
if(obj.containsKey(F("pwr"))) cfg->chMaxPwr[i] = obj[F("pwr")][i]; getVal<uint16_t>(obj, F("pwr"), &cfg->chMaxPwr[i]);
if(obj.containsKey(F("chName"))) snprintf(cfg->chName[i], MAX_NAME_LENGTH, "%s", obj[F("chName")][i].as<const char*>()); getChar(obj, F("chName"), cfg->chName[i], MAX_NAME_LENGTH);
}
} }
} }
#if defined(ESP32)
void getChar(JsonObject obj, const char *key, char *dst, int maxLen) {
if(obj.containsKey(key))
snprintf(dst, maxLen, "%s", obj[key].as<const char*>());
} }
template<typename T=uint8_t>
void getVal(JsonObject obj, const char *key, T *dst) {
if(obj.containsKey(key))
*dst = obj[key];
}
#else
void getChar(JsonObject obj, const __FlashStringHelper *key, char *dst, int maxLen) {
if(obj.containsKey(key))
snprintf(dst, maxLen, "%s", obj[key].as<const char*>());
}
template<typename T=uint8_t>
void getVal(JsonObject obj, const __FlashStringHelper *key, T *dst) {
if(obj.containsKey(key))
*dst = obj[key];
}
#endif
settings_t mCfg; settings_t mCfg;
bool mLastSaveSucceed; bool mLastSaveSucceed;
}; };

2
src/utils/dbg.h

@ -1,6 +1,6 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// 2023 Ahoy, https://www.mikrocontroller.net/topic/525778 // 2023 Ahoy, https://www.mikrocontroller.net/topic/525778
// Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/4.0/deed
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#ifndef __DBG_H__ #ifndef __DBG_H__

Loading…
Cancel
Save