PreRelease+bin. Persistant&Config mgmt done+fixes

This commit is contained in:
2021-12-26 01:41:56 +03:00
parent 184abef5a4
commit 12fe7ea71e
25 changed files with 42070 additions and 42001 deletions

View File

@@ -245,52 +245,93 @@ bool systemConfig::isValidSysConf()
if (stream->write(EEPROM_signature[i]));
stream->close();
setETAG("");
setSerialDebuglevel(7);
setUdpDebuglevel(7);
return true;
}
///
systemConfigFlags systemConfig::getConfigFlags()
{
systemConfigFlags flags;
flags.configFlags32bit=0;
flags.serialDebugLevel=7;
flags.udpDebugLevel=7;
if (stream && isValidSysConf())
{
openStream('r');
stream->seek(offsetof(systemConfigData,configFlags));
stream->readBytes((uint8_t *) &flags,sizeof (flags));
stream->close();
}
return flags;
}
bool systemConfig::setConfigFlags(systemConfigFlags flags)
{
if (!stream || !isValidSysConf()) return false;
openStream('r');
stream->seek(offsetof(systemConfigData,configFlags));
int bytes = stream->write((uint8_t *) &flags, sizeof (flags));
stream->close();
return bytes;
}
bool systemConfig::getSaveSuccedConfig()
{
return false;
systemConfigFlags flags = getConfigFlags();
return !flags.notSaveSuccedConfig;
}
bool systemConfig::setSaveSuccedConfig(bool)
bool systemConfig::setSaveSuccedConfig(bool flag)
{
return false;
systemConfigFlags flags = getConfigFlags();
flags.notSaveSuccedConfig=!flag;
return setConfigFlags(flags);
}
///
bool systemConfig::getLoadHTTPConfig()
{
systemConfigFlags flags = getConfigFlags();
return !flags.notGetConfigFromHTTP;
}
bool systemConfig::setLoadHTTPConfig(bool load)
{
systemConfigFlags flags = getConfigFlags();
flags.notGetConfigFromHTTP=!load;
return setConfigFlags(flags);
}
bool systemConfig::setSerialDebuglevel(short level)
{
return false;
systemConfigFlags flags = getConfigFlags();
flags.serialDebugLevel=level;
return setConfigFlags(flags);
}
bool systemConfig::setUdpDebuglevel(short level)
{
return false;
systemConfigFlags flags = getConfigFlags();
flags.udpDebugLevel=level;
return setConfigFlags(flags);
}
uint8_t systemConfig::getSerialDebuglevel()
{
return 7;
systemConfigFlags flags = getConfigFlags();
return flags.serialDebugLevel;
}
uint8_t systemConfig::getUdpDebuglevel()
{
return 7;
}
//
bool systemConfig::setLoadHTTPConfig(bool load)
{
return false;
}
bool systemConfig::getLoadHTTPConfig()
{
return false;
systemConfigFlags flags = getConfigFlags();
return flags.udpDebugLevel;
}
String systemConfig::getETAG()

View File

@@ -61,5 +61,8 @@ class systemConfig {
bool saveETAG();
bool loadETAG();
systemConfigFlags getConfigFlags();
bool setConfigFlags(systemConfigFlags flags);
//bool Save();
};

View File

@@ -1056,7 +1056,10 @@ if (status2Send) cmd.saveItem(this,status2Send);
//debugSerial<<F("sts:")<<status2Send<<endl;
if (driver) //New style modular code
res = driver->Ctrl(cmd, subItem, toExecute);
{
res = driver->Ctrl(cmd, subItem, toExecute);
//if (res==-1) status2Send=0; ///////not working
}
else
{
switch (itemType) {

View File

@@ -343,7 +343,13 @@ uint16_t httpHandler(Client& client, String request, uint8_t method, long conten
if (! result) return 404;
return result;
}
else
else if (method == HTTP_POST && request.startsWith(F("/config.json")))
{
sysConf.setLoadHTTPConfig(false);
infoSerial<<(F("Config changed locally, portal disabled"))<<endl;
sysConf.setETAG("");
return 0;
}
#endif
return 0; //Unknown
}
@@ -574,21 +580,34 @@ lan_status lanLoop() {
case LIBS_INITIALIZED:
statusLED.set(ledRED|ledGREEN|((configLoaded)?ledBLINK:0));
if (configLocked) return LIBS_INITIALIZED;
if (sysConf.getLoadHTTPConfig())
{
if (!configOk)
{
if (loadConfigFromHttp()==200) lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
else if (configLoaded) {
infoSerial<<F("Continue with previously loaded config")<<endl;
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
}
else if (Ethernet.localIP()) lanStatus = DO_READ_RE_CONFIG;
if (!configOk)
{
if (loadConfigFromHttp()) lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
else if (configLoaded) {
infoSerial<<F("Continue with previously loaded config")<<endl;
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
}
else lanStatus = READ_RE_CONFIG; //Load from NVRAM
}
else
{
infoSerial<<F("Config is valid")<<endl;
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
}
else lanStatus = DO_REINIT; //Load from NVRAM
}
else
{
infoSerial<<F("Config is valid")<<endl;
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
}
} else
{
if (configLoaded)
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
else
lanStatus = DO_READ_RE_CONFIG;
infoSerial<<F("Loading config from portal disabled. use get ON to enable")<<endl;
}
break;
case IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER:
@@ -625,6 +644,7 @@ lan_status lanLoop() {
case DO_REINIT: // Pause and re-init LAN
//if (mqttClient.connected()) mqttClient.disconnect(); // Hmm hungs then cable disconnected
// problem here - if no sockets - DHCP will failed. finally (())
timerLanCheckTime = millis();// + 5000;
lanStatus = REINIT;
statusLED.set(ledRED|((configLoaded)?ledBLINK:0));
@@ -652,13 +672,22 @@ lan_status lanLoop() {
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;//2;
break;
case DO_READ_RE_CONFIG: // Pause and re-read EEPROM
timerLanCheckTime = millis();
lanStatus = READ_RE_CONFIG;
//statusLED.set(ledRED|((configLoaded)?ledBLINK:0));
break;
case READ_RE_CONFIG: // Restore config from FLASH, re-init LAN
debugSerial<<F("Restoring config from EEPROM")<<endl;
if (loadConfigFromEEPROM()) lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;//2;
else {
//timerLanCheckTime = millis();// + 5000;
lanStatus = DO_REINIT;//-10;
}
if (isTimeOver(timerLanCheckTime,millis(),TIMEOUT_REINIT))
{
debugSerial<<F("Restoring config from EEPROM")<<endl;
if (loadConfigFromEEPROM()) lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;//2;
else {
//timerLanCheckTime = millis();// + 5000;
lanStatus = DO_REINIT;//-10;
}
}
break;
case DO_NOTHING:
@@ -841,7 +870,7 @@ void ip_ready_config_loaded_connecting_to_broker() {
if (!mqttArr || ((n = aJson.getArraySize(mqttArr)) < 2)) //At least device name and broker IP must be configured
{
errorSerial<<F("At least device name and broker IP must be configured")<<endl;
lanStatus = READ_RE_CONFIG;
lanStatus = DO_READ_RE_CONFIG;
return;
}
@@ -1261,7 +1290,9 @@ setupSyslog();
int cmd = it.getCmd();
switch (it.itemType) {
case CH_THERMO:
if (cmd<1) it.setCmd(CMD_OFF);
if (cmd<1) it.setCmd(CMD_OFF);
it.setFlag(SEND_COMMAND);
if (it.itemVal) it.setFlag(SEND_PARAMETERS);
pinMode(pin, OUTPUT);
digitalWrite(pin, false); //Initially, all thermostates are LOW (OFF for electho heaters, open for water NO)
debugSerial<<F("Thermo:")<<pin<<F("=LOW")<<F(";");
@@ -1290,7 +1321,6 @@ setupSyslog();
printConfigSummary();
configLoaded=true;
if (sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
ethClient.stop(); //Refresh MQTT connection
configLocked--;
}
@@ -1547,23 +1577,29 @@ if (arg_cnt>1)
if (lanStatus>=HAVE_IP_ADDRESS)
{
configOk=false;
lanStatus=LIBS_INITIALIZED;
return 200;
}
errorSerial<<F("No IP adress")<<endl;
return 500;
/*
if (loadConfigFromHttp(arg_cnt, args))
int retCode=loadConfigFromHttp();
if (retCode==200)
{
lanStatus =IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
return 200;
}
else if (retCode == -1)
{
debugSerial<<F("Releasing socket and retry")<<endl;
configOk=false;
lanStatus=LIBS_INITIALIZED;
ethClient.stop(); // Release MQTT socket
return 201;
}
// Not Loaded
if (configLoaded) lanStatus =IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
else lanStatus = READ_RE_CONFIG;
return 500; */
else lanStatus = DO_READ_RE_CONFIG;
return retCode;
}
errorSerial<<F("No IP adress")<<endl;
return 500;
}
void printBool(bool arg) { (arg) ? infoSerial<<F("+") : infoSerial<<F("-"); }
@@ -1580,7 +1616,7 @@ void headerHandlerProc(String header)
}
}
bool loadConfigFromHttp()
int loadConfigFromHttp()
{
//macAddress * mac = sysConf.getMAC();
int responseStatusCode = 0;
@@ -1625,14 +1661,13 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
// FILE is the return STREAM type of the HTTPClient
configStream = hclient.getURI(URI,NULL,get_header);
responseStatusCode = hclient.getLastReturnCode();
debugSerial<<F("http retcode ")<<responseStatusCode<<endl;delay(100);
//debugSerial<<F("http retcode ")<<responseStatusCode<<endl;delay(100);
//wdt_en();
if (configStream != NULL) {
if (responseStatusCode == 200) {
infoSerial<<F("got Config\n"); delay(500);
char c;
aJsonFileStream as = aJsonFileStream(configStream);
noInterrupts();
cleanConf();
@@ -1644,30 +1679,33 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
{
sysConf.setETAG("");
errorSerial<<F("Config parsing failed\n");
return false;
return 0;
}
else {
applyConfig();
if (configLoaded && sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
infoSerial<<F("Done.\n");
return true;
return 200;
}
}
else if (responseStatusCode == 304)
{
errorSerial<<F("Config not changed\n");
return false;
infoSerial<<F("Config not changed\n");
hclient.closeStream(configStream);
return responseStatusCode;
}
else
{
errorSerial<<F("ERROR: Server returned ");
hclient.closeStream(configStream);
errorSerial<<responseStatusCode<<endl;
return false;
return responseStatusCode;
}
} else {
debugSerial<<F("failed to connect\n");
return false;
return -1;
}
#endif
#if defined(__SAM3X8E__) || defined(ARDUINO_ARCH_STM32) || defined (NRF5) //|| defined(ARDUINO_ARCH_AVR)//|| defined(ARDUINO_ARCH_ESP32) //|| defined(ARDUINO_ARCH_ESP8266)
@@ -1713,32 +1751,33 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
if (!root) {
errorSerial<<F("Config parsing failed\n");
sysConf.setETAG("");
return false;
return 0;
}
else {
debugSerial<<F("Parsed. Free:")<<freeRam()<<endl;
//debugSerial<<response;
applyConfig();
infoSerial<<F("Done.\n");
return true;
if (configLoaded && sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
return 200;
}
}
else if (responseStatusCode == 304)
{
errorSerial<<F("Config not changed\n");
htclient.stop();
return false;
return responseStatusCode;
}
else {
errorSerial<<F("Config retrieving failed\n");
htclient.stop();
return false;
return responseStatusCode;
}
}
else
{
errorSerial<<F("Connect failed\n");
return false;
return -1;
}
#endif
@@ -1784,36 +1823,36 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
} else
{
httpClient.end();
return false;
return -1;
}
if (!root) {
sysConf.setETAG("");
errorSerial<<F("Config parsing failed\n");
return false;
return 0;
} else {
applyConfig();
if (configLoaded && sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
infoSerial<<F("Done.\n");
return true;
return 200;
}
}
else if (responseStatusCode == HTTP_CODE_NOT_MODIFIED)
{
httpClient.end();
errorSerial<<F("Config not changed\n");
return false;
return responseStatusCode;
}
else
{
httpClient.end();
errorSerial<<F("Config retrieving failed\n");
return false;
return responseStatusCode;
}
} else
{
errorSerial.printf("[HTTP] GET... failed, error: %s\n", httpClient.errorToString(responseStatusCode).c_str());
httpClient.end();
return false;
return responseStatusCode;
}
#endif
}
@@ -1890,11 +1929,11 @@ void setup_main() {
if(SPIFFS.begin())
#endif
{
debugSerial<<("SPIFFS Initialize....ok")<<endl;
debugSerialPort.println("SPIFFS Initialize....ok");
}
else
{
debugSerial<<("SPIFFS Initialization...failed")<<endl;
debugSerialPort.println("SPIFFS Initialization...failed");
}
#endif
#else
@@ -1909,7 +1948,7 @@ void setup_main() {
if (!sysConf.isValidSysConf())
{
infoSerial<<F("No valid EEPROM data")<<endl;
debugSerialPort.println(F("No valid EEPROM data. Initializing."));
sysConf.clear();
}
// scan_i2c_bus();

View File

@@ -213,6 +213,7 @@ enum lan_status {
DO_RECONNECT = 12,
RECONNECT = 13,
READ_RE_CONFIG = 14,
DO_READ_RE_CONFIG = 15,
DO_NOTHING = -15
};
@@ -266,7 +267,7 @@ void saveFlash(short n, IPAddress& ip);
int ipLoadFromFlash(short n, IPAddress &ip);
*/
bool loadConfigFromHttp();
int loadConfigFromHttp();
void preTransmission();

View File

@@ -53,6 +53,7 @@ void out_AC::InsertData(byte data[], size_t size){
char s_mode[10];
set_tmp = data[B_SET_TMP]+16;
if (set_tmp>40 || set_tmp<16) return;
cur_tmp = data[B_CUR_TMP];
mode = data[B_MODE];
fan_spd = data[B_FAN_SPD];
@@ -250,8 +251,8 @@ if (cause!=POLLING_SLOW) return 0;
debugSerial.println ("Polling");
SendData(qstn, sizeof(qstn)/sizeof(byte)); //Опрос кондиционера
}
delay(100);
if(AC_Serial.available() > 0){
///delay(100);
if(AC_Serial.available() >= 37){ //was 0
AC_Serial.readBytes(data, 37);
while(AC_Serial.available()){
delay(2);
@@ -282,13 +283,14 @@ int out_AC::Ctrl(itemCmd cmd, char* subItem , bool toExecute)
switch(suffixCode)
{
case S_SET:
//case S_ESET:
set_tmp = cmd.getInt();
if (set_tmp >= 10 && set_tmp <= 30)
if (set_tmp >= 16 && set_tmp <= 40)
{
//if (set_tmp>40 || set_tmp<16) set_temp=21;
data[B_SET_TMP] = set_tmp -16;
publishTopic(item->itemArr->name,(long) set_tmp,"/set");
}
else return -1;
break;
case S_CMD:

View File

@@ -70,7 +70,7 @@
#define WIFI_TIMEOUT 60000UL
#define TIMEOUT_RECONNECT 10000UL
#define TIMEOUT_REINIT 5000UL
#define TIMEOUT_RETAIN 5000UL
#define TIMEOUT_RETAIN 8000UL
#define INTERVAL_1W 5000UL
#define PERIOD_THERMOSTAT_FAILED (600 * 1000UL)>>8

View File

@@ -5,7 +5,7 @@
#define MAXFLASHSTR 32
#define PWDFLASHSTR 16
#define EEPROM_SIGNATURE "LHC0"
#define EEPROM_SIGNATURE "LHC1"
#define EEPROM_SIGNATURE_LENGTH 4
//#define EEPROM_offsetJSON IFLASH_PAGE_SIZE
@@ -18,20 +18,26 @@ const char EEPROM_signature[] = EEPROM_SIGNATURE;
typedef uint8_t macAddress[6];
#pragma pack(push, 1)
typedef union
{
uint32_t configFlags32bit;
struct
{
uint8_t serialDebugLevel:3;
uint8_t notGetConfigFromHTTP:1;
uint8_t udpDebugLevel:3;
uint8_t notSaveSuccedConfig:1;
uint8_t spare2;
uint16_t sysConfigHash;
};
} systemConfigFlags;
typedef struct
{
char signature[4];
macAddress mac; //6 bytes
union {
uint16_t configFlags;
struct
{
uint8_t serialDebugLevel:4;
uint8_t syslogDebugLevel:4;
uint8_t notGetConfigFromHTTP:1;
uint8_t saveToFlash:1;
};
};
uint16_t spare; //2 bytes
systemConfigFlags configFlags; //4 bytes
uint32_t ip;
uint32_t dns;
uint32_t gw;
@@ -40,8 +46,6 @@ const char EEPROM_signature[] = EEPROM_SIGNATURE;
flashstr configURL;
flashpwd MQTTpwd;
flashpwd OTApwd;
flashstr ETAG;
uint16_t sysConfigHash;
flashstr ETAG;
} systemConfigData;
#pragma (pop)