Use PROGMEM and F() properly

Add function to be able to access to strings stored with PROGMEM, it
save 4k memory vs no usage of PROGMEM
This commit is contained in:
luc 2015-05-27 17:08:47 +08:00
parent 0c37d73db8
commit f48e419e0f
5 changed files with 315 additions and 221 deletions

View File

@ -110,8 +110,8 @@ bool CONFIG::write_byte(word pos, const byte value)
bool CONFIG::reset_config() bool CONFIG::reset_config()
{ {
if(!CONFIG::write_byte(EP_WIFI_MODE,DEFAULT_WIFI_MODE))return false; if(!CONFIG::write_byte(EP_WIFI_MODE,DEFAULT_WIFI_MODE))return false;
if(!CONFIG::write_string(EP_SSID,DEFAULT_SSID,strlen(DEFAULT_SSID)))return false; if(!CONFIG::write_string(EP_SSID,PROGMEM2CHAR(DEFAULT_SSID),strlen(PROGMEM2CHAR(DEFAULT_SSID))))return false;
if(!CONFIG::write_string(EP_PASSWORD,DEFAULT_PASSWORD,strlen(DEFAULT_PASSWORD)))return false; if(!CONFIG::write_string(EP_PASSWORD,PROGMEM2CHAR(DEFAULT_PASSWORD),strlen(PROGMEM2CHAR(DEFAULT_PASSWORD))))return false;
if(!CONFIG::write_byte(EP_IP_MODE,DEFAULT_IP_MODE))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_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_MASK_VALUE,DEFAULT_MASK_VALUE,IP_LENGH))return false;

View File

@ -20,7 +20,9 @@
//comment to disable //comment to disable
#define MDNS_FEATURE #define MDNS_FEATURE
#define PROGMEM2CHAR progmem2char
extern char * progmem2char(const char* src);
#ifndef CONFIG_h #ifndef CONFIG_h
#define CONFIG_h #define CONFIG_h
@ -34,7 +36,6 @@ extern "C" {
#define REPOSITORY "https://github.com/luc-github/ESP8266" #define REPOSITORY "https://github.com/luc-github/ESP8266"
//pin used to reset setting //pin used to reset setting
#define RESET_CONFIG_PIN 2 #define RESET_CONFIG_PIN 2
@ -65,8 +66,8 @@ extern "C" {
const char DEFAULT_SSID [] PROGMEM = "ESP8266"; const char DEFAULT_SSID [] PROGMEM = "ESP8266";
const char DEFAULT_PASSWORD [] PROGMEM = "12345678"; const char DEFAULT_PASSWORD [] PROGMEM = "12345678";
#define DEFAULT_IP_MODE STATIC_IP_MODE #define DEFAULT_IP_MODE STATIC_IP_MODE
const byte DEFAULT_IP_VALUE[] PROGMEM = {192,168,0,1}; const byte DEFAULT_IP_VALUE[] = {192,168,0,1};
const byte DEFAULT_MASK_VALUE[] PROGMEM = {255,255,255,0}; const byte DEFAULT_MASK_VALUE[] = {255,255,255,0};
#define DEFAULT_GATEWAY_VALUE DEFAULT_IP_VALUE #define DEFAULT_GATEWAY_VALUE DEFAULT_IP_VALUE
const int DEFAULT_BAUD_RATE = 9600; const int DEFAULT_BAUD_RATE = 9600;
#ifdef MDNS_FEATURE #ifdef MDNS_FEATURE

View File

@ -46,6 +46,7 @@ extern "C" {
void setup() { void setup() {
// init : // init :
ESP.wdtDisable();
delay(8000); delay(8000);
EEPROM.begin(EEPROM_SIZE); EEPROM.begin(EEPROM_SIZE);
bool breset_config=false; bool breset_config=false;

View File

@ -29,7 +29,9 @@ extern "C" {
#include "user_interface.h" #include "user_interface.h"
} }
#define LIMIT_BUFFER 2500
#define LIMIT_BUFFER 3500
const char PAGE_HEAD_1[] PROGMEM = "<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n" \ const char PAGE_HEAD_1[] PROGMEM = "<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n" \
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"; "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n";
@ -40,7 +42,7 @@ const char NAV_START[] PROGMEM = "<nav class=\"navbar navbar-inverse\">\n<div c
const char NAV_LEFT_PART1 [] PROGMEM = "<ul class=\"nav navbar-nav navbar-left\">\n<li "; const char NAV_LEFT_PART1 [] PROGMEM = "<ul class=\"nav navbar-nav navbar-left\">\n<li ";
const char NAV_ELEMENT_ACTIVE [] PROGMEM = "class=\"active\""; const char NAV_ELEMENT_ACTIVE [] PROGMEM = "class=\"active\"";
const char NAV_LEFT_PART2a[] PROGMEM = "><a href=\"http://"; const char NAV_LEFT_PART2a[] PROGMEM = "><a href=\"http://";
const char NAV_LEFT_PART2b[] PROGMEM = "\">Home</a></li>\n<li "; const char NAV_LEFT_PART2b[] PROGMEM = "\">Home</a></li>\n<li ";
const char NAV_LEFT_PART3a[] PROGMEM = "><a href=\"http://"; const char NAV_LEFT_PART3a[] PROGMEM = "><a href=\"http://";
const char NAV_LEFT_PART3b[] PROGMEM = "/CONFIGSYS\">Configuration System</a></li>\n</ul>\n"; const char NAV_LEFT_PART3b[] PROGMEM = "/CONFIGSYS\">Configuration System</a></li>\n</ul>\n";
@ -64,29 +66,29 @@ const char TABLE_START[] PROGMEM = "<div class=\"table-responsive\">\n<table cla
const char TABLE_END [] PROGMEM = "</table></div>\n"; const char TABLE_END [] PROGMEM = "</table></div>\n";
const char CAPTION_S [] PROGMEM = "<caption>\n"; const char CAPTION_S [] PROGMEM = "<caption>\n";
const char THEAD_S[] PROGMEM = "<thead>\n"; const char THEAD_S[] PROGMEM = "<thead>\n";
const char TR_S[] PROGMEM = "<tr>\n"; const char TR_S[] PROGMEM = "<tr>\n";
const char TH_S[] PROGMEM = "<th>\n"; const char TH_S[] PROGMEM = "<th>\n";
const char TH_R[] PROGMEM = "<th scope=\"row\">\n"; const char TH_R[] PROGMEM = "<th scope=\"row\">\n";
const char TD_S[] PROGMEM = "<td>\n"; const char TD_S[] PROGMEM = "<td>\n";
const char TBODY_S[] PROGMEM = "<tbody>\n"; const char TBODY_S[] PROGMEM = "<tbody>\n";
const char CAPTION_E [] PROGMEM = "</caption>\n"; const char CAPTION_E [] PROGMEM = "</caption>\n";
const char THEAD_E[] PROGMEM = "</thead>\n"; const char THEAD_E[] PROGMEM = "</thead>\n";
const char TR_E[] PROGMEM = "</tr>\n"; const char TR_E[] PROGMEM = "</tr>\n";
const char TH_E[] PROGMEM = "</th>\n"; const char TH_E[] PROGMEM = "</th>\n";
const char TD_E[] PROGMEM = "</td>\n"; const char TD_E[] PROGMEM = "</td>\n";
const char TBODY_E[] PROGMEM = "</tbody>\n"; const char TBODY_E[] PROGMEM = "</tbody>\n";
const char T404_PAGE[] PROGMEM = "<H1>Page not found!</H1><BR>Please try <a href=http://"; const char T404_PAGE[] PROGMEM = "<H1>Page not found!</H1><BR>Please try <a href=http://";
const char T404_PAGE_2[] PROGMEM = ">here</a>"; const char T404_PAGE_2[] PROGMEM = ">here</a>";
const char FORM_START[] PROGMEM = "<div class=\"col-sm-10\"><form METHOD=POST>\n"; const char FORM_START[] PROGMEM = "<div class=\"col-sm-10\"><form METHOD=POST>\n";
const char FORM_END[] PROGMEM = "</form></div>\n"; const char FORM_END[] PROGMEM = "</form></div>\n";
const char FORM_INPUT_1[] PROGMEM = "<div class=\"form-group\">\b<label for=\""; const char FORM_INPUT_1[] PROGMEM = "<div class=\"form-group\">\b<label for=\"";
const char FORM_INPUT_1_ERROR[] PROGMEM = "<div class=\"form-group has-error\">\b<label for=\""; const char FORM_INPUT_1_ERROR[] PROGMEM = "<div class=\"form-group has-error\">\b<label for=\"";
const char FORM_INPUT_2[] PROGMEM = "\">"; const char FORM_INPUT_2[] PROGMEM = "\">";
const char FORM_INPUT_3[] PROGMEM = "</label><BR>\n<input type=\"text\" class=\"form-control\" id=\""; const char FORM_INPUT_3[] PROGMEM = "</label><BR>\n<input type=\"text\" class=\"form-control\" id=\"";
const char FORM_INPUT_4[] PROGMEM = "\" name=\""; const char FORM_INPUT_4[] PROGMEM = "\" name=\"";
const char FORM_INPUT_5[] PROGMEM = "\"placeholder=\""; const char FORM_INPUT_5[] PROGMEM = "\"placeholder=\"";
const char FORM_INPUT_6[] PROGMEM = "\" value=\""; const char FORM_INPUT_6[] PROGMEM = "\" value=\"";
const char FORM_INPUT_7[] PROGMEM = "\"style=\"width: auto;\"></div>\n"; const char FORM_INPUT_7[] PROGMEM = "\"style=\"width: auto;\"></div>\n";
const char FORM_SELECT_1[] PROGMEM = "</label><BR>\n<select name=\""; const char FORM_SELECT_1[] PROGMEM = "</label><BR>\n<select name=\"";
const char FORM_SELECT_2[] PROGMEM = "\" id=\""; const char FORM_SELECT_2[] PROGMEM = "\" id=\"";
const char FORM_SELECT_3[] PROGMEM = "\" class=\"form-control\" style=\"width:auto;\">\n"; const char FORM_SELECT_3[] PROGMEM = "\" class=\"form-control\" style=\"width:auto;\">\n";
@ -96,30 +98,120 @@ const char FORM_OPTION_2[] PROGMEM = "\" ";
const char FORM_OPTION_3[] PROGMEM = " >"; const char FORM_OPTION_3[] PROGMEM = " >";
const char FORM_OPTION_4[] PROGMEM = "</option>\n"; const char FORM_OPTION_4[] PROGMEM = "</option>\n";
const char FORM_SUBMIT[] PROGMEM = "<BR><HR><input type=\"submit\" class=\"btn btn-primary\" name=\"SUBMIT\" value=\"Apply\">\n"; const char FORM_SUBMIT[] PROGMEM = "<BR><HR><input type=\"submit\" class=\"btn btn-primary\" name=\"SUBMIT\" value=\"Apply\">\n";
const char ALERT_SUCCESS[] PROGMEM = "<div class=\"alert alert-success\" role=\"alert\">\n"; const char ALERT_SUCCESS[] PROGMEM = "<div class=\"alert alert-success\" role=\"alert\">\n";
const char ALERT_ERROR[] PROGMEM = "<div class=\"alert alert-danger\" role=\"alert\">\n"; const char ALERT_ERROR[] PROGMEM = "<div class=\"alert alert-danger\" role=\"alert\">\n";
const char DIV_E[] PROGMEM = "</div>\n"; const char DIV_E[] PROGMEM = "</div>\n";
const char BAUD_RATE[] PROGMEM = "BAUD_RATE"; const char BAUD_RATE_ID[] PROGMEM = "BAUD_RATE";
const char SLEEP_MODE[] PROGMEM = "SLEEP_MODE"; const char SLEEP_MODE_ID[] PROGMEM = "SLEEP_MODE";
const char NETWORK[] PROGMEM = "NETWORK"; const char NETWORK_ID[] PROGMEM = "NETWORK";
const char REFRESH_1_5[] PROGMEM ="<META HTTP-EQUIV=\"Refresh\" CONTENT=\"5; URL=http://"; const char TITLE_SYSTEM[] PROGMEM = "System";
const char REFRESH_1_15[] PROGMEM ="<META HTTP-EQUIV=\"Refresh\" CONTENT=\"15; URL=http://"; const char CHIP_ID_TITLE[] PROGMEM = "Chip ID: ";
const char REFRESH_2[] PROGMEM ="\">"; const char CPU_FREQ_TITLE[] PROGMEM = "CPU Frequency: ";
#define REFRESH5(ip) web_interface.add4send(REFRESH_1_5);web_interface.add4send(ip);web_interface.add4send(REFRESH_2); const char FREE_MEM_TITLE[] PROGMEM = "Free Memory: ";
#define REFRESH15(ip) web_interface.add4send(REFRESH_1_15);web_interface.add4send(ip);web_interface.add4send(REFRESH_2); const char UNIT_HZ [] PROGMEM = "Hz";
#define MSG_SUCCESS(msg) web_interface.add4send(ALERT_SUCCESS);web_interface.add4send(msg);web_interface.add4send(DIV_E); const char UNIT_OCTET[] PROGMEM = " octets";
#define MSG_ERROR(msg) web_interface.add4send(ALERT_ERROR);web_interface.add4send(msg);web_interface.add4send(DIV_E); const char SDK_VERSION_TITLE[] PROGMEM = "SDK Version: ";
#define OPTION(value, selected,content) web_interface.add4send(FORM_OPTION_1);web_interface.add4send(value);web_interface.add4send(FORM_OPTION_2);web_interface.add4send(selected);web_interface.add4send(FORM_OPTION_3);web_interface.add4send(content);web_interface.add4send(FORM_OPTION_4); const char HTTP_START[] PROGMEM = "http://";
#define SELECT_START(id,label,name) web_interface.add4send(FORM_INPUT_1);web_interface.add4send(id);web_interface.add4send(FORM_INPUT_2);web_interface.add4send(label);web_interface.add4send(FORM_SELECT_1);web_interface.add4send(name);web_interface.add4send(FORM_SELECT_2);web_interface.add4send(id);web_interface.add4send(FORM_SELECT_3); const char HTTP_MDNS_NAME[] PROGMEM = "mDNS name: ";
#define SELECT_START_ERROR(id,label,name) web_interface.add4send(FORM_INPUT_1_ERROR);web_interface.add4send(id);web_interface.add4send(FORM_INPUT_2);web_interface.add4send(label);web_interface.add4send(FORM_SELECT_1);web_interface.add4send(name);web_interface.add4send(FORM_SELECT_2);web_interface.add4send(id);web_interface.add4send(FORM_SELECT_3); const char HTTP_END[] PROGMEM = ".local";
#define SELECT_END web_interface.add4send(FORM_SELECT_END); const char VALUE_11B[] PROGMEM = "11b";
#define INPUT_TEXT( id,label, name,placeholder,value) web_interface.add4send(FORM_INPUT_1);web_interface.add4send(id);web_interface.add4send(FORM_INPUT_2);web_interface.add4send(label);web_interface.add4send(FORM_INPUT_3);web_interface.add4send(id);web_interface.add4send(FORM_INPUT_4);web_interface.add4send(name);web_interface.add4send(FORM_INPUT_5);web_interface.add4send(placeholder);web_interface.add4send(FORM_INPUT_6);web_interface.add4send(value);web_interface.add4send(FORM_INPUT_7); const char VALUE_11N[] PROGMEM = "11n";
#define INPUT_TEXT_ERROR( id,label, name,placeholder,value) web_interface.add4send(FORM_INPUT_1_ERROR);web_interface.add4send(id);web_interface.add4send(FORM_INPUT_2);web_interface.add4send(label);web_interface.add4send(FORM_INPUT_3);web_interface.add4send(id);web_interface.add4send(FORM_INPUT_4);web_interface.add4send(name);web_interface.add4send(FORM_INPUT_5);web_interface.add4send(placeholder);web_interface.add4send(FORM_INPUT_6);web_interface.add4send(value);web_interface.add4send(FORM_INPUT_7); const char VALUE_11G[] PROGMEM = "11g";
#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); const char NETWORK_TITLE[] PROGMEM = "Network: ";
#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); const char VALUE_NONE[] PROGMEM = "None";
#define TH_ENTRY(entry) web_interface.add4send(TH_S);web_interface.add4send(entry);web_interface.add4send(TH_E); const char VALUE_LIGHT[] PROGMEM = "Light";
#define THR_ENTRY(entry) web_interface.add4send(TH_R);web_interface.add4send(entry);web_interface.add4send(TH_E); const char VALUE_MODEM[] PROGMEM = "Modem";
#define TD_ENTRY(entry) web_interface.add4send(TD_S);web_interface.add4send(entry);web_interface.add4send(TD_E); 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_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_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 SYS_1_ID[] PROGMEM = "SYS1";
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_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 SYS_2_ID[] PROGMEM = "SYS2";
const char SYS_3_ID[] PROGMEM = "SYS3";
const char VALUE_SELECTED[] PROGMEM = "selected";
#define MSG_SUCCESS(msg) web_interface.add4send(PROGMEM2CHAR(ALERT_SUCCESS));web_interface.add4send(msg);web_interface.add4send(PROGMEM2CHAR(DIV_E));
#define MSG_ERROR(msg) web_interface.add4send(PROGMEM2CHAR(ALERT_ERROR));web_interface.add4send(msg);web_interface.add4send(PROGMEM2CHAR(DIV_E));
#define OPTION(value, selected,content) web_interface.add4send(PROGMEM2CHAR(FORM_OPTION_1));web_interface.add4send(value);web_interface.add4send(PROGMEM2CHAR(FORM_OPTION_2));web_interface.add4send(selected);web_interface.add4send(PROGMEM2CHAR(FORM_OPTION_3));web_interface.add4send(content);web_interface.add4send(PROGMEM2CHAR(FORM_OPTION_4));
#define SELECT_START(id,label,name) web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_1));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_2));web_interface.add4send(label);web_interface.add4send(PROGMEM2CHAR(FORM_SELECT_1));web_interface.add4send(name);web_interface.add4send(PROGMEM2CHAR(FORM_SELECT_2));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_SELECT_3));
#define SELECT_START_ERROR(id,label,name) web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_1_ERROR));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_2));web_interface.add4send(label);web_interface.add4send(PROGMEM2CHAR(FORM_SELECT_1));web_interface.add4send(name);web_interface.add4send(PROGMEM2CHAR(FORM_SELECT_2));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_SELECT_3));
#define SELECT_END web_interface.add4send(PROGMEM2CHAR(FORM_SELECT_END));
#define INPUT_TEXT( id,label, name,placeholder,value) web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_1));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_2));web_interface.add4send(label);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_3));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_4));web_interface.add4send(name);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_5));web_interface.add4send(placeholder);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_6));web_interface.add4send(value);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_7));
#define INPUT_TEXT_ERROR( id,label, name,placeholder,value) web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_1_ERROR));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_2));web_interface.add4send(label);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_3));web_interface.add4send(id);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_4));web_interface.add4send(name);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_5));web_interface.add4send(placeholder);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_6));web_interface.add4send(value);web_interface.add4send(PROGMEM2CHAR(FORM_INPUT_7));
#define LABEL( title, value) web_interface.add4send(PROGMEM2CHAR(LABEL_START)); web_interface.add4send(title);web_interface.add4send(PROGMEM2CHAR(LABEL_COLOR));web_interface.add4send(value);web_interface.add4send(PROGMEM2CHAR(LABEL_END));web_interface.add4send(PROGMEM2CHAR(BR));
#define LABEL_UNITS(title, value,units) web_interface.add4send(PROGMEM2CHAR(LABEL_START)); web_interface.add4send(title);web_interface.add4send(PROGMEM2CHAR(LABEL_COLOR));web_interface.add4send(value);web_interface.add4send(units);web_interface.add4send(PROGMEM2CHAR(LABEL_END));web_interface.add4send(PROGMEM2CHAR(BR));
#define TH_ENTRY(entry) web_interface.add4send(PROGMEM2CHAR(TH_S));web_interface.add4send(entry);web_interface.add4send(PROGMEM2CHAR(TH_E));
#define THR_ENTRY(entry) web_interface.add4send(PROGMEM2CHAR(TH_R));web_interface.add4send(entry);web_interface.add4send(PROGMEM2CHAR(TH_E));
#define TD_ENTRY(entry) web_interface.add4send(PROGMEM2CHAR(TD_S));web_interface.add4send(entry);web_interface.add4send(PROGMEM2CHAR(TD_E));
char* ICACHE_FLASH_ATTR strncpy_P(char* dest, const char* src, size_t size) {
const char* read = src;
char* write = dest;
char ch = '.';
while (size > 0 && ch != '\0')
{
ch = pgm_read_byte(read++);
*write++ = ch;
size--;
}
return dest;
}
char * progmem2char(const char* src)
{
static char buffer[300];
strcpy_P(buffer,src);
return buffer;
}
//cannot put it in class then cast it as std::function<void(void)> so put outside //cannot put it in class then cast it as std::function<void(void)> so put outside
void handle_web_interface_root() void handle_web_interface_root()
@ -132,82 +224,82 @@ void handle_web_interface_root()
uint8_t mac [WL_MAC_ADDR_LENGTH]; uint8_t mac [WL_MAC_ADDR_LENGTH];
if (wifi_get_opmode()==WIFI_STA ) IP=wifi_config.ip2str(WiFi.localIP()); if (wifi_get_opmode()==WIFI_STA ) IP=wifi_config.ip2str(WiFi.localIP());
else IP=wifi_config.ip2str(WiFi.softAPIP()); else IP=wifi_config.ip2str(WiFi.softAPIP());
web_interface.add4send(PAGE_HEAD_1); web_interface.add4send(PROGMEM2CHAR(PAGE_HEAD_1));
web_interface.add4send(PAGE_HEAD_2); web_interface.add4send(PROGMEM2CHAR(PAGE_HEAD_2));
//top bar //top bar
web_interface.add4send(NAV_START); web_interface.add4send(PROGMEM2CHAR(NAV_START));
web_interface.add4send(NAV_LEFT_PART1) ; web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART1)) ;
web_interface.add4send(NAV_ELEMENT_ACTIVE) ; web_interface.add4send(PROGMEM2CHAR(NAV_ELEMENT_ACTIVE)) ;
web_interface.add4send(NAV_LEFT_PART2a ); web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART2a) );
web_interface.add4send(IP.c_str()); web_interface.add4send(IP.c_str());
web_interface.add4send(NAV_LEFT_PART2b ); web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART2b));
web_interface.add4send(NAV_LEFT_PART3a ); web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART3a));
web_interface.add4send(IP.c_str()); web_interface.add4send(IP.c_str());
web_interface.add4send(NAV_LEFT_PART3b) ; web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART3b));
web_interface.add4send(NAV_RIGHT_PART) ; web_interface.add4send(PROGMEM2CHAR(NAV_RIGHT_PART)) ;
web_interface.add4send(NAV_END) ; web_interface.add4send(PROGMEM2CHAR(NAV_END));
//system part //system part
web_interface.add4send(PANEL_TOP); web_interface.add4send(PROGMEM2CHAR(PANEL_TOP));
web_interface.add4send(F("System")); web_interface.add4send(PROGMEM2CHAR(TITLE_SYSTEM));
web_interface.add4send(PANEL_START); web_interface.add4send(PROGMEM2CHAR(PANEL_START));
LABEL(F("Chip ID: "),String(system_get_chip_id()).c_str()) LABEL(PROGMEM2CHAR(CHIP_ID_TITLE),String(system_get_chip_id()).c_str())
LABEL_UNITS(F("CPU Frequency: "),String(system_get_cpu_freq()).c_str(),F("Hz")) LABEL_UNITS(PROGMEM2CHAR(CPU_FREQ_TITLE),String(system_get_cpu_freq()).c_str(),PROGMEM2CHAR(UNIT_HZ))
LABEL_UNITS(F("Free Memory: "),String(system_get_free_heap_size()).c_str(),F(" octets")) LABEL_UNITS(PROGMEM2CHAR(FREE_MEM_TITLE),String(system_get_free_heap_size()).c_str(),PROGMEM2CHAR(UNIT_OCTET))
LABEL(F("SDK Version: "),system_get_sdk_version()) LABEL(PROGMEM2CHAR(SDK_VERSION_TITLE),system_get_sdk_version())
#ifdef MDNS_FEATURE #ifdef MDNS_FEATURE
sstatus = F("http://"); sstatus = PROGMEM2CHAR(HTTP_START);
sstatus+=LOCAL_NAME; sstatus+=PROGMEM2CHAR(LOCAL_NAME);
LABEL_UNITS(F("mDNS name: "),sstatus.c_str(),F(".local")) LABEL_UNITS(PROGMEM2CHAR(HTTP_MDNS_NAME),sstatus.c_str(),PROGMEM2CHAR(HTTP_END))
#endif #endif
istatus = wifi_get_phy_mode(); istatus = wifi_get_phy_mode();
if (istatus==PHY_MODE_11B) sstatus=F("11b"); if (istatus==PHY_MODE_11B) sstatus=PROGMEM2CHAR(VALUE_11B);
else if (istatus==PHY_MODE_11G) sstatus=F("11g"); else if (istatus==PHY_MODE_11G) sstatus=PROGMEM2CHAR(VALUE_11G);
else sstatus=F("11n"); else sstatus=PROGMEM2CHAR(VALUE_11N);
LABEL(F("Network: "),sstatus.c_str()) LABEL(PROGMEM2CHAR(NETWORK_TITLE),sstatus.c_str())
istatus = wifi_get_sleep_type(); istatus = wifi_get_sleep_type();
if (istatus==NONE_SLEEP_T) sstatus=F("None"); if (istatus==NONE_SLEEP_T) sstatus=PROGMEM2CHAR(VALUE_NONE);
else if (istatus==LIGHT_SLEEP_T) sstatus=F("Light"); else if (istatus==LIGHT_SLEEP_T) sstatus=PROGMEM2CHAR(VALUE_LIGHT);
else sstatus=F("Modem"); else sstatus=PROGMEM2CHAR(VALUE_MODEM);
LABEL(F("Sleep mode: "),sstatus.c_str()) LABEL(PROGMEM2CHAR(SLEEP_MODE_TITLE),sstatus.c_str())
//LABEL(sbuf,F("Boot mode: "),String(system_get_boot_mode())) //no meaning so far //LABEL(sbuf,"Boot mode: ",String(system_get_boot_mode())) //no meaning so far
LABEL(F("Boot version: "),String(system_get_boot_version()).c_str()) LABEL(PROGMEM2CHAR(BOOT_VERSION_TITLE),String(system_get_boot_version()).c_str())
istatus=0; istatus=0;
if (!CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&istatus , BAUD_LENGH))istatus=0; if (!CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&istatus , BAUD_LENGH))istatus=0;
LABEL(F("Baud rate: "),String(istatus).c_str()) LABEL(PROGMEM2CHAR(BAUD_RATE_TITLE),String(istatus).c_str())
web_interface.add4send(PANEL_END); web_interface.add4send(PROGMEM2CHAR(PANEL_END));
//access point //access point
web_interface.add4send(PANEL_TOP); web_interface.add4send(PROGMEM2CHAR(PANEL_TOP));
web_interface.add4send(F("Access Point")); web_interface.add4send(PROGMEM2CHAR(ACCESS_POINT_TITLE));
if(wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) web_interface.add4send(F(" (enabled)")); if(wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) web_interface.add4send(PROGMEM2CHAR(VALUE_ENABLED));
else web_interface.add4send(F(" (disabled)")); else web_interface.add4send(PROGMEM2CHAR(VALUE_DISABLED));
web_interface.add4send(PANEL_START); web_interface.add4send(PROGMEM2CHAR(PANEL_START));
LABEL(F("Mac address: "),wifi_config.mac2str(WiFi.softAPmacAddress(mac))) LABEL(PROGMEM2CHAR(MAC_ADDRESS_TITLE),wifi_config.mac2str(WiFi.softAPmacAddress(mac)))
if (wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) if (wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA)
{ {
if (wifi_softap_get_config(&apconfig)) if (wifi_softap_get_config(&apconfig))
{ {
LABEL(F("SSID: "),(char *)(apconfig.ssid)) LABEL(PROGMEM2CHAR(SSID_TITLE),(char *)(apconfig.ssid))
if(apconfig.ssid_hidden==1)sstatus=F("No"); if(apconfig.ssid_hidden==1)sstatus=PROGMEM2CHAR(VALUE_NO);
else sstatus=F("Yes"); else sstatus=PROGMEM2CHAR(VALUE_YES);
LABEL(F("Visible: "),sstatus.c_str()) LABEL(PROGMEM2CHAR(VISIBLE_TITLE),sstatus.c_str())
LABEL(F("Channel: "),String(apconfig.channel).c_str()) LABEL(PROGMEM2CHAR(CHANNEL_TITLE),String(apconfig.channel).c_str())
if (apconfig.authmode==AUTH_OPEN)sstatus=F("None"); if (apconfig.authmode==AUTH_OPEN)sstatus=PROGMEM2CHAR(VALUE_NONE);
else if (apconfig.authmode==AUTH_WEP)sstatus=F("WEP"); else if (apconfig.authmode==AUTH_WEP)sstatus=PROGMEM2CHAR(VALUE_WEP);
else if (apconfig.authmode==AUTH_WPA_PSK)sstatus=F("WPA"); else if (apconfig.authmode==AUTH_WPA_PSK)sstatus=PROGMEM2CHAR(VALUE_WPA);
else if (apconfig.authmode==AUTH_WPA2_PSK)sstatus=F("WPA2"); else if (apconfig.authmode==AUTH_WPA2_PSK)sstatus=PROGMEM2CHAR(VALUE_WPA2);
else if (apconfig.authmode==AUTH_WPA_WPA2_PSK)sstatus=F("WPA/WPA2"); else if (apconfig.authmode==AUTH_WPA_WPA2_PSK)sstatus=PROGMEM2CHAR(VALUE_WPAWPA2);
else sstatus=F("MAX"); //what is this one ? WPS ? Cannot find information else sstatus=PROGMEM2CHAR(VALUE_MAX); //what is this one ? WPS ? Cannot find information
LABEL(F("Authentification: "),sstatus.c_str()) LABEL(PROGMEM2CHAR(AUTENTIFICATION_TITLE),sstatus.c_str())
LABEL(F("Maximum connections : "),String(apconfig.max_connection).c_str()) LABEL(PROGMEM2CHAR(MAX_CONNECTION_TITLE),String(apconfig.max_connection).c_str())
} }
if (wifi_softap_dhcps_status()==DHCP_STARTED)sstatus=F("Started"); if (wifi_softap_dhcps_status()==DHCP_STARTED)sstatus=PROGMEM2CHAR(VALUE_STARTED);
else sstatus=F("Stopped"); else sstatus=PROGMEM2CHAR(VALUE_STOPPED);
LABEL(F("DHCP Server: "),sstatus.c_str()) LABEL(PROGMEM2CHAR(DHCP_SERVER_TITLE),sstatus.c_str())
if (wifi_get_ip_info(SOFTAP_IF,&info)) if (wifi_get_ip_info(SOFTAP_IF,&info))
{ {
LABEL(F("IP: "),wifi_config.ip2str(info.ip.addr)) LABEL(PROGMEM2CHAR(IP_TITLE),wifi_config.ip2str(info.ip.addr))
LABEL(F("Gateway: "),wifi_config.ip2str(info.gw.addr)) LABEL(PROGMEM2CHAR(GATEWAY_TITLE),wifi_config.ip2str(info.gw.addr))
LABEL(F("Subnet: "),wifi_config.ip2str(info.netmask.addr)) LABEL(PROGMEM2CHAR(SUBNET_TITLE),wifi_config.ip2str(info.netmask.addr))
} }
//List number of client //List number of client
istatus = 0; istatus = 0;
@ -221,66 +313,66 @@ void handle_web_interface_root()
stationtmp = STAILQ_NEXT(stationtmp, next); stationtmp = STAILQ_NEXT(stationtmp, next);
} }
//start table as at least one connected //start table as at least one connected
web_interface.add4send(TABLE_START); web_interface.add4send(PROGMEM2CHAR(TABLE_START));
web_interface.add4send(CAPTION_S); web_interface.add4send(PROGMEM2CHAR(CAPTION_S));
web_interface.add4send(String(istatus).c_str()); web_interface.add4send(String(istatus).c_str());
web_interface.add4send(F(" connected station(s)")); web_interface.add4send(PROGMEM2CHAR(CONNECTED_STATIONS));
web_interface.add4send(CAPTION_S); web_interface.add4send(PROGMEM2CHAR(CAPTION_E));
web_interface.add4send(THEAD_S); web_interface.add4send(PROGMEM2CHAR(THEAD_S));
web_interface.add4send(TR_S); web_interface.add4send(PROGMEM2CHAR(TR_S));
TH_ENTRY(F("#")) TH_ENTRY(PROGMEM2CHAR(NUMBER_LABEL))
TH_ENTRY(F("Mac")) TH_ENTRY(PROGMEM2CHAR(MAC_LABEL))
TH_ENTRY(F("IP")) TH_ENTRY(PROGMEM2CHAR(IP_LABEL))
web_interface.add4send(TR_E); web_interface.add4send(PROGMEM2CHAR(TR_E));
web_interface.add4send(THEAD_E); web_interface.add4send(PROGMEM2CHAR(THEAD_E));
web_interface.add4send(TBODY_S); web_interface.add4send(PROGMEM2CHAR(TBODY_S));
istatus=0; istatus=0;
while(station) while(station)
{ {
istatus++; istatus++;
//display each client //display each client
web_interface.add4send(TR_S); web_interface.add4send(PROGMEM2CHAR(TR_S));
THR_ENTRY(String(istatus).c_str()) THR_ENTRY(String(istatus).c_str())
TD_ENTRY(wifi_config.mac2str(station->bssid)) TD_ENTRY(wifi_config.mac2str(station->bssid))
static char ipstr [16]; //static char ipstr [16];
if (0>sprintf(ipstr, IPSTR,IP2STR(&station->ip))) strcpy (ipstr, F("0.0.0.0")); //if (0>sprintf(ipstr, IPSTR,IP2STR(&station->ip))) strcpy (ipstr, "0.0.0.0");
TD_ENTRY(ipstr) TD_ENTRY(wifi_config.ip2str((byte *)&station->ip))
web_interface.add4send(TR_E); web_interface.add4send(PROGMEM2CHAR(TR_E));
station = STAILQ_NEXT(station, next); station = STAILQ_NEXT(station, next);
} }
web_interface.add4send(TBODY_E); web_interface.add4send(PROGMEM2CHAR(TBODY_E));
//close table //close table
web_interface.add4send(TABLE_END); web_interface.add4send(PROGMEM2CHAR(TABLE_END));
wifi_softap_free_station_info(); wifi_softap_free_station_info();
} }
web_interface.add4send(PANEL_END); web_interface.add4send(PROGMEM2CHAR(PANEL_END));
web_interface.add4send(PANEL_TOP); web_interface.add4send(PROGMEM2CHAR(PANEL_TOP));
web_interface.add4send(F("Station")); web_interface.add4send(PROGMEM2CHAR(STATION_TITLE));
if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) web_interface.add4send(F(" (enabled)")); if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) web_interface.add4send(PROGMEM2CHAR(VALUE_ENABLED));
else web_interface.add4send(F(" (disabled)")); else web_interface.add4send(PROGMEM2CHAR(VALUE_DISABLED));
web_interface.add4send(PANEL_START); web_interface.add4send(PROGMEM2CHAR(PANEL_START));
LABEL(F("Mac address: "),wifi_config.mac2str(WiFi.macAddress(mac))) LABEL(PROGMEM2CHAR(MAC_ADDRESS_TITLE),wifi_config.mac2str(WiFi.macAddress(mac)))
if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA) if(wifi_get_opmode()==WIFI_STA || wifi_get_opmode()==WIFI_AP_STA)
{ {
LABEL(F("Connection to: "),WiFi.SSID()) LABEL(PROGMEM2CHAR(CONNECTION_TO_TITLE),WiFi.SSID())
LABEL(F("Channel: "),String(wifi_get_channel()).c_str()) LABEL(PROGMEM2CHAR(CHANNEL_TITLE),String(wifi_get_channel()).c_str())
istatus = wifi_station_get_connect_status(); istatus = wifi_station_get_connect_status();
if (istatus==STATION_GOT_IP) sstatus=F("Connected"); if (istatus==STATION_GOT_IP) sstatus=PROGMEM2CHAR(VALUE_CONNECTED);
else if (istatus==STATION_NO_AP_FOUND) sstatus=F("SSID not Available!"); else if (istatus==STATION_NO_AP_FOUND) sstatus=PROGMEM2CHAR(VALUE_NO_SSID);
else if (istatus==STATION_CONNECT_FAIL) sstatus=F("Connecion failed!"); else if (istatus==STATION_CONNECT_FAIL) sstatus=PROGMEM2CHAR(VALUE_CONNECTION_FAILED);
else if (istatus==STATION_WRONG_PASSWORD) sstatus=F("Connecion failed! (Wrong Password)"); else if (istatus==STATION_WRONG_PASSWORD) sstatus=PROGMEM2CHAR(VALUE_CONNECTION_FAILED2);
else if (istatus==STATION_IDLE) sstatus=F("Idle");//should not happen else if (istatus==STATION_IDLE) sstatus=PROGMEM2CHAR(VALUE_IDLE);//should not happen
else sstatus=F("Disconnected"); else sstatus=PROGMEM2CHAR(VALUE_DISCONNECTED);
LABEL(F("Status: "),sstatus.c_str()) LABEL(PROGMEM2CHAR(STATUS_TITLE),sstatus.c_str())
if (wifi_station_dhcpc_status()==DHCP_STARTED)sstatus=F("Started"); if (wifi_station_dhcpc_status()==DHCP_STARTED)sstatus=PROGMEM2CHAR(VALUE_STARTED);
else sstatus=F("Stopped"); else sstatus=PROGMEM2CHAR(VALUE_STOPPED);
LABEL(F("DHCP Client: "),sstatus.c_str()) LABEL(PROGMEM2CHAR(DHCP_CLIENT_TITLE),sstatus.c_str())
LABEL(F("IP: "),wifi_config.ip2str(WiFi.localIP())) LABEL(PROGMEM2CHAR(IP_TITLE),wifi_config.ip2str(WiFi.localIP()))
LABEL(F("Gateway: "),wifi_config.ip2str(WiFi.gatewayIP())) LABEL(PROGMEM2CHAR(GATEWAY_TITLE),wifi_config.ip2str(WiFi.gatewayIP()))
LABEL(F("Subnet: "),wifi_config.ip2str(WiFi.subnetMask())) LABEL(PROGMEM2CHAR(SUBNET_TITLE),wifi_config.ip2str(WiFi.subnetMask()))
} }
web_interface.add4send(PANEL_END); web_interface.add4send(PROGMEM2CHAR(PANEL_END));
web_interface.add4send(PAGE_BOTTOM); web_interface.add4send(PROGMEM2CHAR(PAGE_BOTTOM));
web_interface.flushbuffer(); web_interface.flushbuffer();
} }
@ -295,25 +387,25 @@ void handle_web_interface_configSys()
byte bnetwork=0; byte bnetwork=0;
byte bsleepmode=0; byte bsleepmode=0;
//check is it is a submission or a display //check is it is a submission or a display
if (web_interface.WebServer.hasArg(F("SUBMIT"))) if (web_interface.WebServer.hasArg(PROGMEM2CHAR(SUBMIT_ID)))
{ //is there a correct list of values? { //is there a correct list of values?
if (web_interface.WebServer.hasArg(BAUD_RATE) && web_interface.WebServer.hasArg(SLEEP_MODE)&& web_interface.WebServer.hasArg(NETWORK)) if (web_interface.WebServer.hasArg(PROGMEM2CHAR(BAUD_RATE_ID)) && web_interface.WebServer.hasArg(PROGMEM2CHAR(SLEEP_MODE_ID))&& web_interface.WebServer.hasArg(PROGMEM2CHAR(NETWORK_ID)))
{ //is each value correct ? { //is each value correct ?
ibaud = atoi(web_interface.WebServer.arg(BAUD_RATE).c_str()); ibaud = atoi(web_interface.WebServer.arg(PROGMEM2CHAR(BAUD_RATE_ID)).c_str());
bnetwork = atoi(web_interface.WebServer.arg(NETWORK).c_str()); bnetwork = atoi(web_interface.WebServer.arg(PROGMEM2CHAR(NETWORK_ID)).c_str());
bsleepmode = atoi(web_interface.WebServer.arg(SLEEP_MODE).c_str()); bsleepmode = atoi(web_interface.WebServer.arg(PROGMEM2CHAR(SLEEP_MODE_ID)).c_str());
if (!(ibaud==9600 || ibaud==19200|| ibaud==38400|| ibaud==57600|| ibaud==115200|| ibaud==230400) || if (!(ibaud==9600 || ibaud==19200|| ibaud==38400|| ibaud==57600|| ibaud==115200|| ibaud==230400) ||
!(bnetwork==PHY_MODE_11B||bnetwork==PHY_MODE_11G||bnetwork==PHY_MODE_11N) || !(bnetwork==PHY_MODE_11B||bnetwork==PHY_MODE_11G||bnetwork==PHY_MODE_11N) ||
!(bsleepmode==NONE_SLEEP_T ||bsleepmode==LIGHT_SLEEP_T ||bsleepmode==MODEM_SLEEP_T )) !(bsleepmode==NONE_SLEEP_T ||bsleepmode==LIGHT_SLEEP_T ||bsleepmode==MODEM_SLEEP_T ))
{ {
msg_alert_error=true; msg_alert_error=true;
smsg=F("Error in query!!"); smsg=PROGMEM2CHAR(ERROR_QUERY);
} }
} }
else else
{ {
msg_alert_error=true; msg_alert_error=true;
smsg=F("Error in query!!"); smsg=PROGMEM2CHAR(ERROR_QUERY);
} }
//if no error apply the changes //if no error apply the changes
if (msg_alert_error!=true) if (msg_alert_error!=true)
@ -321,13 +413,13 @@ void handle_web_interface_configSys()
if(!CONFIG::write_buffer(EP_BAUD_RATE,(const byte *)&ibaud,BAUD_LENGH) ||!CONFIG::write_byte(EP_PHY_MODE,bnetwork) ||!CONFIG::write_byte(EP_SLEEP_MODE,bsleepmode)) if(!CONFIG::write_buffer(EP_BAUD_RATE,(const byte *)&ibaud,BAUD_LENGH) ||!CONFIG::write_byte(EP_PHY_MODE,bnetwork) ||!CONFIG::write_byte(EP_SLEEP_MODE,bsleepmode))
{ {
msg_alert_error=true; msg_alert_error=true;
smsg=F("Error in writing changes!!"); smsg=PROGMEM2CHAR(ERROR_WRITING_CHANGES);
} }
else else
if (!msg_alert_error) if (!msg_alert_error)
{ {
msg_alert_success=true; msg_alert_success=true;
smsg=F("Change saved, restarting module..."); smsg=PROGMEM2CHAR(SAVED_CHANGES);
} }
} }
@ -335,81 +427,81 @@ void handle_web_interface_configSys()
if (!CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&istatus , BAUD_LENGH))istatus=0; if (!CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&istatus , BAUD_LENGH))istatus=0;
if (wifi_get_opmode()==WIFI_STA ) stmp=wifi_config.ip2str(WiFi.localIP()); if (wifi_get_opmode()==WIFI_STA ) stmp=wifi_config.ip2str(WiFi.localIP());
else stmp=wifi_config.ip2str(WiFi.softAPIP()); else stmp=wifi_config.ip2str(WiFi.softAPIP());
web_interface.add4send(PAGE_HEAD_1); web_interface.add4send(PROGMEM2CHAR(PAGE_HEAD_1));
web_interface.add4send(PAGE_HEAD_2); web_interface.add4send(PROGMEM2CHAR(PAGE_HEAD_2));
web_interface.add4send(NAV_START) ; web_interface.add4send(PROGMEM2CHAR(NAV_START)) ;
web_interface.add4send(NAV_LEFT_PART1) ; web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART1)) ;
web_interface.add4send(NAV_LEFT_PART2a) ; web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART2a)) ;
web_interface.add4send(stmp.c_str()); web_interface.add4send(stmp.c_str());
web_interface.add4send(NAV_LEFT_PART2b); web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART2b));
web_interface.add4send(NAV_ELEMENT_ACTIVE) ; web_interface.add4send(PROGMEM2CHAR(NAV_ELEMENT_ACTIVE)) ;
web_interface.add4send(NAV_LEFT_PART3a) ; web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART3a));
web_interface.add4send(stmp.c_str()); web_interface.add4send(stmp.c_str());
web_interface.add4send(NAV_LEFT_PART3b) ; web_interface.add4send(PROGMEM2CHAR(NAV_LEFT_PART3b));
web_interface.add4send(NAV_RIGHT_PART) ; web_interface.add4send(PROGMEM2CHAR(NAV_RIGHT_PART));
web_interface.add4send(NAV_END) ; web_interface.add4send(PROGMEM2CHAR(NAV_END));
web_interface.add4send(PANEL_TOP); web_interface.add4send(PROGMEM2CHAR(PANEL_TOP));
web_interface.add4send(F("System")); web_interface.add4send(PROGMEM2CHAR(TITLE_SYSTEM));
web_interface.add4send(PANEL_START); web_interface.add4send(PROGMEM2CHAR(PANEL_START));
web_interface.add4send(FORM_START); web_interface.add4send(PROGMEM2CHAR(FORM_START));
SELECT_START(F("SYS1"),F("Baud rate"),F("BAUD_RATE")) SELECT_START(PROGMEM2CHAR(SYS_1_ID),PROGMEM2CHAR(BAUD_RATE_NAME),PROGMEM2CHAR(BAUD_RATE_ID))
if (istatus==9600)stmp = F("selected"); if (istatus==9600)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(F("9600"), stmp.c_str(),F("9600")) OPTION(PROGMEM2CHAR(VALUE_9600), stmp.c_str(),PROGMEM2CHAR(VALUE_9600))
if (istatus==19200)stmp = F("selected"); if (istatus==19200)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(F("19200"), stmp.c_str(),F("19200")) OPTION(PROGMEM2CHAR(VALUE_19200), stmp.c_str(),PROGMEM2CHAR(VALUE_19200))
if (istatus==38400)stmp = F("selected"); if (istatus==38400)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(F("38400"), stmp.c_str(),F("38400")) OPTION(PROGMEM2CHAR(VALUE_38400), stmp.c_str(),PROGMEM2CHAR(VALUE_38400))
if (istatus==57600)stmp = F("selected"); if (istatus==57600)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(F("57600"), stmp.c_str(),F("57600")) OPTION(PROGMEM2CHAR(VALUE_57600), stmp.c_str(),PROGMEM2CHAR(VALUE_57600))
if (istatus==115200)stmp = F("selected"); if (istatus==115200)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(F("115200"), stmp.c_str(),F("115200")) OPTION(PROGMEM2CHAR(VALUE_115200), stmp.c_str(),PROGMEM2CHAR(VALUE_115200))
if (istatus==230400)stmp = F("selected"); if (istatus==230400)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(F("230400"), stmp.c_str(),F("230400")) OPTION(PROGMEM2CHAR(VALUE_230400), stmp.c_str(),PROGMEM2CHAR(VALUE_230400))
SELECT_END SELECT_END
web_interface.add4send(BR); web_interface.add4send(PROGMEM2CHAR(BR));
if (!CONFIG::read_byte(EP_PHY_MODE, &bflag ))bflag=0; if (!CONFIG::read_byte(EP_PHY_MODE, &bflag ))bflag=0;
SELECT_START(F("SYS2"),F("Network"),NETWORK) SELECT_START(PROGMEM2CHAR(SYS_2_ID),PROGMEM2CHAR(NETWORK_NAME),PROGMEM2CHAR(NETWORK_ID))
if (bflag==PHY_MODE_11B)stmp = F("selected"); if (bflag==PHY_MODE_11B)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(String(PHY_MODE_11B).c_str(), stmp.c_str(),F("11b")) OPTION(String(PHY_MODE_11B).c_str(), stmp.c_str(),PROGMEM2CHAR(VALUE_11B))
if (bflag==PHY_MODE_11G)stmp = F("selected"); if (bflag==PHY_MODE_11G)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(String(PHY_MODE_11G).c_str(), stmp.c_str(),F("11g")) OPTION(String(PHY_MODE_11G).c_str(), stmp.c_str(),PROGMEM2CHAR(VALUE_11G))
if (bflag==PHY_MODE_11N)stmp = F("selected"); if (bflag==PHY_MODE_11N)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
if (wifi_get_opmode()==WIFI_STA ) if (wifi_get_opmode()==WIFI_STA )
{ {
OPTION(String(PHY_MODE_11N).c_str(), stmp.c_str(),F("11n")) OPTION(String(PHY_MODE_11N).c_str(), stmp.c_str(),PROGMEM2CHAR(VALUE_11N))
} }
SELECT_END SELECT_END
web_interface.add4send(BR); web_interface.add4send(PROGMEM2CHAR(BR));
if (!CONFIG::read_byte(EP_SLEEP_MODE, &bflag ))bflag=0; if (!CONFIG::read_byte(EP_SLEEP_MODE, &bflag ))bflag=0;
SELECT_START(F("SYS3"),F("Sleep Mode"),SLEEP_MODE) SELECT_START(PROGMEM2CHAR(SYS_3_ID),PROGMEM2CHAR(SLEEP_MODE_NAME),PROGMEM2CHAR(SLEEP_MODE_ID))
if (bflag==NONE_SLEEP_T)stmp = F("selected"); if (bflag==NONE_SLEEP_T)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(String(NONE_SLEEP_T).c_str(), stmp.c_str(),F("None")) OPTION(String(NONE_SLEEP_T).c_str(), stmp.c_str(),PROGMEM2CHAR(VALUE_NONE))
if (bflag==LIGHT_SLEEP_T)stmp = F("selected"); if (bflag==LIGHT_SLEEP_T)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(String(LIGHT_SLEEP_T).c_str(), stmp.c_str(),F("Light")) OPTION(String(LIGHT_SLEEP_T).c_str(), stmp.c_str(),PROGMEM2CHAR(VALUE_LIGHT))
if (bflag==MODEM_SLEEP_T)stmp = F("selected"); if (bflag==MODEM_SLEEP_T)stmp = PROGMEM2CHAR(VALUE_SELECTED);
else stmp=""; else stmp="";
OPTION(String(MODEM_SLEEP_T).c_str(), stmp.c_str(),F("Modem")) OPTION(String(MODEM_SLEEP_T).c_str(), stmp.c_str(),PROGMEM2CHAR(VALUE_MODEM))
SELECT_END SELECT_END
web_interface.add4send(FORM_SUBMIT); web_interface.add4send(PROGMEM2CHAR(FORM_SUBMIT));
web_interface.add4send(FORM_END); web_interface.add4send(PROGMEM2CHAR(FORM_END));
web_interface.add4send(PANEL_END); web_interface.add4send(PROGMEM2CHAR(PANEL_END));
if(msg_alert_error) if(msg_alert_error)
{ {
MSG_ERROR(smsg.c_str()) MSG_ERROR(smsg.c_str())
@ -418,7 +510,7 @@ if(msg_alert_success)
{ {
MSG_SUCCESS(smsg.c_str()) MSG_SUCCESS(smsg.c_str())
} }
web_interface.add4send(PAGE_BOTTOM); web_interface.add4send(PROGMEM2CHAR(PAGE_BOTTOM));
web_interface.flushbuffer(); web_interface.flushbuffer();
if (msg_alert_success && !msg_alert_error) if (msg_alert_success && !msg_alert_error)
{ {
@ -431,9 +523,9 @@ void handle_not_found()
String IP; String IP;
if (wifi_get_opmode()==WIFI_STA ) IP=wifi_config.ip2str(WiFi.localIP()); if (wifi_get_opmode()==WIFI_STA ) IP=wifi_config.ip2str(WiFi.localIP());
else IP=wifi_config.ip2str(WiFi.softAPIP()); else IP=wifi_config.ip2str(WiFi.softAPIP());
web_interface.add4send(T404_PAGE); web_interface.add4send(PROGMEM2CHAR(T404_PAGE));
web_interface.add4send(IP.c_str()); web_interface.add4send(IP.c_str());
web_interface.add4send(T404_PAGE_2); web_interface.add4send(PROGMEM2CHAR(T404_PAGE_2));
web_interface.flushbuffer(); web_interface.flushbuffer();
} }
@ -492,12 +584,12 @@ void WEBINTERFACE_CLASS::add4send(const char * data2send, bool bimmediatsend)
{//send current buffer first {//send current buffer first
if(!bsendingstarted) if(!bsendingstarted)
{ //no header send so first send using header 2500 limit allow to add extra without calculation { //no header send so first send using header 2500 limit allow to add extra without calculation
web_interface.WebServer.send(200, F("text/html"), buffer2send); web_interface.WebServer.send(200, "text/html", buffer2send);
bsendingstarted=true; bsendingstarted=true;
} }
else else
{ //direct data send { //direct data send
web_interface.WebServer.client().print(buffer2send); web_interface.WebServer.sendContent(buffer2send);
} }
buffer2send=data2send; buffer2send=data2send;
//do we need to purge or to store ? //do we need to purge or to store ?
@ -505,7 +597,7 @@ void WEBINTERFACE_CLASS::add4send(const char * data2send, bool bimmediatsend)
{//if some data flush {//if some data flush
if (buffer2send.length()>0) if (buffer2send.length()>0)
{ {
web_interface.WebServer.client().print(buffer2send); web_interface.WebServer.sendContent(buffer2send);
//reset buffer //reset buffer
buffer2send=""; buffer2send="";
} }
@ -519,8 +611,8 @@ void WEBINTERFACE_CLASS::add4send(const char * data2send, bool bimmediatsend)
WEBINTERFACE_CLASS::WEBINTERFACE_CLASS (int port):WebServer(port) WEBINTERFACE_CLASS::WEBINTERFACE_CLASS (int port):WebServer(port)
{ {
//init what will handle "/" //init what will handle "/"
WebServer.on(F("/"),HTTP_ANY, handle_web_interface_root); WebServer.on("/",HTTP_ANY, handle_web_interface_root);
WebServer.on(F("/CONFIGSYS"),HTTP_ANY, handle_web_interface_configSys); WebServer.on("/CONFIGSYS",HTTP_ANY, handle_web_interface_configSys);
WebServer.onNotFound( handle_not_found); WebServer.onNotFound( handle_not_found);
buffer2send=""; buffer2send="";
} }

View File

@ -56,7 +56,7 @@ byte WIFI_CONFIG::split_ip (char * ptr,byte * part)
char * WIFI_CONFIG::mac2str(uint8_t mac [WL_MAC_ADDR_LENGTH]) char * WIFI_CONFIG::mac2str(uint8_t mac [WL_MAC_ADDR_LENGTH])
{ {
static char macstr [18]; static char macstr [18];
if (0>sprintf(macstr,F("%02X:%02X:%02X:%02X:%02X:%02X"),mac[0],mac[1],mac[2],mac[3],mac[4],mac[5])) strcpy (macstr, F("00:00:00:00:00:00")); if (0>sprintf(macstr,"%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5])) strcpy (macstr, "00:00:00:00:00:00");
return macstr; return macstr;
} }
@ -64,7 +64,7 @@ char * WIFI_CONFIG::mac2str(uint8_t mac [WL_MAC_ADDR_LENGTH])
char * WIFI_CONFIG::ip2str(IPAddress Ip ) char * WIFI_CONFIG::ip2str(IPAddress Ip )
{ {
static char ipstr [16]; static char ipstr [16];
if (0>sprintf(ipstr, F("%i.%i.%i.%i"),Ip[0],Ip[1],Ip[2],Ip[3])) strcpy (ipstr, F("0.0.0.0")); if (0>sprintf(ipstr, "%i.%i.%i.%i",Ip[0],Ip[1],Ip[2],Ip[3])) strcpy (ipstr, "0.0.0.0");
return ipstr; return ipstr;
} }
@ -154,7 +154,7 @@ bool WIFI_CONFIG::Setup()
// - second argument is the IP address to advertise // - second argument is the IP address to advertise
// we send our IP address on the WiFi network // we send our IP address on the WiFi network
// Note: for AP mode we would use WiFi.softAPIP()! // Note: for AP mode we would use WiFi.softAPIP()!
if (!mdns.begin(LOCAL_NAME, currentIP)) { if (!mdns.begin(PROGMEM2CHAR(LOCAL_NAME), currentIP)) {
Serial.println(F("Error setting up MDNS responder!")); Serial.println(F("Error setting up MDNS responder!"));
} }
#endif #endif