diff --git a/esp3d/command.cpp b/esp3d/command.cpp index 1cf2414c..b1b32a77 100644 --- a/esp3d/command.cpp +++ b/esp3d/command.cpp @@ -22,6 +22,11 @@ #include "config.h" #include "wifi.h" #include "webinterface.h" +#ifdef SDCARD_FEATURE +#ifndef FS_NO_GLOBALS +#define FS_NO_GLOBALS +#endif +#endif #include String COMMAND::buffer_serial; @@ -41,14 +46,14 @@ void COMMAND::execute_command(int cmd,String cmd_params) break; case 100: if (!CONFIG::isSSIDValid(cmd_params.c_str()))Serial.println("\nError"); - if(!CONFIG::write_string(EP_SSID,cmd_params.c_str())) { + if(!CONFIG::write_string(EP_STA_SSID,cmd_params.c_str())) { Serial.println("\nError"); } else { Serial.println("\nOk"); } break; case 101: - if(!CONFIG::write_string(EP_PASSWORD,cmd_params.c_str())) { + if(!CONFIG::write_string(EP_STA_PASSWORD,cmd_params.c_str())) { Serial.println("\nError"); } else { Serial.println("\nOk"); @@ -81,7 +86,34 @@ void COMMAND::execute_command(int cmd,String cmd_params) } else { mode=DHCP_MODE; } - if(!CONFIG::write_byte(EP_IP_MODE,mode)) { + if(!CONFIG::write_byte(EP_STA_IP_MODE,mode)) { + Serial.println("\nError"); + } else { + Serial.println("\nOk"); + } + break; + case 105: + if (!CONFIG::isSSIDValid(cmd_params.c_str()))Serial.println("\nError"); + if(!CONFIG::write_string(EP_AP_SSID,cmd_params.c_str())) { + Serial.println("\nError"); + } else { + Serial.println("\nOk"); + } + break; + case 106: + if(!CONFIG::write_string(EP_AP_PASSWORD,cmd_params.c_str())) { + Serial.println("\nError"); + } else { + Serial.println("\nOk"); + } + break; + case 107: + if (cmd_params=="STATIC") { + mode = STATIC_IP_MODE; + } else { + mode=DHCP_MODE; + } + if(!CONFIG::write_byte(EP_AP_IP_MODE,mode)) { Serial.println("\nError"); } else { Serial.println("\nOk"); @@ -211,6 +243,8 @@ void COMMAND::execute_command(int cmd,String cmd_params) void COMMAND::check_command(String buffer) { String buffer2; +//if direct access to SDCard no need to handle the M20 command answer +#ifndef DIRECT_SDCARD_FEATURE static bool bfileslist=false; static uint32_t start_list=0; //if SD list is not on going @@ -229,6 +263,7 @@ void COMMAND::check_command(String buffer) (web_interface->blockserial) = true; return; } +#endif #ifdef TEMP_MONITORING_FEATURE int Tpos = buffer.indexOf("T:"); #endif @@ -360,6 +395,7 @@ void COMMAND::check_command(String buffer) #endif } #endif +#ifndef DIRECT_SDCARD_FEATURE } else { //listing file is on going //check if we are too long if ((millis()-start_list)>30000) { //timeout in case of problem @@ -383,6 +419,7 @@ void COMMAND::check_command(String buffer) } } } +#endif } //read a buffer in an array diff --git a/esp3d/config.cpp b/esp3d/config.cpp index d1512a2f..2cad125b 100644 --- a/esp3d/config.cpp +++ b/esp3d/config.cpp @@ -25,6 +25,17 @@ extern "C" { } + void CONFIG::esp_restart(){ + LOG("Restarting\n") + Serial.flush(); + delay(500); + Serial.swap(); + delay(100); + ESP.restart(); + while (1) { + delay(1); + }; +} bool CONFIG::isHostnameValid(const char * hostname) @@ -166,12 +177,62 @@ String CONFIG::formatBytes(size_t bytes) } } +//helper to convert string to IP +//do not use IPAddress.fromString() because lack of check point and error result +//return number of parts +byte CONFIG::split_ip (const char * ptr,byte * part) +{ + if (strlen(ptr)>15 || strlen(ptr)< 7) { + part[0]=0; + part[1]=0; + part[2]=0; + part[3]=0; + return 0; + } + + char pstart [16]; + char * ptr2; + strcpy(pstart,ptr); + ptr2 = pstart; + byte i = strlen(pstart); + byte pos = 0; + for (byte j=0; jsprintf(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; +} + + //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(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) { + LOG("Error read string\n") return false; } EEPROM.begin(EEPROM_SIZE); @@ -198,6 +259,7 @@ 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 ) { + LOG("Error read string\n") return false; } byte b = 13; // non zero for the while loop below @@ -221,6 +283,7 @@ bool CONFIG::read_buffer(int pos, byte byte_buffer[], int size_buffer) { //check if parameters are acceptable if (size_buffer==0 || pos+size_buffer > EEPROM_SIZE || byte_buffer== NULL) { + LOG("Error read buffer\n") return false; } int i=0; @@ -239,6 +302,7 @@ bool CONFIG::read_byte(int pos, byte * value) { //check if parameters are acceptable if (pos+1 > EEPROM_SIZE) { + LOG("Error read byte\n") return false; } EEPROM.begin(EEPROM_SIZE); @@ -262,10 +326,16 @@ bool CONFIG::write_string(int pos, const char * byte_buffer) //check if parameters are acceptable switch (pos) { - case EP_SSID: + case EP_ADMIN_PWD: + case EP_USER_PWD: + maxsize = MAX_LOCAL_PASSWORD_LENGTH; + break; + case EP_AP_SSID: + case EP_STA_SSID: maxsize = MAX_SSID_LENGTH; break; - case EP_PASSWORD: + case EP_AP_PASSWORD: + case EP_STA_PASSWORD: maxsize = MAX_PASSWORD_LENGTH; break; case EP_HOSTNAME: @@ -276,6 +346,7 @@ bool CONFIG::write_string(int pos, const char * byte_buffer) break; } if (size_buffer==0 || pos+size_buffer+1 > EEPROM_SIZE || size_buffer > maxsize || byte_buffer== NULL) { + LOG("Error write string\n") return false; } //copy the value(s) @@ -296,6 +367,7 @@ 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) { + LOG("Error write buffer\n") return false; } EEPROM.begin(EEPROM_SIZE); @@ -313,6 +385,7 @@ bool CONFIG::write_byte(int pos, const byte value) { //check if parameters are acceptable if (pos+1 > EEPROM_SIZE) { + LOG("Error write byte\n") return false; } EEPROM.begin(EEPROM_SIZE); @@ -327,28 +400,49 @@ bool CONFIG::reset_config() if(!CONFIG::write_byte(EP_WIFI_MODE,DEFAULT_WIFI_MODE)) { 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_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)) { + if(!CONFIG::write_string(EP_AP_SSID,FPSTR(DEFAULT_AP_SSID))) { + return false; + } + if(!CONFIG::write_string(EP_AP_PASSWORD,FPSTR(DEFAULT_AP_PASSWORD))) { + return false; + } + if(!CONFIG::write_string(EP_STA_SSID,FPSTR(DEFAULT_STA_SSID))) { + return false; + } + if(!CONFIG::write_string(EP_STA_PASSWORD,FPSTR(DEFAULT_STA_PASSWORD))) { + return false; + } + if(!CONFIG::write_byte(EP_AP_IP_MODE,DEFAULT_AP_IP_MODE)) { + return false; + } + if(!CONFIG::write_byte(EP_STA_IP_MODE,DEFAULT_STA_IP_MODE)) { + return false; + } + if(!CONFIG::write_buffer(EP_STA_IP_VALUE,DEFAULT_IP_VALUE,IP_LENGTH)) { + return false; + } + if(!CONFIG::write_buffer(EP_STA_MASK_VALUE,DEFAULT_MASK_VALUE,IP_LENGTH)) { + return false; + } + if(!CONFIG::write_buffer(EP_STA_GATEWAY_VALUE,DEFAULT_GATEWAY_VALUE,IP_LENGTH)) { + return false; + } + if(!CONFIG::write_byte(EP_STA_PHY_MODE,DEFAULT_PHY_MODE)) { + return false; + } + if(!CONFIG::write_buffer(EP_AP_IP_VALUE,DEFAULT_IP_VALUE,IP_LENGTH)) { + return false; + } + if(!CONFIG::write_buffer(EP_AP_MASK_VALUE,DEFAULT_MASK_VALUE,IP_LENGTH)) { + return false; + } + if(!CONFIG::write_buffer(EP_AP_GATEWAY_VALUE,DEFAULT_GATEWAY_VALUE,IP_LENGTH)) { + return false; + } + if(!CONFIG::write_byte(EP_AP_PHY_MODE,DEFAULT_PHY_MODE)) { return false; } if(!CONFIG::write_byte(EP_SLEEP_MODE,DEFAULT_SLEEP_MODE)) { @@ -400,6 +494,32 @@ void CONFIG::print_config() uint8_t ipbuf[4]; byte bbuf=0; int ibuf=0; + if (CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&ibuf , INTEGER_LENGTH)) { + Serial.print(F("Baud rate: ")); + Serial.println(ibuf); + } else { + Serial.println(F("Error reading baud rate")); + } + if (CONFIG::read_byte(EP_SLEEP_MODE, &bbuf )) { + Serial.print(F("Sleep mode: ")); + if (byte(bbuf)==WIFI_NONE_SLEEP) { + Serial.println(F("None")); + } else if (byte(bbuf)==WIFI_LIGHT_SLEEP) { + Serial.println(F("Light")); + } else if (byte(bbuf)==WIFI_MODEM_SLEEP) { + Serial.println(F("Modem")); + } else { + Serial.println(F("???")); + } + } else { + Serial.println(F("Error reading sleep mode")); + } + if (CONFIG::read_string(EP_HOSTNAME, sbuf , MAX_HOSTNAME_LENGTH)) { + Serial.print(F("Hostname: ")); + Serial.println(sbuf); + } else { + Serial.println(F("Error reading hostname")); + } if (CONFIG::read_byte(EP_WIFI_MODE, &bbuf )) { Serial.print(F("Mode: ")); if (byte(bbuf) == CLIENT_MODE) { @@ -416,17 +536,37 @@ void CONFIG::print_config() Serial.println(F("Error reading mode")); } - if (CONFIG::read_string(EP_SSID, sbuf , MAX_SSID_LENGTH)) { - Serial.print(F("SSID: ")); + if (CONFIG::read_string(EP_STA_SSID, sbuf , MAX_SSID_LENGTH)) { + Serial.print(F("Client SSID: ")); Serial.println(sbuf); } else { Serial.println(F("Error reading SSID")); } - - if (CONFIG::read_byte(EP_IP_MODE, &bbuf )) { - Serial.print(F("IP Mode: ")); + + if (CONFIG::read_byte(EP_STA_IP_MODE, &bbuf )) { + Serial.print(F("STA IP Mode: ")); if (byte(bbuf)==STATIC_IP_MODE) { Serial.println(F("Static")); + if (CONFIG::read_buffer(EP_STA_IP_VALUE,(byte *)ipbuf , IP_LENGTH)) { + Serial.print(F("IP: ")); + Serial.println(IPAddress(ipbuf).toString()); + } else { + Serial.println(F("Error reading IP")); + } + + if (CONFIG::read_buffer(EP_STA_MASK_VALUE, (byte *)ipbuf , IP_LENGTH)) { + Serial.print(F("Subnet: ")); + Serial.println(IPAddress(ipbuf).toString()); + } else { + Serial.println(F("Error reading subnet")); + } + + if (CONFIG::read_buffer(EP_STA_GATEWAY_VALUE, (byte *)ipbuf , IP_LENGTH)) { + Serial.print(F("Gateway: ")); + Serial.println(IPAddress(ipbuf).toString()); + } else { + Serial.println(F("Error reading gateway")); + } } else if (byte(bbuf)==DHCP_MODE) { Serial.println(F("DHCP")); } else { @@ -435,37 +575,9 @@ void CONFIG::print_config() } else { Serial.println(F("Error reading IP mode")); } - - if (CONFIG::read_buffer(EP_IP_VALUE,(byte *)ipbuf , IP_LENGTH)) { - Serial.print(F("IP: ")); - Serial.println(IPAddress(ipbuf).toString()); - } else { - Serial.println(F("Error reading IP")); - } - - if (CONFIG::read_buffer(EP_MASK_VALUE, (byte *)ipbuf , IP_LENGTH)) { - Serial.print(F("Subnet: ")); - Serial.println(IPAddress(ipbuf).toString()); - } else { - Serial.println(F("Error reading subnet")); - } - - if (CONFIG::read_buffer(EP_GATEWAY_VALUE, (byte *)ipbuf , IP_LENGTH)) { - Serial.print(F("Gateway: ")); - Serial.println(IPAddress(ipbuf).toString()); - } else { - Serial.println(F("Error reading gateway")); - } - - if (CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&ibuf , INTEGER_LENGTH)) { - Serial.print(F("Baud rate: ")); - Serial.println(ibuf); - } else { - Serial.println(F("Error reading baud rate")); - } - - if (CONFIG::read_byte(EP_PHY_MODE, &bbuf )) { - Serial.print(F("Phy mode: ")); + + if (CONFIG::read_byte(EP_STA_PHY_MODE, &bbuf )) { + Serial.print(F("STA Phy mode: ")); if (byte(bbuf)==WIFI_PHY_MODE_11B) { Serial.println(F("11b")); } else if (byte(bbuf)==WIFI_PHY_MODE_11G) { @@ -478,20 +590,61 @@ void CONFIG::print_config() } else { Serial.println(F("Error reading phy mode")); } + + if (CONFIG::read_string(EP_AP_SSID, sbuf , MAX_SSID_LENGTH)) { + Serial.print(F("AP SSID: ")); + Serial.println(sbuf); + } else { + Serial.println(F("Error reading SSID")); + } - if (CONFIG::read_byte(EP_SLEEP_MODE, &bbuf )) { - Serial.print(F("Sleep mode: ")); - if (byte(bbuf)==WIFI_NONE_SLEEP) { - Serial.println(F("None")); - } else if (byte(bbuf)==WIFI_LIGHT_SLEEP) { - Serial.println(F("Light")); - } else if (byte(bbuf)==WIFI_MODEM_SLEEP) { - Serial.println(F("Modem")); + if (CONFIG::read_byte(EP_AP_IP_MODE, &bbuf )) { + Serial.print(F("AP IP Mode: ")); + if (byte(bbuf)==STATIC_IP_MODE) { + Serial.println(F("Static")); + if (CONFIG::read_buffer(EP_AP_IP_VALUE,(byte *)ipbuf , IP_LENGTH)) { + Serial.print(F("IP: ")); + Serial.println(IPAddress(ipbuf).toString()); + } else { + Serial.println(F("Error reading IP")); + } + + if (CONFIG::read_buffer(EP_AP_MASK_VALUE, (byte *)ipbuf , IP_LENGTH)) { + Serial.print(F("Subnet: ")); + Serial.println(IPAddress(ipbuf).toString()); + } else { + Serial.println(F("Error reading subnet")); + } + + if (CONFIG::read_buffer(EP_AP_GATEWAY_VALUE, (byte *)ipbuf , IP_LENGTH)) { + Serial.print(F("Gateway: ")); + Serial.println(IPAddress(ipbuf).toString()); + } else { + Serial.println(F("Error reading gateway")); + } + } else if (byte(bbuf)==DHCP_MODE) { + Serial.println(F("DHCP")); + } else { + Serial.println(intTostr(bbuf)); + Serial.println(F("???")); + } + } else { + Serial.println(F("Error reading IP mode")); + } + + if (CONFIG::read_byte(EP_AP_PHY_MODE, &bbuf )) { + Serial.print(F("AP Phy mode: ")); + if (byte(bbuf)==WIFI_PHY_MODE_11B) { + Serial.println(F("11b")); + } else if (byte(bbuf)==WIFI_PHY_MODE_11G) { + Serial.println(F("11g")); + } else if (byte(bbuf)==WIFI_PHY_MODE_11N) { + Serial.println(F("11n")); } else { Serial.println(F("???")); } } else { - Serial.println(F("Error reading sleep mode")); + Serial.println(F("Error reading phy mode")); } if (CONFIG::read_byte(EP_CHANNEL, &bbuf )) { @@ -556,13 +709,6 @@ void CONFIG::print_config() Serial.println(F("Error reading refresh page")); } - if (CONFIG::read_string(EP_HOSTNAME, sbuf , MAX_HOSTNAME_LENGTH)) { - Serial.print(F("Hostname: ")); - Serial.println(sbuf); - } else { - Serial.println(F("Error reading hostname")); - } - if (CONFIG::read_buffer(EP_XY_FEEDRATE, (byte *)&ibuf , INTEGER_LENGTH)) { Serial.print(F("XY feed rate: ")); Serial.println(ibuf); @@ -642,6 +788,11 @@ void CONFIG::print_config() Serial.println(F("???")); #endif Serial.print(F("SD Card support: ")); +#ifdef SDCARD_FEATURE + Serial.println(F("Enabled")); +#else + Serial.println(F("Disabled")); +#endif #ifdef DEBUG_ESP3D Serial.print(F("Debug Enabled :")); #ifdef DEBUG_OUTPUT_SPIFFS diff --git a/esp3d/config.h b/esp3d/config.h index 18ae8470..14e51679 100644 --- a/esp3d/config.h +++ b/esp3d/config.h @@ -25,6 +25,9 @@ #define MARLINKIMBRA 3 #define SMOOTHIEWARE 4 +//FIRMWARE_TARGET: the targeted FW, can be REPETIER (Original Repetier)/ REPETIER4DV (Repetier for Davinci) / MARLIN (Marlin)/ SMOOTHIEWARE (Smoothieware) +#define FIRMWARE_TARGET SMOOTHIEWARE + //comment to disable //MDNS_FEATURE: this feature allow type the name defined //in web browser by default: http:\\esp8266.local and connect @@ -34,7 +37,7 @@ #define SSDP_FEATURE //NETBIOS_FEATURE: this feature is a discovery protocol, supported on Windows out of the box -//#define NETBIOS_FEATURE +#define NETBIOS_FEATURE //CAPTIVE_PORTAL_FEATURE: In SoftAP redirect all unknow call to main page #define CAPTIVE_PORTAL_FEATURE @@ -77,35 +80,51 @@ //FLOW_MONITORING_FEATURE : catch the specific answer and store it to variable #define FLOW_MONITORING_FEATURE -//FIRMWARE_TARGET: the targeted FW, can be REPETIER (Original Repetier)/ REPETIER4DV (Repetier for Davinci) / MARLIN (Marlin)/ SMOOTHIEWARE (Smoothieware) -#define FIRMWARE_TARGET REPETIER4DV -//DEBUG Flag +//DEBUG Flag do not do this when connected to printer !!! //#define DEBUG_ESP3D //#define DEBUG_OUTPUT_SPIFFS +//#define DEBUG_OUTPUT_SD #define DEBUG_OUTPUT_SERIAL #ifdef DEBUG_ESP3D #ifdef DEBUG_OUTPUT_SPIFFS #define LOG(string) {FSFILE logfile = SPIFFS.open("/log.txt", "a+");logfile.print(string);logfile.close();} +#else +#ifdef SDCARD_FEATURE + #ifdef DEBUG_OUTPUT_SD + #define LOG(string) {if(CONFIG::hasSD()){LOCKSD() File logfile = SD.open("/log.txt", "a+");logfile.print(string);logfile.close();RELEASESD()}} + #else + #define LOG(string) {Serial.print(string);} + #endif #else #define LOG(string) {Serial.print(string);} #endif +#endif #else #define LOG(string) {} #endif +#ifdef SDCARD_FEATURE +#define FSFILE fs::File +#define FSDIR fs::Dir +#define FSINFO fs::FSInfo +#else #define FSFILE File #define FSDIR fs::Dir #define FSINFO FSInfo +#endif #ifndef CONFIG_h #define CONFIG_h #include +extern "C" { +#include "user_interface.h" +} #include "wifi.h" //version and sources location -#define FW_VERSION "0.8.0" +#define FW_VERSION "0.8.50" #define REPOSITORY "https://github.com/luc-github/ESP3D" @@ -118,14 +137,14 @@ //position in EEPROM //AP mode = 1; Station client mode = 2 #define EP_WIFI_MODE 0 //1 byte = flag -#define EP_SSID 1 //33 bytes 32+1 = string ; warning does not support multibyte char like chinese -#define EP_PASSWORD 34 //65 bytes 64 +1 = string ;warning does not support multibyte char like chinese -#define EP_IP_MODE 99 //1 byte = flag -#define EP_IP_VALUE 100 //4 bytes xxx.xxx.xxx.xxx -#define EP_MASK_VALUE 104 //4 bytes xxx.xxx.xxx.xxx -#define EP_GATEWAY_VALUE 108 //4 bytes xxx.xxx.xxx.xxx +#define EP_STA_SSID 1 //33 bytes 32+1 = string ; warning does not support multibyte char like chinese +#define EP_STA_PASSWORD 34 //65 bytes 64 +1 = string ;warning does not support multibyte char like chinese +#define EP_STA_IP_MODE 99 //1 byte = flag +#define EP_STA_IP_VALUE 100 //4 bytes xxx.xxx.xxx.xxx +#define EP_STA_MASK_VALUE 104 //4 bytes xxx.xxx.xxx.xxx +#define EP_STA_GATEWAY_VALUE 108 //4 bytes xxx.xxx.xxx.xxx #define EP_BAUD_RATE 112 //4 bytes = int -#define EP_PHY_MODE 116 //1 byte = flag +#define EP_STA_PHY_MODE 116 //1 byte = flag #define EP_SLEEP_MODE 117 //1 byte = flag #define EP_CHANNEL 118 //1 byte = flag #define EP_AUTH_TYPE 119 //1 byte = flag @@ -139,14 +158,24 @@ #define EP_E_FEEDRATE 172//4 bytes = int #define EP_ADMIN_PWD 176//21 bytes 20+1 = string ; warning does not support multibyte char like chinese #define EP_USER_PWD 197//21 bytes 20+1 = string ; warning does not support multibyte char like chinese -//next available is 218 -//space left 256 - 218 = 38 +#define EP_AP_SSID 218 //33 bytes 32+1 = string ; warning does not support multibyte char like chinese +#define EP_AP_PASSWORD 251 //65 bytes 64 +1 = string ;warning does not support multibyte char like chinese +#define EP_AP_IP_VALUE 316 //4 bytes xxx.xxx.xxx.xxx +#define EP_AP_MASK_VALUE 320 //4 bytes xxx.xxx.xxx.xxx +#define EP_AP_GATEWAY_VALUE 324 //4 bytes xxx.xxx.xxx.xxx +#define EP_AP_IP_MODE 329 //1 byte = flag +#define EP_AP_PHY_MODE 182 //1 byte = flag +//next available is 330 +//space left 512 - 330 = 18 //default values #define DEFAULT_WIFI_MODE AP_MODE -const char DEFAULT_SSID [] PROGMEM = "ESP8266"; -const char DEFAULT_PASSWORD [] PROGMEM = "12345678"; -#define DEFAULT_IP_MODE STATIC_IP_MODE +const char DEFAULT_AP_SSID [] PROGMEM = "ESP8266"; +const char DEFAULT_AP_PASSWORD [] PROGMEM = "12345678"; +const char DEFAULT_STA_SSID [] PROGMEM = "ESP8266"; +const char DEFAULT_STA_PASSWORD [] PROGMEM = "12345678"; +const byte DEFAULT_STA_IP_MODE = DHCP_MODE; +const byte DEFAULT_AP_IP_MODE = STATIC_IP_MODE; 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 @@ -172,7 +201,7 @@ const char DEFAULT_USER_LOGIN [] PROGMEM = "user"; //sizes -#define EEPROM_SIZE 256 //max is 512 +#define EEPROM_SIZE 512 //max is 512 #define MAX_SSID_LENGTH 32 #define MIN_SSID_LENGTH 1 #define MAX_PASSWORD_LENGTH 64 @@ -182,6 +211,7 @@ const char DEFAULT_USER_LOGIN [] PROGMEM = "user"; #define IP_LENGTH 4 #define INTEGER_LENGTH 4 #define MAX_HOSTNAME_LENGTH 32 +#define WL_MAC_ADDR_LENGTH 6 class CONFIG { @@ -203,6 +233,10 @@ public: static bool isIPValid(const char * IP); static char * intTostr(int value); static String formatBytes(size_t bytes); + static char * mac2str(uint8_t mac [WL_MAC_ADDR_LENGTH]); + static byte split_ip (const char * ptr,byte * part); + static void esp_restart(); + static void flashfromSD(const char * Filename, int flashtype); }; #endif diff --git a/esp3d/data/config_ap.tpl b/esp3d/data/config_ap.tpl index 49e95d8b..2c59ec2d 100644 --- a/esp3d/data/config_ap.tpl +++ b/esp3d/data/config_ap.tpl @@ -3,6 +3,7 @@ $INCLUDE[header.inc]$
Access Point
+


diff --git a/esp3d/data/config_sta.tpl b/esp3d/data/config_sta.tpl index f4a06d2a..19955f02 100644 --- a/esp3d/data/config_sta.tpl +++ b/esp3d/data/config_sta.tpl @@ -10,6 +10,7 @@ $INCLUDE[header.inc]$ $AVAILABLE_AP[#$ROW_NUMBER$$AP_SSID$$AP_SIGNAL$$IS_PROTECTED$]$
+



diff --git a/esp3d/data/printer.tpl b/esp3d/data/printer.tpl index 3507c0fd..44fc75d5 100644 --- a/esp3d/data/printer.tpl +++ b/esp3d/data/printer.tpl @@ -1,7 +1,7 @@ $INCLUDE[header.inc]$ $INCLUDE[css2.inc]$
-
Control
+
  Control
- - + + @@ -67,7 +78,7 @@ $INCLUDE[css2.inc]$
-
@@ -40,9 +40,20 @@ $INCLUDE[css2.inc]$ 0300 %   Status: -    +    +
+ + + + + + +
Status:
+
+
+
  
Command
+
  Command
@@ -76,7 +87,7 @@ $INCLUDE[css2.inc]$
-
Information
+
  Information
@@ -88,7 +99,7 @@ $INCLUDE[css2.inc]$
-
Error
+
  Error
@@ -100,7 +111,7 @@ $INCLUDE[css2.inc]$
-
Status
+
  Status
@@ -112,7 +123,7 @@ $INCLUDE[css2.inc]$
-
Print
+
  Print
@@ -129,7 +140,7 @@ $INCLUDE[css2.inc]$
-
Jog
+
  Jog
@@ -329,7 +340,7 @@ $INCLUDE[css2.inc]$
-
SD Files
+
  SD Files
   @@ -821,7 +832,13 @@ xmlhttp.send(formData); window.onload = function() { refreshSDfiles(); -if ($REFRESH_PAGE$)setInterval(function(){getstatus();},$REFRESH_PAGE$); +if ($REFRESH_PAGE$){ + setInterval(function(){getstatus();},$REFRESH_PAGE$); + document.getElementById('manualstatus').style.display = "none"; +} +else { + document.getElementById('autostatus').style.display = "none"; +} } function printfile(filename){ diff --git a/esp3d/esp3d.ino b/esp3d/esp3d.ino index e4af4546..753392c1 100644 --- a/esp3d/esp3d.ino +++ b/esp3d/esp3d.ino @@ -55,16 +55,18 @@ WiFiClient serverClients[MAX_SRV_CLIENTS]; void setup() { + bool breset_config=false; + long baud_rate=0; + web_interface = NULL; + data_server = NULL; // init: #ifdef DEBUG_ESP3D Serial.begin(DEFAULT_BAUD_RATE); delay(2000); - LOG("Debug Serial set\n") + LOG("\nDebug Serial set\n") #endif - web_interface = NULL; - data_server = NULL; - WiFi.disconnect(); - bool breset_config=false; + //WiFi.disconnect(); + WiFi.mode(WIFI_OFF); #ifdef RECOVERY_FEATURE delay(8000); //check if reset config is requested @@ -73,53 +75,61 @@ void setup() breset_config=true; //if requested =>reset settings } #endif - //default baud rate - long baud_rate=0; - //check if EEPROM has value 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) ) { + LOG("Error for EEPROM baud rate\n") breset_config=true; //baud rate is incorrect =>reset settings } if (wifi_config.iweb_port<1 ||wifi_config.iweb_port>65001 || wifi_config.idata_port <1 || wifi_config.idata_port >65001) { breset_config=true; //out of range =>reset settings + LOG("Error for EEPROM port values\n") } } else { breset_config=true; //cannot access to config settings=> reset settings + LOG("Error no EEPROM access\n") } - - SPIFFS.begin(); + //reset is requested if(breset_config) { //update EEPROM with default settings Serial.begin(DEFAULT_BAUD_RATE); delay(2000); Serial.println(F("M117 ESP EEPROM reset")); +#ifdef DEBUG_ESP3D + CONFIG::print_config(); + delay(1000); +#endif CONFIG::reset_config(); delay(1000); //put some default value to a void some exception at first start WiFi.mode(WIFI_AP); WiFi.setPhyMode(WIFI_PHY_MODE_11G); - Serial.flush(); - delay(500); - Serial.swap(); - delay(100); - //restart once reset config is done - ESP.restart(); - while (1) { - delay(1); - }; + CONFIG::esp_restart(); } +#if defined(DEBUG_ESP3D) && defined(DEBUG_OUTPUT_SERIAL) + LOG("\n"); + delay(500); + Serial.flush(); +#endif //setup serial Serial.begin(baud_rate); delay(1000); LOG("Serial Set\n"); wifi_config.baud_rate=baud_rate; + //Update is done if any so should be Ok + SPIFFS.begin(); + //setup wifi according settings if (!wifi_config.Setup()) { - wifi_config.Safe_Setup(); + Serial.println(F("M117 Safe mode 1")); + //try again in AP mode + if (!wifi_config.Setup(true)){ + Serial.println(F("M117 Safe mode 2")); + wifi_config.Safe_Setup(); + } } delay(1000); //start web interface @@ -242,13 +252,6 @@ void loop() COMMAND::read_buffer_serial(sbuf, len); } if (web_interface->restartmodule) { - Serial.flush(); - delay(500); - Serial.swap(); - delay(100); - ESP.restart(); - while (1) { - delay(1); - }; + CONFIG::esp_restart(); } } diff --git a/esp3d/webinterface.cpp b/esp3d/webinterface.cpp index 971844e7..40f27f44 100644 --- a/esp3d/webinterface.cpp +++ b/esp3d/webinterface.cpp @@ -27,9 +27,6 @@ #include #include #include -extern "C" { -#include "user_interface.h" -} #include "LinkedList.h" #include "storestrings.h" #include "command.h" @@ -210,8 +207,9 @@ const char KEY_WEB_UPDATE [] PROGMEM = "$WEB_UPDATE_VISIBILITY$"; const char KEY_STA_SIGNAL [] PROGMEM = "$STA_SIGNAL$"; const char KEY_DATA_PORT_VISIBILITY [] PROGMEM = "$DATA_PORT_VISIBILITY$"; const char KEY_LOGIN_ID [] PROGMEM = "$LOGIN_ID$"; +const char KEY_IS_DEFAULT_MODE [] PROGMEM = "$IS_DEFAULT_MODE$"; + -//TODO: should be in webserver class bool WEBINTERFACE_CLASS::processTemplate(const char * filename, STORESTRINGS_CLASS & KeysList , STORESTRINGS_CLASS & ValuesList ) { if(KeysList.size() != ValuesList.size()) { //Sanity check @@ -745,7 +743,7 @@ void handle_web_interface_home() //BSSID stmp = "$MAC_CONNECTED["+String(client_counter)+"]$"; KeysList.add(stmp.c_str()); - ValuesList.add(wifi_config.mac2str(station->bssid)); + ValuesList.add(CONFIG::mac2str(station->bssid)); //IP stmp = "$IP_CONNECTED["+String(client_counter)+"]$"; KeysList.add(stmp.c_str()); @@ -772,7 +770,7 @@ void handle_web_interface_home() } //AP mac address KeysList.add(FPSTR(KEY_AP_MAC)); - ValuesList.add(wifi_config.mac2str(WiFi.softAPmacAddress(mac))); + ValuesList.add(CONFIG::mac2str(WiFi.softAPmacAddress(mac))); //AP configuration if (wifi_softap_get_config(&apconfig)) { //SSID @@ -864,7 +862,7 @@ void handle_web_interface_home() } //STA mac address KeysList.add(FPSTR(KEY_STA_MAC)); - ValuesList.add(wifi_config.mac2str(WiFi.macAddress(mac))); + ValuesList.add(CONFIG::mac2str(WiFi.macAddress(mac))); //SSID used by STA KeysList.add(FPSTR(KEY_STA_SSID)); if (WiFi.SSID().length()==0) { @@ -1240,6 +1238,7 @@ void handle_web_interface_configAP() bool msg_alert_error=false; bool msg_alert_success=false; byte visible_buf; + byte default_mode; byte static_ip_buf; byte auth_buf; byte channel_buf; @@ -1302,6 +1301,15 @@ void handle_web_interface_configAP() } else { visible_buf=0; } + + //Default mode ? + if (web_interface->WebServer.hasArg("DEFAULT_MODE") ) { + default_mode=AP_MODE; + LOG("Set AP Mode\n") + } else { + default_mode=CLIENT_MODE; + LOG("Set Station mode\n") + } //phy mode phy_mode_buf = byte(web_interface->WebServer.arg("NETWORK").toInt()); if (!(phy_mode_buf==WIFI_PHY_MODE_11B||phy_mode_buf==WIFI_PHY_MODE_11G) ) { @@ -1330,8 +1338,10 @@ void handle_web_interface_configAP() //Static IP ? if (web_interface->WebServer.hasArg("STATIC_IP") ) { static_ip_buf=STATIC_IP_MODE; + LOG("Set Static\n") } else { static_ip_buf=DHCP_MODE; + LOG("Set DHCP\n") } //IP @@ -1367,20 +1377,20 @@ void handle_web_interface_configAP() //if no error apply the change if (msg_alert_error==false) { //save - wifi_config.split_ip(sIP.c_str(),ip_sav); - wifi_config.split_ip(sGW.c_str(),gw_sav); - wifi_config.split_ip(sMask.c_str(),msk_sav); - if((!CONFIG::write_byte(EP_WIFI_MODE,AP_MODE))|| - (!CONFIG::write_string(EP_SSID,sSSID.c_str()))|| - (!CONFIG::write_string(EP_PASSWORD,sPassword.c_str()))|| + CONFIG::split_ip(sIP.c_str(),ip_sav); + CONFIG::split_ip(sGW.c_str(),gw_sav); + CONFIG::split_ip(sMask.c_str(),msk_sav); + if((!CONFIG::write_byte(EP_WIFI_MODE,default_mode))|| + (!CONFIG::write_string(EP_AP_SSID,sSSID.c_str()))|| + (!CONFIG::write_string(EP_AP_PASSWORD,sPassword.c_str()))|| (!CONFIG::write_byte(EP_SSID_VISIBLE,visible_buf))|| - (!CONFIG::write_byte(EP_PHY_MODE,phy_mode_buf))|| + (!CONFIG::write_byte(EP_AP_PHY_MODE,phy_mode_buf))|| (!CONFIG::write_byte(EP_CHANNEL,channel_buf)) || (!CONFIG::write_byte(EP_AUTH_TYPE,auth_buf)) || - (!CONFIG::write_byte(EP_IP_MODE,static_ip_buf)) || - (!CONFIG::write_buffer(EP_IP_VALUE,ip_sav,IP_LENGTH))|| - (!CONFIG::write_buffer(EP_GATEWAY_VALUE,gw_sav,IP_LENGTH))|| - (!CONFIG::write_buffer(EP_MASK_VALUE,msk_sav,IP_LENGTH))) { + (!CONFIG::write_byte(EP_AP_IP_MODE,static_ip_buf)) || + (!CONFIG::write_buffer(EP_AP_IP_VALUE,ip_sav,IP_LENGTH))|| + (!CONFIG::write_buffer(EP_AP_GATEWAY_VALUE,gw_sav,IP_LENGTH))|| + (!CONFIG::write_buffer(EP_AP_MASK_VALUE,msk_sav,IP_LENGTH))) { msg_alert_error=true; smsg = FPSTR(EEPROM_NOWRITE); } else { @@ -1392,19 +1402,19 @@ void handle_web_interface_configAP() else { //no submit need to get data from EEPROM //ssid - if (!CONFIG::read_string(EP_SSID, sSSID , MAX_SSID_LENGTH) ) { - sSSID=FPSTR(DEFAULT_SSID); + if (!CONFIG::read_string(EP_AP_SSID, sSSID , MAX_SSID_LENGTH) ) { + sSSID=FPSTR(DEFAULT_AP_SSID); } //password - if (!CONFIG::read_string(EP_PASSWORD, sPassword , MAX_PASSWORD_LENGTH) ) { - sPassword=FPSTR(DEFAULT_PASSWORD); + if (!CONFIG::read_string(EP_AP_PASSWORD, sPassword , MAX_PASSWORD_LENGTH) ) { + sPassword=FPSTR(DEFAULT_AP_PASSWORD); } //ssid visible ? if (!CONFIG::read_byte(EP_SSID_VISIBLE, &visible_buf )) { visible_buf=DEFAULT_SSID_VISIBLE; } //phy mode - if (!CONFIG::read_byte(EP_PHY_MODE, &phy_mode_buf )) { + if (!CONFIG::read_byte(EP_AP_PHY_MODE, &phy_mode_buf )) { phy_mode_buf=DEFAULT_PHY_MODE; } //authentification @@ -1415,26 +1425,30 @@ void handle_web_interface_configAP() if (!CONFIG::read_byte(EP_CHANNEL, &channel_buf )) { channel_buf=DEFAULT_CHANNEL; } + //Default mode ? + if (!CONFIG::read_byte(EP_WIFI_MODE, &default_mode )) { + default_mode=AP_MODE; + } //static IP ? - if (!CONFIG::read_byte(EP_IP_MODE, &static_ip_buf )) { - static_ip_buf=DEFAULT_IP_MODE; + if (!CONFIG::read_byte(EP_AP_IP_MODE, &static_ip_buf )) { + static_ip_buf=DEFAULT_AP_IP_MODE; } //IP for static IP - if (!CONFIG::read_buffer(EP_IP_VALUE,ip_sav , IP_LENGTH) ) { + if (!CONFIG::read_buffer(EP_AP_IP_VALUE,ip_sav , IP_LENGTH) ) { sIP=IPAddress((const uint8_t *)DEFAULT_IP_VALUE).toString(); } else { sIP=IPAddress((const uint8_t *)ip_sav).toString(); } //GW for static IP - if (!CONFIG::read_buffer(EP_GATEWAY_VALUE,gw_sav , IP_LENGTH) ) { + if (!CONFIG::read_buffer(EP_AP_GATEWAY_VALUE,gw_sav , IP_LENGTH) ) { sGW=IPAddress((const uint8_t *)DEFAULT_GATEWAY_VALUE).toString(); } else { sGW=IPAddress((const uint8_t *)gw_sav).toString(); } //Subnet for static IP - if (!CONFIG::read_buffer(EP_MASK_VALUE,msk_sav , IP_LENGTH) ) { + if (!CONFIG::read_buffer(EP_AP_MASK_VALUE,msk_sav , IP_LENGTH) ) { sMask=IPAddress((const uint8_t *)DEFAULT_MASK_VALUE).toString(); } else { sMask=IPAddress((const uint8_t *)msk_sav).toString(); @@ -1458,7 +1472,13 @@ void handle_web_interface_configAP() } else { ValuesList.add(""); } - + //Default mode ? + KeysList.add(FPSTR(KEY_IS_DEFAULT_MODE)); + if ( default_mode==AP_MODE) { + ValuesList.add(FPSTR(VALUE_CHECKED)); + } else { + ValuesList.add(""); + } //network ipos = 0; stmp=""; @@ -1585,6 +1605,7 @@ void handle_web_interface_configSTA() String sSSID,sPassword,sIP,sGW,sMask,sHostname; bool msg_alert_error=false; bool msg_alert_success=false; + byte default_mode; byte static_ip_buf; byte phy_mode_buf; byte ip_sav[4]; @@ -1655,7 +1676,14 @@ void handle_web_interface_configSTA() KeysList.add(FPSTR(KEY_NETWORK_OPTION_LIST_STATUS)); ValuesList.add(FPSTR(VALUE_HAS_ERROR)); } - + //Default mode ? + if (web_interface->WebServer.hasArg("DEFAULT_MODE") ) { + default_mode=CLIENT_MODE; + LOG("Set STA mode\n") + } else { + default_mode=AP_MODE; + LOG("Set AP mode\n") + } //Static IP ? if (web_interface->WebServer.hasArg("STATIC_IP") ) { static_ip_buf=STATIC_IP_MODE; @@ -1696,18 +1724,18 @@ void handle_web_interface_configSTA() //no error ? then save if (msg_alert_error==false) { //save - wifi_config.split_ip(sIP.c_str(),ip_sav); - wifi_config.split_ip(sGW.c_str(),gw_sav); - wifi_config.split_ip(sMask.c_str(),msk_sav); - if((!CONFIG::write_byte(EP_WIFI_MODE,CLIENT_MODE))|| - (!CONFIG::write_string(EP_SSID,sSSID.c_str()))|| - (!CONFIG::write_string(EP_PASSWORD,sPassword.c_str()))|| + CONFIG::split_ip(sIP.c_str(),ip_sav); + CONFIG::split_ip(sGW.c_str(),gw_sav); + CONFIG::split_ip(sMask.c_str(),msk_sav); + if((!CONFIG::write_byte(EP_WIFI_MODE,default_mode))|| + (!CONFIG::write_string(EP_STA_SSID,sSSID.c_str()))|| + (!CONFIG::write_string(EP_STA_PASSWORD,sPassword.c_str()))|| (!CONFIG::write_string(EP_HOSTNAME,sHostname.c_str()))|| - (!CONFIG::write_byte(EP_PHY_MODE,phy_mode_buf))|| - (!CONFIG::write_byte(EP_IP_MODE,static_ip_buf)) || - (!CONFIG::write_buffer(EP_IP_VALUE,ip_sav,IP_LENGTH))|| - (!CONFIG::write_buffer(EP_GATEWAY_VALUE,gw_sav,IP_LENGTH))|| - (!CONFIG::write_buffer(EP_MASK_VALUE,msk_sav,IP_LENGTH))) { + (!CONFIG::write_byte(EP_STA_PHY_MODE,phy_mode_buf))|| + (!CONFIG::write_byte(EP_STA_IP_MODE,static_ip_buf)) || + (!CONFIG::write_buffer(EP_STA_IP_VALUE,ip_sav,IP_LENGTH))|| + (!CONFIG::write_buffer(EP_STA_GATEWAY_VALUE,gw_sav,IP_LENGTH))|| + (!CONFIG::write_buffer(EP_STA_MASK_VALUE,msk_sav,IP_LENGTH))) { msg_alert_error=true; smsg = FPSTR(EEPROM_NOWRITE); } else { @@ -1717,39 +1745,43 @@ void handle_web_interface_configSTA() } } else { //no submit, need to get data from EEPROM //ssid - if (!CONFIG::read_string(EP_SSID, sSSID , MAX_SSID_LENGTH) ) { - sSSID=FPSTR(DEFAULT_SSID); + if (!CONFIG::read_string(EP_STA_SSID, sSSID , MAX_SSID_LENGTH) ) { + sSSID=FPSTR(DEFAULT_STA_SSID); } //password - if (!CONFIG::read_string(EP_PASSWORD, sPassword , MAX_PASSWORD_LENGTH) ) { - sPassword=FPSTR(DEFAULT_PASSWORD); + if (!CONFIG::read_string(EP_STA_PASSWORD, sPassword , MAX_PASSWORD_LENGTH) ) { + sPassword=FPSTR(DEFAULT_STA_PASSWORD); } //hostname if (!CONFIG::read_string(EP_HOSTNAME, sHostname , MAX_HOSTNAME_LENGTH) ) { sHostname=wifi_config.get_default_hostname(); + } + //Default mode ? + if (!CONFIG::read_byte(EP_WIFI_MODE, &default_mode )) { + default_mode=AP_MODE; } //phy mode - if (!CONFIG::read_byte(EP_PHY_MODE, &phy_mode_buf )) { + if (!CONFIG::read_byte(EP_STA_PHY_MODE, &phy_mode_buf )) { phy_mode_buf=DEFAULT_PHY_MODE; } //static IP ? - if (!CONFIG::read_byte(EP_IP_MODE, &static_ip_buf )) { - static_ip_buf=DEFAULT_IP_MODE; + if (!CONFIG::read_byte(EP_STA_IP_MODE, &static_ip_buf )) { + static_ip_buf=DEFAULT_STA_IP_MODE; } //IP for static IP - if (!CONFIG::read_buffer(EP_IP_VALUE,ip_sav , IP_LENGTH) ) { + if (!CONFIG::read_buffer(EP_STA_IP_VALUE,ip_sav , IP_LENGTH) ) { sIP=IPAddress((const uint8_t *)DEFAULT_IP_VALUE).toString(); } else { sIP=IPAddress((const uint8_t *)ip_sav).toString(); } //GW for static IP - if (!CONFIG::read_buffer(EP_GATEWAY_VALUE,gw_sav , IP_LENGTH) ) { + if (!CONFIG::read_buffer(EP_STA_GATEWAY_VALUE,gw_sav , IP_LENGTH) ) { sGW=IPAddress((const uint8_t *)DEFAULT_GATEWAY_VALUE).toString(); } else { sGW=IPAddress((const uint8_t *)gw_sav).toString(); } //Subnet for static IP - if (!CONFIG::read_buffer(EP_MASK_VALUE,msk_sav , IP_LENGTH) ) { + if (!CONFIG::read_buffer(EP_STA_MASK_VALUE,msk_sav , IP_LENGTH) ) { sMask=IPAddress((const uint8_t *)DEFAULT_MASK_VALUE).toString(); } else { sMask=IPAddress((const uint8_t *)msk_sav).toString(); @@ -1767,7 +1799,15 @@ void handle_web_interface_configSTA() //hostname KeysList.add(FPSTR(KEY_HOSTNAME)); ValuesList.add(sHostname); - + + //Default mode ? + KeysList.add(FPSTR(KEY_IS_DEFAULT_MODE)); + if ( default_mode==CLIENT_MODE) { + ValuesList.add(FPSTR(VALUE_CHECKED)); + } else { + ValuesList.add(""); + } + //network ipos = 0; stmp=""; @@ -2613,6 +2653,8 @@ void SDFileupload() #ifdef WEB_UPDATE_FEATURE void WebUpdateUpload() { + static size_t last_upload_update; + static uint32_t maxSketchSpace ; //only admin can update FW if(web_interface->is_authenticated() != LEVEL_ADMIN) { @@ -2629,16 +2671,25 @@ void WebUpdateUpload() Serial.println(F("M117 Update Firmware")); web_interface->_upload_status= UPLOAD_STATUS_ONGOING; WiFiUDP::stopAll(); - uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; + maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; + last_upload_update = 0; if(!Update.begin(maxSketchSpace)) { //start with max available size web_interface->_upload_status=UPLOAD_STATUS_CANCELLED; } + else Serial.println(F("M117 Update 0%")); //Upload write //************** } else if(upload.status == UPLOAD_FILE_WRITE) { //check if no error if (web_interface->_upload_status == UPLOAD_STATUS_ONGOING) { + //we do not know the total file size yet but we know the available space so let's use it + if ( ((100 * upload.totalSize) / maxSketchSpace) !=last_upload_update){ + last_upload_update = (100 * upload.totalSize) / maxSketchSpace; + Serial.print(F("M117 Update ")); + Serial.print(last_upload_update); + Serial.println(F("%")); + } if(Update.write(upload.buf, upload.currentSize) != upload.currentSize) { web_interface->_upload_status=UPLOAD_STATUS_CANCELLED; @@ -2649,7 +2700,7 @@ void WebUpdateUpload() } else if(upload.status == UPLOAD_FILE_END) { if(Update.end(true)) { //true to set the size to the current progress //Now Reboot - Serial.println(F("M117 Update Done")); + Serial.println(F("M117 Update 100%")); web_interface->_upload_status=UPLOAD_STATUS_SUCCESSFUL; } } else if(upload.status == UPLOAD_FILE_ABORTED) { @@ -2917,12 +2968,14 @@ void handleSDFileList() } String jsonfile = "{" ; - //if action is processing do not build list +#ifndef DIRECT_SDCARD_FEATURE + //if action is processing do not build list, but no need Serial for Direct SDCard Support if ((web_interface->blockserial)){ LOG("Wait, blocking\n"); jsonfile+="\"status\":\"processing\",\"mode\":\"serial\"}"; } else +#endif { jsonfile+="\"files\":["; LOG("No Blocking \n"); @@ -3349,8 +3402,10 @@ WEBINTERFACE_CLASS::WEBINTERFACE_CLASS (int port):WebServer(port) status_msg.setsize(4); status_msg.setlength(50); #endif +#ifndef DIRECT_SDCARD_FEATURE fileslist.setlength(100);//12 for filename + space + size fileslist.setsize(70); // 70 files to limite to 2K +#endif fsUploadFile=(FSFILE)0; _head=NULL; _nb_ip=0; @@ -3368,7 +3423,9 @@ WEBINTERFACE_CLASS::~WEBINTERFACE_CLASS() #ifdef STATUS_MSG_FEATURE status_msg.clear(); #endif +#ifndef DIRECT_SDCARD_FEATURE fileslist.clear(); +#endif while (_head) { auth_ip * current = _head; _head=_head->_next; diff --git a/esp3d/webinterface.h b/esp3d/webinterface.h index f0c7fd9b..0a8f17f7 100644 --- a/esp3d/webinterface.h +++ b/esp3d/webinterface.h @@ -24,6 +24,11 @@ #include #include #include +#ifdef SDCARD_FEATURE +#ifndef FS_NO_GLOBALS +#define FS_NO_GLOBALS +#endif +#endif #include #include "storestrings.h" @@ -63,7 +68,9 @@ public: #ifdef FLOW_MONITORING_FEATURE String answer4M221; #endif +#ifndef DIRECT_SDCARD_FEATURE STORESTRINGS_CLASS fileslist; +#endif #ifdef ERROR_MSG_FEATURE STORESTRINGS_CLASS error_msg; #endif diff --git a/esp3d/wifi.cpp b/esp3d/wifi.cpp index 0f8ba82f..782fe3bb 100644 --- a/esp3d/wifi.cpp +++ b/esp3d/wifi.cpp @@ -71,54 +71,6 @@ const char * WIFI_CONFIG::get_default_hostname() return hostname; } -//helper to convert string to IP -//do not use IPAddress.fromString() because lack of check point and error result -//return number of parts -byte WIFI_CONFIG::split_ip (const char * ptr,byte * part) -{ - if (strlen(ptr)>15 || strlen(ptr)< 7) { - part[0]=0; - part[1]=0; - part[2]=0; - part[3]=0; - return 0; - } - - char pstart [16]; - char * ptr2; - strcpy(pstart,ptr); - ptr2 = pstart; - byte i = strlen(pstart); - byte pos = 0; - for (byte j=0; jsprintf(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; -} - //safe setup if no connection void WIFI_CONFIG::Safe_Setup() { @@ -133,8 +85,8 @@ void WIFI_CONFIG::Safe_Setup() IPAddress local_ip (DEFAULT_IP_VALUE[0],DEFAULT_IP_VALUE[1],DEFAULT_IP_VALUE[2],DEFAULT_IP_VALUE[3]); IPAddress gateway (DEFAULT_GATEWAY_VALUE[0],DEFAULT_GATEWAY_VALUE[1],DEFAULT_GATEWAY_VALUE[2],DEFAULT_GATEWAY_VALUE[3]); IPAddress subnet (DEFAULT_MASK_VALUE[0],DEFAULT_MASK_VALUE[1],DEFAULT_MASK_VALUE[2],DEFAULT_MASK_VALUE[3]); - String ssid = FPSTR(DEFAULT_SSID); - String pwd = FPSTR(DEFAULT_PASSWORD); + String ssid = FPSTR(DEFAULT_AP_SSID); + String pwd = FPSTR(DEFAULT_AP_PASSWORD); WiFi.softAP(ssid.c_str(),pwd.c_str()); delay(500); WiFi.softAPConfig( local_ip, gateway, subnet); @@ -143,7 +95,7 @@ void WIFI_CONFIG::Safe_Setup() } //Read configuration settings and apply them -bool WIFI_CONFIG::Setup() +bool WIFI_CONFIG::Setup(bool force_ap) { char pwd[MAX_PASSWORD_LENGTH+1]; char sbuf[MAX_SSID_LENGTH+1]; @@ -155,56 +107,93 @@ bool WIFI_CONFIG::Setup() //system_update_cpu_freq(SYS_CPU_160MHZ); //set the sleep mode if (!CONFIG::read_byte(EP_SLEEP_MODE, &bflag )) { + LOG("Error read Sleep mode\n") return false; } WiFi.setSleepMode ((WiFiSleepType_t)bflag); sleep_mode=bflag; - //AP or client ? - if (!CONFIG::read_byte(EP_WIFI_MODE, &bmode ) || !CONFIG::read_string(EP_SSID, sbuf , MAX_SSID_LENGTH) ||!CONFIG::read_string(EP_PASSWORD, pwd , MAX_PASSWORD_LENGTH)) { - return false; + if (force_ap) { + bmode = AP_MODE; + } + else { + //AP or client ? + if (!CONFIG::read_byte(EP_WIFI_MODE, &bmode ) ) { + LOG("Error read wifi mode\n") + return false; + } } if (!CONFIG::read_string(EP_HOSTNAME, hostname , MAX_HOSTNAME_LENGTH)) { strcpy(hostname,get_default_hostname()); - } - //DHCP or Static IP ? - if (!CONFIG::read_byte(EP_IP_MODE, &bflag )) { - return false; - } - if (bflag==STATIC_IP_MODE) { - byte ip_buf[4]; - //get the IP - if (!CONFIG::read_buffer(EP_IP_VALUE,ip_buf , IP_LENGTH)) { - return false; - } - IPAddress local_ip (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); - //get the gateway - if (!CONFIG::read_buffer(EP_GATEWAY_VALUE,ip_buf , IP_LENGTH)) { - return false; - } - IPAddress gateway (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); - //get the mask - if (!CONFIG::read_buffer(EP_MASK_VALUE,ip_buf , IP_LENGTH)) { - return false; - } - IPAddress subnet (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); - //apply according active wifi mode - if (bmode==AP_MODE) { - WiFi.softAPConfig( local_ip, gateway, subnet); - } else { - WiFi.config( local_ip, gateway, subnet); - } } //this is AP mode if (bmode==AP_MODE) { - WiFi.enableSTA(true); + LOG("Set AP mode\n") + if(!CONFIG::read_string(EP_AP_SSID, sbuf , MAX_SSID_LENGTH))return false; + if(!CONFIG::read_string(EP_AP_PASSWORD, pwd , MAX_PASSWORD_LENGTH))return false; + Serial.print(FPSTR(M117_)); + Serial.print(F("SSID ")); + Serial.println(sbuf); + LOG("SSID ") + LOG(sbuf) + LOG("\n") + //DHCP or Static IP ? + if (!CONFIG::read_byte(EP_AP_IP_MODE, &bflag )) { + LOG("Error IP mode\n") + return false; + } + LOG("IP Mode: ") + LOG(CONFIG::intTostr(bflag)) + LOG("\n") + if (bflag==STATIC_IP_MODE) { + byte ip_buf[4]; + LOG("Static mode\n") + //get the IP + LOG("IP value:") + if (!CONFIG::read_buffer(EP_AP_IP_VALUE,ip_buf , IP_LENGTH)) { + LOG("Error\n") + return false; + } + IPAddress local_ip (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); + LOG(local_ip.toString()) + LOG("\nGW value:") + //get the gateway + if (!CONFIG::read_buffer(EP_AP_GATEWAY_VALUE,ip_buf , IP_LENGTH)) { + LOG("Error\n") + return false; + } + IPAddress gateway (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); + LOG(gateway.toString()) + LOG("\nMask value:") + //get the mask + if (!CONFIG::read_buffer(EP_AP_MASK_VALUE,ip_buf , IP_LENGTH)) { + LOG("Error Mask value\n") + return false; + } + IPAddress subnet (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); + LOG(subnet.toString()) + LOG("\n") + //apply according active wifi mode + LOG("Set IP\n") + WiFi.softAPConfig( local_ip, gateway, subnet); + delay(100); + } + LOG("Disable STA\n") + WiFi.enableSTA(false); + delay(100); + LOG("Set AP\n") //setup Soft AP WiFi.mode(WIFI_AP); + delay(50); WiFi.softAP(sbuf, pwd); + delay(100); + LOG("Set phy mode\n") //setup PHY_MODE - if (!CONFIG::read_byte(EP_PHY_MODE, &bflag )) { + if (!CONFIG::read_byte(EP_AP_PHY_MODE, &bflag )) { return false; } WiFi.setPhyMode((WiFiPhyMode_t)bflag); + delay(100); + LOG("Get current config\n") //get current config struct softap_config apconfig; wifi_softap_get_config(&apconfig); @@ -232,17 +221,51 @@ bool WIFI_CONFIG::Setup() delay(1000); } } else { + LOG("Set STA mode\n") + if(!CONFIG::read_string(EP_STA_SSID, sbuf , MAX_SSID_LENGTH))return false; + if(!CONFIG::read_string(EP_STA_PASSWORD, pwd , MAX_PASSWORD_LENGTH))return false; + Serial.print(FPSTR(M117_)); + Serial.print(F("SSID ")); + Serial.println(sbuf); + LOG("SSID ") + LOG(sbuf) + LOG("\n") + if (!CONFIG::read_byte(EP_STA_IP_MODE, &bflag )) { + return false; + } + if (bflag==STATIC_IP_MODE) { + byte ip_buf[4]; + //get the IP + if (!CONFIG::read_buffer(EP_STA_IP_VALUE,ip_buf , IP_LENGTH)) { + return false; + } + IPAddress local_ip (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); + //get the gateway + if (!CONFIG::read_buffer(EP_STA_GATEWAY_VALUE,ip_buf , IP_LENGTH)) { + return false; + } + IPAddress gateway (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); + //get the mask + if (!CONFIG::read_buffer(EP_STA_MASK_VALUE,ip_buf , IP_LENGTH)) { + return false; + } + IPAddress subnet (ip_buf[0],ip_buf[1],ip_buf[2],ip_buf[3]); + //apply according active wifi mode + WiFi.config( local_ip, gateway, subnet); + } WiFi.enableAP(false); + delay(100); //setup station mode WiFi.mode(WIFI_STA); + delay(100); WiFi.begin(sbuf, pwd); - delay(500); + delay(100); //setup PHY_MODE - if (!CONFIG::read_byte(EP_PHY_MODE, &bflag )) { + if (!CONFIG::read_byte(EP_STA_PHY_MODE, &bflag )) { return false; } WiFi.setPhyMode((WiFiPhyMode_t)bflag); - delay(500); + delay(100); byte i=0; //try to connect while (WiFi.status() != WL_CONNECTED && i<40) { diff --git a/esp3d/wifi.h b/esp3d/wifi.h index 7aa7a7c5..8fe8327c 100644 --- a/esp3d/wifi.h +++ b/esp3d/wifi.h @@ -42,10 +42,8 @@ public: long baud_rate; int sleep_mode; int32_t getSignal(int32_t RSSI); - bool Setup(); + bool Setup(bool force_ap = false); void Safe_Setup(); - char * mac2str(uint8_t mac [WL_MAC_ADDR_LENGTH]); - byte split_ip (const char * ptr,byte * part); const char * get_default_hostname(); const char * get_hostname(); private: