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);