diff --git a/esp8266/webinterface.cpp b/esp8266/webinterface.cpp
index c5d06bc9..8326aaa9 100644
--- a/esp8266/webinterface.cpp
+++ b/esp8266/webinterface.cpp
@@ -29,6 +29,8 @@ extern "C" {
#include "user_interface.h"
}
+#define LIMIT_BUFFER 2500
+
const char PAGE_HEAD[] PROGMEM = "\n
\n\n\n" \
"\nWifi Configuration" \
"\n\n"\
@@ -57,13 +59,30 @@ const char LABEL_START[] PROGMEM = "";
const char BR[] PROGMEM = "
\n";
-#define LABEL(buffer, title, value) buffer+= LABEL_START; buffer+=title;buffer+=LABEL_COLOR;buffer+=value;buffer+=LABEL_END;buffer+=BR;
-#define LABEL_UNITS(buffer, title, value,units) buffer+= LABEL_START; buffer+=title;buffer+=LABEL_COLOR;buffer+=value;buffer+=units;buffer+=LABEL_END;buffer+=BR;
+const char TABLE_START[] PROGMEM = "\n
";
+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 TH_R[] 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";
+#define LABEL( title, value) web_interface.add4send(LABEL_START); web_interface.add4send(title);web_interface.add4send(LABEL_COLOR);web_interface.add4send(value);web_interface.add4send(LABEL_END);web_interface.add4send(BR);
+#define LABEL_UNITS(title, value,units) web_interface.add4send(LABEL_START); web_interface.add4send(title);web_interface.add4send(LABEL_COLOR);web_interface.add4send(value);web_interface.add4send(units);web_interface.add4send(LABEL_END);web_interface.add4send(BR);
+#define TH_ENTRY(entry) web_interface.add4send(TH_S);web_interface.add4send(entry);web_interface.add4send(TH_E);
+#define THR_ENTRY(entry) web_interface.add4send(TH_R);web_interface.add4send(entry);web_interface.add4send(TH_E);
+#define TD_ENTRY(entry) web_interface.add4send(TD_S);web_interface.add4send(entry);web_interface.add4send(TD_E);
//cannot put it in class then cast it as std::function so put outside
void handle_web_interface_root()
{
- String sbuf=PAGE_HEAD ;
String IP;
String sstatus;
struct softap_config apconfig;
@@ -72,156 +91,175 @@ void handle_web_interface_root()
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());
+ web_interface.add4send(PAGE_HEAD);
//top bar
- sbuf+=NAV_START ;
- sbuf+=NAV_LEFT_PART1 ;
- sbuf+=NAV_ELEMENT_ACTIVE ;
- sbuf+=NAV_LEFT_PART2a ;
- sbuf+=IP;
- sbuf+=NAV_LEFT_PART2b ;
- sbuf+=NAV_LEFT_PART3a ;
- sbuf+=IP;
- sbuf+=NAV_LEFT_PART3b ;
- sbuf+=NAV_RIGHT_PART ;
- sbuf+=NAV_END ;
-//system part
- sbuf+=PANEL_TOP;
- sbuf+=F("System");
- sbuf+=PANEL_START;
- LABEL(sbuf,F("Chip ID: "),String(system_get_chip_id()))
- LABEL_UNITS(sbuf,F("CPU Frequency: "),system_get_cpu_freq(),F("Hz"))
- LABEL_UNITS(sbuf,F("Free Memory: "),String(system_get_free_heap_size()),F(" octets"))
- LABEL(sbuf,F("SDK Version: "),system_get_sdk_version())
+ web_interface.add4send(NAV_START);
+ web_interface.add4send(NAV_LEFT_PART1) ;
+ web_interface.add4send(NAV_ELEMENT_ACTIVE) ;
+ web_interface.add4send(NAV_LEFT_PART2a );
+ web_interface.add4send(IP.c_str());
+ web_interface.add4send(NAV_LEFT_PART2b );
+ web_interface.add4send(NAV_LEFT_PART3a );
+ web_interface.add4send(IP.c_str());
+ web_interface.add4send(NAV_LEFT_PART3b) ;
+ web_interface.add4send(NAV_RIGHT_PART) ;
+ web_interface.add4send(NAV_END) ;
+ //system part
+ web_interface.add4send(PANEL_TOP);
+ web_interface.add4send(F("System"));
+ web_interface.add4send(PANEL_START);
+
+ LABEL(F("Chip ID: "),String(system_get_chip_id()).c_str())
+ LABEL_UNITS(F("CPU Frequency: "),String(system_get_cpu_freq()).c_str(),F("Hz"))
+ LABEL_UNITS(F("Free Memory: "),String(system_get_free_heap_size()).c_str(),F(" octets"))
+ LABEL(F("SDK Version: "),system_get_sdk_version())
#ifdef MDNS_FEATURE
sstatus = F("http://");
sstatus+=LOCAL_NAME;
- LABEL_UNITS(sbuf,F("mDNS name: "),sstatus,F(".local"))
+ LABEL_UNITS(F("mDNS name: "),sstatus.c_str(),F(".local"))
#endif
istatus = wifi_get_phy_mode();
if (istatus==PHY_MODE_11B) sstatus=F("11b");
else if (istatus==PHY_MODE_11G) sstatus=F("11g");
else sstatus=F("11n");
- LABEL(sbuf,F("Network: "),sstatus)
+ LABEL(F("Network: "),sstatus.c_str())
istatus = wifi_get_sleep_type();
if (istatus==NONE_SLEEP_T) sstatus=F("None");
else if (istatus==LIGHT_SLEEP_T) sstatus=F("Light");
else sstatus=F("Modem");
- LABEL(sbuf,F("Sleep mode: "),sstatus)
+ LABEL(F("Sleep mode: "),sstatus.c_str())
//LABEL(sbuf,F("Boot mode: "),String(system_get_boot_mode())) //no meaning so far
- LABEL(sbuf,F("Boot version: "),String(system_get_boot_version()))
- sbuf+=PANEL_END;
-
- //split to not reach the sending size limit
- web_interface.WebServer.send(200, F("text/html"), sbuf);
-
+ LABEL(F("Boot version: "),String(system_get_boot_version()).c_str())
+ web_interface.add4send(PANEL_END);
//access point
- sbuf=PANEL_TOP;
- sbuf+=F("Access Point");
- if(wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) sbuf+=F(" (enabled)");
- else sbuf+=F(" (disabled)");
- sbuf+=PANEL_START;
- LABEL(sbuf,F("Mac address: "),wifi_config.mac2str(WiFi.softAPmacAddress(mac));)
- if (wifi_softap_get_config(&apconfig))
- {
- LABEL(sbuf,F("SSID: "),(char *)(apconfig.ssid))
- if(apconfig.ssid_hidden==1)sstatus=F("No");
- else sstatus=F("Yes");
- LABEL(sbuf,F("Visible: "),sstatus)
- LABEL(sbuf,F("Channel: "),String(apconfig.channel))
- if (apconfig.authmode==AUTH_OPEN)sstatus=F("None");
- else if (apconfig.authmode==AUTH_WEP)sstatus=F("WEP");
- else if (apconfig.authmode==AUTH_WPA_PSK)sstatus=F("WPA");
- else if (apconfig.authmode==AUTH_WPA2_PSK)sstatus=F("WPA2");
- else if (apconfig.authmode==AUTH_WPA_WPA2_PSK)sstatus=F("WPA/WPA2");
- else sstatus=F("MAX"); //what is this one ? WPS ? Cannot find information
- LABEL(sbuf,F("Authentification: "),sstatus)
- LABEL(sbuf,F("Maximum connections : "),String(apconfig.max_connection))
- }
- if (wifi_softap_dhcps_status()==DHCP_STARTED)sstatus=F("Started");
- else sstatus=F("Stopped");
- LABEL(sbuf,F("DHCP Server: "),sstatus)
- if (wifi_get_ip_info(SOFTAP_IF,&info))
- {
- LABEL(sbuf,F("IP: "),wifi_config.ip2str(info.ip.addr))
- LABEL(sbuf,F("Gateway: "),wifi_config.ip2str(info.gw.addr))
- LABEL(sbuf,F("Subnet: "),wifi_config.ip2str(info.netmask.addr))
- }
- //List number of client
- istatus = 0;
- sstatus="";
- struct station_info * station = wifi_softap_get_station_info();
- while(station){
- istatus++;
- sstatus+=F("Mac: | ");
- sstatus+=wifi_config.mac2str(station->bssid);
- sstatus+=F(" | IP: | ");
- static char ipstr [16];
- if (0>sprintf(ipstr, IPSTR,IP2STR(&station->ip))) strcpy (ipstr, F("0.0.0.0"));
- sstatus+=ipstr;
- sstatus+=F(" |
");
- station = STAILQ_NEXT(station, next);
- }
- wifi_softap_free_station_info();
- LABEL(sbuf,F("Clients: "),String(istatus));
- sbuf+=F("");
- sbuf+=sstatus;
- sbuf+=F("
");
- sbuf+=PANEL_END;
- //split to not reach the sending size limit
- web_interface.WebServer.client().print(sbuf);
-
- sbuf=PANEL_TOP;
- sbuf+=F("Station");
- if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) sbuf+=F(" (enabled)");
- else sbuf+=F(" (disabled)");
- sbuf+=PANEL_START;
- LABEL(sbuf,F("Mac address: "),wifi_config.mac2str(WiFi.macAddress(mac));)
- LABEL(sbuf,F("Connection to: "),WiFi.SSID())
- LABEL(sbuf,F("Channel: "),String(wifi_get_channel()))
- istatus = wifi_station_get_connect_status();
- if (istatus==STATION_GOT_IP) sstatus=F("Connected");
- else if (istatus==STATION_NO_AP_FOUND) sstatus=F("SSID not Available!");
- else if (istatus==STATION_CONNECT_FAIL) sstatus=F("Connecion failed!");
- else if (istatus==STATION_WRONG_PASSWORD) sstatus=F("Connecion failed! (Wrong Password)");
- else if (istatus==STATION_IDLE) sstatus=F("Idle");//should not happen
- else sstatus=F("Disconnected");
- LABEL(sbuf,F("Status: "),sstatus)
- if (wifi_station_dhcpc_status()==DHCP_STARTED)sstatus=F("Started");
- else sstatus=F("Stopped");
- LABEL(sbuf,F("DHCP Client: "),sstatus)
- LABEL(sbuf,F("IP: "),wifi_config.ip2str(WiFi.localIP()))
- LABEL(sbuf,F("Gateway: "),wifi_config.ip2str(WiFi.gatewayIP()))
- LABEL(sbuf,F("Subnet: "),wifi_config.ip2str(WiFi.subnetMask()))
- sbuf+=PANEL_END;
- //split to not reach the sending size limit (2920)
- web_interface.WebServer.client().print(sbuf);
-
-
- sbuf=PAGE_BOTTOM;
- //split to not reach the sending size limit
- web_interface.WebServer.client().print(sbuf);
+ web_interface.add4send(PANEL_TOP);
+ web_interface.add4send(F("Access Point"));
+ if(wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) web_interface.add4send(F(" (enabled)"));
+ else web_interface.add4send(F(" (disabled)"));
+ web_interface.add4send(PANEL_START);
+ LABEL(F("Mac address: "),wifi_config.mac2str(WiFi.softAPmacAddress(mac)))
+ if (wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA)
+ {
+ if (wifi_softap_get_config(&apconfig))
+ {
+ LABEL(F("SSID: "),(char *)(apconfig.ssid))
+ if(apconfig.ssid_hidden==1)sstatus=F("No");
+ else sstatus=F("Yes");
+ LABEL(F("Visible: "),sstatus.c_str())
+ LABEL(F("Channel: "),String(apconfig.channel).c_str())
+ if (apconfig.authmode==AUTH_OPEN)sstatus=F("None");
+ else if (apconfig.authmode==AUTH_WEP)sstatus=F("WEP");
+ else if (apconfig.authmode==AUTH_WPA_PSK)sstatus=F("WPA");
+ else if (apconfig.authmode==AUTH_WPA2_PSK)sstatus=F("WPA2");
+ else if (apconfig.authmode==AUTH_WPA_WPA2_PSK)sstatus=F("WPA/WPA2");
+ else sstatus=F("MAX"); //what is this one ? WPS ? Cannot find information
+ LABEL(F("Authentification: "),sstatus.c_str())
+ LABEL(F("Maximum connections : "),String(apconfig.max_connection).c_str())
+ }
+ if (wifi_softap_dhcps_status()==DHCP_STARTED)sstatus=F("Started");
+ else sstatus=F("Stopped");
+ LABEL(F("DHCP Server: "),sstatus.c_str())
+ if (wifi_get_ip_info(SOFTAP_IF,&info))
+ {
+ LABEL(F("IP: "),wifi_config.ip2str(info.ip.addr))
+ LABEL(F("Gateway: "),wifi_config.ip2str(info.gw.addr))
+ LABEL(F("Subnet: "),wifi_config.ip2str(info.netmask.addr))
+ }
+ //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)
+ {
+ istatus++;
+ stationtmp = STAILQ_NEXT(stationtmp, next);
+ }
+ //start table as at least one connected
+ web_interface.add4send(TABLE_START);
+ web_interface.add4send(CAPTION_S);
+ web_interface.add4send(String(istatus).c_str());
+ web_interface.add4send(F(" connected station(s)"));
+ web_interface.add4send(CAPTION_S);
+ web_interface.add4send(THEAD_S);
+ web_interface.add4send(TR_S);
+ TH_ENTRY(F("#"))
+ TH_ENTRY(F("Mac"))
+ TH_ENTRY(F("IP"))
+ web_interface.add4send(TR_E);
+ web_interface.add4send(THEAD_E);
+ web_interface.add4send(TBODY_S);
+ istatus=0;
+ while(station)
+ {
+ istatus++;
+ //display each client
+ web_interface.add4send(TR_S);
+ THR_ENTRY(String(istatus).c_str())
+ TD_ENTRY(wifi_config.mac2str(station->bssid))
+ static char ipstr [16];
+ if (0>sprintf(ipstr, IPSTR,IP2STR(&station->ip))) strcpy (ipstr, F("0.0.0.0"));
+ TD_ENTRY(ipstr)
+ web_interface.add4send(TR_E);
+ station = STAILQ_NEXT(station, next);
+ }
+ web_interface.add4send(TBODY_E);
+ //close table
+ web_interface.add4send(TABLE_END);
+ wifi_softap_free_station_info();
+ }
+ web_interface.add4send(PANEL_END);
+ web_interface.add4send(PANEL_TOP);
+ web_interface.add4send(F("Station"));
+ if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) web_interface.add4send(F(" (enabled)"));
+ else web_interface.add4send(F(" (disabled)"));
+ web_interface.add4send(PANEL_START);
+ LABEL(F("Mac address: "),wifi_config.mac2str(WiFi.macAddress(mac)))
+ if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA)
+ {
+ LABEL(F("Connection to: "),WiFi.SSID())
+ LABEL(F("Channel: "),String(wifi_get_channel()).c_str())
+ istatus = wifi_station_get_connect_status();
+ if (istatus==STATION_GOT_IP) sstatus=F("Connected");
+ else if (istatus==STATION_NO_AP_FOUND) sstatus=F("SSID not Available!");
+ else if (istatus==STATION_CONNECT_FAIL) sstatus=F("Connecion failed!");
+ else if (istatus==STATION_WRONG_PASSWORD) sstatus=F("Connecion failed! (Wrong Password)");
+ else if (istatus==STATION_IDLE) sstatus=F("Idle");//should not happen
+ else sstatus=F("Disconnected");
+ LABEL(F("Status: "),sstatus.c_str())
+ if (wifi_station_dhcpc_status()==DHCP_STARTED)sstatus=F("Started");
+ else sstatus=F("Stopped");
+ LABEL(F("DHCP Client: "),sstatus.c_str())
+ LABEL(F("IP: "),wifi_config.ip2str(WiFi.localIP()))
+ LABEL(F("Gateway: "),wifi_config.ip2str(WiFi.gatewayIP()))
+ LABEL(F("Subnet: "),wifi_config.ip2str(WiFi.subnetMask()))
+ }
+ web_interface.add4send(PANEL_END);
+ web_interface.add4send(PAGE_BOTTOM);
+ web_interface.flushbuffer();
}
void handle_web_interface_config()
{
- String sbuf=PAGE_HEAD ;
String IP;
if (wifi_get_opmode()==WIFI_STA ) IP=wifi_config.ip2str(WiFi.localIP());
else IP=wifi_config.ip2str(WiFi.softAPIP());
- sbuf+=NAV_START ;
- sbuf+=NAV_LEFT_PART1 ;
- sbuf+=NAV_LEFT_PART2a ;
- sbuf+=IP;
- sbuf+=NAV_LEFT_PART2b ;
- sbuf+=NAV_ELEMENT_ACTIVE ;
- sbuf+=NAV_LEFT_PART3a ;
- sbuf+=IP;
- sbuf+=NAV_LEFT_PART3b ;
- sbuf+=NAV_RIGHT_PART ;
- sbuf+=NAV_END ;
- sbuf+="Configuration
";
- sbuf+=PAGE_BOTTOM;
- web_interface.WebServer.send(200, F("text/html"), sbuf);
+ web_interface.add4send(PAGE_HEAD);
+ web_interface.add4send(NAV_START) ;
+ web_interface.add4send(NAV_LEFT_PART1) ;
+ web_interface.add4send(NAV_LEFT_PART2a) ;
+ web_interface.add4send(IP.c_str());
+ web_interface.add4send(NAV_LEFT_PART2b);
+ web_interface.add4send(NAV_ELEMENT_ACTIVE) ;
+ web_interface.add4send(NAV_LEFT_PART3a) ;
+ web_interface.add4send(IP.c_str());
+ web_interface.add4send(NAV_LEFT_PART3b) ;
+ web_interface.add4send(NAV_RIGHT_PART) ;
+ web_interface.add4send(NAV_END) ;
+ web_interface.add4send("Configuration
");
+ web_interface.add4send(PAGE_BOTTOM);
+ web_interface.flushbuffer();
}
//URI Decoding function
@@ -257,12 +295,58 @@ void WEBINTERFACE_CLASS::urldecode(char *dst, const char *src)
*dst++ = '\0';
}
+//send immediatly the current data
+void WEBINTERFACE_CLASS::flushbuffer()
+{ //empty buffer
+ web_interface.add4send("", true);
+ //reset header part
+ bsendingstarted=false;
+}
+
+//check size of buffer
+//add to buffer if under buffer limit
+//send if buffer limit is reached or will be reached
+void WEBINTERFACE_CLASS::add4send(const char * data2send, bool bimmediatsend)
+{
+ //we store as no need to send right now
+ if (((buffer2send.length() + strlen(data2send)) 0)
+ {
+ web_interface.WebServer.client().print(buffer2send);
+ //reset buffer
+ buffer2send="";
+ }
+ //reset header
+ bsendingstarted=false;
+ }
+ }
+}
+
//constructor
WEBINTERFACE_CLASS::WEBINTERFACE_CLASS (int port):WebServer(port)
{
//init what will handle "/"
WebServer.on(F("/"),HTTP_ANY, handle_web_interface_root);
WebServer.on(F("/CONFIG"),HTTP_ANY, handle_web_interface_config);
+ buffer2send="";
}
WEBINTERFACE_CLASS web_interface(80);