mirror of
https://github.com/anklimov/lighthub
synced 2025-12-06 11:49:51 +03:00
begin refactoring persist, no_MQTT, nullCfg
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;};
|
||||||
|
|||||||
@@ -44,21 +44,25 @@ extern NRFFlashStorage EEPROM;
|
|||||||
class seekableStream : public Stream
|
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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
@@ -270,7 +276,7 @@ int httpHandler(Client& client, String request, long contentLength, bool authori
|
|||||||
request+=body;
|
request+=body;
|
||||||
|
|
||||||
debugSerial<<F("Cmd: ")<<request<<endl;
|
debugSerial<<F("Cmd: ")<<request<<endl;
|
||||||
if (request=="reboot") client.stop();
|
if (request=="reboot ") client.stop();
|
||||||
const char* res=request.c_str();
|
const char* res=request.c_str();
|
||||||
cmd_parse((char*) res);
|
cmd_parse((char*) res);
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user