diff --git a/build-flags/build_flags_esp32-wifi b/build-flags/build_flags_esp32-wifi index bf5603d..103fbcf 100644 --- a/build-flags/build_flags_esp32-wifi +++ b/build-flags/build_flags_esp32-wifi @@ -9,8 +9,9 @@ -DSYSLOG_ENABLE # - udp errors -DOTA -#-DARDUINO_OTA_MDNS_DISABLE -#-DMDNS_ENABLE - ArduinoMDNS didnt working +-DARDUINO_OTA_MDNS_DISABLE +#-DMDNS_ENABLE +#- ArduinoMDNS didnt working -DMCP23017 -DMODBUS_TX_PIN=13 @@ -42,4 +43,6 @@ #-DAUTOCONNECT_RECONNECT_WAITTIME=60 -DFS_STORAGE --DFS_PREPARE \ No newline at end of file +-DFS_PREPARE + +-D CORS=\"http://lazyhome.ru\" diff --git a/lighthub/config.cpp b/lighthub/config.cpp index db677ae..a6645a4 100644 --- a/lighthub/config.cpp +++ b/lighthub/config.cpp @@ -1,5 +1,14 @@ #include "config.h" +int systemConfig::openStream(char mode) + { + #if defined(FS_STORAGE) + stream->open("/config.bin",mode); + #else + stream->open(FN_CONFIG_BIN,mode); + #endif + stream->setSize(SYSCONF_SIZE); + }; bool systemConfig::isValidSysConf() { @@ -34,7 +43,7 @@ bool systemConfig::isValidSysConf() bool systemConfig::setMAC(macAddress& _mac) { if (!stream || !isValidSysConf()) return false; - openStream('w'); + openStream('a'); stream->seek(offsetof(systemConfigData,mac)); stream->write ((const uint8_t *)&_mac,sizeof(_mac)); memcpy(mac, _mac, sizeof(mac)); @@ -44,11 +53,15 @@ bool systemConfig::isValidSysConf() char * systemConfig::getMQTTpwd(char * buffer, uint16_t bufLen) { - if (!stream || !isValidSysConf()) return NULL; + if (!stream || !isValidSysConf()) return NULL; openStream('r'); stream->seek(offsetof(systemConfigData,MQTTpwd)); short bytes=stream->readBytesUntil(0,buffer,bufLen-1); stream->close(); + Serial.println("valid"); + Serial.println(offsetof(systemConfigData,MQTTpwd)); + Serial.println(bytes); + Serial.write(buffer,bytes); if (bytes) { buffer[bytes]=0; @@ -60,7 +73,7 @@ bool systemConfig::isValidSysConf() bool systemConfig::setMQTTpwd(char * pwd) { if (!stream || !isValidSysConf() || (strlen(pwd)>=sizeof(systemConfigData::MQTTpwd))) return false; - openStream('w'); + openStream('r'); stream->seek(offsetof(systemConfigData,MQTTpwd)); stream->print(pwd); int bytes = stream->write((uint8_t)'\0'); @@ -87,7 +100,7 @@ bool systemConfig::isValidSysConf() bool systemConfig::setOTApwd(char * pwd) { if (!stream || !isValidSysConf() || (strlen(pwd)>=sizeof(systemConfigData::OTApwd))) return false; - openStream('w'); + openStream('r'); stream->seek(offsetof(systemConfigData,OTApwd)); stream->print(pwd); int bytes = stream->write((uint8_t)'\0'); @@ -114,7 +127,7 @@ bool systemConfig::isValidSysConf() bool systemConfig::setServer(char* url) { if (!stream || !isValidSysConf() || (strlen(url)>=sizeof(systemConfigData::configURL))) return false; - openStream('w'); + openStream('r'); stream->seek(offsetof(systemConfigData,configURL)); stream->print(url); int bytes = stream->write((uint8_t)'\0'); @@ -183,7 +196,7 @@ bool systemConfig::isValidSysConf() bool systemConfig::setMask(IPAddress& mask) { uint32_t addr = mask; if (!stream || !isValidSysConf()) return false; - openStream('w'); + openStream('r'); stream->seek(offsetof(systemConfigData,mask)); int bytes = stream->write((uint8_t *) &addr, 4); stream->close(); @@ -193,7 +206,7 @@ bool systemConfig::isValidSysConf() bool systemConfig::setDNS(IPAddress& dns) { uint32_t addr = dns; if (!stream || !isValidSysConf()) return false; - openStream('w'); + openStream('r'); stream->seek(offsetof(systemConfigData,dns)); int bytes = stream->write((uint8_t *) &addr, 4); stream->close(); @@ -204,7 +217,7 @@ bool systemConfig::isValidSysConf() bool systemConfig::setGW(IPAddress& gw) { uint32_t addr = gw; if (!stream || !isValidSysConf()) return false; - openStream('w'); + openStream('r'); stream->seek(offsetof(systemConfigData,gw)); int bytes = stream->write((uint8_t *) &addr, 4); stream->close(); diff --git a/lighthub/config.h b/lighthub/config.h index d315aa9..e80997b 100644 --- a/lighthub/config.h +++ b/lighthub/config.h @@ -6,67 +6,14 @@ #include #include "flashstream.h" #include - -#define MAXFLASHSTR 32 -#define PWDFLASHSTR 16 -#define EEPROM_SIGNATURE "LHCF" -#define EEPROM_SIGNATURE_LENGTH 4 -const char EEPROM_signature[] = EEPROM_SIGNATURE; - -#define SYSCONF_OFFSET 0 - -#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 IFLASH_PAGE_SIZE -#define EEPROM_FIX_PART_LEN EEPROM_offsetJSON-SYSCONF_OFFSET - - typedef char flashstr[MAXFLASHSTR]; - typedef char flashpwd[PWDFLASHSTR]; - typedef uint8_t macAddress[6]; - - #pragma pack(push, 1) - 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; - }; - }; - uint32_t ip; - uint32_t dns; - uint32_t gw; - uint32_t mask; - - flashstr configURL; - flashpwd MQTTpwd; - flashpwd OTApwd; - - uint16_t sysConfigHash; - uint16_t JSONHash; - - } systemConfigData; - #pragma (pop) +#include "systemconfigdata.h" + class systemConfig { private: flashStream * stream; - int openStream(char mode = '\0') - { - #if defined(FS_STORAGE) - stream->open("/config.bin",mode); - #else - stream->open(EEPROM_offsetJSON,mode); - #endif - }; - + int openStream(char mode = '\0'); + public: macAddress mac; systemConfig() {stream=NULL;}; diff --git a/lighthub/flashstream.cpp b/lighthub/flashstream.cpp index 9c96f7d..4952066 100644 --- a/lighthub/flashstream.cpp +++ b/lighthub/flashstream.cpp @@ -1,4 +1,39 @@ -#include +#include "flashstream.h" +#include "systemconfigdata.h" + +#include +#include + + + +#if defined(ARDUINO_ARCH_AVR) +#include +#endif + +#if defined(ESP32) && !defined(FS_STORAGE) +#include +#endif + +#if defined(ARDUINO_ARCH_ESP8266) +#include +#endif + + +#if defined(__SAM3X8E__) +#include +extern DueFlashStorage EEPROM; +#endif + +#ifdef NRF5 +#include //STUB +extern NRFFlashStorage EEPROM; +#endif + +#ifdef ARDUINO_ARCH_STM32 +#include //STUB +extern NRFFlashStorage EEPROM; +#endif + #if defined(__SAM3X8E__) DueFlashStorage EEPROM; @@ -10,4 +45,185 @@ NRFFlashStorage EEPROM; #ifdef ARDUINO_ARCH_STM32 NRFFlashStorage EEPROM; +#endif + +#if defined(FS_STORAGE) + + + int flashStream::open(String _filename, char mode) + { + char modestr[4]; + modestr[0]=mode; modestr[1]='b'; modestr[2]='+'; modestr[3]='\0'; + if (fs) fs.close(); + filename=_filename; + + if (fs = SPIFFS.open(_filename,modestr)) + { + openedMode=mode; + + if (_filename.endsWith(".json")) {contentType=HTTP_TEXT_JSON;textMode=true;} + else if (_filename.endsWith(".bin")) {contentType=HTTP_OCTET_STREAM;textMode=false;} + else if (_filename.endsWith(".txt")) {contentType=HTTP_TEXT_PLAIN;textMode=true;} + else if (_filename.endsWith(".html")) {contentType=HTTP_TEXT_HTML;textMode=true;} + else if (_filename.endsWith(".gif")) {contentType=HTTP_IMAGE_GIF;textMode=false;} + else if (_filename.endsWith(".jpg")) {contentType=HTTP_IMAGE_JPEG;textMode=false;} + + + debugSerial<<(F("Opened ("))<streamSize) _pos=streamSize; + unsigned int res = fs.seek(_pos,SeekSet); + debugSerial<<(F(" Res:"))<"<<(char)ch; + #if defined(__AVR__) + EEPROM.update(startPos+pos++,(char)ch); + return 1; + #elif defined(__SAM3X8E__) + return EEPROM.write(startPos+pos++,(char)ch); + #else + EEPROM.write(startPos+pos++,(char)ch); + return 1; + #endif + }; + + #if defined(__SAM3X8E__) + size_t flashStream::write(const uint8_t *buffer, size_t size) + { + //debugSerial<<("Write from:")< -#include + + +#include +#include +#include "seekablestream.h" +//#include "config.h" #if defined(FS_STORAGE) #include #include #endif -#if defined(ARDUINO_ARCH_AVR) -#include -#endif +#define FN_CONFIG_JSON 1 +#define FN_CONFIG_BIN 2 -#if defined(ESP32) && !defined(FS_STORAGE) -#include -#endif - -#if defined(ARDUINO_ARCH_ESP8266) -#include -#endif - - -#if defined(__SAM3X8E__) -#include -extern DueFlashStorage EEPROM; -#endif - -#ifdef NRF5 -#include //STUB -extern NRFFlashStorage EEPROM; -#endif - -#ifdef ARDUINO_ARCH_STM32 -#include //STUB -extern NRFFlashStorage EEPROM; -#endif - - -#include -#include -#include "seekablestream.h" - -#define EOF 255 #if defined(FS_STORAGE) class flashStream : public seekableStream @@ -53,130 +26,36 @@ String filename; char openedMode; File fs; public: -flashStream():seekableStream(65535) + flashStream():seekableStream(65535) { openedMode='\0'; - //fs = 0; filename = ""; - // open('r'); - }; - - virtual int open(String _filename, char mode) override - { - char modestr[2]; - modestr[0]=mode; modestr[1]=0; - filename=_filename; - - if (fs = SPIFFS.open(_filename,modestr)) - { - openedMode=mode; - //fs.seek(savedPos); - - if (_filename.endsWith(".json")) {contentType=HTTP_TEXT_JSON;textMode=true;} - else if (_filename.endsWith(".bin")) {contentType=HTTP_OCTET_STREAM;textMode=false;} - else if (_filename.endsWith(".txt")) {contentType=HTTP_TEXT_PLAIN;textMode=true;} - - - debugSerial<<("Opened/")<"<<(char)ch; - #if defined(__AVR__) - EEPROM.update(startPos+pos++,(char)ch); - return 1; - #elif defined(__SAM3X8E__) - return EEPROM.write(startPos+pos++,(char)ch); - #else - EEPROM.write(startPos+pos++,(char)ch); - return 1; - #endif - }; + virtual unsigned int seek(unsigned int _pos = 0); + virtual int available() override; + virtual int read() ; + virtual int peek() ; + virtual void flush(); + virtual size_t write(uint8_t ch) ; - #if defined(__SAM3X8E__) - virtual size_t write(const uint8_t *buffer, size_t size) override - { - //debugSerial<<("Write from:")<child; -while (items && item) - { - if (item->type == aJson_Array && aJson.getArraySize(item)>0) +if (root && items) +{ + debugSerial<child; + while (item) { - Item it(item->name); - if (it.isValid()) it.Stop(); - yield(); + if (item->type == aJson_Array && aJson.getArraySize(item)>0) + { + Item it(item->name); + if (it.isValid()) it.Stop(); + yield(); + } + item = item->next; } - item = item->next; - } +} pollingItem = NULL; debugSerial<1) #if defined(FS_STORAGE) sysConfStream.open("/config.json",'w'); #else - sysConfStream.open(EEPROM_offsetJSON,'w'); + sysConfStream.open(FN_CONFIG_JSON,'w'); #endif #if defined(__SAM3X8E__) @@ -1281,8 +1287,8 @@ if (arg_cnt>1) aJson.print(root, &stringStream); int len = strlen(outBuf); outBuf[len++]= 255; - JSONStream.seek(); - size_t res = JSONStream.write((byte*) outBuf,len); + //JSONStream.seek(); + size_t res = sysConfStream.write((byte*) outBuf,len); free (outBuf); infoSerial<1) { - if (!strcasecmp_P(args[1],ON_P)) sysConf.setLoadHTTPConfig(true); - if (!strcasecmp_P(args[1],OFF_P)) sysConf.setLoadHTTPConfig(false); + if (!strcasecmp_P(args[1],ON_P)) {sysConf.setLoadHTTPConfig(true); return;}; + if (!strcasecmp_P(args[1],OFF_P)) {sysConf.setLoadHTTPConfig(false); return;}; + infoSerial< #include +#define EOFchar 255 + class seekableStream : public Stream { protected: unsigned int streamSize; -bool textMode; -uint16_t contentType; +bool textMode; +uint16_t contentType; public: seekableStream(unsigned int size):Stream(),streamSize(size) {}; -unsigned int getSize() {return streamSize;} +unsigned int getSize() {return streamSize;} +void setSize (unsigned int size) {streamSize = size;}; 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; -virtual void close() = 0; +virtual int open(String _filename, char mode) = 0; +virtual void close() = 0; virtual uint16_t getContentType() {return contentType;}; -virtual void putEOF() {if (textMode) write (EOF);}; +virtual void putEOF() {if (textMode) write (EOFchar);}; }; #endif \ No newline at end of file diff --git a/lighthub/systemconfigdata.h b/lighthub/systemconfigdata.h new file mode 100644 index 0000000..40aebb0 --- /dev/null +++ b/lighthub/systemconfigdata.h @@ -0,0 +1,48 @@ +#define SYSCONF_OFFSET 0 +#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 MAXFLASHSTR 32 +#define PWDFLASHSTR 16 +#define EEPROM_SIGNATURE "LHCF" +#define EEPROM_SIGNATURE_LENGTH 4 + +//#define EEPROM_offsetJSON IFLASH_PAGE_SIZE +#define EEPROM_FIX_PART_LEN EEPROM_offsetJSON-SYSCONF_OFFSET + +const char EEPROM_signature[] = EEPROM_SIGNATURE; + + typedef char flashstr[MAXFLASHSTR]; + typedef char flashpwd[PWDFLASHSTR]; + typedef uint8_t macAddress[6]; + + #pragma pack(push, 1) + 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; + }; + }; + uint32_t ip; + uint32_t dns; + uint32_t gw; + uint32_t mask; + + flashstr configURL; + flashpwd MQTTpwd; + flashpwd OTApwd; + + uint16_t sysConfigHash; + uint16_t JSONHash; + + } systemConfigData; + #pragma (pop) \ No newline at end of file