diff --git a/esp8266/LinkedList.h b/esp8266/LinkedList.h new file mode 100644 index 00000000..d9139520 --- /dev/null +++ b/esp8266/LinkedList.h @@ -0,0 +1,324 @@ +/* + LinkedList.h - V1.1 - Generic LinkedList implementation + Works better with FIFO, because LIFO will need to + search the entire List to find the last one; + + For instructions, go to https://github.com/ivanseidel/LinkedList + + Created by Ivan Seidel Gomes, March, 2013. + Released into the public domain. + Changelog: 2015/10/05: [Luc] Change false to NULL for pointers +*/ + + +#ifndef LinkedList_h +#define LinkedList_h + +template +struct ListNode +{ + T data; + ListNode *next; +}; + +template +class LinkedList{ + +protected: + int _size; + ListNode *root; + ListNode *last; + + // Helps "get" method, by saving last position + ListNode *lastNodeGot; + int lastIndexGot; + // isCached should be set to FALSE + // everytime the list suffer changes + bool isCached; + + ListNode* getNode(int index); + +public: + LinkedList(); + ~LinkedList(); + + /* + Returns current size of LinkedList + */ + virtual int size(); + /* + Adds a T object in the specified index; + Unlink and link the LinkedList correcly; + Increment _size + */ + virtual bool add(int index, T); + /* + Adds a T object in the end of the LinkedList; + Increment _size; + */ + virtual bool add(T); + /* + Adds a T object in the start of the LinkedList; + Increment _size; + */ + virtual bool unshift(T); + /* + Set the object at index, with T; + Increment _size; + */ + virtual bool set(int index, T); + /* + Remove object at index; + If index is not reachable, returns false; + else, decrement _size + */ + virtual T remove(int index); + /* + Remove last object; + */ + virtual T pop(); + /* + Remove first object; + */ + virtual T shift(); + /* + Get the index'th element on the list; + Return Element if accessible, + else, return false; + */ + virtual T get(int index); + + /* + Clear the entire array + */ + virtual void clear(); + +}; + +// Initialize LinkedList with false values +template +LinkedList::LinkedList() +{ + root=NULL; + last=NULL; + _size=0; + + lastNodeGot = root; + lastIndexGot = 0; + isCached = false; +} + +// Clear Nodes and free Memory +template +LinkedList::~LinkedList() +{ + ListNode* tmp; + while(root!=NULL) + { + tmp=root; + root=root->next; + delete tmp; + } + last = NULL; + _size=0; + isCached = false; +} + +/* + Actualy "logic" coding +*/ + +template +ListNode* LinkedList::getNode(int index){ + + int _pos = 0; + ListNode* current = root; + + // Check if the node trying to get is + // immediatly AFTER the previous got one + if(isCached && lastIndexGot <= index){ + _pos = lastIndexGot; + current = lastNodeGot; + } + + while(_pos < index && current){ + current = current->next; + + _pos++; + } + + // Check if the object index got is the same as the required + if(_pos == index){ + isCached = true; + lastIndexGot = index; + lastNodeGot = current; + + return current; + } + + return NULL; +} + +template +int LinkedList::size(){ + return _size; +} + +template +bool LinkedList::add(int index, T _t){ + + if(index >= _size) + return add(_t); + + if(index == 0) + return unshift(_t); + + ListNode *tmp = new ListNode(), + *_prev = getNode(index-1); + tmp->data = _t; + tmp->next = _prev->next; + _prev->next = tmp; + + _size++; + isCached = false; + + return true; +} + +template +bool LinkedList::add(T _t){ + + ListNode *tmp = new ListNode(); + tmp->data = _t; + tmp->next = NULL; + + if(root){ + // Already have elements inserted + last->next = tmp; + last = tmp; + }else{ + // First element being inserted + root = tmp; + last = tmp; + } + + _size++; + isCached = false; + + return true; +} + +template +bool LinkedList::unshift(T _t){ + + if(_size == 0) + return add(_t); + + ListNode *tmp = new ListNode(); + tmp->next = root; + tmp->data = _t; + root = tmp; + + _size++; + isCached = false; + + return true; +} + +template +bool LinkedList::set(int index, T _t){ + // Check if index position is in bounds + if(index < 0 || index >= _size) + return false; + + getNode(index)->data = _t; + return true; +} + +template +T LinkedList::pop(){ + if(_size <= 0) + return T(); + + isCached = false; + + if(_size >= 2){ + ListNode *tmp = getNode(_size - 2); + T ret = tmp->next->data; + delete(tmp->next); + tmp->next = NULL; + last = tmp; + _size--; + return ret; + }else{ + // Only one element left on the list + T ret = root->data; + delete(root); + root = NULL; + last = NULL; + _size = 0; + return ret; + } +} + +template +T LinkedList::shift(){ + if(_size <= 0) + return T(); + + if(_size > 1){ + ListNode *_next = root->next; + T ret = root->data; + delete(root); + root = _next; + _size --; + isCached = false; + + return ret; + }else{ + // Only one left, then pop() + return pop(); + } + +} + +template +T LinkedList::remove(int index){ + if (index < 0 || index >= _size) + { + return T(); + } + + if(index == 0) + return shift(); + + if (index == _size-1) + { + return pop(); + } + + ListNode *tmp = getNode(index - 1); + ListNode *toDelete = tmp->next; + T ret = toDelete->data; + tmp->next = tmp->next->next; + delete(toDelete); + _size--; + isCached = false; + return ret; +} + + +template +T LinkedList::get(int index){ + ListNode *tmp = getNode(index); + + return (tmp ? tmp->data : T()); +} + +template +void LinkedList::clear(){ + while(size() > 0) + shift(); +} + +#endif diff --git a/esp8266/command.cpp b/esp8266/command.cpp index 3aeae033..71d0495b 100644 --- a/esp8266/command.cpp +++ b/esp8266/command.cpp @@ -91,7 +91,7 @@ void COMMAND::check_command(String buffer) cmd_part2=buffer.substring(ESPpos2+1); } //if command is a valid number then execute command - if(atoi(cmd_part1.c_str())!=0)execute_command(atoi(cmd_part1.c_str()),cmd_part2); + if(cmd_part1.toInt()!=0)execute_command(cmd_part1.toInt(),cmd_part2); //if not is not a valid [ESPXXX] command } } diff --git a/esp8266/config.cpp b/esp8266/config.cpp index 1ecfaab8..162d9f6d 100644 --- a/esp8266/config.cpp +++ b/esp8266/config.cpp @@ -19,15 +19,16 @@ */ #include "config.h" #include +#include "wifi.h" //read a string //a string is multibyte + \0, this is won't work if 1 char is multibyte like chinese char -bool CONFIG::read_string(word pos, char byte_buffer[], word size_max) +bool CONFIG::read_string(int pos, char byte_buffer[], int size_max) { //check if parameters are acceptable if (size_max==0 || pos+size_max+1 > EEPROM_SIZE || byte_buffer== NULL)return false; byte b=0; - word i=0; + int i=0; //read first byte b = EEPROM.read(pos + i); byte_buffer[i]=b; @@ -44,12 +45,33 @@ bool CONFIG::read_string(word pos, char byte_buffer[], word size_max) return true; } +bool CONFIG::read_string(int pos, String & sbuffer, int size_max) +{ + //check if parameters are acceptable + if (size_max==0 || pos+size_max+1 > EEPROM_SIZE )return false; + byte b=0; + int i=0; + sbuffer=""; + //read first byte + b = EEPROM.read(pos + i); + sbuffer+=char(b); + i++; + //read until max size is reached or \0 is found + while (i EEPROM_SIZE || byte_buffer== NULL)return false; - word i=0; + int i=0; //read until max size is reached while (i EEPROM_SIZE)return false; @@ -68,13 +90,21 @@ bool CONFIG::read_byte(word pos, byte * value) return true; } -//write a string (array of byte with a 0x00 at the end) -bool CONFIG::write_string(word pos, const char * byte_buffer, word size_buffer) +bool CONFIG::write_string(int pos, const __FlashStringHelper *str) { + String stmp = str; + return write_string(pos,stmp.c_str()); +} + +//write a string (array of byte with a 0x00 at the end) +bool CONFIG::write_string(int pos, const char * byte_buffer) +{ + int size_buffer; + size_buffer= strlen(byte_buffer); //check if parameters are acceptable if (size_buffer==0 || pos+size_buffer+1 > EEPROM_SIZE || byte_buffer== NULL)return false; //copy the value(s) - for (word i = 0; i < size_buffer; i++) { + for (int i = 0; i < size_buffer; i++) { EEPROM.write(pos + i, byte_buffer[i]); } @@ -85,12 +115,12 @@ bool CONFIG::write_string(word pos, const char * byte_buffer, word size_buffer) } //write a buffer -bool CONFIG::write_buffer(word pos, const byte * byte_buffer, word size_buffer) +bool CONFIG::write_buffer(int pos, const byte * byte_buffer, int size_buffer) { //check if parameters are acceptable if (size_buffer==0 || pos+size_buffer > EEPROM_SIZE || byte_buffer== NULL)return false; //copy the value(s) - for (word i = 0; i < size_buffer; i++) { + for (int i = 0; i < size_buffer; i++) { EEPROM.write(pos + i, byte_buffer[i]); } EEPROM.commit(); @@ -98,7 +128,7 @@ bool CONFIG::write_buffer(word pos, const byte * byte_buffer, word size_buffer) } //read a flag / byte -bool CONFIG::write_byte(word pos, const byte value) +bool CONFIG::write_byte(int pos, const byte value) { //check if parameters are acceptable if (pos+1 > EEPROM_SIZE)return false; @@ -110,44 +140,54 @@ bool CONFIG::write_byte(word pos, const byte value) bool CONFIG::reset_config() { if(!CONFIG::write_byte(EP_WIFI_MODE,DEFAULT_WIFI_MODE))return false; - if(!CONFIG::write_string(EP_SSID,String(FPSTR(DEFAULT_SSID)).c_str(),strlen_P(DEFAULT_SSID)))return false; - if(!CONFIG::write_string(EP_PASSWORD,String(FPSTR(DEFAULT_PASSWORD)).c_str(),strlen_P(DEFAULT_PASSWORD)))return false; + if(!CONFIG::write_string(EP_SSID,FPSTR(DEFAULT_SSID)))return false; + if(!CONFIG::write_string(EP_PASSWORD,FPSTR(DEFAULT_PASSWORD)))return false; if(!CONFIG::write_byte(EP_IP_MODE,DEFAULT_IP_MODE))return false; - if(!CONFIG::write_buffer(EP_IP_VALUE,DEFAULT_IP_VALUE,IP_LENGH))return false; - if(!CONFIG::write_buffer(EP_MASK_VALUE,DEFAULT_MASK_VALUE,IP_LENGH))return false; - if(!CONFIG::write_buffer(EP_GATEWAY_VALUE,DEFAULT_GATEWAY_VALUE,IP_LENGH))return false; - if(!CONFIG::write_buffer(EP_BAUD_RATE,(const byte *)&DEFAULT_BAUD_RATE,INTEGER_LENGH))return false; + if(!CONFIG::write_buffer(EP_IP_VALUE,DEFAULT_IP_VALUE,IP_LENGTH))return false; + if(!CONFIG::write_buffer(EP_MASK_VALUE,DEFAULT_MASK_VALUE,IP_LENGTH))return false; + if(!CONFIG::write_buffer(EP_GATEWAY_VALUE,DEFAULT_GATEWAY_VALUE,IP_LENGTH))return false; + if(!CONFIG::write_buffer(EP_BAUD_RATE,(const byte *)&DEFAULT_BAUD_RATE,INTEGER_LENGTH))return false; if(!CONFIG::write_byte(EP_PHY_MODE,DEFAULT_PHY_MODE))return false; if(!CONFIG::write_byte(EP_SLEEP_MODE,DEFAULT_SLEEP_MODE))return false; if(!CONFIG::write_byte(EP_CHANNEL,DEFAULT_CHANNEL))return false; if(!CONFIG::write_byte(EP_AUTH_TYPE,DEFAULT_AUTH_TYPE))return false; if(!CONFIG::write_byte(EP_SSID_VISIBLE,DEFAULT_SSID_VISIBLE))return false; - if(!CONFIG::write_buffer(EP_WEB_PORT,(const byte *)&DEFAULT_WEB_PORT,INTEGER_LENGH))return false; - if(!CONFIG::write_buffer(EP_DATA_PORT,(const byte *)&DEFAULT_DATA_PORT,INTEGER_LENGH))return false; - if(!CONFIG::write_byte(EP_POLLING_TIME,DEFAULT_POLLING_TIME))return false; + if(!CONFIG::write_buffer(EP_WEB_PORT,(const byte *)&DEFAULT_WEB_PORT,INTEGER_LENGTH))return false; + if(!CONFIG::write_buffer(EP_DATA_PORT,(const byte *)&DEFAULT_DATA_PORT,INTEGER_LENGTH))return false; + if(!CONFIG::write_byte(EP_REFRESH_PAGE_TIME,DEFAULT_REFRESH_PAGE_TIME))return false; + if(!CONFIG::write_string(EP_HOSTNAME,wifi_config.get_default_hostname()))return false; + if(!CONFIG::write_buffer(EP_XY_FEEDRATE,(const byte *)&DEFAULT_XY_FEEDRATE,INTEGER_LENGTH))return false; + if(!CONFIG::write_buffer(EP_Z_FEEDRATE,(const byte *)&DEFAULT_Z_FEEDRATE,INTEGER_LENGTH))return false; + if(!CONFIG::write_buffer(EP_E_FEEDRATE,(const byte *)&DEFAULT_E_FEEDRATE,INTEGER_LENGTH))return false; + return true; } void CONFIG::print_config() { //use bigest size for buffer - char sbuf[MAX_PASSWORD_LENGH+1]; + char sbuf[MAX_PASSWORD_LENGTH+1]; byte bbuf=0; int ibuf=0; if (CONFIG::read_byte(EP_WIFI_MODE, &bbuf ))Serial.println(byte(bbuf)); - if (CONFIG::read_string(EP_SSID, sbuf , MAX_SSID_LENGH))Serial.println(sbuf); - if (CONFIG::read_string(EP_PASSWORD, sbuf , MAX_PASSWORD_LENGH))Serial.println(sbuf); + if (CONFIG::read_string(EP_SSID, sbuf , MAX_SSID_LENGTH))Serial.println(sbuf); + if (CONFIG::read_string(EP_PASSWORD, sbuf , MAX_PASSWORD_LENGTH))Serial.println(sbuf); if (CONFIG::read_byte(EP_IP_MODE, &bbuf ))Serial.println(byte(bbuf)); - if (CONFIG::read_buffer(EP_IP_VALUE,(byte *)sbuf , IP_LENGH))Serial.println(wifi_config.ip2str((byte *)sbuf)); - if (CONFIG::read_buffer(EP_MASK_VALUE, (byte *)sbuf , IP_LENGH))Serial.println(wifi_config.ip2str((byte *)sbuf)); - if (CONFIG::read_buffer(EP_GATEWAY_VALUE, (byte *)sbuf , IP_LENGH))Serial.println(wifi_config.ip2str((byte *)sbuf)); - if (CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&ibuf , INTEGER_LENGH))Serial.println(ibuf); + if (CONFIG::read_buffer(EP_IP_VALUE,(byte *)sbuf , IP_LENGTH))Serial.println(wifi_config.ip2str((byte *)sbuf)); + if (CONFIG::read_buffer(EP_MASK_VALUE, (byte *)sbuf , IP_LENGTH))Serial.println(wifi_config.ip2str((byte *)sbuf)); + if (CONFIG::read_buffer(EP_GATEWAY_VALUE, (byte *)sbuf , IP_LENGTH))Serial.println(wifi_config.ip2str((byte *)sbuf)); + if (CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&ibuf , INTEGER_LENGTH))Serial.println(ibuf); if (CONFIG::read_byte(EP_PHY_MODE, &bbuf ))Serial.println(byte(bbuf)); if (CONFIG::read_byte(EP_SLEEP_MODE, &bbuf ))Serial.println(byte(bbuf)); if (CONFIG::read_byte(EP_CHANNEL, &bbuf ))Serial.println(byte(bbuf)); if (CONFIG::read_byte(EP_AUTH_TYPE, &bbuf ))Serial.println(byte(bbuf)); if (CONFIG::read_byte(EP_SSID_VISIBLE, &bbuf ))Serial.println(byte(bbuf)); - if (CONFIG::read_buffer(EP_WEB_PORT, (byte *)&ibuf , INTEGER_LENGH))Serial.println(ibuf); - if (CONFIG::read_buffer(EP_DATA_PORT, (byte *)&ibuf , INTEGER_LENGH))Serial.println(ibuf); - if (CONFIG::read_byte(EP_POLLING_TIME, &bbuf ))Serial.println(byte(bbuf)); + if (CONFIG::read_buffer(EP_WEB_PORT, (byte *)&ibuf , INTEGER_LENGTH))Serial.println(ibuf); + if (CONFIG::read_buffer(EP_DATA_PORT, (byte *)&ibuf , INTEGER_LENGTH))Serial.println(ibuf); + if (CONFIG::read_byte(EP_REFRESH_PAGE_TIME, &bbuf ))Serial.println(byte(bbuf)); + if (CONFIG::read_string(EP_HOSTNAME, sbuf , MAX_HOSTNAME_LENGTH))Serial.println(sbuf); + if (CONFIG::read_buffer(EP_XY_FEEDRATE, (byte *)&ibuf , INTEGER_LENGTH))Serial.println(ibuf); + if (CONFIG::read_buffer(EP_Z_FEEDRATE, (byte *)&ibuf , INTEGER_LENGTH))Serial.println(ibuf); + if (CONFIG::read_buffer(EP_E_FEEDRATE, (byte *)&ibuf , INTEGER_LENGTH))Serial.println(ibuf); + } diff --git a/esp8266/config.h b/esp8266/config.h index 637b41cd..5e2bea4e 100644 --- a/esp8266/config.h +++ b/esp8266/config.h @@ -27,10 +27,7 @@ #define SSDP_FEATURE //CAPTIVE_PORTAL_FEATURE: In SoftAP redirect all unknow call to main page -#define CAPTIVE_PORTAL_FEATURE - -//USE_CSS_FEATURE: this feature allow to have fancy UI by adding css in page -#define USE_CSS_FEATURE +//#define CAPTIVE_PORTAL_FEATURE #ifndef CONFIG_h #define CONFIG_h @@ -41,7 +38,7 @@ extern "C" { #include "user_interface.h" } //version and sources location -#define FW_VERSION "V0.3" +#define FW_VERSION "0.4" #define REPOSITORY "https://github.com/luc-github/ESP8266" @@ -71,7 +68,11 @@ extern "C" { #define EP_SSID_VISIBLE 120 //1 byte = flag #define EP_WEB_PORT 121 //4 bytes = int #define EP_DATA_PORT 125 //4 bytes = int -#define EP_POLLING_TIME 129 //1 bytes = flag +#define EP_REFRESH_PAGE_TIME 129 //1 bytes = flag +#define EP_HOSTNAME 130//33 bytes 32+1 = string ; warning does not support multibyte char like chinese +#define EP_XY_FEEDRATE 164//4 bytes = int +#define EP_Z_FEEDRATE 168//4 bytes = int +#define EP_E_FEEDRATE 172//4 bytes = int @@ -84,9 +85,6 @@ const byte DEFAULT_IP_VALUE[] = {192, 168, 0, 1}; const byte DEFAULT_MASK_VALUE[] = {255, 255, 255, 0}; #define DEFAULT_GATEWAY_VALUE DEFAULT_IP_VALUE const long DEFAULT_BAUD_RATE = 9600; -#ifdef MDNS_FEATURE -const char LOCAL_NAME[] PROGMEM = "esp8266"; -#endif const char M117_[] PROGMEM = "M117 "; #define DEFAULT_PHY_MODE PHY_MODE_11G #define DEFAULT_SLEEP_MODE MODEM_SLEEP_T @@ -97,26 +95,32 @@ const char M117_[] PROGMEM = "M117 "; #define DEFAULT_BEACON_INTERVAL 100 const int DEFAULT_WEB_PORT = 80; const int DEFAULT_DATA_PORT = 8888; -#define DEFAULT_POLLING_TIME 3 +#define DEFAULT_REFRESH_PAGE_TIME 3 +const int DEFAULT_XY_FEEDRATE=1000; +const int DEFAULT_Z_FEEDRATE =100; +const int DEFAULT_E_FEEDRATE=400; //sizes #define EEPROM_SIZE 256 //max is 512 -#define MAX_SSID_LENGH 32 -#define MIN_SSID_LENGH 1 -#define MAX_PASSWORD_LENGH 64 -#define MIN_PASSWORD_LENGH 8 -#define IP_LENGH 4 -#define INTEGER_LENGH 4 +#define MAX_SSID_LENGTH 32 +#define MIN_SSID_LENGTH 1 +#define MAX_PASSWORD_LENGTH 64 +#define MIN_PASSWORD_LENGTH 8 +#define IP_LENGTH 4 +#define INTEGER_LENGTH 4 +#define MAX_HOSTNAME_LENGTH 32 class CONFIG { public: - static bool read_string(word pos, char byte_buffer[], word size_max); - static bool read_buffer(word pos, byte byte_buffer[], word size_buffer); - static bool read_byte(word pos, byte * value); - static bool write_string(word pos, const char * byte_buffer, word size_buffer); - static bool write_buffer(word pos, const byte * byte_buffer, word size_buffer); - static bool write_byte(word pos, const byte value); + static bool read_string(int pos, char byte_buffer[], int size_max); + static bool read_string(int pos, String & sbuffer, int size_max); + static bool read_buffer(int pos, byte byte_buffer[], int size_buffer); + static bool read_byte(int pos, byte * value); + static bool write_string(int pos, const char * byte_buffer); + static bool write_string(int pos, const __FlashStringHelper *str); + static bool write_buffer(int pos, const byte * byte_buffer, int size_buffer); + static bool write_byte(int pos, const byte value); static bool reset_config(); static void print_config(); }; diff --git a/esp8266/data - for 64K SPIFFS/config_ap.tpl b/esp8266/data - for 64K SPIFFS/config_ap.tpl new file mode 100644 index 00000000..f94722a8 --- /dev/null +++ b/esp8266/data - for 64K SPIFFS/config_ap.tpl @@ -0,0 +1,62 @@ +$INCLUDE[header.inc]$ +
+
Access Point
+
+
+
+
+
+

+
+
+

+
+

+
+

+
+ +
+
+

+
+

+
+

+
+
+ +
+
+ +
+
+ +$SERVICE_PAGE$ + + + + diff --git a/esp8266/data - for 64K SPIFFS/config_sta.tpl b/esp8266/data - for 64K SPIFFS/config_sta.tpl new file mode 100644 index 00000000..9e21d504 --- /dev/null +++ b/esp8266/data - for 64K SPIFFS/config_sta.tpl @@ -0,0 +1,56 @@ +$INCLUDE[header.inc]$ +
+
Station
+
+
+
+ + + +$AVAILABLE_AP[]$ +
$AVAILABLE_AP_NB_ITEMS$ AP(s) available
#SSIDSignalProtected
#$ROW_NUMBER$$AP_SSID$$AP_SIGNAL$$IS_PROTECTED$
+
+

+
+

+
+

+
+

+
+ +
+
+

+
+

+
+

+
+
+ +
+
+
+ +$SERVICE_PAGE$ + + + diff --git a/esp8266/data - for 64K SPIFFS/header.inc b/esp8266/data - for 64K SPIFFS/header.inc new file mode 100644 index 00000000..0f807a4b --- /dev/null +++ b/esp8266/data - for 64K SPIFFS/header.inc @@ -0,0 +1,33 @@ + + + + + +$PAGE_TITLE$
+ + + + + + diff --git a/esp8266/data - for 64K SPIFFS/home.tpl b/esp8266/data - for 64K SPIFFS/home.tpl new file mode 100644 index 00000000..6001fc8b --- /dev/null +++ b/esp8266/data - for 64K SPIFFS/home.tpl @@ -0,0 +1,57 @@ +$INCLUDE[header.inc]$ +
+
System
+

+
+
+
+

+

+

+

+
+
+
+
+
+
+
+
Access Point ($AP_STATUS_ENABLED$)
+

+
+
+
+
+
+
+
+
+
+
+ + + +$CONNECTED_STATIONS[]$ +
$CONNECTED_STATIONS_NB_ITEMS$ connected station(s)
#MacIP
#$ROW_NUMBER$$MAC_CONNECTED$$IP_CONNECTED$
+
+
+
+
+
Station ($STA_STATUS_ENABLED$)
+

+
+
+
+
+
+
+
+
+
+
+
+$SERVICE_PAGE$ + + + + diff --git a/esp8266/data - for 64K SPIFFS/printer.tpl b/esp8266/data - for 64K SPIFFS/printer.tpl new file mode 100644 index 00000000..e2bb362d --- /dev/null +++ b/esp8266/data - for 64K SPIFFS/printer.tpl @@ -0,0 +1,306 @@ +$INCLUDE[header.inc]$ + + + + + + + + + + +
+ + + + +
0300% +  Status: +   + + +
+ + + +
0300% +      
+ +




+ + + +
+ + + +SD 
+ + + + + + + + + + + + +
+ + +X + + +
+-10
+-1
+-0.1
+ +Y + +
+-10
+-1
+-0.1
+ + +
+10 +1 +0.1
+
+-0.1 +-1 + +-10
Z
+ + + +
+0.1
+1
+10
+Z + +
+0.1
+1
+10
+ +$SERVICE_PAGE$ + + + diff --git a/esp8266/data - for 64K SPIFFS/settings.tpl b/esp8266/data - for 64K SPIFFS/settings.tpl new file mode 100644 index 00000000..5f565d53 --- /dev/null +++ b/esp8266/data - for 64K SPIFFS/settings.tpl @@ -0,0 +1,29 @@ +$INCLUDE[header.inc]$ +
+
Printer Settings
+
+
+

+
+

+
+

+
+

+
+ +
+
+ +
+
+$SERVICE_PAGE$ + + + + + diff --git a/esp8266/data - for 64K SPIFFS/system.tpl b/esp8266/data - for 64K SPIFFS/system.tpl new file mode 100644 index 00000000..a5fe1420 --- /dev/null +++ b/esp8266/data - for 64K SPIFFS/system.tpl @@ -0,0 +1,33 @@ +$INCLUDE[header.inc]$ +
+
System
+
+
+
+
+
+
+
+
+

+
+

+
+ +
+
+ +
+
+$SERVICE_PAGE$ + + + diff --git a/esp8266/data - for more than 64K SPIFFS/404.tpl b/esp8266/data - for more than 64K SPIFFS/404.tpl new file mode 100644 index 00000000..a4672d77 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/404.tpl @@ -0,0 +1,30 @@ + + +Redirecting... + + +
Unknown page - you will be redirected... +

+if not redirected, click here +

+ + + +
+ + + diff --git a/esp8266/data - for more than 64K SPIFFS/config_ap.tpl b/esp8266/data - for more than 64K SPIFFS/config_ap.tpl new file mode 100644 index 00000000..5eab053c --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/config_ap.tpl @@ -0,0 +1,64 @@ +$INCLUDE[header.inc]$ +
+
Access Point
+
+
+
+
+
+

+
+
+

+
+

+
+

+
+ +
+
+

+
+

+
+

+
+
+ +
+
+ +
+
+ +$INCLUDE[footer.inc]$ + diff --git a/esp8266/data - for more than 64K SPIFFS/config_sta.tpl b/esp8266/data - for more than 64K SPIFFS/config_sta.tpl new file mode 100644 index 00000000..d830f1f5 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/config_sta.tpl @@ -0,0 +1,65 @@ +$INCLUDE[header.inc]$ +
+
Station
+
+
+
+ + + +$AVAILABLE_AP[]$ +
$AVAILABLE_AP_NB_ITEMS$ AP(s) available
#SSIDSignalProtected
#$ROW_NUMBER$$AP_SSID$$AP_SIGNAL$$IS_PROTECTED$
+
+

+
+

+
+

+
+

+
+ +
+
+
+

+
+

+
+

+
+
+ +
+
+ +
+
+ +$INCLUDE[footer.inc]$ diff --git a/esp8266/data - for more than 64K SPIFFS/css.inc b/esp8266/data - for more than 64K SPIFFS/css.inc new file mode 100644 index 00000000..f4aff0c9 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/css.inc @@ -0,0 +1,48 @@ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%; font-size:10px;} +body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff;} +.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px;} +table{border:0px;border-spacing:0;max-width:100%;} +.table-bordered{ width:100%; border:1px solid #dddddd;margin-bottom:20px;} +td{white-space:nowrap; padding:2mm;} +th{text-align:left;} +.table>thead>tr>th,.table>tbody>tr>th,.table>thead>tr>td,.table>tbody>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd;} +.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td{border:1px solid #dddddd;} +.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px;} +.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9;} +@media (min-width:768px){.container{width:750px;}} +@media (min-width:992px){.container{width:970px;}} +@media (min-width:1200px){.container{width:1170px;}} +.nav{ width:100%; color:#cccccc;padding-left:10;padding-right:10;list-style:none;background-color:#333333;border-radius:6px ;margin-bottom:20px;} +a{position:relative;display:block;padding:10px 15px;text-decoration:none;color:#cccccc;} + .active{color:#ffffff;background-color:#000000;} +.active a,a:hover,a:focus{color:#FFFFFF;} +.panel{margin-bottom:20px;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05);} +.panel-body{padding:15px;} +.panel-heading{padding:10px 15px;color:#333333;background-color:#f5f5f5;border-color:#dddddd;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom:1px solid #dddddd;} +label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold;} +.text-info{color:#31708f;} +.form-control{display:block;width:auto;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555555;background-color:#ffffff +;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075); +* -webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s; +* transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6); +* box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6);} +.form-group{margin-bottom:15px;} +.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation; touch-action:manipulation;cursor:pointer; +background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px; +* -webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} +.btn-primary{color:#ffffff;background-color:#337ab7;border-color:#2e6da4;} +.btn-primary:focus,.btn-primary:active,.btn-primary:hover,.btn-primary.focus,.btn-primary.active,.btn-primary.hover{color:#ffffff;background-color:#286090;border-color:#122b40;} +caption{padding-top:8px;padding-bottom:8px;color:#777777;text-align:left;} +.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d;} +.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442;} +.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);} +.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;} +.has-error .control-label{color:#a94442;} +.has-success .form-control {border-color: #3c763d;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);} +.has-success .form-control:focus {border-color: #2b542c;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;} +.has-success .control-label{color: #3c763d;} +.btn-danger{color:#ffffff;background-color:#d9534f;border-color:#d43f3a;} +.btn-danger:focus,.btn-danger:active,.btn-danger:hover,.btn-danger.focus,.btn-danger.active,.btn-danger.hover{color: #ffffff;background-color:#c9302c;border-color:#761c19;} +.btnimg {cursor:hand; border-radius:6px ;;border:1px solid #FFFFFF;} +.btnimg:hover{background-color:#F0F0F0;border-color:#00FFFF;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;} diff --git a/esp8266/data - for more than 64K SPIFFS/favicon.ico b/esp8266/data - for more than 64K SPIFFS/favicon.ico new file mode 100644 index 00000000..b2b24df7 Binary files /dev/null and b/esp8266/data - for more than 64K SPIFFS/favicon.ico differ diff --git a/esp8266/data - for more than 64K SPIFFS/footer.inc b/esp8266/data - for more than 64K SPIFFS/footer.inc new file mode 100644 index 00000000..ba870a64 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/footer.inc @@ -0,0 +1,3 @@ +$SERVICE_PAGE$ + + diff --git a/esp8266/data - for more than 64K SPIFFS/header.inc b/esp8266/data - for more than 64K SPIFFS/header.inc new file mode 100644 index 00000000..e426852b --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/header.inc @@ -0,0 +1,23 @@ + + + + + + +$PAGE_TITLE$ + +
+ + + + + + + + + + + + diff --git a/esp8266/data - for more than 64K SPIFFS/home.tpl b/esp8266/data - for more than 64K SPIFFS/home.tpl new file mode 100644 index 00000000..5959b314 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/home.tpl @@ -0,0 +1,54 @@ +$INCLUDE[header.inc]$ +
+
System
+

+
+
+
+

+

+

+

+
+
+
+
+
+
+
+
Access Point ($AP_STATUS_ENABLED$)
+

+
+
+
+
+
+
+
+
+
+
+ + + +$CONNECTED_STATIONS[]$ +
$CONNECTED_STATIONS_NB_ITEMS$ connected station(s)
#MacIP
#$ROW_NUMBER$$MAC_CONNECTED$$IP_CONNECTED$
+
+
+
+
+
Station ($STA_STATUS_ENABLED$)
+

+
+
+
+
+
+
+
+
+
+
+
+$INCLUDE[footer.inc]$ + diff --git a/esp8266/data - for more than 64K SPIFFS/printer.tpl b/esp8266/data - for more than 64K SPIFFS/printer.tpl new file mode 100644 index 00000000..3b202546 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/printer.tpl @@ -0,0 +1,303 @@ +$INCLUDE[header.inc]$ + + + + + + + + + + +
+ + + + +
0300% +  Status: +   + + +
+ + + +
0300% +      
+ +




+ + + +
+ + + +SD 
+ + + + + + + + + + + + +
+ + +X + + +
+-10
+-1
+-0.1
+ +Y + +
+-10
+-1
+-0.1
+ + +
+10 +1 +0.1
+
+-0.1 +-1 + +-10
Z
+ + + +
+0.1
+1
+10
+Z + +
+0.1
+1
+10
+ +$INCLUDE[footer.inc]$ diff --git a/esp8266/data - for more than 64K SPIFFS/restart.tpl b/esp8266/data - for more than 64K SPIFFS/restart.tpl new file mode 100644 index 00000000..973cd65b --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/restart.tpl @@ -0,0 +1,27 @@ + + +Restarting... + + +
Restarting, please wait.... +
+ +
+ + + diff --git a/esp8266/data - for more than 64K SPIFFS/settings.tpl b/esp8266/data - for more than 64K SPIFFS/settings.tpl new file mode 100644 index 00000000..76c69278 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/settings.tpl @@ -0,0 +1,27 @@ +$INCLUDE[header.inc]$ +
+
Printer Settings
+
+
+

+
+

+
+

+
+

+
+ + +
+
+ +
+
+$INCLUDE[footer.inc]$ + + diff --git a/esp8266/data - for more than 64K SPIFFS/system.tpl b/esp8266/data - for more than 64K SPIFFS/system.tpl new file mode 100644 index 00000000..8fe99276 --- /dev/null +++ b/esp8266/data - for more than 64K SPIFFS/system.tpl @@ -0,0 +1,30 @@ +$INCLUDE[header.inc]$ +
+
System
+
+
+
+
+
+
+
+
+

+
+

+
+ +
+
+ +
+
+$INCLUDE[footer.inc]$ diff --git a/esp8266/data/404.tpl b/esp8266/data/404.tpl new file mode 100644 index 00000000..a4672d77 --- /dev/null +++ b/esp8266/data/404.tpl @@ -0,0 +1,30 @@ + + +Redirecting... + + +
Unknown page - you will be redirected... +

+if not redirected, click here +

+ + + +
+ + + diff --git a/esp8266/data/config_ap.tpl b/esp8266/data/config_ap.tpl new file mode 100644 index 00000000..5eab053c --- /dev/null +++ b/esp8266/data/config_ap.tpl @@ -0,0 +1,64 @@ +$INCLUDE[header.inc]$ +
+
Access Point
+
+
+
+
+
+

+
+
+

+
+

+
+

+
+ +
+
+

+
+

+
+

+
+
+ +
+
+ +
+
+ +$INCLUDE[footer.inc]$ + diff --git a/esp8266/data/config_sta.tpl b/esp8266/data/config_sta.tpl new file mode 100644 index 00000000..d830f1f5 --- /dev/null +++ b/esp8266/data/config_sta.tpl @@ -0,0 +1,65 @@ +$INCLUDE[header.inc]$ +
+
Station
+
+
+
+ + + +$AVAILABLE_AP[]$ +
$AVAILABLE_AP_NB_ITEMS$ AP(s) available
#SSIDSignalProtected
#$ROW_NUMBER$$AP_SSID$$AP_SIGNAL$$IS_PROTECTED$
+
+

+
+

+
+

+
+

+
+ +
+
+
+

+
+

+
+

+
+
+ +
+
+ +
+
+ +$INCLUDE[footer.inc]$ diff --git a/esp8266/data/css.inc b/esp8266/data/css.inc new file mode 100644 index 00000000..f4aff0c9 --- /dev/null +++ b/esp8266/data/css.inc @@ -0,0 +1,48 @@ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%; font-size:10px;} +body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff;} +.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px;} +table{border:0px;border-spacing:0;max-width:100%;} +.table-bordered{ width:100%; border:1px solid #dddddd;margin-bottom:20px;} +td{white-space:nowrap; padding:2mm;} +th{text-align:left;} +.table>thead>tr>th,.table>tbody>tr>th,.table>thead>tr>td,.table>tbody>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd;} +.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td{border:1px solid #dddddd;} +.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px;} +.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9;} +@media (min-width:768px){.container{width:750px;}} +@media (min-width:992px){.container{width:970px;}} +@media (min-width:1200px){.container{width:1170px;}} +.nav{ width:100%; color:#cccccc;padding-left:10;padding-right:10;list-style:none;background-color:#333333;border-radius:6px ;margin-bottom:20px;} +a{position:relative;display:block;padding:10px 15px;text-decoration:none;color:#cccccc;} + .active{color:#ffffff;background-color:#000000;} +.active a,a:hover,a:focus{color:#FFFFFF;} +.panel{margin-bottom:20px;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05);} +.panel-body{padding:15px;} +.panel-heading{padding:10px 15px;color:#333333;background-color:#f5f5f5;border-color:#dddddd;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom:1px solid #dddddd;} +label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold;} +.text-info{color:#31708f;} +.form-control{display:block;width:auto;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555555;background-color:#ffffff +;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075); +* -webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s; +* transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6); +* box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6);} +.form-group{margin-bottom:15px;} +.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation; touch-action:manipulation;cursor:pointer; +background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px; +* -webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} +.btn-primary{color:#ffffff;background-color:#337ab7;border-color:#2e6da4;} +.btn-primary:focus,.btn-primary:active,.btn-primary:hover,.btn-primary.focus,.btn-primary.active,.btn-primary.hover{color:#ffffff;background-color:#286090;border-color:#122b40;} +caption{padding-top:8px;padding-bottom:8px;color:#777777;text-align:left;} +.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d;} +.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442;} +.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);} +.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;} +.has-error .control-label{color:#a94442;} +.has-success .form-control {border-color: #3c763d;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);} +.has-success .form-control:focus {border-color: #2b542c;-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;} +.has-success .control-label{color: #3c763d;} +.btn-danger{color:#ffffff;background-color:#d9534f;border-color:#d43f3a;} +.btn-danger:focus,.btn-danger:active,.btn-danger:hover,.btn-danger.focus,.btn-danger.active,.btn-danger.hover{color: #ffffff;background-color:#c9302c;border-color:#761c19;} +.btnimg {cursor:hand; border-radius:6px ;;border:1px solid #FFFFFF;} +.btnimg:hover{background-color:#F0F0F0;border-color:#00FFFF;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;} diff --git a/esp8266/data/favicon.ico b/esp8266/data/favicon.ico new file mode 100644 index 00000000..b2b24df7 Binary files /dev/null and b/esp8266/data/favicon.ico differ diff --git a/esp8266/data/footer.inc b/esp8266/data/footer.inc new file mode 100644 index 00000000..ba870a64 --- /dev/null +++ b/esp8266/data/footer.inc @@ -0,0 +1,3 @@ +$SERVICE_PAGE$ + + diff --git a/esp8266/data/header.inc b/esp8266/data/header.inc new file mode 100644 index 00000000..e426852b --- /dev/null +++ b/esp8266/data/header.inc @@ -0,0 +1,23 @@ + + + + + + +$PAGE_TITLE$ + +
+ + + + + + + + + + + + diff --git a/esp8266/data/home.tpl b/esp8266/data/home.tpl new file mode 100644 index 00000000..5959b314 --- /dev/null +++ b/esp8266/data/home.tpl @@ -0,0 +1,54 @@ +$INCLUDE[header.inc]$ +
+
System
+

+
+
+
+

+

+

+

+
+
+
+
+
+
+
+
Access Point ($AP_STATUS_ENABLED$)
+

+
+
+
+
+
+
+
+
+
+
+ + + +$CONNECTED_STATIONS[]$ +
$CONNECTED_STATIONS_NB_ITEMS$ connected station(s)
#MacIP
#$ROW_NUMBER$$MAC_CONNECTED$$IP_CONNECTED$
+
+
+
+
+
Station ($STA_STATUS_ENABLED$)
+

+
+
+
+
+
+
+
+
+
+
+
+$INCLUDE[footer.inc]$ + diff --git a/esp8266/data/printer.tpl b/esp8266/data/printer.tpl new file mode 100644 index 00000000..3b202546 --- /dev/null +++ b/esp8266/data/printer.tpl @@ -0,0 +1,303 @@ +$INCLUDE[header.inc]$ + + + + + + + + + + +
+ + + + +
0300% +  Status: +   + + +
+ + + +
0300% +      
+ +




+ + + +
+ + + +SD 
+ + + + + + + + + + + + +
+ + +X + + +
+-10
+-1
+-0.1
+ +Y + +
+-10
+-1
+-0.1
+ + +
+10 +1 +0.1
+
+-0.1 +-1 + +-10
Z
+ + + +
+0.1
+1
+10
+Z + +
+0.1
+1
+10
+ +$INCLUDE[footer.inc]$ diff --git a/esp8266/data/restart.tpl b/esp8266/data/restart.tpl new file mode 100644 index 00000000..973cd65b --- /dev/null +++ b/esp8266/data/restart.tpl @@ -0,0 +1,27 @@ + + +Restarting... + + +
Restarting, please wait.... +
+ +
+ + + diff --git a/esp8266/data/settings.tpl b/esp8266/data/settings.tpl new file mode 100644 index 00000000..76c69278 --- /dev/null +++ b/esp8266/data/settings.tpl @@ -0,0 +1,27 @@ +$INCLUDE[header.inc]$ +
+
Printer Settings
+
+
+

+
+

+
+

+
+

+
+ + +
+
+ +
+
+$INCLUDE[footer.inc]$ + + diff --git a/esp8266/data/system.tpl b/esp8266/data/system.tpl new file mode 100644 index 00000000..8fe99276 --- /dev/null +++ b/esp8266/data/system.tpl @@ -0,0 +1,30 @@ +$INCLUDE[header.inc]$ +
+
System
+
+
+
+
+
+
+
+
+

+
+

+
+ +
+
+ +
+
+$INCLUDE[footer.inc]$ diff --git a/esp8266/esp8266.ino b/esp8266/esp8266.ino index c88875ab..8ba6def0 100644 --- a/esp8266/esp8266.ino +++ b/esp8266/esp8266.ino @@ -12,7 +12,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this Firmware. If not, see . + along with this Firmware. If not, see . This firmware is using the standard arduino IDE with module to support ESP8266: https://github.com/esp8266/Arduino from Bootmanager @@ -50,6 +50,7 @@ DNSServer dnsServer; extern "C" { #include "user_interface.h" } +#include #define MAX_SRV_CLIENTS 1 WiFiServer * data_server; WiFiClient serverClients[MAX_SRV_CLIENTS]; @@ -68,7 +69,7 @@ void setup() { long baud_rate=0; //check if EEPROM has value - if ( CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&baud_rate , INTEGER_LENGH)&&CONFIG::read_buffer(EP_WEB_PORT, (byte *)&(wifi_config.iweb_port) , INTEGER_LENGH)&&CONFIG::read_buffer(EP_DATA_PORT, (byte *)&(wifi_config.idata_port) , INTEGER_LENGH)) + if ( CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&baud_rate , INTEGER_LENGTH)&&CONFIG::read_buffer(EP_WEB_PORT, (byte *)&(wifi_config.iweb_port) , INTEGER_LENGTH)&&CONFIG::read_buffer(EP_DATA_PORT, (byte *)&(wifi_config.idata_port) , INTEGER_LENGTH)) { //check if baud value is one of allowed ones if ( ! (baud_rate==9600 || baud_rate==19200 ||baud_rate==38400 ||baud_rate==57600 ||baud_rate==115200 ||baud_rate==230400 ||baud_rate==250000) )breset_config=true;//baud rate is incorrect =>reset settings @@ -83,6 +84,7 @@ void setup() { { //update EEPROM with default settings CONFIG::reset_config(); + delay(1000); //use default baud rate and ports baud_rate=DEFAULT_BAUD_RATE; wifi_config.iweb_port=DEFAULT_WEB_PORT; @@ -90,8 +92,10 @@ void setup() { } //setup serial Serial.begin(baud_rate); + delay(1000); + wifi_config.baud_rate=baud_rate; //setup wifi according settings - wifi_config.Setup(); + if (!wifi_config.Setup()) wifi_config.Safe_Setup(); delay(1000); //start interfaces web_interface = new WEBINTERFACE_CLASS(wifi_config.iweb_port); @@ -110,15 +114,19 @@ void setup() { { // if DNSServer is started with "*" for domain name, it will reply with // provided IP to all DNS request + dnsServer.setErrorReplyCode(DNSReplyCode::NoError); dnsServer.start(DNS_PORT, "*", WiFi.softAPIP()); } #endif #ifdef SSDP_FEATURE + String stmp; SSDP.setSchemaURL("description.xml"); SSDP.setHTTPPort( wifi_config.iweb_port); - SSDP.setName("ESP8266 Module"); - SSDP.setSerialNumber(String(system_get_chip_id()).c_str()); + if (!CONFIG::read_string(EP_HOSTNAME, stmp , MAX_HOSTNAME_LENGTH))stmp=wifi_config.get_default_hostname(); + SSDP.setName(stmp.c_str()); + stmp=String(system_get_chip_id()); + SSDP.setSerialNumber(stmp.c_str()); SSDP.setURL("/"); SSDP.setModelName("ESP8266 01"); SSDP.setModelNumber("01"); @@ -127,6 +135,7 @@ void setup() { SSDP.setManufacturerURL("http://espressif.com"); SSDP.begin(); #endif +SPIFFS.begin(); } diff --git a/esp8266/storestrings.cpp b/esp8266/storestrings.cpp index 0ab20969..f9f7835a 100644 --- a/esp8266/storestrings.cpp +++ b/esp8266/storestrings.cpp @@ -18,52 +18,130 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "storestrings.h" -#define MAX_STORAGE 20 - -STORESTRINGS_CLASS::STORESTRINGS_CLASS (uint8_t size){ - - storage_size = (size 0 ) - { //is current cursor available or need a shift - if (storage_cursor > storage_size-1) - { - for (uint i=0;i storage_size-1) return storage[storage_size-1]; - else return storage[pos]; + return add(string.c_str()); } -uint STORESTRINGS_CLASS::get_size() +bool STORESTRINGS_CLASS::add (const __FlashStringHelper *str) { - return storage_size; + String stmp; + stmp=str; + return add(stmp.c_str()); +} +//Add element in storage +bool STORESTRINGS_CLASS::add (const char * string){ + //if we reach max size + if (_maxsize==_charlist.size()) + {//remove oldest one + char * str = _charlist.shift(); + delete str; + } + //add new one + //get size including \0 at the end + size_t size = strlen(string)+1; + bool need_resize=false; + if ( (_maxstringlength!=-1) && (size >_maxstringlength+1 )) + { + need_resize = true; + size=_maxstringlength+1; + } + //reserve memory + char * ptr = new char[size*sizeof(char)]; + //copy string to storage + if (need_resize) + { //copy maximum length minus 3 + strncpy(ptr,string,_maxstringlength-3); + //add nul char + ptr[_maxstringlength-3]='\0'; + //add dot to show string was cutted + strcat(ptr,"..."); + } + else + { //copy as it is + strcpy(ptr,string); + } + //add storage to list + _charlist.add(ptr); + return true; +} +//Remove element at pos position +bool STORESTRINGS_CLASS::remove(int pos) +{ //be sure index is in range + if (pos<0 && pos>(_charlist.size()-1)) return false; + //remove item from list + char * str = _charlist.remove(pos); + //destroy item + delete str; + return true; +} +//Get element at pos position +const char * STORESTRINGS_CLASS::get(int pos) +{ //be sure index is in range + if (pos<0 && pos>(_charlist.size()-1)) return NULL; + return (const char *) _charlist.get(pos); +} +//Get index for defined string +int STORESTRINGS_CLASS::get_index(const char * string) +{//parse the list until it is found + for (int p=0;p<_charlist.size();p++) + { + if (strcmp ( _charlist.get(p), string)==0)return p; + } + //if not found return -1 + return -1; +} +//Number of elements in list +int STORESTRINGS_CLASS::size() +{ + return _charlist.size(); } -int STORESTRINGS_CLASS::get_used_max_index() -{ -if (storage_cursor > storage_size-1) return storage_size-1; -else return storage_cursor-1; -} + diff --git a/esp8266/storestrings.h b/esp8266/storestrings.h index 6bfeb496..1ef25285 100644 --- a/esp8266/storestrings.h +++ b/esp8266/storestrings.h @@ -20,21 +20,29 @@ #ifndef STORESTRINGS_h #define STORESTRINGS_h -#include - +#include +#include "LinkedList.h" class STORESTRINGS_CLASS { public: - STORESTRINGS_CLASS (uint8_t size = 10); + STORESTRINGS_CLASS (int maxsize = -1, int maxstringlength=-1); ~STORESTRINGS_CLASS (); bool add (const char * string); - String get_index_at(uint pos); - uint get_size(); - int get_used_max_index(); + bool add (String & string); + bool add (const __FlashStringHelper *str); + bool remove(int pos); + const char * get(int pos); + int get_index(const char * string); + void clear(); + int size(); + bool setsize(int size); + bool setlenght(int lenght); + int getsize(); + int getlenght(); private: - String * storage; - uint storage_size; - uint storage_cursor; + int _maxsize; + int _maxstringlength; + LinkedList _charlist; }; #endif diff --git a/esp8266/webinterface.cpp b/esp8266/webinterface.cpp index b5a776aa..b6dda1dd 100644 --- a/esp8266/webinterface.cpp +++ b/esp8266/webinterface.cpp @@ -29,357 +29,178 @@ extern "C" { #include "user_interface.h" } +#include +#include "LinkedList.h" +#include "storestrings.h" #ifdef SSDP_FEATURE #include #endif -const char CSS_START[] PROGMEM ="\n"; -const char PAGE_HEAD_1[] PROGMEM = "\n\n\n\n" \ - "\n"; -const char PAGE_HEAD_2[] PROGMEM = "Wifi Configuration" \ - " \n\n
"; - -const char NAV_START[] PROGMEM = "\n"; -const char NAV_LEFT_PART1 [] PROGMEM = "\n"; -const char NAV_RIGHT_PART[] PROGMEM = "\n"; -const char NAV_END[] PROGMEM = "
HomeSystem ConfigurationAP ConfigurationStation ConfigurationPrinter Status FW: " FW_VERSION "Github
\n"; - -const char PAGE_BOTTOM[] PROGMEM = "\n\n" ; -const char EMPTY_STRING[] PROGMEM = "" ; - -const char PANEL_TOP[] PROGMEM = "
\n
\n"; -const char PANEL_START[] PROGMEM ="
\n
"; -const char PANEL_END[] PROGMEM = "
\n
\n"; -const char LABEL_START[] PROGMEM = ""; -const char BR[] PROGMEM = "
\n"; -const char TABLE_START[] PROGMEM = ""; -const char TABLE_END [] PROGMEM = "
\n"; -const char CAPTION_S [] PROGMEM = "\n"; -const char THEAD_S[] PROGMEM = "\n"; -const char TR_S[] PROGMEM = "\n"; -const char TH_S[] PROGMEM = "\n"; -const char TD_S[] PROGMEM = "\n"; -const char TBODY_S[] PROGMEM = "\n"; -const char CAPTION_E [] PROGMEM = "\n"; -const char THEAD_E[] PROGMEM = "\n"; -const char TR_E[] PROGMEM = "\n"; -const char TH_E[] PROGMEM = "\n"; -const char TD_E[] PROGMEM = "\n"; -const char TBODY_E[] PROGMEM = "\n"; -const char T404_PAGE[] PROGMEM = "

Page not found!


Please try \n
\n"; - -const char FORM_CHECKBOX_1[] PROGMEM ="
\n"; -const char FORM_OPTION_1[] PROGMEM = "
\n"; -const char ALERT_ERROR[] PROGMEM = "
\n"; -const char DIV_E[] PROGMEM = "
\n"; -const char BAUD_RATE_ID[] PROGMEM = "BAUD_RATE"; -const char SLEEP_MODE_ID[] PROGMEM = "SLEEP_MODE"; -const char NETWORK_ID[] PROGMEM = "NETWORK"; -const char TITLE_SYSTEM[] PROGMEM = "System"; -const char CHIP_ID_TITLE[] PROGMEM = "Chip ID: "; -const char CPU_FREQ_TITLE[] PROGMEM = "CPU Frequency: "; -const char FREE_MEM_TITLE[] PROGMEM = "Free Memory: "; -const char UNIT_HZ [] PROGMEM = "Hz"; -const char UNIT_OCTET[] PROGMEM = " octets"; -const char UNIT_SECONDS[] PROGMEM = " second(s)"; -const char SDK_VERSION_TITLE[] PROGMEM = "SDK Version: "; -const char HTTP_START[] PROGMEM = "http://"; -const char HTTP_MDNS_NAME[] PROGMEM = "mDNS name: "; -const char HTTP_END[] PROGMEM = ".local"; -const char SSDP_PROTOCOL_NAME[] PROGMEM = "SSDP Protocol: "; -const char CAPTIVE_PORTAL_LABEL[] PROGMEM = "Captive Portal: "; +const char PAGE_404 [] PROGMEM ="\n\nRedirecting... \n\n\n
Unknown page - you will be redirected...\n

\nif not redirected,
click here\n

\n\n\n\n
\n\n\n\n"; +const char PAGE_RESTART [] PROGMEM ="\n\nRestarting... \n\n\n
Restarting, please wait....\n
\n\n
\n\n\n\n"; +const char RESTARTCMD [] PROGMEM =""; const char VALUE_11B[] PROGMEM = "11b"; const char VALUE_11N[] PROGMEM = "11n"; const char VALUE_11G[] PROGMEM = "11g"; -const char NETWORK_TITLE[] PROGMEM = "Network: "; const char VALUE_NONE[] PROGMEM = "None"; const char VALUE_LIGHT[] PROGMEM = "Light"; const char VALUE_MODEM[] PROGMEM = "Modem"; -const char SLEEP_MODE_TITLE[] PROGMEM = "Sleep mode: "; -const char BOOT_VERSION_TITLE[] PROGMEM = "Boot version: "; -const char BAUD_RATE_TITLE[] PROGMEM = "Baud rate: "; -const char ACCESS_POINT_TITLE[] PROGMEM = "Access Point"; -const char VALUE_ENABLED[] PROGMEM = " (enabled)"; -const char VALUE_DISABLED[] PROGMEM = " (disabled)"; -const char MAC_ADDRESS_TITLE[] PROGMEM = "Mac address: "; -const char MAC_LABEL[] PROGMEM = "Mac"; -const char SSID_TITLE[] PROGMEM = "SSID: "; -const char VALUE_NO[] PROGMEM = "No"; -const char VALUE_YES[] PROGMEM = "Yes"; -const char VISIBLE_TITLE[] PROGMEM = "Visible: "; -const char CHANNEL_TITLE[] PROGMEM = "Channel: "; -const char STATUS_TITLE[] PROGMEM = "Status: "; +const char VALUE_ENABLED[] PROGMEM = "Enabled"; +const char VALUE_DISABLED[] PROGMEM = "Disabled"; const char VALUE_WEP[] PROGMEM = "WEP"; const char VALUE_WPA[] PROGMEM = "WPA"; const char VALUE_WPA2[] PROGMEM = "WPA2"; const char VALUE_WPAWPA2[] PROGMEM = "WPA/WPA2"; const char VALUE_MAX[] PROGMEM = "MAX"; -const char AUTENTIFICATION_TITLE[] PROGMEM = "Authentification: "; -const char MAX_CONNECTION_TITLE[] PROGMEM = "Maximum connections : "; const char VALUE_STARTED[] PROGMEM = "Started"; const char VALUE_STOPPED[] PROGMEM = "Stopped"; -const char DHCP_SERVER_TITLE[] PROGMEM = "DHCP Server: "; -const char IP_TITLE[] PROGMEM = "IP: "; -const char GATEWAY_TITLE[] PROGMEM = "Gateway: "; -const char SUBNET_TITLE[] PROGMEM = "Subnet: "; -const char CONNECTED_STATIONS[] PROGMEM = " connected station(s)"; -const char NUMBER_LABEL[] PROGMEM = "#"; -const char IP_LABEL[] PROGMEM = "IP"; -const char STATION_TITLE[] PROGMEM = "Station"; -const char CONNECTION_TO_TITLE[] PROGMEM = "Connection to: "; +const char VALUE_NO[] PROGMEM = "No"; +const char VALUE_YES[] PROGMEM = "Yes"; const char VALUE_CONNECTED[] PROGMEM = "Connected"; const char VALUE_NO_SSID[] PROGMEM = "SSID not Available!"; const char VALUE_CONNECTION_FAILED[] PROGMEM = "Connection failed!"; const char VALUE_CONNECTION_FAILED2[] PROGMEM = "Connection failed! (Wrong Password)"; const char VALUE_IDLE[] PROGMEM = "Idle"; const char VALUE_DISCONNECTED[] PROGMEM = "Disconnected"; -const char DHCP_CLIENT_TITLE[] PROGMEM = "DHCP Client: "; -const char ERROR_QUERY[] PROGMEM = "Error in query!!"; -const char ERROR_WRITING_CHANGES[] PROGMEM = "Error in writing changes!!"; -const char SAVED_CHANGES[] PROGMEM = "Change saved, restarting module..."; -const char SUBMIT_ID[] PROGMEM = "SUBMIT"; -const char BAUD_RATE_NAME[] PROGMEM = "Baud rate"; -const char NETWORK_NAME[] PROGMEM = "Network"; -const char SLEEP_MODE_NAME[] PROGMEM = "Sleep Mode"; -const char VALUE_1[] PROGMEM = "1"; -const char VALUE_2[] PROGMEM = "2"; -const char VALUE_3[] PROGMEM = "3"; -const char VALUE_4[] PROGMEM = "4"; -const char VALUE_5[] PROGMEM = "5"; -const char VALUE_10[] PROGMEM = "10"; -const char VALUE_30[] PROGMEM = "30"; -const char VALUE_60[] PROGMEM = "60"; -const char VALUE_9600[] PROGMEM = "9600"; -const char VALUE_19200[] PROGMEM = "19200"; -const char VALUE_38400[] PROGMEM = "38400"; -const char VALUE_57600[] PROGMEM = "57600"; -const char VALUE_115200[] PROGMEM = "115200"; -const char VALUE_230400[] PROGMEM = "230400"; -const char VALUE_250000[] PROGMEM = "250000"; -const char VALUE_SELECTED[] PROGMEM = "selected"; -const char AP_1_ID[] PROGMEM = "AP1"; -const char AP_2_ID[] PROGMEM = "AP2"; -const char AP_3_ID[] PROGMEM = "AP3"; -const char AP_4_ID[] PROGMEM = "AP4"; -const char AP_5_ID[] PROGMEM = "AP5"; -const char AP_6_ID[] PROGMEM = "AP6"; -const char AP_7_ID[] PROGMEM = "AP7"; -const char AP_8_ID[] PROGMEM = "AP8"; -const char AP_9_ID[] PROGMEM = "AP9"; -const char AP_10_ID[] PROGMEM = "AP10"; -const char SSID_ID[] PROGMEM = "SSID"; -const char PASSWORD_TITLE[] PROGMEM = "Password :"; -const char PASSWORD_NAME[] PROGMEM = "Password"; -const char PASSWORD_ID[] PROGMEM = "PASSWORD"; -const char CHECKED_VALUE[] PROGMEM = "checked"; -const char VISIBLE_NAME[] PROGMEM = "VISIBLE"; -const char VISIBLE_LABEL[] PROGMEM = "Visible"; -const char AUTENTIFICATION_ID[] PROGMEM = "AUTHENTIFICATION"; -const char STATIC_IP_LABEL[] PROGMEM = "Static IP"; -const char STATIC_IP_NAME[] PROGMEM = "STATIC_IP"; -const char IP_NAME[] PROGMEM = "IP"; -const char GATEWAY_ID[] PROGMEM = "GATEWAY"; -const char CHANNEL_ID[] PROGMEM = "CHANNEL"; -const char SUBNET_ID[] PROGMEM = "SUBNET"; -const char GATEWAY_NAME[] PROGMEM = "Gateway"; -const char SUBNET_NAME[] PROGMEM = "Subnet"; -const char ERROR_INCORRECT_SSID[] PROGMEM = "Incorrect SSID : no space, limited to 33 char length"; -const char ERROR_INCORRECT_PASSWORD[] PROGMEM = "Incorrect password : space not allowed, limited to 8~64 char length
"; -const char ERROR_INCORRECT_PORT[] PROGMEM = "Incorrect port : 1~65000 only
"; -const char ERROR_INCORRECT_PORT2[] PROGMEM = "Incorrect port : web port aannot be same as data port
"; -const char ERROR_INCORRECT_IP_FORMAT[] PROGMEM = "Incorrect IP format, should be : xxx.xxx.xxx.xxx
"; -const char SHOW_IP_BLOCK[] PROGMEM = "
"; -const char HIDE_IP_BLOCK[] PROGMEM = "
"; -const char AVAILABLE_APS[] PROGMEM = " AP(s) available"; -const char RSSI_NAME[] PROGMEM = "Signal"; -const char PROTECTED_NAME[] PROGMEM = "Protected"; -const char WEB_PORT_TITLE[] PROGMEM = "Web port:"; -const char DATA_PORT_TITLE[] PROGMEM = "Data port:"; -const char WEB_PORT_ID[] PROGMEM = "WEBPORT"; -const char DATA_PORT_ID[] PROGMEM = "DATAPORT"; -const char PORT_DESC[]PROGMEM = "1~65000"; - -const char TEMP_SVG_1[]PROGMEM ="\n\n\n"; -const char TEMP_SVG_2[]PROGMEM ="\n\n\n"; -const char TEMP_SVG_3[]PROGMEM ="\n\n"; -const char TEMP_SVG_4[]PROGMEM ="\n\n\n"; -const char TEMP_SVG_5[]PROGMEM ="\n"; -const char TEMP_SVG_8[]PROGMEM ="\n\n\n"; -const char TEMP_SVG_15[]PROGMEM =" °C\n"; -const char TEMP_SVG_16[]PROGMEM =""; -const char DATA_S[]PROGMEM ="
"; -const char DATA_E[]PROGMEM ="\n"; -const char DIV_FLOW[]PROGMEM = "
"; -const char DIV_SPEED[]PROGMEM ="
"; -const char DIV_POSITION[]PROGMEM ="
"; -const char DIV_STATUS[]PROGMEM ="
"; -const char STATUS_1[]PROGMEM ="\n\n"; - -const char PRINTER_1a[]PROGMEM ="
\n"; -const char PRINTER_1b[]PROGMEM ="
 
\n"; -const char PRINTER_1c[]PROGMEM ="
\n"; -const char PRINTER_1d[]PROGMEM ="
  \n"; -const char PRINTER_1e[]PROGMEM ="

\n"; -const char PRINTER_1f[]PROGMEM ="

\n"; -const char PRINTER_1g[]PROGMEM ="

\n"; -const char PRINTER_1h[]PROGMEM ="
\n"; -const char PRINTER_1_a_1[]PROGMEM="
   "; -const char PRINTER_2[]PROGMEM ="
\n\n"; -const char PRINTER_4[]PROGMEM ="\n"; -const char DIV_ERRORMSG[]PROGMEM ="
\n"; -const char DIV_INFOMSG[]PROGMEM ="
\n"; -const char DIV_STATUSMSG[]PROGMEM ="
\n"; -const char COMMAND_ID[]PROGMEM ="COM"; -const char PARAM_ID[]PROGMEM ="PARAM"; -const char POLLING_TITLE[]PROGMEM ="Refresh Web page (s):"; -const char POLLING_NAME[]PROGMEM ="Refresh printer status every :"; -const char POLLING_ID[]PROGMEM ="POLLING"; -const char TEXT_HTML[]PROGMEM ="text/html"; -const char RESTARTCMD [] PROGMEM =""; -const char RESTARTINGMSG [] PROGMEM = "\n\n
Restarting, please wait.... \n
\n\n
\n\n\n\n"; - - - - -#define TEMP_SVG(temperature,target,description) buffer2send+=(FPSTR(TEMP_SVG_1));buffer2send+=(FPSTR(TEMP_SVG_2));buffer2send+=(FPSTR(TEMP_SVG_3));buffer2send+=(FPSTR(TEMP_SVG_4));buffer2send+=(FPSTR(TEMP_SVG_5));buffer2send+=String(target+10); buffer2send+=(FPSTR(TEMP_SVG_6));buffer2send+=String(target+10); buffer2send+=(FPSTR(TEMP_SVG_7));buffer2send+=(FPSTR(TEMP_SVG_8));buffer2send+=String(temperature+5);buffer2send+=(FPSTR(TEMP_SVG_9));buffer2send+=String(temperature+15);buffer2send+=(FPSTR(TEMP_SVG_10));buffer2send+=String(temperature+10);buffer2send+=(FPSTR(TEMP_SVG_11));buffer2send+=String(temperature+5);buffer2send+=(FPSTR(TEMP_SVG_12));buffer2send+=String(temperature+15);buffer2send+=(FPSTR(TEMP_SVG_13));buffer2send+=String(temperature+10);buffer2send+=(FPSTR(TEMP_SVG_14));buffer2send+=description;buffer2send+=(FPSTR(TEMP_SVG_15));buffer2send+=(FPSTR(TEMP_SVG_16)); - -#define MSG_SUCCESS(msg) buffer2send+=(FPSTR(ALERT_SUCCESS));buffer2send+=(msg);buffer2send+=(FPSTR(DIV_E)); -#define MSG_ERROR(msg) buffer2send+=(FPSTR(ALERT_ERROR));buffer2send+=(msg);buffer2send+=(FPSTR(DIV_E)); -#define OPTION(value, selected,content) buffer2send+=(FPSTR(FORM_OPTION_1));buffer2send+=(value);buffer2send+=(FPSTR(FORM_OPTION_2));buffer2send+=(selected);buffer2send+=(FPSTR(FORM_OPTION_3));buffer2send+=(content);buffer2send+=(FPSTR(FORM_OPTION_4)); -#define SELECT_START(id,label,name) buffer2send+=(FPSTR(FORM_INPUT_1));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_2));buffer2send+=(label);buffer2send+=(FPSTR(FORM_SELECT_1));buffer2send+=(name);buffer2send+=(FPSTR(FORM_SELECT_2));buffer2send+=(id);buffer2send+=(FPSTR(FORM_SELECT_3)); -#define SELECT_START_ERROR(id,label,name) buffer2send+=(FPSTR(FORM_INPUT_1_ERROR));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_2));buffer2send+=(label);buffer2send+=(FPSTR(FORM_SELECT_1));buffer2send+=(name);buffer2send+=(FPSTR(FORM_SELECT_2));buffer2send+=(id);buffer2send+=(FPSTR(FORM_SELECT_3)); -#define SELECT_END buffer2send+=(FPSTR(FORM_SELECT_END)); -#define INPUT_TEXT( id,label, name,placeholder,value) buffer2send+=(FPSTR(FORM_INPUT_1));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_2));buffer2send+=(label);buffer2send+=(FPSTR(FORM_INPUT_3));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_4));buffer2send+=(name);buffer2send+=(FPSTR(FORM_INPUT_5));buffer2send+=(placeholder);buffer2send+=(FPSTR(FORM_INPUT_6));buffer2send+=(value);buffer2send+=(FPSTR(FORM_INPUT_7)); -#define INPUT_TEXT_ERROR( id,label, name,placeholder,value) buffer2send+=(FPSTR(FORM_INPUT_1_ERROR));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_2));buffer2send+=(label);buffer2send+=(FPSTR(FORM_INPUT_3));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_4));buffer2send+=(name);buffer2send+=(FPSTR(FORM_INPUT_5));buffer2send+=(placeholder);buffer2send+=(FPSTR(FORM_INPUT_6));buffer2send+=(value);buffer2send+=(FPSTR(FORM_INPUT_7)); -#define INPUT_PASSWORD( id,label, name,placeholder,value) buffer2send+=(FPSTR(FORM_INPUT_1));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_2));buffer2send+=(label);buffer2send+=(FPSTR(FORM_INPUT_3P));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_4));buffer2send+=(name);buffer2send+=(FPSTR(FORM_INPUT_5));buffer2send+=(placeholder);buffer2send+=(FPSTR(FORM_INPUT_6));buffer2send+=(value);buffer2send+=(FPSTR(FORM_INPUT_7)); -#define INPUT_PASSWORD_ERROR( id,label, name,placeholder,value) buffer2send+=(FPSTR(FORM_INPUT_1_ERROR));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_2));buffer2send+=(label);buffer2send+=(FPSTR(FORM_INPUT_3P));buffer2send+=(id);buffer2send+=(FPSTR(FORM_INPUT_4));buffer2send+=(name);buffer2send+=(FPSTR(FORM_INPUT_5));buffer2send+=(placeholder);buffer2send+=(FPSTR(FORM_INPUT_6));buffer2send+=(value);buffer2send+=(FPSTR(FORM_INPUT_7)); -#define INPUT_CHECKBOX(name,label,status) buffer2send+=(FPSTR(FORM_CHECKBOX_1));buffer2send+=(name);buffer2send+=(FPSTR(FORM_CHECKBOX_2));buffer2send+=(status);buffer2send+=(FPSTR(FORM_CHECKBOX_3));buffer2send+=(label);buffer2send+=(FPSTR(FORM_CHECKBOX_4)); -#define LABEL( title, value) buffer2send+=(FPSTR(LABEL_START)); buffer2send+=(title);buffer2send+=(FPSTR(LABEL_COLOR));buffer2send+=(value);buffer2send+=(FPSTR(LABEL_END));buffer2send+=(FPSTR(BR)); -#define LABEL_UNITS(title, value,units) buffer2send+=(FPSTR(LABEL_START)); buffer2send+=(title);buffer2send+=(FPSTR(LABEL_COLOR));buffer2send+=(value);buffer2send+=(units);buffer2send+=(FPSTR(LABEL_END));buffer2send+=(FPSTR(BR)); -#define TH_ENTRY(entry) buffer2send+=(FPSTR(TH_S));buffer2send+=(entry);buffer2send+=(FPSTR(TH_E)); -#define THR_ENTRY(entry) buffer2send+=(FPSTR(TH_S));buffer2send+=(entry);buffer2send+=(FPSTR(TH_E)); -#define TD_ENTRY(entry) buffer2send+=(FPSTR(TD_S));buffer2send+=(entry);buffer2send+=(FPSTR(TD_E)); -#define TOPBAR(IP,menu) buffer2send+=(FPSTR(NAV_START)); buffer2send+=(FPSTR(NAV_LEFT_PART1)) ; buffer2send+=(menu==1?FPSTR(NAV_ELEMENT_ACTIVE):FPSTR(EMPTY_STRING)) ; buffer2send+=(FPSTR(NAV_LEFT_PART2a) ); buffer2send+=(IP); buffer2send+=(FPSTR(NAV_LEFT_PART2b));buffer2send+=(menu==2?FPSTR(NAV_ELEMENT_ACTIVE):FPSTR(EMPTY_STRING)) ; buffer2send+=(FPSTR(NAV_LEFT_PART3a) ); buffer2send+=(IP); buffer2send+=(FPSTR(NAV_LEFT_PART3b));buffer2send+=(menu==3?FPSTR(NAV_ELEMENT_ACTIVE):FPSTR(EMPTY_STRING)) ; buffer2send+=(FPSTR(NAV_LEFT_PART4a) ); buffer2send+=(IP); buffer2send+=(FPSTR(NAV_LEFT_PART4b)); buffer2send+=(menu==4?FPSTR(NAV_ELEMENT_ACTIVE):FPSTR(EMPTY_STRING)) ; buffer2send+=(FPSTR(NAV_LEFT_PART5a) ); buffer2send+=(IP); buffer2send+=(FPSTR(NAV_LEFT_PART5b));buffer2send+=(menu==5?FPSTR(NAV_ELEMENT_ACTIVE):FPSTR(EMPTY_STRING)) ; buffer2send+=(FPSTR(NAV_LEFT_PART6a) ); buffer2send+=(IP); buffer2send+=(FPSTR(NAV_LEFT_PART6b));buffer2send+=(FPSTR(NAV_RIGHT_PART)) ; buffer2send+=(FPSTR(NAV_END)); -#define STATUS_SVG(color) buffer2send+=(FPSTR(STATUS_1));buffer2send+=(color);buffer2send+=(FPSTR(STATUS_2)); +const char VALUE_ITEM_VISIBLE[] PROGMEM = "visibility:visible;"; +const char VALUE_ITEM_HIDDEN[] PROGMEM ="visibility:hidden;height:0px;width:0px;"; +const char KEY_IP[] PROGMEM ="$IP$"; +const char KEY_WEB_ADDRESS[] PROGMEM ="$WEB_ADDRESS$"; +const char KEY_HOSTNAME[] PROGMEM ="$HOSTNAME$"; +const char KEY_HOSTNAME_VISIBLE[] PROGMEM ="$HOSTNAME_VISIBLE$"; +const char KEY_NOT_APPLICABLE_4_AP[] PROGMEM ="Not applicable for Access Point"; +const char KEY_PAGE_TITLE[] PROGMEM ="$PAGE_TITLE$"; +const char VALUE_HOME[] PROGMEM = "Home"; +const char VALUE_FW_VERSION[] PROGMEM = FW_VERSION; +const char VALUE_NOT_AVAILABLE [] PROGMEM ="Not available"; +const char VALUE_NO_IP [] PROGMEM = "0.0.0.0"; +const char KEY_FILE_NAME [] PROGMEM ="$FILE_NAME$"; +const char KEY_SHORT_FILE_NAME [] PROGMEM ="$SHORT_FILE_NAME$"; +const char KEY_MENU_HOME [] PROGMEM ="$MENU_HOME$"; +const char KEY_MENU_SYSTEM [] PROGMEM ="$MENU_SYSTEM$"; +const char KEY_MENU_AP [] PROGMEM ="$MENU_AP$"; +const char KEY_MENU_STA [] PROGMEM ="$MENU_STA$"; +const char KEY_MENU_PRINTER [] PROGMEM ="$MENU_PRINTER$"; +const char KEY_MENU_SETTINGS [] PROGMEM ="$MENU_SETTINGS"; +const char KEY_FW_VER [] PROGMEM ="$FW_VER$"; +const char KEY_CHIP_ID [] PROGMEM ="$CHIP_ID$"; +const char KEY_CPU_FREQ [] PROGMEM ="$CPU_FREQ$"; +const char KEY_SDK_VER [] PROGMEM ="$SDK_VER$"; +const char KEY_MDNS_NAME [] PROGMEM = "$MDNS_NAME$"; +const char KEY_MDNS_VISIBLE [] PROGMEM ="$MDNS_VISIBLE$"; +const char KEY_CONNECTED_STATIONS_NB_ITEMS [] PROGMEM = "$CONNECTED_STATIONS_NB_ITEMS$"; +const char KEY_CAPTIVE_PORTAL_STATUS [] PROGMEM = "$CAPTIVE_PORTAL_STATUS$"; +const char KEY_CAPTIVE_PORTAL_VISIBLE [] PROGMEM = "$CAPTIVE_PORTAL_VISIBLE$"; +const char KEY_SSDP_STATUS [] PROGMEM ="$SSDP_STATUS$"; +const char KEY_SSDP_VISIBLE [] PROGMEM ="$SSDP_VISIBLE$"; +const char KEY_NET_PHY [] PROGMEM ="$NET_PHY$"; +const char KEY_SLEEP_MODE [] PROGMEM = "$SLEEP_MODE$"; +const char KEY_BOOT_VER [] PROGMEM = "$BOOT_VER$"; +const char KEY_WEB_PORT [] PROGMEM = "$WEB_PORT$"; +const char KEY_DATA_PORT[] PROGMEM = "$DATA_PORT$"; +const char KEY_BAUD_RATE [] PROGMEM = "$BAUD_RATE$"; +const char KEY_REFRESH_PAGE [] PROGMEM = "$REFRESH_PAGE$"; +const char KEY_AP_STATUS_ENABLED [] PROGMEM = "$AP_STATUS_ENABLED$"; +const char KEY_AP_VISIBILITY [] PROGMEM = "$AP_VISIBILITY$"; +const char KEY_AP_MAC [] PROGMEM = "$AP_MAC$"; +const char KEY_AP_SSID [] PROGMEM = "$AP_SSID$"; +const char KEY_AP_IS_VISIBLE [] PROGMEM = "$AP_IS_VISIBLE$"; +const char KEY_AP_CHANNEL [] PROGMEM = "$AP_CHANNEL$"; +const char KEY_AP_AUTH [] PROGMEM = "$AP_AUTH$"; +const char KEY_AP_MAX_CON [] PROGMEM = "$AP_MAX_CON$"; +const char KEY_AP_DHCP_STATUS [] PROGMEM = "$AP_DHCP_STATUS$"; +const char KEY_AP_IP [] PROGMEM = "$AP_IP$"; +const char KEY_AP_GW [] PROGMEM = "$AP_GW$";; +const char KEY_AP_SUBNET [] PROGMEM = "$AP_SUBNET$";; +const char KEY_STA_STATUS_ENABLED [] PROGMEM = "$STA_STATUS_ENABLED$"; +const char KEY_STA_VISIBILITY [] PROGMEM = "$STA_VISIBILITY$"; +const char VALUE_ACTIVE [] PROGMEM = "active"; +const char KEY_STA_DHCP_STATUS [] PROGMEM = "$STA_DHCP_STATUS$"; +const char KEY_STA_IP [] PROGMEM = "$STA_IP$"; +const char KEY_STA_GW [] PROGMEM = "$STA_GW$"; +const char KEY_STA_SUBNET [] PROGMEM = "$STA_SUBNET$"; +const char KEY_STA_MAC [] PROGMEM = "$STA_MAC$"; +const char KEY_STA_SSID [] PROGMEM = "$STA_SSID$"; +const char KEY_STA_CHANNEL [] PROGMEM = "$STA_CHANNEL$"; +const char KEY_STA_STATUS [] PROGMEM = "$STA_STATUS$"; +const char KEY_FREE_MEM [] PROGMEM = "$FREE_MEM$"; +const char KEY_SERVICE_PAGE [] PROGMEM = "$SERVICE_PAGE$"; +const char ARG_SUBMIT [] PROGMEM = "SUBMIT"; +const char KEY_MODE [] PROGMEM = "$MODE$"; +const char VALUE_AP [] PROGMEM = "AP"; +const char VALUE_STA [] PROGMEM = "STA"; +const char VALUE_AP_STA [] PROGMEM = "AP_STA"; +const char KEY_BAUD_RATE_OPTIONS_LIST [] PROGMEM ="$BAUD_RATE_OPTIONS_LIST$"; +const char KEY_SLEEP_MODE_OPTIONS_LIST [] PROGMEM ="$SLEEP_MODE_OPTIONS_LIST$"; +const char KEY_ERROR_MSG [] PROGMEM ="$ERROR_MSG$"; +const char KEY_SUCCESS_MSG [] PROGMEM ="$SUCCESS_MSG$"; +const char KEY_ERROR_MSG_VISIBILITY [] PROGMEM ="$ERROR_MSG_VISIBILITY$"; +const char KEY_SUCCESS_MSG_VISIBILITY[] PROGMEM ="$SUCCESS_MSG_VISIBILITY$"; +const char KEY_SUBMIT_BUTTON_VISIBILITY [] PROGMEM ="$SUBMIT_BUTTON_VISIBILITY$"; +const char VALUE_CONFIG_AP [] PROGMEM = "Configuration Access Point"; +const char VALUE_CONFIG_STA [] PROGMEM = "Configuration Station Client"; +const char VALUE_PRINTER [] PROGMEM = "Printer Interface"; +const char VALUE_HAS_ERROR [] PROGMEM = "has-error"; +const char VALUE_HAS_SUCCESS [] PROGMEM = "has-success"; +const char KEY_BAUD_RATE_STATUS [] PROGMEM = "$BAUD_RATE_STATUS$"; +const char KEY_SLEEP_MODE_STATUS [] PROGMEM ="$SLEEP_MODE_STATUS$"; +const char KEY_WEB_PORT_STATUS [] PROGMEM = "$WEB_PORT_STATUS$"; +const char KEY_DATA_PORT_STATUS [] PROGMEM ="$DATA_PORT_STATUS$"; +const char KEY_AP_SSID_STATUS [] PROGMEM = "$AP_SSID_STATUS$"; +const char KEY_AP_PASSWORD_STATUS [] PROGMEM = "$AP_PASSWORD_STATUS$"; +const char KEY_NETWORK_OPTION_LIST_STATUS [] PROGMEM = "$NETWORK_OPTION_LIST_STATUS$"; +const char KEY_NETWORK_OPTION_LIST [] PROGMEM = "$NETWORK_OPTION_LIST$"; +const char KEY_CHANNEL_OPTION_LIST_STATUS [] PROGMEM = "$CHANNEL_OPTION_LIST_STATUS$"; +const char KEY_CHANNEL_OPTION_LIST [] PROGMEM = "$CHANNEL_OPTION_LIST$"; +const char KEY_AUTH_OPTION_LIST_STATUS [] PROGMEM = "$AUTH_OPTION_LIST_STATUS$"; +const char KEY_AUTH_OPTION_LIST [] PROGMEM = "$AUTH_OPTION_LIST$"; +const char KEY_AP_IP_STATUS [] PROGMEM = "$AP_IP_STATUS$"; +const char KEY_AP_GW_STATUS [] PROGMEM = "$AP_GW_STATUS$"; +const char KEY_AP_SUBNET_STATUS [] PROGMEM = "$AP_SUBNET_STATUS$"; +const char KEY_AP_PASSWORD [] PROGMEM = "$AP_PASSWORD$"; +const char KEY_IS_SSID_VISIBLE_STATUS [] PROGMEM = "$IS_SSID_VISIBLE_STATUS$"; +const char KEY_IS_SSID_VISIBLE [] PROGMEM = "$IS_SSID_VISIBLE$"; +const char VALUE_CHECKED [] PROGMEM = "checked"; +const char VALUE_SELECTED [] PROGMEM ="selected"; +const char KEY_IS_STATIC_IP [] PROGMEM = "$IS_STATIC_IP$"; +const char KEY_AP_STATIC_IP_STATUS [] PROGMEM = "$AP_STATIC_IP_STATUS$"; +const char KEY_STA_STATIC_IP_STATUS [] PROGMEM = "$STA_STATIC_IP_STATUS$"; +const char KEY_STA_SSID_STATUS [] PROGMEM = "$STA_SSID_STATUS$"; +const char KEY_STA_PASSWORD_STATUS [] PROGMEM = "$STA_PASSWORD_STATUS$"; +const char KEY_STA_IP_STATUS [] PROGMEM = "$STA_IP_STATUS$"; +const char KEY_STA_GW_STATUS [] PROGMEM = "$STA_GW_STATUS$"; +const char KEY_STA_SUBNET_STATUS [] PROGMEM = "$STA_SUBNET_STATUS$"; +const char KEY_STA_PASSWORD [] PROGMEM = "$STA_PASSWORD$"; +const char KEY_AVAILABLE_AP_NB_ITEMS [] PROGMEM = "$AVAILABLE_AP_NB_ITEMS$"; +const char KEY_AP_SCAN_VISIBILITY [] PROGMEM = "$AP_SCAN_VISIBILITY$"; +const char KEY_HOSTNAME_STATUS [] PROGMEM = "$HOSTNAME_STATUS$"; +const char KEY_XY_FEEDRATE [] PROGMEM = "$XY_FEEDRATE$"; +const char KEY_Z_FEEDRATE [] PROGMEM = "$Z_FEEDRATE$"; +const char KEY_E_FEEDRATE [] PROGMEM = "$E_FEEDRATE$"; +const char KEY_XY_FEEDRATE_STATUS [] PROGMEM = "$XY_FEEDRATE_STATUS$"; +const char KEY_Z_FEEDRATE_STATUS [] PROGMEM = "$Z_FEEDRATE_STATUS$"; +const char KEY_E_FEEDRATE_STATUS [] PROGMEM = "$E_FEEDRATE_STATUS$"; +const char VALUE_SETTINGS [] PROGMEM = "Printer Settings"; +const char KEY_REFRESH_PAGE_STATUS [] PROGMEM = "$REFRESH_PAGE_STATUS$"; +bool WEBINTERFACE_CLASS::isHostnameValid(const char * hostname) +{ //limited size + char c; + if (strlen(hostname)>MAX_HOSTNAME_LENGTH || strlen(hostname) < 1) return false; + //only letter and digit + for (int i=0;i < strlen(hostname);i++) + { + c = hostname[i]; + if (!(isdigit(c) || isalpha(c) || c=='_')) return false; + if (c==' ') return false; + } + return true; +} bool WEBINTERFACE_CLASS::isSSIDValid(const char * ssid) { //limited size char c; - if (strlen(ssid)>MAX_SSID_LENGH || strlen(ssid)MAX_SSID_LENGTH || strlen(ssid)MAX_PASSWORD_LENGH)|| (strlen(password)MAX_PASSWORD_LENGTH)|| (strlen(password) myFileList = LinkedList(); + String buffer2send; + String bufferheader; + int size_content=0; + bool header_sent=false; + //one loop to calculate size + one loop to really send + //size_content is a mandatory element to avoid memory leak + for(int processing_step=0;processing_step<2;processing_step++) + { + buffer2send=""; + //open template file + File currentfile = SPIFFS.open(filename, "r"); + //if error display error on web page + if (!currentfile) + { + buffer2send = String("Error opening : ") + filename; + web_interface->WebServer.send(200,"text/plain",buffer2send); + return false; + } + else //template is open + { + int b ; + String sLine; + bool bprocessing=true; + while (bprocessing) //read all bytes + { + b = currentfile.read(); //from current open file + if (b!=-1) //if not EOF + { + sLine+=char(b); //add to current line + if (b=='\n') //end of line is reached + { //change all variables by their values + for (int k=0;k-1) + { //get value + nb=atoi(ValuesList.get(ipos)); + ipos=ipos-(nb*3); + } + //do a sanity check data are there + String Last_IP_Key = "$IP_CONNECTED["+String(nb-1)+"]$"; + if (nb>0 && (KeysList.get_index("$ROW_NUMBER[0]$")==ipos) &&(Last_IP_Key==KeysList.get(ipos-1+(nb*3)))) + { + for (int j=0;j-1) + { + tmppart.replace("$ROW_NUMBER$",ValuesList.get(ipos+0+(j*3))); + tmppart.replace("$MAC_CONNECTED$",ValuesList.get(ipos+1+(j*3))); + tmppart.replace("$IP_CONNECTED$",ValuesList.get(ipos+2+(j*3))); + } + tablepart +=tmppart; + } + } + //now build back + sLine = beforelinetoprocess + tablepart + afterlinetoprocess; + + } + + pos_tag=sLine.indexOf("$AVAILABLE_AP["); + if (pos_tag!=-1) //if yes + { //extract line + int pos_tag_end = sLine.indexOf("]$",pos_tag); + int nb = -1; + int ipos = -1; + //part before repetitive section + String beforelinetoprocess=sLine.substring( 0,pos_tag); + //part after repetitive section + String afterlinetoprocess=sLine.substring( pos_tag_end+2); + //repetitive section itself + String linetoprocess =sLine.substring( pos_tag+strlen("$AVAILABLE_AP["),pos_tag_end); + String tablepart; + //get how many items + ipos=KeysList.get_index("$AVAILABLE_AP_NB_ITEMS$"); + if (ipos >-1) + { //get value + nb=atoi(ValuesList.get(ipos)); + ipos=ipos-(nb*4); + } + //do a sanity check data are there + String Last_IP_Key = "$IS_PROTECTED["+String(nb-1)+"]$"; + if (nb>0 && (KeysList.get_index("$ROW_NUMBER[0]$")==ipos) &&(Last_IP_Key==KeysList.get(ipos-1+(nb*4)))) + { + for (int j=0;j-1) + { + tmppart.replace("$ROW_NUMBER$",ValuesList.get(ipos+0+(j*4))); + tmppart.replace("$AP_SSID$",ValuesList.get(ipos+1+(j*4))); + tmppart.replace("$AP_SIGNAL$",ValuesList.get(ipos+2+(j*4))); + tmppart.replace("$IS_PROTECTED$",ValuesList.get(ipos+3+(j*4))); + } + tablepart +=tmppart; + } + } + //now build back + sLine = beforelinetoprocess + tablepart + afterlinetoprocess; + + } + + //add current line to buffer + buffer2send+=sLine; + //if buffer limit is reached + if (buffer2send.length()>1200) + { //if we are just doing size calculation + if (processing_step==0) + { //add buffer size + size_content+=buffer2send.length(); + } + else //if no size calculation, send data + { //if header is not send yet + if (!header_sent) + {//send header with calculated size + header_sent=true; + web_interface->WebServer.sendContent(bufferheader); + } + //send data + web_interface->WebServer.sendContent(buffer2send); + } + //reset buffer + buffer2send=""; + } + } + //reset line + sLine=""; + //add a delay for safety for WDT + delay(1); + } + } + else //EOF is reached + { //close current file + currentfile.close(); + //if current file is not template file but incled one + if (myFileList.size()>0) + { //get level +1 file description and continue + currentfile = myFileList.pop(); + } + else + {//we have done template parsing, let's stop reading + bprocessing=false; + } + } + } + } + //check if something is still in buffer and need to be send + if (buffer2send!=""){ + //if we are doing size calculation + if (processing_step==0) + { //add buffer size + size_content+=buffer2send.length(); + } + else //if no size calculation, send data + { //if header is not send yet + if (!header_sent) + {//send header with calculated size + web_interface->WebServer.sendContent(bufferheader); + } + //send data + web_interface->WebServer.sendContent(buffer2send); + } + } + //if we end size calculation loop + if (processing_step==0) + { //let's build the header with correct size' + bufferheader = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: "+String(size_content)+"\r\nConnection: close\r\nAccess-Control-Allow-Origin: *\r\n\r\n"; + } + } + return true; } -//cannot put it in class then cast it as std::function so put outside +//root insterface void handle_web_interface_root() { - String IP; - String buffer2send=""; - String sstatus; - struct softap_config apconfig; - struct ip_info info; - byte bbuf; - int istatus; - int lstatus; - uint8_t mac [WL_MAC_ADDR_LENGTH]; - if (wifi_get_opmode()==WIFI_STA ) IP=wifi_config.ip2str(WiFi.localIP()); - else IP=wifi_config.ip2str(WiFi.softAPIP()); - if (wifi_config.iweb_port!=80) - { - IP+=":"; - IP+=String(wifi_config.iweb_port); - } - buffer2send+=(FPSTR(PAGE_HEAD_1)); - add_css (buffer2send); - buffer2send+=(FPSTR(PAGE_HEAD_2)); - //top bar - TOPBAR(IP.c_str(),1) - //system part - buffer2send+=(FPSTR(PANEL_TOP)); - buffer2send+=(FPSTR(TITLE_SYSTEM)); - buffer2send+=(FPSTR(PANEL_START)); - LABEL(FPSTR(CHIP_ID_TITLE),String(system_get_chip_id()).c_str()) - LABEL_UNITS(FPSTR(CPU_FREQ_TITLE),String(system_get_cpu_freq()).c_str(),FPSTR(UNIT_HZ)) - LABEL_UNITS(FPSTR(FREE_MEM_TITLE),String(system_get_free_heap_size()).c_str(),FPSTR(UNIT_OCTET)) - LABEL(FPSTR(SDK_VERSION_TITLE),system_get_sdk_version()) - #ifdef MDNS_FEATURE - sstatus = FPSTR(HTTP_START); - sstatus+=FPSTR(LOCAL_NAME); - LABEL_UNITS(FPSTR(HTTP_MDNS_NAME),sstatus.c_str(),FPSTR(HTTP_END)) - #endif - #ifdef CAPTIVE_PORTAL_FEATURE - if (wifi_get_opmode()!=WIFI_STA ) - { - LABEL(FPSTR(CAPTIVE_PORTAL_LABEL),FPSTR(VALUE_YES)) - } - #endif - #ifdef SSDP_FEATURE - LABEL(FPSTR(SSDP_PROTOCOL_NAME),FPSTR(VALUE_YES)) - #endif - istatus = wifi_get_phy_mode(); - if (istatus==PHY_MODE_11B) sstatus=FPSTR(VALUE_11B); - else if (istatus==PHY_MODE_11G) sstatus=FPSTR(VALUE_11G); - else sstatus=FPSTR(VALUE_11N); - LABEL(FPSTR(NETWORK_TITLE),sstatus.c_str()) - istatus = wifi_get_sleep_type(); - if (istatus==NONE_SLEEP_T) sstatus=FPSTR(VALUE_NONE); - else if (istatus==LIGHT_SLEEP_T) sstatus=FPSTR(VALUE_LIGHT); - else sstatus=FPSTR(VALUE_MODEM); - LABEL(FPSTR(SLEEP_MODE_TITLE),sstatus.c_str()) - LABEL(FPSTR(BOOT_VERSION_TITLE),String(system_get_boot_version()).c_str()) - istatus=0; - if (!CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&lstatus , INTEGER_LENGH))lstatus=0; - LABEL(FPSTR(BAUD_RATE_TITLE),String(lstatus).c_str()) - istatus=0; - if (!CONFIG::read_buffer(EP_WEB_PORT, (byte *)&istatus , INTEGER_LENGH))istatus=0; - LABEL(FPSTR(WEB_PORT_TITLE),String(istatus).c_str()) - istatus=0; - if (!CONFIG::read_buffer(EP_DATA_PORT, (byte *)&istatus , INTEGER_LENGH))istatus=0; - LABEL(FPSTR(DATA_PORT_TITLE),String(istatus).c_str()) - if (!CONFIG::read_byte(EP_POLLING_TIME, &bbuf ))bbuf=DEFAULT_POLLING_TIME; - LABEL_UNITS(FPSTR(POLLING_NAME),String(bbuf).c_str(),FPSTR(UNIT_SECONDS)) - buffer2send+=(FPSTR(PANEL_END)); - //access point - buffer2send+=(FPSTR(PANEL_TOP)); - buffer2send+=(FPSTR(ACCESS_POINT_TITLE)); - if(wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) buffer2send+=(FPSTR(VALUE_ENABLED)); - else buffer2send+=(FPSTR(VALUE_DISABLED)); - buffer2send+=(FPSTR(PANEL_START)); - LABEL(FPSTR(MAC_ADDRESS_TITLE),wifi_config.mac2str(WiFi.softAPmacAddress(mac))) - if (wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) - { - if (wifi_softap_get_config(&apconfig)) + String stmp; + long lstatus; + int istatus; + byte bbuf; + STORESTRINGS_CLASS KeysList ; + STORESTRINGS_CLASS ValuesList ; + struct softap_config apconfig; + struct ip_info info; + uint8_t mac [WL_MAC_ADDR_LENGTH]; + //Free Mem, put at the end to reflect situation + KeysList.add(FPSTR(KEY_FREE_MEM)); + ValuesList.add(intTostr(system_get_free_heap_size())); + //IP + stmp=FPSTR(KEY_IP); + KeysList.add(stmp); + if (wifi_get_opmode()==WIFI_STA ) stmp=WiFi.localIP().toString(); + else stmp=WiFi.softAPIP().toString(); + ValuesList.add(stmp); + //Web address = ip + port + KeysList.add(FPSTR(KEY_WEB_ADDRESS)); + if (wifi_config.iweb_port!=80) { - LABEL(FPSTR(SSID_TITLE),(char *)(apconfig.ssid)) - if(apconfig.ssid_hidden==1)sstatus=FPSTR(VALUE_NO); - else sstatus=FPSTR(VALUE_YES); - LABEL(FPSTR(VISIBLE_TITLE),sstatus.c_str()) - LABEL(FPSTR(CHANNEL_TITLE),String(apconfig.channel).c_str()) - if (apconfig.authmode==AUTH_OPEN)sstatus=FPSTR(VALUE_NONE); - else if (apconfig.authmode==AUTH_WEP)sstatus=FPSTR(VALUE_WEP); - else if (apconfig.authmode==AUTH_WPA_PSK)sstatus=FPSTR(VALUE_WPA); - else if (apconfig.authmode==AUTH_WPA2_PSK)sstatus=FPSTR(VALUE_WPA2); - else if (apconfig.authmode==AUTH_WPA_WPA2_PSK)sstatus=FPSTR(VALUE_WPAWPA2); - else sstatus=FPSTR(VALUE_MAX); //what is this one ? WPS ? Cannot find information - LABEL(FPSTR(AUTENTIFICATION_TITLE),sstatus.c_str()) - LABEL(FPSTR(MAX_CONNECTION_TITLE),String(apconfig.max_connection).c_str()) + stmp+=":"; + stmp+=intTostr(wifi_config.iweb_port); } - if (wifi_softap_dhcps_status()==DHCP_STARTED)sstatus=FPSTR(VALUE_STARTED); - else sstatus=FPSTR(VALUE_STOPPED); - LABEL(FPSTR(DHCP_SERVER_TITLE),sstatus.c_str()) - if (wifi_get_ip_info(SOFTAP_IF,&info)) + ValuesList.add(stmp); + //Hostname + if (wifi_get_opmode()==WIFI_STA ) + { + KeysList.add(FPSTR(KEY_MODE)); + ValuesList.add(FPSTR(VALUE_STA)); + KeysList.add(FPSTR(KEY_HOSTNAME)); + ValuesList.add(wifi_config.get_hostname()); + KeysList.add(FPSTR(KEY_HOSTNAME_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_VISIBLE)); + } + else + { + KeysList.add(FPSTR(KEY_HOSTNAME)); + ValuesList.add(FPSTR(KEY_NOT_APPLICABLE_4_AP)); + KeysList.add(FPSTR(KEY_HOSTNAME_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_HIDDEN)); + if (wifi_get_opmode()==WIFI_AP ) { - LABEL(FPSTR(IP_TITLE),wifi_config.ip2str(info.ip.addr)) - LABEL(FPSTR(GATEWAY_TITLE),wifi_config.ip2str(info.gw.addr)) - LABEL(FPSTR(SUBNET_TITLE),wifi_config.ip2str(info.netmask.addr)) + KeysList.add(FPSTR(KEY_MODE)); + ValuesList.add(FPSTR(VALUE_AP)); } - //List number of client - istatus = 0; - sstatus=""; - struct station_info * station = wifi_softap_get_station_info(); - struct station_info * stationtmp = station; - //get total number of connected clients - while(stationtmp) + else { - istatus++; - stationtmp = STAILQ_NEXT(stationtmp, next); - yield(); + KeysList.add(FPSTR(KEY_MODE)); + ValuesList.add(FPSTR(VALUE_AP_STA)); } - //start table as at least one connected - buffer2send+=(FPSTR(TABLE_START)); - buffer2send+=(FPSTR(CAPTION_S)); - buffer2send+=(String(istatus).c_str()); - buffer2send+=(FPSTR(CONNECTED_STATIONS)); - buffer2send+=(FPSTR(CAPTION_E)); - buffer2send+=(FPSTR(THEAD_S)); - buffer2send+=(FPSTR(TR_S)); - TH_ENTRY(FPSTR(NUMBER_LABEL)) - TH_ENTRY(FPSTR(MAC_LABEL)) - TH_ENTRY(FPSTR(IP_LABEL)) - buffer2send+=(FPSTR(TR_E)); - buffer2send+=(FPSTR(THEAD_E)); - buffer2send+=(FPSTR(TBODY_S)); - istatus=0; + } + //page title + KeysList.add(FPSTR(KEY_PAGE_TITLE)); + ValuesList.add(FPSTR(VALUE_HOME)); + //tpl file name with extension + KeysList.add(FPSTR(KEY_FILE_NAME)); + ValuesList.add("home.tpl"); + //tpl file name without extension + KeysList.add(FPSTR(KEY_SHORT_FILE_NAME)); + ValuesList.add("home"); + //menu item + KeysList.add(FPSTR(KEY_MENU_HOME)); + ValuesList.add(FPSTR(VALUE_ACTIVE)); + //FW Version + KeysList.add(FPSTR(KEY_FW_VER)); + ValuesList.add(FPSTR(VALUE_FW_VERSION)); + //Chip ID + KeysList.add(FPSTR(KEY_CHIP_ID)); + ValuesList.add( intTostr(system_get_chip_id())); + //CPU Freq + KeysList.add(FPSTR(KEY_CPU_FREQ)); + ValuesList.add(intTostr(system_get_cpu_freq())); + //SDK Version + KeysList.add(FPSTR(KEY_SDK_VER)); + ValuesList.add(system_get_sdk_version()); + //MDNS Feature + #ifdef MDNS_FEATURE + KeysList.add(FPSTR(KEY_MDNS_NAME)); + stmp="http://"; + stmp+=wifi_config.get_hostname(); + stmp+=".local"; + ValuesList.add(stmp); + KeysList.add(FPSTR(KEY_MDNS_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_VISIBLE)); + #else + KeysList.add(FPSTR(KEY_MDNS_NAME)); + ValuesList.add(FPSTR(VALUE_DISABLED)); + KeysList.add(FPSTR(KEY_MDNS_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_HIDDEN)); + #endif + //SSDP Feature + #ifdef SSDP_FEATURE + KeysList.add(FPSTR(KEY_SSDP_STATUS)); + ValuesList.add(FPSTR(VALUE_ENABLED)); + KeysList.add(FPSTR(KEY_SSDP_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_VISIBLE)); + #else + KeysList.add(FPSTR(KEY_SSDP_STATUS)); + ValuesList.add(FPSTR(VALUE_DISABLED)); + KeysList.add(FPSTR(KEY_SSDP_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_HIDDEN)); + #endif + //Captive portal Feature + #ifdef CAPTIVE_PORTAL_FEATURE + if (wifi_get_opmode()==WIFI_AP) + { + KeysList.add(FPSTR(KEY_CAPTIVE_PORTAL_STATUS)); + ValuesList.add(FPSTR(VALUE_ENABLED)); + KeysList.add(FPSTR(KEY_CAPTIVE_PORTAL_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_VISIBLE)); + } + else + { + KeysList.add(FPSTR(KEY_CAPTIVE_PORTAL_STATUS)); + ValuesList.add(FPSTR(VALUE_DISABLED)); + KeysList.add(FPSTR(KEY_CAPTIVE_PORTAL_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_HIDDEN)); + } + #else + KeysList.add(FPSTR(KEY_CAPTIVE_PORTAL_STATUS)); + ValuesList.add(FPSTR(VALUE_DISABLED)); + KeysList.add(FPSTR(KEY_CAPTIVE_PORTAL_VISIBLE)); + ValuesList.add(FPSTR(VALUE_ITEM_HIDDEN)); + #endif + //network + KeysList.add(FPSTR(KEY_NET_PHY)); + if (wifi_get_phy_mode()==PHY_MODE_11B) ValuesList.add(FPSTR(VALUE_11B)); + else if (wifi_get_phy_mode()==PHY_MODE_11G)ValuesList.add(FPSTR(VALUE_11G)); + else ValuesList.add(FPSTR(VALUE_11N)); + //sleep mode + KeysList.add(FPSTR(KEY_SLEEP_MODE)); + if (wifi_get_sleep_type()==NONE_SLEEP_T) ValuesList.add(FPSTR(VALUE_NONE)); + else if (wifi_get_sleep_type()==LIGHT_SLEEP_T) ValuesList.add(FPSTR(VALUE_LIGHT)); + else ValuesList.add(FPSTR(VALUE_MODEM)); + //Boot version + KeysList.add(FPSTR(KEY_BOOT_VER)); + ValuesList.add(intTostr(system_get_boot_version())); + //baud rate + KeysList.add(FPSTR(KEY_BAUD_RATE)); + ValuesList.add(intTostr(wifi_config.baud_rate)); + //Web Port + KeysList.add(FPSTR(KEY_WEB_PORT)); + ValuesList.add(intTostr(wifi_config.iweb_port)); + //Web Port + KeysList.add(FPSTR(KEY_DATA_PORT)); + ValuesList.add(intTostr(wifi_config.idata_port)); + //AP part + if (wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) + { + int client_counter=0; + struct station_info * station; + //AP is enabled + KeysList.add(FPSTR(KEY_AP_STATUS_ENABLED)); + ValuesList.add(FPSTR(VALUE_ENABLED)); + //set visible + KeysList.add(FPSTR(KEY_AP_VISIBILITY)); + ValuesList.add(FPSTR(VALUE_ITEM_VISIBLE)); + //list of connected clients + station = wifi_softap_get_station_info(); while(station) { - yield(); - istatus++; - //display each client - buffer2send+=(FPSTR(TR_S)); - THR_ENTRY(String(istatus).c_str()) - TD_ENTRY(wifi_config.mac2str(station->bssid)) - TD_ENTRY(wifi_config.ip2str((byte *)&station->ip)) - buffer2send+=(FPSTR(TR_E)); - station = STAILQ_NEXT(station, next); + //Row number + stmp = "$ROW_NUMBER["+String(client_counter)+"]$"; + KeysList.add(stmp.c_str()); + stmp=String(client_counter+1); + ValuesList.add(stmp); + //BSSID + stmp = "$MAC_CONNECTED["+String(client_counter)+"]$"; + KeysList.add(stmp.c_str()); + + ValuesList.add(wifi_config.mac2str(station->bssid)); + //IP + stmp = "$IP_CONNECTED["+String(client_counter)+"]$"; + KeysList.add(stmp.c_str()); + ValuesList.add(wifi_config.ip2str((byte *)&station->ip)); + //increment counter + client_counter++; + //go next record + station = STAILQ_NEXT(station, next); } - buffer2send+=(FPSTR(TBODY_E)); - //close table - buffer2send+=(FPSTR(TABLE_END)); - wifi_softap_free_station_info(); - } - buffer2send+=(FPSTR(PANEL_END)); - buffer2send+=(FPSTR(PANEL_TOP)); - buffer2send+=(FPSTR(STATION_TITLE)); - if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) buffer2send+=(FPSTR(VALUE_ENABLED)); - else buffer2send+=(FPSTR(VALUE_DISABLED)); - buffer2send+=(FPSTR(PANEL_START)); - LABEL(FPSTR(MAC_ADDRESS_TITLE),wifi_config.mac2str(WiFi.macAddress(mac))) - if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) - { - LABEL(FPSTR(CONNECTION_TO_TITLE),WiFi.SSID()) - LABEL(FPSTR(CHANNEL_TITLE),String(wifi_get_channel()).c_str()) - istatus = wifi_station_get_connect_status(); - if (istatus==STATION_GOT_IP) sstatus=FPSTR(VALUE_CONNECTED); - else if (istatus==STATION_NO_AP_FOUND) sstatus=FPSTR(VALUE_NO_SSID); - else if (istatus==STATION_CONNECT_FAIL) sstatus=FPSTR(VALUE_CONNECTION_FAILED); - else if (istatus==STATION_WRONG_PASSWORD) sstatus=FPSTR(VALUE_CONNECTION_FAILED2); - else if (istatus==STATION_IDLE) sstatus=FPSTR(VALUE_IDLE);//should not happen - else sstatus=FPSTR(VALUE_DISCONNECTED); - LABEL(FPSTR(STATUS_TITLE),sstatus.c_str()) - if (wifi_station_dhcpc_status()==DHCP_STARTED)sstatus=FPSTR(VALUE_STARTED); - else sstatus=FPSTR(VALUE_STOPPED); - LABEL(FPSTR(DHCP_CLIENT_TITLE),sstatus.c_str()) - LABEL(FPSTR(IP_TITLE),wifi_config.ip2str(WiFi.localIP())) - LABEL(FPSTR(GATEWAY_TITLE),wifi_config.ip2str(WiFi.gatewayIP())) - LABEL(FPSTR(SUBNET_TITLE),wifi_config.ip2str(WiFi.subnetMask())) - } - buffer2send+=(FPSTR(PANEL_END)); - buffer2send+=(FPSTR(PAGE_BOTTOM)); - web_interface->WebServer.send(200, "text/html", buffer2send); + wifi_softap_free_station_info(); + //Connected clients + KeysList.add(FPSTR(KEY_CONNECTED_STATIONS_NB_ITEMS)); + ValuesList.add(intTostr(client_counter)); + } + else + { + //AP is disabled + KeysList.add(FPSTR(KEY_AP_STATUS_ENABLED)); + ValuesList.add(FPSTR(VALUE_DISABLED)); + //set hide + KeysList.add(FPSTR(KEY_AP_VISIBILITY)); + ValuesList.add(FPSTR(VALUE_ITEM_HIDDEN)); + //Connected clients + KeysList.add(FPSTR(KEY_CONNECTED_STATIONS_NB_ITEMS)); + ValuesList.add("0"); + } + //AP mac address + KeysList.add(FPSTR(KEY_AP_MAC)); + ValuesList.add(wifi_config.mac2str(WiFi.softAPmacAddress(mac))); + //AP configuration + if (wifi_softap_get_config(&apconfig)) + { + //SSID + KeysList.add(FPSTR(KEY_AP_SSID)); + ValuesList.add((char *)(apconfig.ssid)); + //AP visibile or hidden + KeysList.add(FPSTR(KEY_AP_IS_VISIBLE)); + if(apconfig.ssid_hidden==1)ValuesList.add(FPSTR(VALUE_NO)); + else ValuesList.add(FPSTR(VALUE_YES)); + //Channel + KeysList.add(FPSTR(KEY_AP_CHANNEL)); + ValuesList.add(intTostr(apconfig.channel)); + //Authentification mode + KeysList.add(FPSTR(KEY_AP_AUTH)); + if (apconfig.authmode==AUTH_OPEN)ValuesList.add(FPSTR(VALUE_NONE)); + else if (apconfig.authmode==AUTH_WEP)ValuesList.add(FPSTR(VALUE_WEP)); + else if (apconfig.authmode==AUTH_WPA_PSK)ValuesList.add(FPSTR(VALUE_WPA)); + else if (apconfig.authmode==AUTH_WPA2_PSK)ValuesList.add(FPSTR(VALUE_WPA2)); + else if (apconfig.authmode==AUTH_WPA_WPA2_PSK)ValuesList.add(FPSTR(VALUE_WPAWPA2)); + else ValuesList.add(FPSTR(VALUE_MAX)); //what is this one ? WPS ? Cannot find information + //Max connections + KeysList.add(FPSTR(KEY_AP_MAX_CON)); + ValuesList.add(intTostr(apconfig.max_connection)); + } + else + { + //SSID + KeysList.add(FPSTR(KEY_AP_SSID)); + ValuesList.add(FPSTR(VALUE_NOT_AVAILABLE)); + //AP visibile or hidden + KeysList.add(FPSTR(KEY_AP_IS_VISIBLE)); + ValuesList.add(FPSTR(VALUE_NOT_AVAILABLE)); + //Channel + KeysList.add(FPSTR(KEY_AP_CHANNEL)); + ValuesList.add(FPSTR(VALUE_NOT_AVAILABLE)); + //Authentification mode + KeysList.add(FPSTR(KEY_AP_AUTH)); + ValuesList.add(FPSTR(VALUE_NOT_AVAILABLE)); + //Max connections + KeysList.add(FPSTR(KEY_AP_MAX_CON)); + ValuesList.add(FPSTR(VALUE_NOT_AVAILABLE)); + } + KeysList.add(FPSTR(KEY_AP_DHCP_STATUS)); + if (wifi_softap_dhcps_status()==DHCP_STARTED)ValuesList.add(FPSTR(VALUE_STARTED)); + else ValuesList.add(FPSTR(VALUE_STOPPED)); + //IP/GW/MASK + if (wifi_get_ip_info(SOFTAP_IF,&info)) + { + //IP address + KeysList.add(FPSTR(KEY_AP_IP)); + ValuesList.add(wifi_config.ip2str(info.ip.addr)); + //GW address + KeysList.add(FPSTR(KEY_AP_GW)); + ValuesList.add(wifi_config.ip2str(info.gw.addr)); + //Sub Net Mask + KeysList.add(FPSTR(KEY_AP_SUBNET)); + ValuesList.add(wifi_config.ip2str(info.netmask.addr)); + } + else + { + //IP address + KeysList.add(FPSTR(KEY_AP_IP)); + ValuesList.add(FPSTR(VALUE_NO_IP)); + //GW address + KeysList.add(FPSTR(KEY_AP_GW)); + ValuesList.add(FPSTR(VALUE_NO_IP)); + //Sub Net Mask + KeysList.add(FPSTR(KEY_AP_SUBNET)); + ValuesList.add(FPSTR(VALUE_NO_IP)); + } + //STA part + if (wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) + { + //STA is enabled + KeysList.add(FPSTR(KEY_STA_STATUS_ENABLED)); + ValuesList.add(FPSTR(VALUE_ENABLED)); + //set visible + KeysList.add(FPSTR(KEY_STA_VISIBILITY)); + ValuesList.add(FPSTR(VALUE_ITEM_VISIBLE)); + } + else + { + //STA is disabled + KeysList.add(FPSTR(KEY_STA_STATUS_ENABLED)); + ValuesList.add(FPSTR(VALUE_DISABLED)); + //set hide + KeysList.add(FPSTR(KEY_STA_VISIBILITY)); + ValuesList.add(FPSTR(VALUE_ITEM_HIDDEN)); + } + //STA mac address + KeysList.add(FPSTR(KEY_STA_MAC)); + ValuesList.add(wifi_config.mac2str(WiFi.macAddress(mac))); + //SSID used by STA + KeysList.add(FPSTR(KEY_STA_SSID)); + if (strlen(WiFi.SSID())==0)ValuesList.add(FPSTR(VALUE_NOT_AVAILABLE)); + else ValuesList.add(WiFi.SSID()); + //Channel + KeysList.add(FPSTR(KEY_STA_CHANNEL)); + ValuesList.add(intTostr (wifi_get_channel())); + //Connection status + istatus = wifi_station_get_connect_status(); + KeysList.add(FPSTR(KEY_STA_STATUS)); + if (istatus==STATION_GOT_IP) ValuesList.add(FPSTR(VALUE_CONNECTED)); + else if (istatus==STATION_NO_AP_FOUND) ValuesList.add(FPSTR(VALUE_NO_SSID)); + else if (istatus==STATION_CONNECT_FAIL) ValuesList.add(FPSTR(VALUE_CONNECTION_FAILED)); + else if (istatus==STATION_WRONG_PASSWORD) ValuesList.add(FPSTR(VALUE_CONNECTION_FAILED2)); + else if (istatus==STATION_IDLE) ValuesList.add(FPSTR(VALUE_IDLE));//should not happen + else ValuesList.add(FPSTR(VALUE_DISCONNECTED)); + //DHCP Client status + KeysList.add(FPSTR(KEY_STA_DHCP_STATUS)); + if (wifi_station_dhcpc_status()==DHCP_STARTED)ValuesList.add(FPSTR(VALUE_STARTED)); + else ValuesList.add(FPSTR(VALUE_STOPPED)); + //IP address + KeysList.add(FPSTR(KEY_STA_IP)); + ValuesList.add(WiFi.localIP().toString().c_str()); + //GW address + KeysList.add(FPSTR(KEY_STA_GW)); + ValuesList.add(WiFi.gatewayIP().toString().c_str()); + //Sub Net Mask + KeysList.add(FPSTR(KEY_STA_SUBNET)); + ValuesList.add(WiFi.subnetMask().toString().c_str()); + //Service page / no need refresh on this page + KeysList.add(FPSTR(KEY_SERVICE_PAGE)); + ValuesList.add(""); + + //process the template file and provide list of variables + if(KeysList.size()==ValuesList.size()) //Sanity check + processTemplate("/home.tpl", KeysList , ValuesList); + //need to clean to speed up memory recovery + KeysList.clear(); + ValuesList.clear(); } void handle_web_interface_configSys() { - String stmp,smsg; - String buffer2send =""; - byte bflag=0; - char error_display[4]={0,0,0,0}; - bool msg_alert_error=false; - bool msg_alert_success=false; - long ibaud=0; - int iweb_port =0; - int idata_port =0; - byte bsleepmode=0; - byte polling_time=3; + String stmp,smsg; + long lstatus; + int istatus; + byte bbuf; + long ibaud=DEFAULT_BAUD_RATE; + int iweb_port =DEFAULT_WEB_PORT; + int idata_port =DEFAULT_DATA_PORT; + byte bsleepmode=DEFAULT_SLEEP_MODE; + bool msg_alert_error=false; + bool msg_alert_success=false; + long lbaudlist[] = {9600 ,19200,38400,57600,115200,230400,250000,-1}; + int bmodemvaluelist[] = {NONE_SLEEP_T,LIGHT_SLEEP_T,MODEM_SLEEP_T, -1}; + const __FlashStringHelper *smodemdisplaylist[]={FPSTR(VALUE_NONE),FPSTR(VALUE_LIGHT),FPSTR(VALUE_MODEM),FPSTR(VALUE_MODEM)}; + STORESTRINGS_CLASS KeysList ; + STORESTRINGS_CLASS ValuesList ; + //Free Mem, put at the end to reflect situation + KeysList.add(FPSTR(KEY_FREE_MEM)); + ValuesList.add(intTostr(system_get_free_heap_size())); + //IP + stmp=FPSTR(KEY_IP); + KeysList.add(stmp); + if (wifi_get_opmode()==WIFI_STA ) stmp=WiFi.localIP().toString(); + else stmp=WiFi.softAPIP().toString(); + ValuesList.add(stmp); + //Web address = ip + port + KeysList.add(FPSTR(KEY_WEB_ADDRESS)); + if (wifi_config.iweb_port!=80) + { + stmp+=":"; + stmp+=intTostr(wifi_config.iweb_port); + } + ValuesList.add(stmp); + //mode + if (wifi_get_opmode()==WIFI_STA ) + { + KeysList.add(FPSTR(KEY_MODE)); + ValuesList.add(FPSTR(VALUE_STA)); + } + else + { + if (wifi_get_opmode()==WIFI_AP ) + { + KeysList.add(FPSTR(KEY_MODE)); + ValuesList.add(FPSTR(VALUE_AP)); + } + else + { + KeysList.add(FPSTR(KEY_MODE)); + ValuesList.add(FPSTR(VALUE_AP_STA)); + } + } + //FW Version + KeysList.add(FPSTR(KEY_FW_VER)); + ValuesList.add(FPSTR(VALUE_FW_VERSION)); + //page title + KeysList.add(FPSTR(KEY_PAGE_TITLE)); + ValuesList.add(FPSTR(VALUE_HOME)); + //tpl file name with extension + KeysList.add(FPSTR(KEY_FILE_NAME)); + ValuesList.add("system.tpl"); + //tpl file name without extension + KeysList.add(FPSTR(KEY_SHORT_FILE_NAME)); + ValuesList.add("system"); + //menu item + KeysList.add(FPSTR(KEY_MENU_SYSTEM)); + ValuesList.add(FPSTR(VALUE_ACTIVE)); + //check is it is a submission or a display - if (web_interface->WebServer.hasArg(String(FPSTR(SUBMIT_ID)).c_str())) + if (web_interface->WebServer.hasArg("SUBMIT")) { //is there a correct list of values? - if (web_interface->WebServer.hasArg(String(FPSTR(BAUD_RATE_ID)).c_str()) && web_interface->WebServer.hasArg(String(FPSTR(SLEEP_MODE_ID)).c_str())&& web_interface->WebServer.hasArg(String(FPSTR(POLLING_ID)).c_str())&& web_interface->WebServer.hasArg(String(FPSTR(WEB_PORT_ID)).c_str())&& web_interface->WebServer.hasArg(String(FPSTR(DATA_PORT_ID)).c_str())) + if (web_interface->WebServer.hasArg("BAUD_RATE") && web_interface->WebServer.hasArg("SLEEP_MODE")&& web_interface->WebServer.hasArg("DATAPORT")&& web_interface->WebServer.hasArg("WEBPORT")) { //is each value correct ? - ibaud = atol(web_interface->WebServer.arg(String(FPSTR(BAUD_RATE_ID)).c_str()).c_str()); - iweb_port = atol(web_interface->WebServer.arg(String(FPSTR(WEB_PORT_ID)).c_str()).c_str()); - idata_port = atoi(web_interface->WebServer.arg(String(FPSTR(DATA_PORT_ID)).c_str()).c_str()); - bsleepmode = atoi(web_interface->WebServer.arg(String(FPSTR(SLEEP_MODE_ID)).c_str()).c_str()); - polling_time = atoi(web_interface->WebServer.arg(String(FPSTR(POLLING_ID)).c_str()).c_str()); - if (!(iweb_port>0 && iweb_port<65001) || - !(idata_port>0 && idata_port<65001)) + ibaud = web_interface->WebServer.arg("BAUD_RATE").toInt(); + iweb_port = web_interface->WebServer.arg("WEBPORT").toInt(); + idata_port = web_interface->WebServer.arg("DATAPORT").toInt(); + bsleepmode = web_interface->WebServer.arg("SLEEP_MODE").toInt(); + + if (!(iweb_port>0 && iweb_port<65001)) { msg_alert_error=true; - smsg=FPSTR(ERROR_INCORRECT_PORT); + smsg+="Error : invalid port value for web port
"; + KeysList.add(FPSTR(KEY_WEB_PORT_STATUS)); + ValuesList.add(FPSTR(VALUE_HAS_ERROR)); + } + if (!(idata_port>0 && idata_port<65001)) + { + msg_alert_error=true; + smsg+="Error : invalid port value for data port
"; + KeysList.add(FPSTR(KEY_DATA_PORT_STATUS)); + ValuesList.add(FPSTR(VALUE_HAS_ERROR)); } if (iweb_port== idata_port) { msg_alert_error=true; - smsg=FPSTR(ERROR_INCORRECT_PORT2); + smsg+="Error : web port and data port cannot be identical
"; + KeysList.add(FPSTR(KEY_WEB_PORT_STATUS)); + ValuesList.add(FPSTR(VALUE_HAS_ERROR)); + KeysList.add(FPSTR(KEY_DATA_PORT_STATUS)); + ValuesList.add(FPSTR(VALUE_HAS_ERROR)); } - if (!(ibaud==9600 || ibaud==19200|| ibaud==38400|| ibaud==57600|| ibaud==115200|| ibaud==230400 || ibaud==250000) || - !(bsleepmode==NONE_SLEEP_T ||bsleepmode==LIGHT_SLEEP_T ||bsleepmode==MODEM_SLEEP_T )|| - !(polling_time==1 || polling_time==2 ||polling_time==3 || polling_time==4 ||polling_time==5 ||polling_time==10 ||polling_time==30 ||polling_time==60)) + if (!(ibaud==9600 || ibaud==19200|| ibaud==38400|| ibaud==57600|| ibaud==115200|| ibaud==230400 || ibaud==250000)) { msg_alert_error=true; - smsg=FPSTR(ERROR_QUERY); + smsg+="Error : value for baud rate is not correct
"; + KeysList.add(FPSTR(KEY_BAUD_RATE_STATUS)); + ValuesList.add(FPSTR(VALUE_HAS_ERROR)); + } + if (!(bsleepmode==NONE_SLEEP_T ||bsleepmode==LIGHT_SLEEP_T ||bsleepmode==MODEM_SLEEP_T )) + { + msg_alert_error=true; + smsg+="Error : value for sleeping mode is not correct
"; + KeysList.add(FPSTR(KEY_SLEEP_MODE_STATUS)); + ValuesList.add(FPSTR(VALUE_HAS_ERROR)); } } else { msg_alert_error=true; - smsg=FPSTR(ERROR_QUERY); + smsg="Error : Missing data"; } //if no error apply the changes if (msg_alert_error!=true) { - if(!CONFIG::write_buffer(EP_BAUD_RATE,(const byte *)&ibaud,INTEGER_LENGH)||!CONFIG::write_buffer(EP_WEB_PORT,(const byte *)&iweb_port,INTEGER_LENGH)||!CONFIG::write_buffer(EP_DATA_PORT,(const byte *)&idata_port,INTEGER_LENGH)||!CONFIG::write_byte(EP_SLEEP_MODE,bsleepmode)||!CONFIG::write_byte(EP_POLLING_TIME,polling_time)) + if(!CONFIG::write_buffer(EP_BAUD_RATE,(const byte *)&ibaud,INTEGER_LENGTH)||!CONFIG::write_buffer(EP_WEB_PORT,(const byte *)&iweb_port,INTEGER_LENGTH)||!CONFIG::write_buffer(EP_DATA_PORT,(const byte *)&idata_port,INTEGER_LENGTH)||!CONFIG::write_byte(EP_SLEEP_MODE,bsleepmode)) { msg_alert_error=true; - smsg=FPSTR(ERROR_WRITING_CHANGES); + smsg="Error : Cannot write to EEPROM"; } else - if (!msg_alert_error) { msg_alert_success=true; wifi_config.iweb_port=iweb_port; wifi_config.idata_port=idata_port; - smsg=FPSTR(SAVED_CHANGES); + smsg="Changes saved to EEPROM, restarting...."; } } } - else + else //no submit need to get data from EEPROM { - if (!CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&ibaud , INTEGER_LENGH))ibaud=DEFAULT_BAUD_RATE; + if (!CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&ibaud , INTEGER_LENGTH))ibaud=DEFAULT_BAUD_RATE; if (!CONFIG::read_byte(EP_SLEEP_MODE, &bsleepmode ))bsleepmode=DEFAULT_SLEEP_MODE; - if (!CONFIG::read_buffer(EP_WEB_PORT, (byte *)&iweb_port , INTEGER_LENGH))ibaud=DEFAULT_WEB_PORT; - if (!CONFIG::read_buffer(EP_DATA_PORT, (byte *)&idata_port , INTEGER_LENGH))ibaud=DEFAULT_DATA_PORT; - if (!CONFIG::read_byte(EP_POLLING_TIME, &polling_time ))polling_time=DEFAULT_POLLING_TIME; + if (!CONFIG::read_buffer(EP_WEB_PORT, (byte *)&iweb_port , INTEGER_LENGTH))iweb_port=DEFAULT_WEB_PORT; + if (!CONFIG::read_buffer(EP_DATA_PORT, (byte *)&idata_port , INTEGER_LENGTH))idata_port=DEFAULT_DATA_PORT; } - if (wifi_get_opmode()==WIFI_STA ) stmp=wifi_config.ip2str(WiFi.localIP()); - else stmp=wifi_config.ip2str(WiFi.softAPIP()); - if (wifi_config.iweb_port!=80) - { - stmp+=":"; - stmp+=String(wifi_config.iweb_port); - } - buffer2send+=(FPSTR(PAGE_HEAD_1)); - add_css (buffer2send); - buffer2send+=(FPSTR(PAGE_HEAD_2)); - TOPBAR(stmp.c_str(),2) - buffer2send+=(FPSTR(PANEL_TOP)); - buffer2send+=(FPSTR(TITLE_SYSTEM)); - buffer2send+=(FPSTR(PANEL_START)); - buffer2send+=(FPSTR(FORM_START)); - //baud rate - SELECT_START(FPSTR(AP_1_ID),FPSTR(BAUD_RATE_NAME),FPSTR(BAUD_RATE_ID)) - if (ibaud==9600)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_9600), stmp.c_str(),FPSTR(VALUE_9600)) - if (ibaud==19200)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_19200), stmp.c_str(),FPSTR(VALUE_19200)) - if (ibaud==38400)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_38400), stmp.c_str(),FPSTR(VALUE_38400)) - if (ibaud==57600)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_57600), stmp.c_str(),FPSTR(VALUE_57600)) - if (ibaud==115200)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_115200), stmp.c_str(),FPSTR(VALUE_115200)) - if (ibaud==230400)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_230400), stmp.c_str(),FPSTR(VALUE_230400)) - if (ibaud==250000)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_250000), stmp.c_str(),FPSTR(VALUE_250000)) - SELECT_END - - // buffer2send+=(FPSTR(BR)); - - //sleep mode - SELECT_START(FPSTR(AP_2_ID),FPSTR(SLEEP_MODE_NAME),FPSTR(SLEEP_MODE_ID)) - if (bsleepmode==NONE_SLEEP_T)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(String(NONE_SLEEP_T).c_str(), stmp.c_str(),FPSTR(VALUE_NONE)) - if (bsleepmode==LIGHT_SLEEP_T)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(String(LIGHT_SLEEP_T).c_str(), stmp.c_str(),FPSTR(VALUE_LIGHT)) - if (bsleepmode==MODEM_SLEEP_T)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(String(MODEM_SLEEP_T).c_str(), stmp.c_str(),FPSTR(VALUE_MODEM)) - SELECT_END - - //web port - if(error_display[2]==0) - { - INPUT_TEXT( FPSTR(AP_3_ID),FPSTR(WEB_PORT_TITLE), FPSTR(WEB_PORT_ID),FPSTR(PORT_DESC),String(iweb_port).c_str()) - } - else - { - INPUT_TEXT_ERROR( FPSTR(AP_3_ID),FPSTR(WEB_PORT_TITLE), FPSTR(WEB_PORT_ID),FPSTR(PORT_DESC),String(iweb_port).c_str()) - } - //data port - if(error_display[3]==0) - { - INPUT_TEXT( FPSTR(AP_4_ID),FPSTR(DATA_PORT_TITLE), FPSTR(DATA_PORT_ID),FPSTR(PORT_DESC),String(idata_port).c_str()) - } - else - { - INPUT_TEXT_ERROR( FPSTR(AP_4_ID),FPSTR(DATA_PORT_TITLE), FPSTR(DATA_PORT_ID),FPSTR(PORT_DESC),String(idata_port).c_str()) - } - - //polling - SELECT_START(FPSTR(AP_10_ID),FPSTR(POLLING_TITLE),FPSTR(POLLING_ID)) - if (polling_time==1)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_1), stmp.c_str(),FPSTR(VALUE_1)) - if (polling_time==2)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_2), stmp.c_str(),FPSTR(VALUE_2)) - if (polling_time==3)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_3), stmp.c_str(),FPSTR(VALUE_3)) - if (polling_time==4)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_4), stmp.c_str(),FPSTR(VALUE_4)) - if (polling_time==5)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_5), stmp.c_str(),FPSTR(VALUE_5)) - if (polling_time==10)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_10), stmp.c_str(),FPSTR(VALUE_10)) - if (polling_time==30)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_30), stmp.c_str(),FPSTR(VALUE_30)) - if (polling_time==60)stmp = FPSTR(VALUE_SELECTED); - else stmp=""; - OPTION(FPSTR(VALUE_60), stmp.c_str(),FPSTR(VALUE_60)) - - SELECT_END - if(msg_alert_error) - { - MSG_ERROR(smsg.c_str()) - buffer2send+=(FPSTR(FORM_SUBMIT)); - } - else if(msg_alert_success) + //Baud rate list + istatus = 0; + stmp=""; + while (lbaudlist[istatus]>-1) { - MSG_SUCCESS(smsg.c_str()) + stmp+="