begin refactoring persist, no_MQTT, nullCfg

This commit is contained in:
2021-09-19 23:32:34 +03:00
parent 7fce2b34b2
commit f22e84a6db
6 changed files with 143 additions and 57 deletions

View File

@@ -4,11 +4,12 @@
bool systemConfig::isValidSysConf() bool systemConfig::isValidSysConf()
{ {
if (!stream) return false; if (!stream) return false;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,signature)); stream->seek(offsetof(systemConfigData,signature));
for (int i=0;i<sizeof(systemConfigData::signature);i++) for (int i=0;i<sizeof(systemConfigData::signature);i++)
if (stream->read()!=EEPROM_signature[i]) if (stream->read()!=EEPROM_signature[i])
{ {
stream->close();
return false; return false;
} }
return true; return true;
@@ -18,7 +19,7 @@ bool systemConfig::isValidSysConf()
bool systemConfig::getMAC() bool systemConfig::getMAC()
{ {
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,mac)); stream->seek(offsetof(systemConfigData,mac));
bool isMacValid = false; bool isMacValid = false;
@@ -26,26 +27,28 @@ bool systemConfig::isValidSysConf()
mac[i] = stream->read(); mac[i] = stream->read();
if (mac[i] != 0 && mac[i] != 0xff) isMacValid = true; if (mac[i] != 0 && mac[i] != 0xff) isMacValid = true;
} }
stream->close();
return isMacValid; return isMacValid;
} }
bool systemConfig::setMAC(macAddress& _mac) bool systemConfig::setMAC(macAddress& _mac)
{ {
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('w'); openStream('w');
stream->seek(offsetof(systemConfigData,mac)); stream->seek(offsetof(systemConfigData,mac));
stream->write ((const uint8_t *)&_mac,sizeof(_mac)); stream->write ((const uint8_t *)&_mac,sizeof(_mac));
memcpy(mac, _mac, sizeof(mac)); memcpy(mac, _mac, sizeof(mac));
stream->flush(); stream->close();
return true; return true;
} }
char * systemConfig::getMQTTpwd(char * buffer, uint16_t bufLen) char * systemConfig::getMQTTpwd(char * buffer, uint16_t bufLen)
{ {
if (!stream || !isValidSysConf()) return NULL; if (!stream || !isValidSysConf()) return NULL;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,MQTTpwd)); stream->seek(offsetof(systemConfigData,MQTTpwd));
short bytes=stream->readBytesUntil(0,buffer,bufLen-1); short bytes=stream->readBytesUntil(0,buffer,bufLen-1);
stream->close();
if (bytes) if (bytes)
{ {
buffer[bytes]=0; buffer[bytes]=0;
@@ -57,11 +60,11 @@ bool systemConfig::isValidSysConf()
bool systemConfig::setMQTTpwd(char * pwd) bool systemConfig::setMQTTpwd(char * pwd)
{ {
if (!stream || !isValidSysConf() || (strlen(pwd)>=sizeof(systemConfigData::MQTTpwd))) return false; if (!stream || !isValidSysConf() || (strlen(pwd)>=sizeof(systemConfigData::MQTTpwd))) return false;
stream->open('w'); openStream('w');
stream->seek(offsetof(systemConfigData,MQTTpwd)); stream->seek(offsetof(systemConfigData,MQTTpwd));
stream->print(pwd); stream->print(pwd);
int bytes = stream->write((uint8_t)'\0'); int bytes = stream->write((uint8_t)'\0');
stream->flush(); stream->close();
return bytes; return bytes;
} }
@@ -69,9 +72,10 @@ bool systemConfig::isValidSysConf()
char * systemConfig::getOTApwd(char * buffer, uint16_t bufLen) char * systemConfig::getOTApwd(char * buffer, uint16_t bufLen)
{ {
if (!stream || !isValidSysConf()) return NULL; if (!stream || !isValidSysConf()) return NULL;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,OTApwd)); stream->seek(offsetof(systemConfigData,OTApwd));
short bytes=stream->readBytesUntil(0,buffer,bufLen-1); short bytes=stream->readBytesUntil(0,buffer,bufLen-1);
stream->close();
if (bytes) if (bytes)
{ {
buffer[bytes]=0; buffer[bytes]=0;
@@ -83,11 +87,11 @@ bool systemConfig::isValidSysConf()
bool systemConfig::setOTApwd(char * pwd) bool systemConfig::setOTApwd(char * pwd)
{ {
if (!stream || !isValidSysConf() || (strlen(pwd)>=sizeof(systemConfigData::OTApwd))) return false; if (!stream || !isValidSysConf() || (strlen(pwd)>=sizeof(systemConfigData::OTApwd))) return false;
stream->open('w'); openStream('w');
stream->seek(offsetof(systemConfigData,OTApwd)); stream->seek(offsetof(systemConfigData,OTApwd));
stream->print(pwd); stream->print(pwd);
int bytes = stream->write((uint8_t)'\0'); int bytes = stream->write((uint8_t)'\0');
stream->flush(); stream->close();
return bytes; return bytes;
} }
@@ -95,9 +99,10 @@ bool systemConfig::isValidSysConf()
char * systemConfig::getServer(char * buffer, uint16_t bufLen) char * systemConfig::getServer(char * buffer, uint16_t bufLen)
{ {
if (!stream || !isValidSysConf()) return NULL; if (!stream || !isValidSysConf()) return NULL;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,configURL)); stream->seek(offsetof(systemConfigData,configURL));
short bytes=stream->readBytesUntil(0,buffer,bufLen-1); short bytes=stream->readBytesUntil(0,buffer,bufLen-1);
stream->close();
if (bytes) if (bytes)
{ {
buffer[bytes]=0; buffer[bytes]=0;
@@ -109,11 +114,11 @@ bool systemConfig::isValidSysConf()
bool systemConfig::setServer(char* url) bool systemConfig::setServer(char* url)
{ {
if (!stream || !isValidSysConf() || (strlen(url)>=sizeof(systemConfigData::configURL))) return false; if (!stream || !isValidSysConf() || (strlen(url)>=sizeof(systemConfigData::configURL))) return false;
stream->open('w'); openStream('w');
stream->seek(offsetof(systemConfigData,configURL)); stream->seek(offsetof(systemConfigData,configURL));
stream->print(url); stream->print(url);
int bytes = stream->write((uint8_t)'\0'); int bytes = stream->write((uint8_t)'\0');
stream->flush(); stream->close();
return bytes; return bytes;
} }
@@ -122,10 +127,11 @@ bool systemConfig::isValidSysConf()
{ {
uint32_t addr; uint32_t addr;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,ip)); stream->seek(offsetof(systemConfigData,ip));
stream->readBytes((uint8_t *) &addr,4); stream->readBytes((uint8_t *) &addr,4);
ip=addr; ip=addr;
stream->close();
return (ip[0] && ((ip[0] != 0xff) || (ip[1] != 0xff) || (ip[2] != 0xff) || (ip[3] != 0xff))); return (ip[0] && ((ip[0] != 0xff) || (ip[1] != 0xff) || (ip[2] != 0xff) || (ip[3] != 0xff)));
} }
@@ -133,30 +139,33 @@ bool systemConfig::isValidSysConf()
{ {
uint32_t addr; uint32_t addr;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,mask)); stream->seek(offsetof(systemConfigData,mask));
stream->readBytes((uint8_t *) &addr,4); stream->readBytes((uint8_t *) &addr,4);
mask=addr; mask=addr;
stream->close();
return (mask[0] && ((mask[0] != 0xff) || (mask[1] != 0xff) || (mask[2] != 0xff) || (mask[3] != 0xff))); return (mask[0] && ((mask[0] != 0xff) || (mask[1] != 0xff) || (mask[2] != 0xff) || (mask[3] != 0xff)));
} }
bool systemConfig::getDNS(IPAddress& dns) bool systemConfig::getDNS(IPAddress& dns)
{ uint32_t addr; { uint32_t addr;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,dns)); stream->seek(offsetof(systemConfigData,dns));
stream->readBytes((uint8_t *) &addr,4); stream->readBytes((uint8_t *) &addr,4);
dns = addr; dns = addr;
stream->close();
return (dns[0] && ((dns[0] != 0xff) || (dns[1] != 0xff) || (dns[2] != 0xff) || (dns[3] != 0xff))); return (dns[0] && ((dns[0] != 0xff) || (dns[1] != 0xff) || (dns[2] != 0xff) || (dns[3] != 0xff)));
} }
bool systemConfig::getGW(IPAddress& gw) bool systemConfig::getGW(IPAddress& gw)
{ uint32_t addr; { uint32_t addr;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,gw)); stream->seek(offsetof(systemConfigData,gw));
stream->readBytes((uint8_t *) &addr,4); stream->readBytes((uint8_t *) &addr,4);
gw=addr; gw=addr;
stream->close();
return (gw[0] && ((gw[0] != 0xff) || (gw[1] != 0xff) || (gw[2] != 0xff) || (gw[3] != 0xff))); return (gw[0] && ((gw[0] != 0xff) || (gw[1] != 0xff) || (gw[2] != 0xff) || (gw[3] != 0xff)));
} }
@@ -164,30 +173,30 @@ bool systemConfig::isValidSysConf()
bool systemConfig::setIP(IPAddress& ip) bool systemConfig::setIP(IPAddress& ip)
{ uint32_t addr=ip; { uint32_t addr=ip;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('r'); openStream('r');
stream->seek(offsetof(systemConfigData,ip)); stream->seek(offsetof(systemConfigData,ip));
int bytes = stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush(); stream->close();
return bytes; return bytes;
} }
bool systemConfig::setMask(IPAddress& mask) bool systemConfig::setMask(IPAddress& mask)
{ uint32_t addr = mask; { uint32_t addr = mask;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('w'); openStream('w');
stream->seek(offsetof(systemConfigData,mask)); stream->seek(offsetof(systemConfigData,mask));
int bytes = stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush(); stream->close();
return bytes; return bytes;
} }
bool systemConfig::setDNS(IPAddress& dns) bool systemConfig::setDNS(IPAddress& dns)
{ uint32_t addr = dns; { uint32_t addr = dns;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('w'); openStream('w');
stream->seek(offsetof(systemConfigData,dns)); stream->seek(offsetof(systemConfigData,dns));
int bytes = stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush(); stream->close();
return bytes; return bytes;
} }
@@ -195,10 +204,10 @@ bool systemConfig::isValidSysConf()
bool systemConfig::setGW(IPAddress& gw) bool systemConfig::setGW(IPAddress& gw)
{ uint32_t addr = gw; { uint32_t addr = gw;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('w'); openStream('w');
stream->seek(offsetof(systemConfigData,gw)); stream->seek(offsetof(systemConfigData,gw));
int bytes = stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush(); stream->close();
return bytes; return bytes;
} }
@@ -206,7 +215,7 @@ bool systemConfig::isValidSysConf()
bool systemConfig::clear() bool systemConfig::clear()
{ {
if (!stream) return false; if (!stream) return false;
stream->open('w'); openStream('w');
stream->seek(0); stream->seek(0);
for (unsigned int i = 0; i < stream->getSize(); i++) { for (unsigned int i = 0; i < stream->getSize(); i++) {
stream->write((uint8_t)'\0'); stream->write((uint8_t)'\0');
@@ -214,7 +223,7 @@ bool systemConfig::isValidSysConf()
stream->seek(offsetof(systemConfigData,signature)); stream->seek(offsetof(systemConfigData,signature));
for (unsigned int i=0;i<sizeof(systemConfigData::signature);i++) for (unsigned int i=0;i<sizeof(systemConfigData::signature);i++)
if (stream->write(EEPROM_signature[i])); if (stream->write(EEPROM_signature[i]));
stream->flush(); stream->close();
return true; return true;
} }

View File

@@ -16,6 +16,7 @@ const char EEPROM_signature[] = EEPROM_SIGNATURE;
#define SYSCONF_OFFSET 0 #define SYSCONF_OFFSET 0
#define EEPROM_offset_NotAlligned SYSCONF_OFFSET+sizeof(systemConfigData) #define EEPROM_offset_NotAlligned SYSCONF_OFFSET+sizeof(systemConfigData)
#define SYSCONF_SIZE EEPROM_offsetJSON
#define EEPROM_offsetJSON EEPROM_offset_NotAlligned + (4 -(EEPROM_offset_NotAlligned & 3)) #define EEPROM_offsetJSON EEPROM_offset_NotAlligned + (4 -(EEPROM_offset_NotAlligned & 3))
//#define EEPROM_offsetJSON IFLASH_PAGE_SIZE //#define EEPROM_offsetJSON IFLASH_PAGE_SIZE
#define EEPROM_FIX_PART_LEN EEPROM_offsetJSON-SYSCONF_OFFSET #define EEPROM_FIX_PART_LEN EEPROM_offsetJSON-SYSCONF_OFFSET
@@ -57,6 +58,15 @@ const char EEPROM_signature[] = EEPROM_SIGNATURE;
class systemConfig { class systemConfig {
private: private:
flashStream * stream; flashStream * stream;
int openStream(char mode = '\0')
{
#if defined(FS_STORAGE)
stream.open("/config.bin",mode);
#else
stream.open(EEPROM_offsetJSON,mode);
#endif
};
public: public:
macAddress mac; macAddress mac;
systemConfig() {stream=NULL;}; systemConfig() {stream=NULL;};

View File

@@ -45,20 +45,24 @@ class seekableStream : public Stream
{ {
protected: protected:
unsigned int streamSize; unsigned int streamSize;
bool textMode;
public: public:
seekableStream(unsigned int size):Stream(),streamSize(size) {}; seekableStream(unsigned int size):Stream(),streamSize(size) {};
unsigned int getSize() {return streamSize;} unsigned int getSize() {return streamSize;}
virtual unsigned int seek(unsigned int _pos = 0) = 0; virtual unsigned int seek(unsigned int _pos = 0) = 0;
virtual int open(unsigned int _startPos=0, unsigned int _size=4096, char mode='\0') = 0;
virtual int open(String _filename, char mode='\0') = 0;
virtual void close() = 0;
}; };
#if defined(FS_STORAGE) #if defined(FS_STORAGE)
class flashStream : public seekableStream class flashStream : public seekableStream
{ {
private: private:
File fs;
String filename; String filename;
char openedMode; char openedMode;
File fs;
public: public:
flashStream(String _filename):seekableStream(65535) flashStream(String _filename):seekableStream(65535)
{ {
@@ -66,8 +70,12 @@ flashStream(String _filename):seekableStream(65535)
openedMode='\0'; openedMode='\0';
open('r'); open('r');
} }
virtual int open(String _filename, char mode='\0')
int open(char mode='\0') {
textMode = _filename suffix == txt or json
open file
};
virtual int open(char mode='\0')
{ {
if (!mode && openedMode) mode=openedMode; if (!mode && openedMode) mode=openedMode;
if (!mode && !openedMode) mode='r'; if (!mode && !openedMode) mode='r';
@@ -97,7 +105,7 @@ flashStream(String _filename):seekableStream(65535)
virtual int read() {open('r');return fs.read();}; virtual int read() {open('r');return fs.read();};
virtual int peek() {open('r'); return fs.peek();}; virtual int peek() {open('r'); return fs.peek();};
virtual unsigned int seek(unsigned int _pos = 0){return open();fs.seek(_pos,SeekSet);}; virtual unsigned int seek(unsigned int _pos = 0){return open();fs.seek(_pos,SeekSet);};
virtual void flush() {fs.flush(); open('r'); }; virtual void close() {fs.flush(); open('r'); };
virtual size_t write(uint8_t ch) {open('w'); return fs.write(ch);}; virtual size_t write(uint8_t ch) {open('w'); return fs.write(ch);};
using Print::write; using Print::write;
void putEOF(){write (255);}; void putEOF(){write (255);};
@@ -117,15 +125,44 @@ unsigned int startPos;
public: public:
flashStream(unsigned int _startPos=0, unsigned int _size=4096 ):seekableStream(_size) flashStream(unsigned int _startPos=0, unsigned int _size=4096 ):seekableStream(_size)
{ {
pos = _startPos; startPos = _startPos; pos = 0; startPos = _startPos;
}; };
void setSize(unsigned int _size) {streamSize=_size;}; void setSize(unsigned int _size) {streamSize=_size;};
int open(bool write=false) {return 1;};
virtual int open(String _filename, char mode='\0')
{
if (_filename == "config.json")
{
pos = 0;
streamSize = _size;
startPos = EEPROM_offsetJSON;
textMode = true;
return 1;
}
else if (_filename == "config.bin")
{
pos = 0;
startPos = SYSCONF_OFFSET;
streamSize = SYSCONF_SIZE;
textMode =false;
return 1;
}
else return 0;
};
virtual int open(unsigned int _startPos=0, unsigned int _size=4096 char mode='\0')
{
pos = 0;
startPos = _startPos;
streamSize = _size;
return 1;
};
virtual unsigned int seek(unsigned int _pos = 0) virtual unsigned int seek(unsigned int _pos = 0)
{ pos=min(startPos+_pos, startPos+streamSize); { pos=min(_pos, streamSize);
debugSerial<<F("Seek:")<<pos<<endl; debugSerial<<F("Seek:")<<pos<<endl;
return pos; return pos;
}; };
@@ -158,12 +195,12 @@ flashStream(unsigned int _startPos=0, unsigned int _size=4096 ):seekableStream(_
{ {
//debugSerial<<">"<<(char)ch; //debugSerial<<">"<<(char)ch;
#if defined(__AVR__) #if defined(__AVR__)
EEPROM.update(pos++,(char)ch); EEPROM.update(startPos+pos++,(char)ch);
return 1; return 1;
#elif defined(__SAM3X8E__) #elif defined(__SAM3X8E__)
return EEPROM.write(pos++,(char)ch); return EEPROM.write(startPos+pos++,(char)ch);
#else #else
EEPROM.write(pos++,(char)ch); EEPROM.write(startPos+pos++,(char)ch);
return 1; return 1;
#endif #endif
@@ -180,7 +217,7 @@ flashStream(unsigned int _startPos=0, unsigned int _size=4096 ):seekableStream(_
virtual size_t write(const uint8_t *buffer, size_t size) override virtual size_t write(const uint8_t *buffer, size_t size) override
{ {
//debugSerial<<("Write from:")<<pos<<" "<<size<<" bytes"<<endl; //debugSerial<<("Write from:")<<pos<<" "<<size<<" bytes"<<endl;
EEPROM.write(pos,(byte*)buffer,size); EEPROM.write(startPos+pos,(byte*)buffer,size);
pos+=size; pos+=size;
return size; return size;
}; };

View File

@@ -410,7 +410,7 @@ void Item::setExt(long int par) // Only store if VAL is int (autogenerated or c
{ {
if (!itemExt) if (!itemExt)
{ {
for (int i = aJson.getArraySize(itemArr); i <= 4; i++) for (int i = aJson.getArraySize(itemArr); i <= I_EXT; i++)
aJson.addItemToArray(itemArr, itemExt=aJson.createNull());// Item((long int)0)); aJson.addItemToArray(itemArr, itemExt=aJson.createNull());// Item((long int)0));
//itemExt = aJson.getArrayItem(itemArr, I_EXT); //itemExt = aJson.getArrayItem(itemArr, I_EXT);
}; };
@@ -688,8 +688,8 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion)
/// DELAYED COMMANDS processing /// DELAYED COMMANDS processing
if (suffixCode == S_DELAYED) if (suffixCode == S_DELAYED)
{ {
for (int i = aJson.getArraySize(itemArr); i < I_TIMESTAMP+1; i++) for (int i = aJson.getArraySize(itemArr); i <= I_TIMESTAMP; i++)
aJson.addItemToArray(itemArr, aJson.createItem( (long int) 0)); aJson.addItemToArray(itemArr, aJson.createNull());
aJsonObject *timestampObj = aJson.getArrayItem(itemArr, I_TIMESTAMP); aJsonObject *timestampObj = aJson.getArrayItem(itemArr, I_TIMESTAMP);
if (timestampObj && cmd.getCmd()<=0xf) if (timestampObj && cmd.getCmd()<=0xf)
@@ -697,6 +697,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion)
if (cmd.getInt()>0) if (cmd.getInt()>0)
{ {
timestampObj->valueint = millis()+cmd.getInt(); timestampObj->valueint = millis()+cmd.getInt();
timestampObj->type = aJson_Int;
timestampObj->subtype=cmd.getCmd(); timestampObj->subtype=cmd.getCmd();
debugSerial<<F( "Armed for ")<< cmd.getInt() << F(" ms :")<<timestampObj->valueint<<endl; debugSerial<<F( "Armed for ")<< cmd.getInt() << F(" ms :")<<timestampObj->valueint<<endl;
} }

View File

@@ -48,6 +48,7 @@ Streamlog errorSerial(&debugSerialPort,LOG_ERROR, ledRED);
Streamlog infoSerial (&debugSerialPort,LOG_INFO); Streamlog infoSerial (&debugSerialPort,LOG_INFO);
#endif #endif
/*
#if defined(FS_STORAGE) #if defined(FS_STORAGE)
flashStream sysConfStream("/config.bin"); flashStream sysConfStream("/config.bin");
flashStream JSONStream("/config.json"); flashStream JSONStream("/config.json");
@@ -55,6 +56,9 @@ flashStream JSONStream("/config.json");
flashStream sysConfStream(SYSCONF_OFFSET,EEPROM_offsetJSON); flashStream sysConfStream(SYSCONF_OFFSET,EEPROM_offsetJSON);
flashStream JSONStream(EEPROM_offsetJSON,MAX_JSON_CONF_SIZE); flashStream JSONStream(EEPROM_offsetJSON,MAX_JSON_CONF_SIZE);
#endif #endif
*/
flashStream sysConfStream();
systemConfig sysConf(&sysConfStream); systemConfig sysConf(&sysConfStream);
@@ -257,6 +261,8 @@ int httpHandler(Client& client, String request, long contentLength, bool authori
itemCmd ic; itemCmd ic;
ic.loadItem(&item,SEND_COMMAND|SEND_PARAMETERS); ic.loadItem(&item,SEND_COMMAND|SEND_PARAMETERS);
if (item.itemType == CH_GROUP)
{if (item.isActive()) item.setCmd(CMD_ON); else item.setCmd(CMD_OFF);}
char buf[32]; char buf[32];
response=ic.toString(buf, sizeof(buf)); response=ic.toString(buf, sizeof(buf));
@@ -408,7 +414,7 @@ if (element && element->type == aJson_String) return element->valuestring;
} }
debugSerial<<passwordBuf<<endl; debugSerial<<passwordBuf<<endl;
ArduinoOTA.begin(Ethernet.localIP(), "Lighthub", passwordBuf, InternalStorage, sysConfStream, JSONStream); ArduinoOTA.begin(Ethernet.localIP(), "Lighthub", passwordBuf, InternalStorage, sysConfStream);//, JSONStream);
ArduinoOTA.setCustomHandler(httpHandler); ArduinoOTA.setCustomHandler(httpHandler);
infoSerial<<F("OTA initialized\n"); infoSerial<<F("OTA initialized\n");
@@ -518,7 +524,12 @@ lan_status lanLoop() {
case IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER: case IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER:
wdt_res(); wdt_res();
statusLED.set(ledRED|ledGREEN|((configLoaded)?ledBLINK:0)); statusLED.set(ledRED|ledGREEN|((configLoaded)?ledBLINK:0));
ip_ready_config_loaded_connecting_to_broker(); if (!mqttArr || ((aJson.getArraySize(mqttArr)) < 2))
{
infoSerial<<F("No MQTT configured")<<endl;
lanStatus=OPERATION_NO_MQTT;
}
else ip_ready_config_loaded_connecting_to_broker();
break; break;
case RETAINING_COLLECTING: case RETAINING_COLLECTING:
@@ -579,7 +590,9 @@ lan_status lanLoop() {
} }
break; break;
case DO_NOTHING:; case DO_NOTHING:
case OPERATION_NO_MQTT:
;
} }
@@ -614,7 +627,7 @@ lan_status lanLoop() {
case DHCP_CHECK_REBIND_FAIL: case DHCP_CHECK_REBIND_FAIL:
errorSerial<<F("Error: rebind fail")<<endl; errorSerial<<F("Error: rebind fail")<<endl;
if (mqttClient.connected()) mqttClient.disconnect(); /// if (mqttClient.connected()) mqttClient.disconnect(); ??
//timerLanCheckTime = millis();// + 1000; //timerLanCheckTime = millis();// + 1000;
lanStatus = DO_REINIT; lanStatus = DO_REINIT;
break; break;
@@ -1220,14 +1233,21 @@ int loadConfigFromEEPROM()
{ {
char ch; char ch;
infoSerial<<F("Loading Config from EEPROM")<<endl; infoSerial<<F("Loading Config from EEPROM")<<endl;
JSONStream.open('r'); #if defined(FS_STORAGE)
JSONStream.seek(); sysConfStream.open("/config.json",'r');
#else
sysConfStream.open(EEPROM_offsetJSON,'r');
#endif
//JSONStream.seek();
if (JSONStream.peek() == '{') { if (JSONStream.peek() == '{') {
aJsonStream as = aJsonStream(&JSONStream); aJsonStream as = aJsonStream(&JSONStream);
cleanConf(); cleanConf();
root = aJson.parse(&as); root = aJson.parse(&as);
sysConfStream.close();
if (!root) { if (!root) {
errorSerial<<F("load failed")<<endl; errorSerial<<F("load failed")<<endl;
// sysConfStream.close();
return 0; return 0;
} }
infoSerial<<F("Loaded")<<endl; infoSerial<<F("Loaded")<<endl;
@@ -1235,8 +1255,9 @@ int loadConfigFromEEPROM()
ethClient.stop(); //Refresh MQTT connect to get retained info ethClient.stop(); //Refresh MQTT connect to get retained info
return 1; return 1;
} else { } else {
JSONStream.write(255); //truncate garbage JSONStream.writeEOF(); //truncate garbage
infoSerial<<F("No stored config")<<endl; infoSerial<<F("No stored config")<<endl;
sysConfStream.close();
return 0; return 0;
} }
return 0; return 0;
@@ -1251,10 +1272,17 @@ if (arg_cnt>1)
infoSerial<<F("Config autosave:")<<sysConf.getSaveSuccedConfig()<<endl; infoSerial<<F("Config autosave:")<<sysConf.getSaveSuccedConfig()<<endl;
return; return;
} }
#if defined(FS_STORAGE)
sysConfStream.open("/config.json",'w');
#else
sysConfStream.open(EEPROM_offsetJSON,'w');
#endif
#if defined(__SAM3X8E__) #if defined(__SAM3X8E__)
char* outBuf = (char*) malloc(MAX_JSON_CONF_SIZE); /* XXX: Dynamic size. */ char* outBuf = (char*) malloc(MAX_JSON_CONF_SIZE); /* XXX: Dynamic size. */
if (outBuf == NULL) if (outBuf == NULL)
{ {
sysConfStream.close();
return; return;
} }
infoSerial<<F("Saving config to EEPROM..")<<endl; infoSerial<<F("Saving config to EEPROM..")<<endl;
@@ -1267,13 +1295,13 @@ if (arg_cnt>1)
free (outBuf); free (outBuf);
infoSerial<<res<< F("bytes from ")<<len<<F(" are saved to EEPROM")<<endl; infoSerial<<res<< F("bytes from ")<<len<<F(" are saved to EEPROM")<<endl;
#else #else
JSONStream.open('w'); //JSONStream.open('w');
JSONStream.seek(); //JSONStream.seek();
aJsonStream jsonEEPROMStream = aJsonStream(&JSONStream); aJsonStream jsonEEPROMStream = aJsonStream(&JSONStream);
infoSerial<<F("Saving config to EEPROM.."); infoSerial<<F("Saving config to EEPROM..");
aJson.print(root, &jsonEEPROMStream); aJson.print(root, &jsonEEPROMStream);
JSONStream.putEOF(); JSONStream.putEOF();
JSONStream.flush(); JSONStream.close();
infoSerial<<F("Saved to EEPROM")<<endl; infoSerial<<F("Saved to EEPROM")<<endl;
#endif #endif
} }

View File

@@ -207,6 +207,7 @@ enum lan_status {
IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER = 4, IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER = 4,
RETAINING_COLLECTING = 5, RETAINING_COLLECTING = 5,
OPERATION = 6, OPERATION = 6,
OPERATION_NO_MQTT = 7,
DO_REINIT = -10, DO_REINIT = -10,
REINIT = - 11, REINIT = - 11,