more persitance all MPU, RESTORE bug fixed

This commit is contained in:
2021-09-10 23:40:42 +03:00
parent 6485833f7d
commit 7fce2b34b2
24 changed files with 39953 additions and 39696 deletions

View File

@@ -13,3 +13,4 @@
-DCORS=\"http://lazyhome.ru\" -DCORS=\"http://lazyhome.ru\"
-DTIMER_INT -DTIMER_INT
-DRESTART_LAN_ON_MQTT_ERRORS

View File

@@ -24,3 +24,5 @@
#Default SerialDebug settings #Default SerialDebug settings
#-DSERIAL_BAUD=115200 #-DSERIAL_BAUD=115200
#-DdebugSerialPort=Serial #-DdebugSerialPort=Serial
-DRESTART_LAN_ON_MQTT_ERRORS

View File

@@ -18,6 +18,7 @@
#-DWiz5100 #-DWiz5100
-DARDUINO_OTA_MDNS_DISABLE -DARDUINO_OTA_MDNS_DISABLE
#-DMDNS_ENABLE #-DMDNS_ENABLE
-DRESTART_LAN_ON_MQTT_ERRORS
# Example of UARTBRIDGE configuration # Example of UARTBRIDGE configuration
#-DUARTBRIDGE_ENABLE #-DUARTBRIDGE_ENABLE

File diff suppressed because it is too large Load Diff

Binary file not shown.

2
compiled/due/sendcommand.sh Executable file
View File

@@ -0,0 +1,2 @@
#../tools/mac/arduinoOTA -address 192.168.88.21 -port 65280 -username arduino -password password -sketch firmware.bin -b -upload /sketch
curl --basic --user arduino:password --data-ascii "$2" --url http://192.168.88.21:65280/command/$1

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -4,6 +4,7 @@
bool systemConfig::isValidSysConf() bool systemConfig::isValidSysConf()
{ {
if (!stream) return false; if (!stream) return false;
stream->open('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])
@@ -17,6 +18,7 @@ bool systemConfig::isValidSysConf()
bool systemConfig::getMAC() bool systemConfig::getMAC()
{ {
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('r');
stream->seek(offsetof(systemConfigData,mac)); stream->seek(offsetof(systemConfigData,mac));
bool isMacValid = false; bool isMacValid = false;
@@ -30,16 +32,18 @@ bool systemConfig::isValidSysConf()
bool systemConfig::setMAC(macAddress& _mac) bool systemConfig::setMAC(macAddress& _mac)
{ {
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('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();
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');
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);
if (bytes) if (bytes)
@@ -53,15 +57,19 @@ 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');
stream->seek(offsetof(systemConfigData,MQTTpwd)); stream->seek(offsetof(systemConfigData,MQTTpwd));
stream->print(pwd); stream->print(pwd);
return stream->write((uint8_t)'\0'); int bytes = stream->write((uint8_t)'\0');
stream->flush();
return bytes;
} }
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');
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);
if (bytes) if (bytes)
@@ -75,15 +83,19 @@ 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');
stream->seek(offsetof(systemConfigData,OTApwd)); stream->seek(offsetof(systemConfigData,OTApwd));
stream->print(pwd); stream->print(pwd);
return stream->write((uint8_t)'\0'); int bytes = stream->write((uint8_t)'\0');
stream->flush();
return bytes;
} }
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');
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);
if (bytes) if (bytes)
@@ -97,9 +109,12 @@ 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');
stream->seek(offsetof(systemConfigData,configURL)); stream->seek(offsetof(systemConfigData,configURL));
stream->print(url); stream->print(url);
return stream->write((uint8_t)'\0'); int bytes = stream->write((uint8_t)'\0');
stream->flush();
return bytes;
} }
@@ -107,6 +122,7 @@ bool systemConfig::isValidSysConf()
{ {
uint32_t addr; uint32_t addr;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('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;
@@ -117,6 +133,7 @@ bool systemConfig::isValidSysConf()
{ {
uint32_t addr; uint32_t addr;
if (!stream || !isValidSysConf()) return false; if (!stream || !isValidSysConf()) return false;
stream->open('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;
@@ -126,6 +143,7 @@ bool systemConfig::isValidSysConf()
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');
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;
@@ -135,6 +153,7 @@ bool systemConfig::isValidSysConf()
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');
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;
@@ -145,36 +164,49 @@ 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');
stream->seek(offsetof(systemConfigData,ip)); stream->seek(offsetof(systemConfigData,ip));
return stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush();
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');
stream->seek(offsetof(systemConfigData,mask)); stream->seek(offsetof(systemConfigData,mask));
return stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush();
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');
stream->seek(offsetof(systemConfigData,dns)); stream->seek(offsetof(systemConfigData,dns));
return stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush();
return bytes;
} }
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');
stream->seek(offsetof(systemConfigData,gw)); stream->seek(offsetof(systemConfigData,gw));
return stream->write((uint8_t *) &addr, 4); int bytes = stream->write((uint8_t *) &addr, 4);
stream->flush();
return bytes;
} }
void systemConfig::clear() bool systemConfig::clear()
{ {
if (!stream) return ; if (!stream) return false;
stream->open('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');
@@ -183,6 +215,7 @@ bool systemConfig::isValidSysConf()
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->flush();
return true;
} }
/// ///

View File

@@ -91,7 +91,7 @@ class systemConfig {
uint8_t getSerialDebuglevel(); uint8_t getSerialDebuglevel();
uint8_t getUdpDebuglevel(); uint8_t getUdpDebuglevel();
void clear(); bool clear();
bool getSaveSuccedConfig(); bool getSaveSuccedConfig();
bool setSaveSuccedConfig(bool); bool setSaveSuccedConfig(bool);
bool getLoadHTTPConfig(); bool getLoadHTTPConfig();

View File

@@ -56,18 +56,49 @@ class flashStream : public seekableStream
{ {
private: private:
File fs; File fs;
String filename;
char openedMode;
public: public:
flashStream(String _filename):seekableStream(65535) flashStream(String _filename):seekableStream(65535)
{ {
fs = SPIFFS.open(_filename, "a+"); filename=_filename;
if (!fs) SPIFFS.open(_filename, "w+"); openedMode='\0';
open('r');
} }
virtual int available() { return fs.available(); };
virtual int read() {return fs.read();}; int open(char mode='\0')
virtual int peek() { return fs.peek();}; {
virtual unsigned int seek(unsigned int _pos = 0){return fs.seek(_pos,SeekSet);}; if (!mode && openedMode) mode=openedMode;
virtual void flush() {return fs.flush();}; if (!mode && !openedMode) mode='r';
virtual size_t write(uint8_t ch) {return fs.write(ch);}; if (openedMode!=mode)
{
char modestr[2];
modestr[0]=mode;modestr[1]=0;
unsigned int savedPos=fs.position();
if (fs) fs.close();
if (fs = SPIFFS.open(filename,modestr))
{
openedMode=mode;
fs.seek(savedPos);
debugSerial<<("Opened/")<<modestr<<(":")<<filename<<endl;
}
else
{
openedMode='\0';
debugSerial<<("Open error/")<<modestr<<(":")<<filename<<endl;
}
}
return fs;
}
virtual int available() { if (!fs) return 0; return fs.available(); };
virtual int read() {open('r');return fs.read();};
virtual int peek() {open('r'); return fs.peek();};
virtual unsigned int seek(unsigned int _pos = 0){return open();fs.seek(_pos,SeekSet);};
virtual void flush() {fs.flush(); open('r'); };
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);};
virtual ~flashStream () {if (fs) fs.close();} ; virtual ~flashStream () {if (fs) fs.close();} ;
@@ -87,23 +118,26 @@ 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 = _startPos; startPos = _startPos;
#if defined(ESP8266)
size_t len = EEPROM.length();
if (len) EEPROM.commit();
EEPROM.begin(len+streamSize); //Re-init
#endif
}; };
void setSize(unsigned int _size) {streamSize=_size;};
int open(bool write=false) {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(startPos+_pos, startPos+streamSize);
//debugSerial<<F("Seek:")<<pos<<endl; debugSerial<<F("Seek:")<<pos<<endl;
return pos; return pos;
}; };
virtual int available() { return (pos<streamSize);}; virtual int available() {
//debugSerial<<pos<<"%"<<streamSize<<";";
return (pos<streamSize);
};
virtual int read() virtual int read()
{ {
int ch = peek(); int ch = peek();
pos++; pos++;
//debugSerial<<"<"<<(char)ch;
return ch; return ch;
}; };
virtual int peek() virtual int peek()
@@ -113,22 +147,33 @@ flashStream(unsigned int _startPos=0, unsigned int _size=4096 ):seekableStream(_
else return -1; else return -1;
}; };
virtual void flush() { virtual void flush() {
#if defined(ESP8266) #if defined(ESP8266) || defined(ESP32)
EEPROM.commit(); if (EEPROM.commitReset())
infoSerial<<"Commited to FLASH"<<endl;
else errorSerial<<"Commit error. len:"<<EEPROM.length()<<endl;
#endif #endif
}; };
virtual size_t write(uint8_t ch) virtual size_t write(uint8_t ch)
{ {
//debugSerial<<">"<<(char)ch;
#if defined(__AVR__) #if defined(__AVR__)
EEPROM.update(pos++,(char)ch); EEPROM.update(pos++,(char)ch);
return 1; return 1;
#elif defined(__SAM3X8E__)
return EEPROM.write(pos++,(char)ch);
#else
EEPROM.write(pos++,(char)ch);
return 1;
#endif #endif
#if defined(__SAM3X8E__) // #if defined(__SAM3X8E__)
return EEPROM.write(pos++,(char)ch); // return EEPROM.write(pos++,(char)ch);
#endif // #else
return 0; // EEPROM.update(pos++,(char)ch);
// return 1;
// #endif
// return 0;
}; };
#if defined(__SAM3X8E__) #if defined(__SAM3X8E__)
@@ -143,7 +188,7 @@ flashStream(unsigned int _startPos=0, unsigned int _size=4096 ):seekableStream(_
using Print::write;//(const uint8_t *buffer, size_t size); using Print::write;//(const uint8_t *buffer, size_t size);
#endif #endif
void putEOF(){write (255); void putEOF(){write (255);
#if defined(ESP8266) #if defined(ESP8266) || defined(ESP32)
EEPROM.commit(); EEPROM.commit();
#endif #endif
}; };

View File

@@ -861,6 +861,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion)
debugSerial << F("Restored from:") << t << endl; debugSerial << F("Restored from:") << t << endl;
cmd.loadItemDef(this); cmd.loadItemDef(this);
cmd.Cmd(CMD_ON); //turning on cmd.Cmd(CMD_ON); //turning on
status2Send |= SEND_COMMAND | SEND_IMMEDIATE;
break; break;
default: default:
return -3; return -3;
@@ -956,6 +957,7 @@ int Item::Ctrl(itemCmd cmd, char* subItem, bool allowRecursion)
toExecute=true; toExecute=true;
if (itemType == CH_THERMO) cmd.Cmd(CMD_AUTO); //// if (itemType == CH_THERMO) cmd.Cmd(CMD_AUTO); ////
else cmd.Cmd(CMD_ON); //turning on else cmd.Cmd(CMD_ON); //turning on
status2Send |= SEND_COMMAND | SEND_IMMEDIATE;
break; break;
default: default:
return -3; return -3;

View File

@@ -27,9 +27,30 @@ e-mail anklimov@gmail.com
#include "TimerInterrupt_Generic.h" #include "TimerInterrupt_Generic.h"
#endif #endif
#ifdef SYSLOG_ENABLE
#include <Syslog.h>
#ifndef WIFI_ENABLE
EthernetUDP udpSyslogClient;
#else
WiFiUDP udpSyslogClient;
#endif
Syslog udpSyslog(udpSyslogClient, SYSLOG_PROTO_BSD);
static char syslogDeviceHostname[16];
Streamlog debugSerial(&debugSerialPort,LOG_DEBUG,&udpSyslog);
Streamlog errorSerial(&debugSerialPort,LOG_ERROR,&udpSyslog,ledRED);
Streamlog infoSerial (&debugSerialPort,LOG_INFO,&udpSyslog);
#else
Streamlog debugSerial(&debugSerialPort,LOG_DEBUG);
Streamlog errorSerial(&debugSerialPort,LOG_ERROR, ledRED);
Streamlog infoSerial (&debugSerialPort,LOG_INFO);
#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");
#else #else
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);
@@ -37,7 +58,6 @@ flashStream JSONStream(EEPROM_offsetJSON,MAX_JSON_CONF_SIZE);
systemConfig sysConf(&sysConfStream); systemConfig sysConf(&sysConfStream);
extern long timer0_overflow_count; extern long timer0_overflow_count;
#ifdef WIFI_ENABLE #ifdef WIFI_ENABLE
WiFiClient ethClient; WiFiClient ethClient;
@@ -64,33 +84,10 @@ EthernetClient ethClient;
MDNS mdns(mdnsUDP); MDNS mdns(mdnsUDP);
#endif #endif
#ifdef SYSLOG_ENABLE
#include <Syslog.h>
#ifndef WIFI_ENABLE
EthernetUDP udpSyslogClient;
#else
WiFiUDP udpSyslogClient;
#endif
Syslog udpSyslog(udpSyslogClient, SYSLOG_PROTO_BSD);
//unsigned long timerSyslogPingTime;
static char syslogDeviceHostname[16];
Streamlog debugSerial(&debugSerialPort,LOG_DEBUG,&udpSyslog);
Streamlog errorSerial(&debugSerialPort,LOG_ERROR,&udpSyslog,ledRED);
Streamlog infoSerial (&debugSerialPort,LOG_INFO,&udpSyslog);
#else
Streamlog debugSerial(&debugSerialPort,LOG_DEBUG);
Streamlog errorSerial(&debugSerialPort,LOG_ERROR, ledRED);
Streamlog infoSerial (&debugSerialPort,LOG_INFO);
#endif
StatusLED statusLED(ledRED); StatusLED statusLED(ledRED);
lan_status lanStatus = INITIAL_STATE; lan_status lanStatus = INITIAL_STATE;
const char configserver[] PROGMEM = CONFIG_SERVER; const char configserver[] PROGMEM = CONFIG_SERVER;
const char verval_P[] PROGMEM = QUOTE(PIO_SRC_REV); const char verval_P[] PROGMEM = QUOTE(PIO_SRC_REV);
@@ -132,20 +129,18 @@ bool owReady = false;
bool configOk = false; // At least once connected to MQTT bool configOk = false; // At least once connected to MQTT
bool configLoaded = false; bool configLoaded = false;
bool initializedListeners = false; bool initializedListeners = false;
int8_t ethernetIdleCount =0; volatile int8_t ethernetIdleCount =0;
int8_t configLocked = 0; volatile int8_t configLocked = 0;
#if defined (_modbus) #if defined (_modbus)
ModbusMaster node; ModbusMaster node;
#endif #endif
//byte mac[6];
PubSubClient mqttClient(ethClient); PubSubClient mqttClient(ethClient);
bool wifiInitialized; bool wifiInitialized;
int mqttErrorRate; int8_t mqttErrorRate=0;
#if defined(__SAM3X8E__) #if defined(__SAM3X8E__)
void watchdogSetup(void) {} //Do not remove - strong re-definition WDT Init for DUE void watchdogSetup(void) {} //Do not remove - strong re-definition WDT Init for DUE
@@ -286,11 +281,11 @@ int httpHandler(Client& client, String request, long contentLength, bool authori
#ifdef CORS #ifdef CORS
client.print(F("Access-Control-Allow-Origin: ")); client.print(F("Access-Control-Allow-Origin: "));
client.println(CORS); client.println(F(CORS));
#endif #endif
if (response!="") { if (response!="") {
client.println("Content-Type: text/plain"); client.println(F("Content-Type: text/plain"));
client.println(); client.println();
client.println(response); client.println(response);
} }
@@ -846,7 +841,7 @@ void ip_ready_config_loaded_connecting_to_broker() {
#ifdef RESTART_LAN_ON_MQTT_ERRORS #ifdef RESTART_LAN_ON_MQTT_ERRORS
mqttErrorRate++; mqttErrorRate++;
if(mqttErrorRate>50){ if(mqttErrorRate>50){
errorSerial<<F("Too many MQTT connection errors. Restart LAN")); errorSerial<<F("Too many MQTT connection errors. Restart LAN")<<endl;
mqttErrorRate=0; mqttErrorRate=0;
#ifdef RESET_PIN #ifdef RESET_PIN
resetHard(); resetHard();
@@ -907,7 +902,6 @@ if (WiFi.status() == WL_CONNECTED) {
*/ */
#else // Ethernet connection #else // Ethernet connection
//macAddress * mac = sysConf.getMAC();
IPAddress ip, dns, gw, mask; IPAddress ip, dns, gw, mask;
int res = 1; int res = 1;
infoSerial<<F("Starting lan")<<endl; infoSerial<<F("Starting lan")<<endl;
@@ -1212,12 +1206,7 @@ void printConfigSummary() {
infoSerial<<F("\n1-wire "); infoSerial<<F("\n1-wire ");
printBool(owArr); printBool(owArr);
#endif #endif
/*
#ifdef SYSLOG_ENABLE
infoSerial<<F("\nudp syslog ");
printBool(udpSyslogArr);
#endif
*/
infoSerial << endl; infoSerial << endl;
infoSerial<<F("RAM=")<<freeRam()<<endl; infoSerial<<F("RAM=")<<freeRam()<<endl;
} }
@@ -1231,6 +1220,7 @@ int loadConfigFromEEPROM()
{ {
char ch; char ch;
infoSerial<<F("Loading Config from EEPROM")<<endl; infoSerial<<F("Loading Config from EEPROM")<<endl;
JSONStream.open('r');
JSONStream.seek(); JSONStream.seek();
if (JSONStream.peek() == '{') { if (JSONStream.peek() == '{') {
aJsonStream as = aJsonStream(&JSONStream); aJsonStream as = aJsonStream(&JSONStream);
@@ -1271,17 +1261,19 @@ if (arg_cnt>1)
aJsonStringStream stringStream(NULL, outBuf, MAX_JSON_CONF_SIZE); aJsonStringStream stringStream(NULL, outBuf, MAX_JSON_CONF_SIZE);
aJson.print(root, &stringStream); aJson.print(root, &stringStream);
int len = strlen(outBuf); int len = strlen(outBuf);
outBuf[len++]= EOF; outBuf[len++]= 255;
JSONStream.seek(); JSONStream.seek();
size_t res = JSONStream.write((byte*) outBuf,len); size_t res = JSONStream.write((byte*) outBuf,len);
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.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();
infoSerial<<F("Saved to EEPROM")<<endl; infoSerial<<F("Saved to EEPROM")<<endl;
#endif #endif
} }
@@ -1356,7 +1348,7 @@ void cmdFunctionIp(int arg_cnt, char **args)
} }
void cmdFunctionClearEEPROM(int arg_cnt, char **args){ void cmdFunctionClearEEPROM(int arg_cnt, char **args){
sysConf.clear(); if (sysConf.clear())
infoSerial<<F("EEPROM cleared\n"); infoSerial<<F("EEPROM cleared\n");
} }
@@ -1651,6 +1643,39 @@ void setup_main() {
delay(1000); delay(1000);
#endif #endif
#ifndef ESP_EEPROM_SIZE
#define ESP_EEPROM_SIZE 4096-10
#endif
#if defined (FS_STORAGE)
#if defined(FS_PREPARE)
//Initialize File System
if(SPIFFS.begin(true))
{
debugSerial<<("SPIFFS Initialize....ok")<<endl;
}
else
{
debugSerial<<("SPIFFS Initialization...failed")<<endl;
}
#endif
#else
#if defined(ESP8266) || defined(ESP32)
EEPROM.begin(ESP_EEPROM_SIZE);
int streamSize = EEPROM.length();
JSONStream.setSize(streamSize-EEPROM_offsetJSON);
debugSerial<<F("FLASH Init: ")<<streamSize<<endl;
#endif
#endif
//Checkin EEPROM integrity (signature)
if (!sysConf.isValidSysConf())
{
infoSerial<<F("No valid EEPROM data")<<endl;
sysConf.clear();
}
// scan_i2c_bus();
serialDebugLevel=sysConf.getSerialDebuglevel(); serialDebugLevel=sysConf.getSerialDebuglevel();
udpDebugLevel=sysConf.getUdpDebuglevel(); udpDebugLevel=sysConf.getUdpDebuglevel();
@@ -1666,33 +1691,11 @@ void setup_main() {
setupCmdArduino(); setupCmdArduino();
printFirmwareVersionAndBuildOptions(); printFirmwareVersionAndBuildOptions();
//Checkin EEPROM integrity (signature)
if (!sysConf.isValidSysConf()) sysConf.clear();
// scan_i2c_bus();
#ifdef SD_CARD_INSERTED #ifdef SD_CARD_INSERTED
sd_card_w5100_setup(); sd_card_w5100_setup();
#endif #endif
setupMacAddress(); setupMacAddress();
/*
#if defined(ARDUINO_ARCH_ESP8266)
EEPROM.begin(ESP_EEPROM_SIZE);
#endif
*/
#if defined(FS_PREPARE)
//Initialize File System
if(SPIFFS.begin(true))
{
debugSerial<<("SPIFFS Initialize....ok")<<endl;
}
else
{
debugSerial<<("SPIFFS Initialization...failed")<<endl;
}
#endif
#ifdef _modbus #ifdef _modbus
#ifdef CONTROLLINO #ifdef CONTROLLINO
@@ -1735,7 +1738,6 @@ void setup_main() {
#endif #endif
delay(LAN_INIT_DELAY);//for LAN-shield initializing delay(LAN_INIT_DELAY);//for LAN-shield initializing
//TODO: checkForRemoteSketchUpdate();
#if defined(W5500_CS_PIN) && ! defined(WIFI_ENABLE) #if defined(W5500_CS_PIN) && ! defined(WIFI_ENABLE)
Ethernet.init(W5500_CS_PIN); Ethernet.init(W5500_CS_PIN);
@@ -2064,7 +2066,9 @@ void ethernetIdle(void){
ethernetIdleCount++; ethernetIdleCount++;
wdt_res(); wdt_res();
yield(); yield();
inputLoop(CHECK_INPUT); inputLoop(CHECK_INTERRUPT);
yield();
cmdPoll();
ethernetIdleCount--; ethernetIdleCount--;
}; };

View File

@@ -116,6 +116,7 @@ lib_deps =
https://github.com/arcao/Syslog.git https://github.com/arcao/Syslog.git
br3ttb/PID@^1.2.1 br3ttb/PID@^1.2.1
TimerInterrupt_Generic TimerInterrupt_Generic
d00616/arduino-NVM @ ^0.9.1
monitor_speed = 115200 monitor_speed = 115200
@@ -138,7 +139,8 @@ lib_ignore =
Ethernet2 Ethernet2
Ethernet3 Ethernet3
Ethernet5100 Ethernet5100
EEPROM ESP_EEPROM
;EEPROM
Artnet Artnet
UIPEthernet UIPEthernet
ESP_EEPROM ESP_EEPROM
@@ -204,7 +206,8 @@ lib_ignore =
Ethernet2 Ethernet2
Ethernet3 Ethernet3
Ethernet5100 Ethernet5100
EEPROM ;EEPROM
ESP_EEPROM
UIPEthernet UIPEthernet
ESP_EEPROM ESP_EEPROM
httpClient httpClient
@@ -219,7 +222,7 @@ lib_deps =
https://github.com/anklimov/CmdArduino https://github.com/anklimov/CmdArduino
https://github.com/knolleary/pubsubclient.git https://github.com/knolleary/pubsubclient.git
Streaming Streaming
;ESP_EEPROM ;EEPROM
;https://github.com/anklimov/NRFFlashStorage ;https://github.com/anklimov/NRFFlashStorage
Adafruit Unified Sensor Adafruit Unified Sensor
DHT sensor library for ESPx DHT sensor library for ESPx
@@ -371,8 +374,8 @@ board_build.f_cpu = 16000000L
;build_unflags = -flto - not working without LTO! ;build_unflags = -flto - not working without LTO!
;upload_protocol = arduino ;upload_protocol = arduino
;upload_command = arduinoOTA -address 192.168.11.213 -port 65280 -username arduino -password password -b -upload /sketch -sketch $BUILD_DIR/${PROGNAME}.bin;sleep 5 upload_command = arduinoOTA -address 192.168.11.213 -port 65280 -username arduino -password password -b -upload /sketch -sketch $BUILD_DIR/${PROGNAME}.bin;sleep 5
;upload_protocol = custom upload_protocol = custom
board_upload.speed = ${env:fuses_bootloader.board_bootloader.speed} board_upload.speed = ${env:fuses_bootloader.board_bootloader.speed}
framework = arduino framework = arduino
@@ -599,9 +602,9 @@ framework = arduino
board = due board = due
monitor_baud = 115200 monitor_baud = 115200
build_flags = !python get_build_flags.py lighthub21 build_flags = !python get_build_flags.py lighthub21
;upload_command = arduinoOTA -address 192.168.11.172 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE ;sleep 6 upload_command = arduinoOTA -address 192.168.11.172 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE ;sleep 6
;upload_command = arduinoOTA -address 192.168.88.45 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE;sleep 6 ;upload_command = arduinoOTA -address 192.168.88.45 -port 65280 -username arduino -password password -b -upload /sketch -sketch $SOURCE;sleep 6
;upload_protocol = custom upload_protocol = custom
lib_ignore = lib_ignore =
;DS2482_OneWire //UNCOMMENT for software 1-wire driver ;DS2482_OneWire //UNCOMMENT for software 1-wire driver
DHT sensor library for ESPx DHT sensor library for ESPx