/* commands.cpp - GRBL_ESP command class Copyright (c) 2014 Luc Lebosse. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.h" #include "commands.h" #include "espresponse.h" #include #include "report.h" #ifdef ENABLE_SD_CARD #include "grbl_sd.h" #endif #ifdef ENABLE_BLUETOOTH #include "BTconfig.h" #endif #ifdef ENABLE_WIFI #include "wificonfig.h" #if defined (ENABLE_HTTP) #include "web_server.h" #endif #ifdef ENABLE_TELNET #include "telnet_server.h" #endif #endif #ifdef ENABLE_NOTIFICATIONS #include "notifications_service.h" #endif #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif esp_err_t esp_task_wdt_reset(); #ifdef __cplusplus } #endif bool COMMANDS::restart_ESP_module = false; /* * delay is to avoid with asyncwebserver and may need to wait sometimes */ void COMMANDS::wait(uint32_t milliseconds){ uint32_t timeout = millis(); esp_task_wdt_reset(); //for a wait 0; //wait feeding WDT while ( (millis() - timeout) < milliseconds) { esp_task_wdt_reset(); } } bool COMMANDS::execute_internal_command (int cmd, String cmd_params, level_authenticate_type auth_level, ESPResponseStream *espresponse) { bool response = true; level_authenticate_type auth_type = auth_level; if (!espresponse) return false; #ifdef ENABLE_AUTHENTICATION if (isadmin(cmd_params)) { auth_type = LEVEL_ADMIN; } if (isuser (cmd_params) && (auth_type != LEVEL_ADMIN) ) { auth_type = LEVEL_USER; } #endif //manage parameters String parameter; switch (cmd) { #ifdef ENABLE_WIFI //STA SSID //[ESP100][pwd=] case 100: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); String defV = DEFAULT_STA_SSID; espresponse->println(prefs.getString(STA_SSID_ENTRY, defV).c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif if (!WiFiConfig::isSSIDValid (parameter.c_str() ) ) { if(espresponse)espresponse->println ("Error: Incorrect SSID!"); response = false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(STA_SSID_ENTRY, parameter) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } } break; //STA Password //[ESP101][pwd=] case 101: { #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if (!WiFiConfig::isPasswordValid (parameter.c_str() ) ) { if(espresponse)espresponse->println ("Error: Incorrect password!"); response = false; return false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(STA_PWD_ENTRY, parameter) != parameter.length()){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } break; //Change STA IP mode (DHCP/STATIC) //[ESP102]pwd= case 102: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); int8_t resp = prefs.getChar(STA_IP_MODE_ENTRY, DHCP_MODE); if (resp == DHCP_MODE) espresponse->println("DHCP"); else if (resp == STATIC_MODE) espresponse->println("STATIC"); else espresponse->println("???"); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter.toUpperCase(); if (!((parameter == "STATIC") || (parameter == "DHCP"))) { if(espresponse)espresponse->println ("Error: only STATIC or DHCP mode supported!"); response = false; return false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); int8_t bbuf = (parameter == "DHCP")?DHCP_MODE:STATIC_MODE; if (prefs.putChar(STA_IP_MODE_ENTRY, bbuf) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } } break; //Change STA IP/Mask/GW //[ESP103]IP= MSK= GW= pwd= case 103: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); //IP String defV = DEFAULT_STA_IP; int32_t IP = prefs.getInt(STA_IP_ENTRY, wifi_config.IP_int_from_string(defV)); //GW defV = DEFAULT_STA_GW; int32_t GW = prefs.getInt(STA_GW_ENTRY, wifi_config.IP_int_from_string(defV)); //MK defV = DEFAULT_STA_MK; int32_t MK = prefs.getInt(STA_MK_ENTRY, wifi_config.IP_int_from_string(defV)); defV = "IP:" + wifi_config.IP_string_from_int(IP) + ", GW:" + wifi_config.IP_string_from_int(GW) + ", MSK:" + wifi_config.IP_string_from_int(MK); espresponse->println(defV.c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif String IP = get_param (cmd_params, "IP=", false); String GW = get_param (cmd_params, "GW=", false); String MSK = get_param (cmd_params, "MSK=", false); Serial.println(IP); Serial.println(GW); if ( !WiFiConfig::isValidIP(IP.c_str())) { if(espresponse)espresponse->println ("Error: Incorrect IP!"); response = false; return false; } if ( !WiFiConfig::isValidIP(GW.c_str())) { if(espresponse)espresponse->println ("Error: Incorrect Gateway!"); response = false; return false; } if ( !WiFiConfig::isValidIP(MSK.c_str())) { if(espresponse)espresponse->println ("Error: Incorrect Mask!"); response = false; return false; } Preferences prefs; prefs.begin(NAMESPACE, false); if ((prefs.putInt(STA_IP_ENTRY, wifi_config.IP_int_from_string(IP)) == 0) || (prefs.putInt(STA_GW_ENTRY, wifi_config.IP_int_from_string(GW)) == 0) || (prefs.putInt(STA_MK_ENTRY, wifi_config.IP_int_from_string(MSK)) == 0)){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } break; //Change AP SSID //[ESP105]pwd= case 105: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); String defV = DEFAULT_AP_SSID; espresponse->println(prefs.getString(AP_SSID_ENTRY, defV).c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif if (!WiFiConfig::isSSIDValid (parameter.c_str() ) ) { if(espresponse)espresponse->println ("Error: Incorrect SSID!"); response = false; } Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(AP_SSID_ENTRY, parameter) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } break; //Change AP Password //[ESP106]pwd= case 106: { #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if (!WiFiConfig::isPasswordValid (parameter.c_str() ) ) { if(espresponse)espresponse->println ("Error: Incorrect password!"); response = false; return false; } Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(AP_PWD_ENTRY, parameter) != parameter.length()){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } break; //Change AP IP //[ESP107]pwd= case 107: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); //IP String defV = DEFAULT_AP_IP; int32_t IP = prefs.getInt(AP_IP_ENTRY, wifi_config.IP_int_from_string(defV)); espresponse->println(wifi_config.IP_string_from_int(IP).c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif if ( !WiFiConfig::isValidIP(parameter.c_str())) { if(espresponse)espresponse->println ("Error: Incorrect IP!"); response = false; return false; } Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putInt(AP_IP_ENTRY, wifi_config.IP_int_from_string(parameter)) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } break; //Change AP channel //[ESP108]pwd= case 108: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); int8_t channel = prefs.getChar(AP_CHANNEL_ENTRY, DEFAULT_AP_CHANNEL); espresponse->println(String(channel).c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif int8_t bbuf = parameter.toInt(); if ((bbuf > MAX_CHANNEL) || (bbuf < MIN_CHANNEL)) { if(espresponse)espresponse->println ("Error: Incorrect channel!"); response = false; return false; } Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putChar(AP_CHANNEL_ENTRY, bbuf) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } break; #endif #if defined( ENABLE_WIFI) || defined( ENABLE_BLUETOOTH) //Set radio state at boot which can be BT, STA, AP, OFF //[ESP110]pwd= case 110: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); int8_t wifiMode = prefs.getChar(ESP_RADIO_MODE, DEFAULT_RADIO_MODE); if (wifiMode == ESP_RADIO_OFF) espresponse->println("OFF"); else if (wifiMode == ESP_BT) espresponse->println("BT"); else if (wifiMode == ESP_WIFI_AP) espresponse->println("AP"); else if (wifiMode == ESP_WIFI_STA) espresponse->println("STA"); else espresponse->println("??"); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter.toUpperCase(); if (!( #if defined( ENABLE_BLUETOOTH) (parameter == "BT") || #endif #if defined( ENABLE_WIFI) (parameter == "STA") || (parameter == "AP") || #endif (parameter == "OFF"))) { if(espresponse)espresponse->println ("Error: only " #ifdef ENABLE_BLUETOOTH "BT or " #endif #ifdef ENABLE_WIFI "STA or AP or " #endif "OFF mode supported!"); response = false; return false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); int8_t bbuf = ESP_RADIO_OFF; #ifdef ENABLE_WIFI if(parameter == "STA")bbuf = ESP_WIFI_STA; if(parameter == "AP")bbuf = ESP_WIFI_AP; #endif #ifdef ENABLE_BLUETOOTH if(parameter == "BT")bbuf = ESP_BT; #endif if (prefs.putChar(ESP_RADIO_MODE, bbuf) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } } break; #endif #ifdef ENABLE_WIFI //Get current IP //[ESP111]
case 111: { if (!espresponse) return false; String currentIP = cmd_params; if (WiFi.getMode() == WIFI_STA) { currentIP += WiFi.localIP().toString(); } else { currentIP += WiFi.softAPIP().toString(); } espresponse->println (currentIP.c_str()); } break; //Get/Set hostname //[ESP112] pwd= case 112: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //Get hostname if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); String defV = DEFAULT_HOSTNAME; espresponse->println(prefs.getString(HOSTNAME_ENTRY, defV).c_str()); prefs.end(); } else { //set host name #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif if (!wifi_config.isHostnameValid (parameter.c_str() ) ) { if(espresponse)espresponse->println ("Error: Incorrect hostname!"); response = false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(HOSTNAME_ENTRY, parameter) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } } break; #endif #if defined (ENABLE_WIFI) || defined (ENABLE_BLUETOOTH) //Set immediate radio state which can be ON, OFF //[ESP115]pwd= case 115:{ #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); //get if (parameter.length() == 0) { bool on =false; #if defined (ENABLE_WIFI) if (WiFi.getMode() != WIFI_MODE_NULL)on = true; #endif #if defined (ENABLE_BLUETOOTH) if (bt_config.Is_BT_on())on = true; #endif espresponse->println ((on)?"ON":"OFF"); } else { parameter.toUpperCase(); if (!((parameter == "ON") || (parameter == "OFF"))) { if(espresponse)espresponse->println ("Error: only ON or OFF mode supported!"); return false; } else { //Stop everything #if defined (ENABLE_WIFI) if (WiFi.getMode() != WIFI_MODE_NULL)wifi_config.StopWiFi(); #endif #if defined (ENABLE_BLUETOOTH) if (bt_config.Is_BT_on())bt_config.end(); #endif //if On start proper service if (parameter == "ON") { //On Preferences prefs; prefs.begin(NAMESPACE, true); int8_t wifiMode = prefs.getChar(ESP_RADIO_MODE, DEFAULT_RADIO_MODE); prefs.end(); if ((wifiMode == ESP_WIFI_AP) || (wifiMode == ESP_WIFI_STA)){ #if defined (ENABLE_WIFI) wifi_config.begin(); #else if(espresponse)espresponse->println ("Error: WiFi is not enabled!"); return false; #endif } else if (wifiMode == ESP_BT) { #if defined (ENABLE_BLUETOOTH) bt_config.begin(); #else if(espresponse)espresponse->println ("Error: Bluetooth is not enabled!"); return false; #endif } else { if(espresponse)espresponse->println ("[MSG: Radio is Off]"); return false; } } else if(espresponse)espresponse->println ("[MSG: Radio is Off]"); } } } break; #endif #ifdef ENABLE_WIFI //Set HTTP state which can be ON, OFF //[ESP120]pwd= case 120: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); int8_t Mode = prefs.getChar(HTTP_ENABLE_ENTRY, DEFAULT_HTTP_STATE); espresponse->println((Mode == 0)?"OFF":"ON"); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter.toUpperCase(); if (!((parameter == "ON") || (parameter == "OFF"))) { if(espresponse)espresponse->println ("Error: only ON or OFF mode supported!"); response = false; return false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); int8_t bbuf = (parameter == "ON")?1:0; if (prefs.putChar(HTTP_ENABLE_ENTRY, bbuf) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } } break; //Set HTTP port //[ESP121]pwd= case 121: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); int port = prefs.getUShort(HTTP_PORT_ENTRY, DEFAULT_WEBSERVER_PORT); espresponse->println(String(port).c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif int ibuf = parameter.toInt(); if ((ibuf > MAX_HTTP_PORT) || (ibuf < MIN_HTTP_PORT)) { if(espresponse)espresponse->println ("Error: Incorrect port!"); response = false; return false; } Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putUShort(HTTP_PORT_ENTRY, ibuf) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } break; //Set Telnet state which can be ON, OFF //[ESP130]pwd= case 130: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); int8_t Mode = prefs.getChar(TELNET_ENABLE_ENTRY, DEFAULT_TELNET_STATE); espresponse->println((Mode == 0)?"OFF":"ON"); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter.toUpperCase(); if (!((parameter == "ON") || (parameter == "OFF"))) { if(espresponse)espresponse->println ("Error: only ON or OFF mode supported!"); response = false; return false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); int8_t bbuf = (parameter == "ON")?1:0; if (prefs.putChar(TELNET_ENABLE_ENTRY, bbuf) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } } break; //Set Telnet port //[ESP131]pwd= case 131: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); int port = prefs.getUShort(TELNET_PORT_ENTRY, DEFAULT_TELNETSERVER_PORT); espresponse->println(String(port).c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif int ibuf = parameter.toInt(); if ((ibuf > MAX_TELNET_PORT) || (ibuf < MIN_TELNET_PORT)) { if(espresponse)espresponse->println ("Error: Incorrect port!"); response = false; return false; } Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putUShort(TELNET_PORT_ENTRY, ibuf) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } break; #endif #ifdef ENABLE_BLUETOOTH //Get/Set btname //[ESP140]< Bluetooth name> pwd= case 140: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; #ifdef ENABLE_AUTHENTICATION if ((auth_type != LEVEL_ADMIN) && (parameter.length() > 0)) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif //Get btname if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); String defV = DEFAULT_BT_NAME; espresponse->println(prefs.getString(BT_NAME_ENTRY, defV).c_str()); prefs.end(); } else { //set BT name if (!bt_config.isBTnameValid (parameter.c_str() ) ) { if(espresponse)espresponse->println ("Error: Incorrect name!"); response = false; } else { Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(BT_NAME_ENTRY, parameter) == 0){ response = false; if(espresponse)espresponse->println ("Error: Set failed!"); } else if(espresponse)espresponse->println ("ok"); prefs.end(); } } } break; #endif //Get SD Card Status //[ESP200] case 200: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif if (!espresponse) return false; String resp = "No SD card"; #ifdef ENABLE_SD_CARD int8_t state = get_sd_state(true); if (state == SDCARD_IDLE)resp="SD card detected"; else if (state == SDCARD_NOT_PRESENT)resp="No SD card"; else resp="Busy"; #endif espresponse->println (resp.c_str()); } break; #ifdef ENABLE_SD_CARD //Get SD Card Content //[ESP210] case 210: { if (!espresponse) return false; #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif int8_t state = get_sd_state(true); if (state == SDCARD_IDLE) { listDir(SD, "/", 10, espresponse->client()); String ssd = "[SD Free:" + ESPResponseStream::formatBytes(SD.totalBytes() - SD.usedBytes()); ssd +=" Used:" + ESPResponseStream::formatBytes(SD.usedBytes()); ssd +=" Total:" + ESPResponseStream::formatBytes(SD.totalBytes()); ssd +="]"; espresponse->println (""); espresponse->println (ssd.c_str()); } else espresponse->println ((state == SDCARD_NOT_PRESENT) ? "No SD card" : "Busy"); } break; //Delete SD Card file / directory //[ESP215]pwd= case 215: { if (!espresponse) return false; #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if (parameter.length() != 0) { int8_t state = get_sd_state(true); parameter.trim(); if (parameter[0] != '/'){ parameter = "/" + parameter; } if (state == SDCARD_IDLE) { File file2del = SD.open(parameter.c_str()); if (file2del) { if (file2del.isDirectory()) { if (!SD.rmdir((char *)parameter.c_str())) { espresponse->println ("Error: Cannot delete directory! Is directory empty?"); } else { espresponse->println ("Directory deleted."); } } else { if (!SD.remove((char *)parameter.c_str())) { espresponse->println ("Error: Cannot delete file!"); } else { espresponse->println ("File deleted."); } } } else { espresponse->println ("Error: Cannot stat file!"); } file2del.close(); } else { espresponse->println ((state == SDCARD_NOT_PRESENT) ? "No SD card" : "Busy"); } } else { espresponse->println ("Error: Missing file name!"); } } break; //print SD file //[ESP220] case 220: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if(espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if (parameter.length() == 0){ if(espresponse)espresponse->println ("Error: Missing file name!"); return false; } int8_t state = get_sd_state(true); if (state != SDCARD_IDLE) { espresponse->println ((state == SDCARD_NOT_PRESENT) ? "No SD card" : "Busy"); return false; } if (sys.state != STATE_IDLE) { if(espresponse)espresponse->println ("Busy"); return false; } if (!openFile(SD, parameter.c_str())){ report_status_message(STATUS_SD_FAILED_READ, (espresponse)?espresponse->client(): CLIENT_ALL); espresponse->println (""); return false; } char fileLine[255]; SD_client = (espresponse)?espresponse->client(): CLIENT_ALL; if (!readFileLine(fileLine)) { //No need notification here it is just a macro closeFile(); espresponse->println (""); return false; } else { report_status_message(gc_execute_line(fileLine, (espresponse)?espresponse->client(): CLIENT_ALL), (espresponse)?espresponse->client(): CLIENT_ALL); // execute the first line } report_realtime_status( (espresponse)?espresponse->client(): CLIENT_ALL); espresponse->println (""); } break; #endif //Get full ESP32 settings content //[ESP400] case 400: { String v; String defV; Preferences prefs; if (!espresponse) return false; #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif espresponse->print("{\"EEPROM\":["); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); prefs.begin(NAMESPACE, true); #ifdef ENABLE_WIFI int8_t vi; //1 - Hostname espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (HOSTNAME_ENTRY); espresponse->print ("\",\"T\":\"S\",\"V\":\""); espresponse->print (wifi_config.Hostname().c_str()); espresponse->print ("\",\"H\":\"Hostname\" ,\"S\":\""); espresponse->print (String(MAX_HOSTNAME_LENGTH).c_str()); espresponse->print ("\", \"M\":\""); espresponse->print (String(MIN_HOSTNAME_LENGTH).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); #ifdef ENABLE_HTTP //2 - http protocol mode espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (HTTP_ENABLE_ENTRY); espresponse->print ("\",\"T\":\"B\",\"V\":\""); vi = prefs.getChar(HTTP_ENABLE_ENTRY, 1); espresponse->print (String(vi).c_str()); espresponse->print ("\",\"H\":\"HTTP protocol\",\"O\":[{\"Enabled\":\"1\"},{\"Disabled\":\"0\"}]}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //3 - http port espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (HTTP_PORT_ENTRY); espresponse->print ("\",\"T\":\"I\",\"V\":\""); espresponse->print (String(web_server.port()).c_str()); espresponse->print ("\",\"H\":\"HTTP Port\",\"S\":\""); espresponse->print (String(MAX_HTTP_PORT).c_str()); espresponse->print ("\",\"M\":\""); espresponse->print (String(MIN_HTTP_PORT).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); #endif #ifdef ENABLE_TELNET //4 - telnet protocol mode espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (TELNET_ENABLE_ENTRY); espresponse->print ("\",\"T\":\"B\",\"V\":\""); vi = prefs.getChar(TELNET_ENABLE_ENTRY, DEFAULT_TELNET_STATE); espresponse->print (String(vi).c_str()); espresponse->print ("\",\"H\":\"Telnet protocol\",\"O\":[{\"Enabled\":\"1\"},{\"Disabled\":\"0\"}]}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //5 - telnet Port espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (TELNET_PORT_ENTRY); espresponse->print ("\",\"T\":\"I\",\"V\":\""); espresponse->print (String(telnet_server.port()).c_str()); espresponse->print ("\",\"H\":\"Telnet Port\",\"S\":\""); espresponse->print (String(MAX_TELNET_PORT).c_str()); espresponse->print ("\",\"M\":\""); espresponse->print (String(MIN_TELNET_PORT).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); #endif //6 - radio mode espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (ESP_RADIO_MODE); espresponse->print ("\",\"T\":\"B\",\"V\":\""); vi = prefs.getChar(ESP_RADIO_MODE, ESP_RADIO_OFF); espresponse->print (String(vi).c_str()); espresponse->print ("\",\"H\":\"Radio mode\",\"O\":[{\"None\":\"0\"}"); #ifdef ENABLE_WIFI espresponse->print (",{\"STA\":\"1\"},{\"AP\":\"2\"}"); #endif #ifdef ENABLE_BLUETOOTH espresponse->print (",{\"BT\":\"3\"}"); #endif espresponse->print ("]}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //7 - STA SSID espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (STA_SSID_ENTRY); espresponse->print ("\",\"T\":\"S\",\"V\":\""); defV = DEFAULT_STA_SSID; espresponse->print (prefs.getString(STA_SSID_ENTRY, defV).c_str()); espresponse->print ("\",\"S\":\""); espresponse->print (String(MAX_SSID_LENGTH).c_str()); espresponse->print ("\",\"H\":\"Station SSID\",\"M\":\""); espresponse->print (String(MIN_SSID_LENGTH).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //8 - STA password espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (STA_PWD_ENTRY); espresponse->print ("\",\"T\":\"S\",\"V\":\""); espresponse->print (HIDDEN_PASSWORD); espresponse->print ("\",\"S\":\""); espresponse->print (String(MAX_PASSWORD_LENGTH).c_str()); espresponse->print ("\",\"H\":\"Station Password\",\"M\":\""); espresponse->print (String(MIN_PASSWORD_LENGTH).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); // 9 - STA IP mode espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (STA_IP_MODE_ENTRY); espresponse->print ("\",\"T\":\"B\",\"V\":\""); espresponse->print (String(prefs.getChar(STA_IP_MODE_ENTRY, DHCP_MODE)).c_str()); espresponse->print ("\",\"H\":\"Station IP Mode\",\"O\":[{\"DHCP\":\"0\"},{\"Static\":\"1\"}]}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //10-STA static IP espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (STA_IP_ENTRY); espresponse->print ("\",\"T\":\"A\",\"V\":\""); espresponse->print (wifi_config.IP_string_from_int(prefs.getInt(STA_IP_ENTRY, 0)).c_str()); espresponse->print ("\",\"H\":\"Station Static IP\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //11-STA static Gateway espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (STA_GW_ENTRY); espresponse->print ("\",\"T\":\"A\",\"V\":\""); espresponse->print (wifi_config.IP_string_from_int(prefs.getInt(STA_GW_ENTRY, 0)).c_str()); espresponse->print ("\",\"H\":\"Station Static Gateway\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //12-STA static Mask espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (STA_MK_ENTRY); espresponse->print ("\",\"T\":\"A\",\"V\":\""); espresponse->print (wifi_config.IP_string_from_int(prefs.getInt(STA_MK_ENTRY, 0)).c_str()); espresponse->print ("\",\"H\":\"Station Static Mask\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //13 - AP SSID espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (AP_SSID_ENTRY); espresponse->print ("\",\"T\":\"S\",\"V\":\""); defV = DEFAULT_AP_SSID; espresponse->print (prefs.getString(AP_SSID_ENTRY, defV).c_str()); espresponse->print ("\",\"S\":\""); espresponse->print (String(MAX_SSID_LENGTH).c_str()); espresponse->print ("\",\"H\":\"AP SSID\",\"M\":\""); espresponse->print (String(MIN_SSID_LENGTH).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //14 - AP password espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (AP_PWD_ENTRY); espresponse->print ("\",\"T\":\"S\",\"V\":\""); espresponse->print (HIDDEN_PASSWORD); espresponse->print ("\",\"S\":\""); espresponse->print (String(MAX_PASSWORD_LENGTH).c_str()); espresponse->print ("\",\"H\":\"AP Password\",\"M\":\""); espresponse->print (String(MIN_PASSWORD_LENGTH).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //15 - AP static IP espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (AP_IP_ENTRY); espresponse->print ("\",\"T\":\"A\",\"V\":\""); defV = DEFAULT_AP_IP; espresponse->print (wifi_config.IP_string_from_int(prefs.getInt(AP_IP_ENTRY, wifi_config.IP_int_from_string(defV))).c_str()); espresponse->print ("\",\"H\":\"AP Static IP\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //16 - AP Channel espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (AP_CHANNEL_ENTRY); espresponse->print ("\",\"T\":\"B\",\"V\":\""); espresponse->print (String(prefs.getChar(AP_CHANNEL_ENTRY, DEFAULT_AP_CHANNEL)).c_str()); espresponse->print ("\",\"H\":\"AP Channel\",\"O\":["); for (int i = MIN_CHANNEL; i <= MAX_CHANNEL ; i++) { espresponse->print ("{\""); espresponse->print (String(i).c_str()); espresponse->print ("\":\""); espresponse->print (String(i).c_str()); espresponse->print ("\"}"); if (i < MAX_CHANNEL) { espresponse->print (","); } } espresponse->print ("]}"); #ifdef ENABLE_NOTIFICATIONS espresponse->print (","); //Notification type espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (NOTIFICATION_TYPE); espresponse->print ("\",\"T\":\"B\",\"V\":\""); vi = prefs.getChar(NOTIFICATION_TYPE, DEFAULT_NOTIFICATION_TYPE); espresponse->print (String(vi).c_str()); espresponse->print ("\",\"H\":\"Notification type\",\"O\":[{\"None\":\"0\"}"); espresponse->print (",{\"Line\":\"3\"},{\"Pushover\":\"1\"}"); espresponse->print (",{\"Email\":\"2\"}"); espresponse->print ("]}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //Notification token 1 espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (NOTIFICATION_T1); espresponse->print ("\",\"T\":\"S\",\"V\":\""); defV = DEFAULT_TOKEN; espresponse->print (prefs.getString(NOTIFICATION_T1, defV).c_str()); espresponse->print ("\",\"S\":\""); espresponse->print (String(MAX_NOTIFICATION_TOKEN_LENGTH).c_str()); espresponse->print ("\",\"H\":\"Notification Token 1\",\"M\":\""); espresponse->print (String(MIN_NOTIFICATION_TOKEN_LENGTH).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //Notification token 2 espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (NOTIFICATION_T2); espresponse->print ("\",\"T\":\"S\",\"V\":\""); defV = DEFAULT_TOKEN; espresponse->print (prefs.getString(NOTIFICATION_T2, defV).c_str()); espresponse->print ("\",\"S\":\""); espresponse->print (String(MAX_NOTIFICATION_TOKEN_LENGTH).c_str()); espresponse->print ("\",\"H\":\"Notification Token 2\",\"M\":\""); espresponse->print (String(MIN_NOTIFICATION_TOKEN_LENGTH).c_str()); espresponse->print ("\"}"); espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); //Notification settings espresponse->print ("{\"F\":\"network\",\"P\":\""); espresponse->print (NOTIFICATION_TS); espresponse->print ("\",\"T\":\"S\",\"V\":\""); defV = DEFAULT_TOKEN; espresponse->print (prefs.getString(NOTIFICATION_TS, defV).c_str()); espresponse->print ("\",\"S\":\""); espresponse->print (String(MAX_NOTIFICATION_SETTING_LENGTH).c_str()); espresponse->print ("\",\"H\":\"Notification Settings\",\"M\":\""); espresponse->print (String(MIN_NOTIFICATION_TOKEN_LENGTH).c_str()); espresponse->print ("\"}"); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); #endif //ENABLE_NOTIFICATIONS #endif espresponse->print ("]}"); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); prefs.end(); } break; //Set EEPROM setting //[ESP401]P= T= V= pwd= case 401: { #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif //check validity of parameters String spos = get_param (cmd_params, "P=", false); String styp = get_param (cmd_params, "T=", false); String sval = get_param (cmd_params, "V=", true); spos.trim(); sval.trim(); if (spos.length() == 0) { response = false; } if (! (styp == "B" || styp == "S" || styp == "A" || styp == "I" || styp == "F") ) { response = false; } if ((sval.length() == 0) #if defined (ENABLE_WIFI) && !((spos==AP_PWD_ENTRY) || (spos==STA_PWD_ENTRY)) #endif ){ response = false; } if (response) { Preferences prefs; prefs.begin(NAMESPACE, false); //Byte value if ((styp == "B") || (styp == "F")){ int8_t bbuf = sval.toInt(); if (prefs.putChar(spos.c_str(), bbuf) ==0 ) { response = false; } else { #if defined (ENABLE_WIFI) //dynamique refresh is better than restart the board if (spos == ESP_RADIO_MODE){ //TODO } if (spos == AP_CHANNEL_ENTRY) { //TODO } #if defined (ENABLE_HTTP) if (spos == HTTP_ENABLE_ENTRY) { //TODO } #endif #if defined (ENABLE_TELNET) if (spos == TELNET_ENABLE_ENTRY) { //TODO } #endif #endif } } //Integer value if (styp == "I") { int16_t ibuf = sval.toInt(); if (prefs.putUShort(spos.c_str(), ibuf) == 0) { response = false; } else { #if defined (ENABLE_WIFI) #if defined (ENABLE_HTTP) if (spos == HTTP_PORT_ENTRY){ //TODO } #endif #if defined (ENABLE_TELNET) if (spos == TELNET_PORT_ENTRY){ //TODO //Serial.println(ibuf); } #endif #endif } } //String value if (styp == "S") { if (prefs.putString(spos.c_str(), sval) != sval.length()) { response = false; } else { #if defined (ENABLE_WIFI) if (spos == HOSTNAME_ENTRY){ //TODO } if (spos == STA_SSID_ENTRY){ //TODO } if (spos == STA_PWD_ENTRY){ //TODO } if (spos == AP_SSID_ENTRY){ //TODO } if (spos == AP_PWD_ENTRY){ //TODO } #endif } } #if defined (ENABLE_WIFI) //IP address if (styp == "A") { if (prefs.putInt(spos.c_str(), wifi_config.IP_int_from_string(sval)) == 0) { response = false; } else { if (spos == STA_IP_ENTRY){ //TODO } if (spos == STA_GW_ENTRY){ //TODO } if (spos == STA_MK_ENTRY){ //TODO } if (spos == AP_IP_ENTRY){ //TODO } } } #endif prefs.end(); } if (!response) { if (espresponse) espresponse->println ("Error: Incorrect Command"); } else { if (espresponse) espresponse->println ("ok"); } } break; #if defined (ENABLE_WIFI) //Get available AP list (limited to 30) //output is JSON //[ESP410] case 410: { if (!espresponse)return false; #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif espresponse->print("{\"AP_LIST\":["); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); int n = WiFi.scanComplete(); if (n == -2) { WiFi.scanNetworks (true); } else if (n) { for (int i = 0; i < n; ++i) { if (i > 0) { espresponse->print (","); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); } espresponse->print ("{\"SSID\":\""); espresponse->print (WiFi.SSID (i).c_str()); espresponse->print ("\",\"SIGNAL\":\""); espresponse->print (String(wifi_config.getSignal (WiFi.RSSI (i) )).c_str()); espresponse->print ("\",\"IS_PROTECTED\":\""); if (WiFi.encryptionType (i) == WIFI_AUTH_OPEN) { espresponse->print ("0"); } else { espresponse->print ("1"); } espresponse->print ("\"}"); } } WiFi.scanDelete(); if (WiFi.scanComplete() == -2) { WiFi.scanNetworks (true); } espresponse->print ("]}"); if(espresponse->client() != CLIENT_WEBUI)espresponse->println(""); } break; #endif //Get ESP current status case 420: { #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif if (!espresponse)return false; espresponse->print ("Chip ID: "); espresponse->print (String ( (uint16_t) (ESP.getEfuseMac() >> 32) ).c_str()); espresponse->println(""); espresponse->print ("CPU Frequency: "); espresponse->print (String (ESP.getCpuFreqMHz() ).c_str()); espresponse->print ("Mhz"); espresponse->println(""); espresponse->print ("CPU Temperature: "); espresponse->print (String (temperatureRead(), 1).c_str()); if(espresponse->client() == CLIENT_WEBUI)espresponse->print ("°"); espresponse->print ("C"); espresponse->println(""); espresponse->print ("Free memory: "); espresponse->print (ESPResponseStream::formatBytes (ESP.getFreeHeap()).c_str()); espresponse->println(""); espresponse->print ("SDK: "); espresponse->print (ESP.getSdkVersion()); espresponse->println(""); espresponse->print ("Flash Size: "); espresponse->print (ESPResponseStream::formatBytes (ESP.getFlashChipSize()).c_str()); espresponse->println(""); #if defined (ENABLE_WIFI) if (WiFi.getMode() != WIFI_MODE_NULL){ espresponse->print ("Available Size for update: "); //Is OTA available ? size_t flashsize = 0; if (esp_ota_get_running_partition()) { const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL); if (partition) { flashsize = partition->size; } } espresponse->print (ESPResponseStream::formatBytes (flashsize).c_str()); espresponse->println(""); } if (WiFi.getMode() != WIFI_MODE_NULL){ espresponse->print ("Available Size for SPIFFS: "); espresponse->print (ESPResponseStream::formatBytes (SPIFFS.totalBytes()).c_str()); espresponse->println(""); } #endif espresponse->print ("Baud rate: "); long br = Serial.baudRate(); //workaround for ESP32 if (br == 115201) { br = 115200; } if (br == 230423) { br = 230400; } espresponse->print (String(br).c_str()); espresponse->println(""); espresponse->print ("Sleep mode: "); if (WiFi.getSleep())espresponse->print ("Modem"); else espresponse->print ("None"); espresponse->println(""); #if defined (ENABLE_WIFI) #if defined (ENABLE_HTTP) if (WiFi.getMode() != WIFI_MODE_NULL){ espresponse->print ("Web port: "); espresponse->print (String(web_server.port()).c_str()); espresponse->println(""); } #endif #if defined (ENABLE_TELNET) if (WiFi.getMode() != WIFI_MODE_NULL){ espresponse->print ("Data port: "); espresponse->print (String(telnet_server.port()).c_str()); espresponse->println(""); } #endif if (WiFi.getMode() != WIFI_MODE_NULL){ espresponse->print ("Hostname: "); espresponse->print ( wifi_config.Hostname().c_str()); espresponse->println(""); } espresponse->print ("Current WiFi Mode: "); if (WiFi.getMode() == WIFI_STA) { espresponse->print ("STA ("); espresponse->print ( WiFi.macAddress().c_str()); espresponse->print (")"); espresponse->println(""); espresponse->print ("Connected to: "); if (WiFi.isConnected()){ //in theory no need but ... espresponse->print (WiFi.SSID().c_str()); espresponse->println(""); espresponse->print ("Signal: "); espresponse->print ( String(wifi_config.getSignal (WiFi.RSSI())).c_str()); espresponse->print ("%"); espresponse->println(""); uint8_t PhyMode; esp_wifi_get_protocol (ESP_IF_WIFI_STA, &PhyMode); espresponse->print ("Phy Mode: "); if (PhyMode == (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N)) espresponse->print ("11n"); else if (PhyMode == (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G)) espresponse->print ("11g"); else if (PhyMode == (WIFI_PROTOCOL_11B )) espresponse->print ("11b"); else espresponse->print ("???"); espresponse->println(""); espresponse->print ("Channel: "); espresponse->print (String (WiFi.channel()).c_str()); espresponse->println(""); espresponse->print ("IP Mode: "); tcpip_adapter_dhcp_status_t dhcp_status; tcpip_adapter_dhcpc_get_status (TCPIP_ADAPTER_IF_STA, &dhcp_status); if (dhcp_status == TCPIP_ADAPTER_DHCP_STARTED)espresponse->print ("DHCP"); else espresponse->print ("Static"); espresponse->println(""); espresponse->print ("IP: "); espresponse->print (WiFi.localIP().toString().c_str()); espresponse->println(""); espresponse->print ("Gateway: "); espresponse->print (WiFi.gatewayIP().toString().c_str()); espresponse->println(""); espresponse->print ("Mask: "); espresponse->print (WiFi.subnetMask().toString().c_str()); espresponse->println(""); espresponse->print ("DNS: "); espresponse->print (WiFi.dnsIP().toString().c_str()); espresponse->println(""); } //this is web command so connection => no command espresponse->print ("Disabled Mode: "); espresponse->print ("AP ("); espresponse->print (WiFi.softAPmacAddress().c_str()); espresponse->print (")"); espresponse->println(""); } else if (WiFi.getMode() == WIFI_AP) { espresponse->print ("AP ("); espresponse->print (WiFi.softAPmacAddress().c_str()); espresponse->print (")"); espresponse->println(""); wifi_config_t conf; esp_wifi_get_config (ESP_IF_WIFI_AP, &conf); espresponse->print ("SSID: "); espresponse->print ((const char*) conf.ap.ssid); espresponse->println(""); espresponse->print ("Visible: "); espresponse->print ( (conf.ap.ssid_hidden == 0) ? "Yes" : "No"); espresponse->println(""); espresponse->print ("Authentication: "); if (conf.ap.authmode == WIFI_AUTH_OPEN) { espresponse->print ("None"); } else if (conf.ap.authmode == WIFI_AUTH_WEP) { espresponse->print ("WEP"); } else if (conf.ap.authmode == WIFI_AUTH_WPA_PSK) { espresponse->print ("WPA"); } else if (conf.ap.authmode == WIFI_AUTH_WPA2_PSK) { espresponse->print ("WPA2"); } else { espresponse->print ("WPA/WPA2"); } espresponse->println(""); espresponse->print ("Max Connections: "); espresponse->print (String(conf.ap.max_connection).c_str()); espresponse->println(""); espresponse->print ("DHCP Server: "); tcpip_adapter_dhcp_status_t dhcp_status; tcpip_adapter_dhcps_get_status (TCPIP_ADAPTER_IF_AP, &dhcp_status); if (dhcp_status == TCPIP_ADAPTER_DHCP_STARTED)espresponse->print ("Started"); else espresponse->print ("Stopped"); espresponse->println(""); espresponse->print ("IP: "); espresponse->print (WiFi.softAPIP().toString().c_str()); espresponse->println(""); tcpip_adapter_ip_info_t ip_AP; tcpip_adapter_get_ip_info (TCPIP_ADAPTER_IF_AP, &ip_AP); espresponse->print ("Gateway: "); espresponse->print (IPAddress (ip_AP.gw.addr).toString().c_str()); espresponse->println(""); espresponse->print ("Mask: "); espresponse->print (IPAddress (ip_AP.netmask.addr).toString().c_str()); espresponse->println(""); espresponse->print ("Connected clients: "); wifi_sta_list_t station; tcpip_adapter_sta_list_t tcpip_sta_list; esp_wifi_ap_get_sta_list (&station); tcpip_adapter_get_sta_list (&station, &tcpip_sta_list); espresponse->print (String(station.num).c_str()); espresponse->println(""); for (int i = 0; i < station.num; i++) { espresponse->print (wifi_config.mac2str(tcpip_sta_list.sta[i].mac)); espresponse->print (" "); espresponse->print ( IPAddress (tcpip_sta_list.sta[i].ip.addr).toString().c_str()); espresponse->println(""); } espresponse->print ("Disabled Mode: "); espresponse->print ("STA ("); espresponse->print (WiFi.macAddress().c_str()); espresponse->print (")"); espresponse->println(""); } else if (WiFi.getMode() == WIFI_AP_STA) //we should not be in this state but just in case .... { espresponse->print ("Mixed"); espresponse->println(""); espresponse->print ("STA ("); espresponse->print (WiFi.macAddress().c_str()); espresponse->print (")"); espresponse->println(""); espresponse->print ("AP ("); espresponse->print (WiFi.softAPmacAddress().c_str()); espresponse->print (")"); espresponse->println(""); } else { //we should not be there if no wifi .... espresponse->print ("Off"); espresponse->println(""); } #endif #ifdef ENABLE_BLUETOOTH espresponse->print ("Current BT Mode: "); if (bt_config.Is_BT_on()){ espresponse->println("On"); espresponse->print ("BT Name: "); espresponse->print (bt_config.BTname().c_str()); espresponse->print ("("); espresponse->print (bt_config.device_address()); espresponse->println(")"); espresponse->print ("Status: "); if(SerialBT.hasClient()) { espresponse->print ("Connected with "); espresponse->print (bt_config._btclient.c_str()); } else espresponse->print ("Not connected"); } else{ espresponse->print ("Off"); } espresponse->println(""); #endif #ifdef ENABLE_NOTIFICATIONS espresponse->print ("Notifications: "); espresponse->print (notificationsservice.started()?"Enabled":"Disabled"); if (notificationsservice.started()) { espresponse->print ("("); espresponse->print (notificationsservice.getTypeString()); espresponse->print (")"); } espresponse->println(""); #endif //TODO to complete espresponse->print ("FW version: "); espresponse->print (GRBL_VERSION); espresponse->print (" ("); espresponse->print (GRBL_VERSION_BUILD); espresponse->print (") (ESP32)"); espresponse->println(""); } break; //Set ESP mode //cmd is RESTART //[ESP444] case 444: parameter = get_param(cmd_params,"", true); #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif { if (parameter=="RESTART") { grbl_send(CLIENT_ALL,"[MSG:Restart ongoing]\r\n"); COMMANDS::restart_ESP(); } else response = false; } if (!response) { if (espresponse)espresponse->println ("Error: Incorrect Command"); } else { if (espresponse)espresponse->println ("ok"); } break; #ifdef ENABLE_AUTHENTICATION //Change / Reset user password //[ESP555] case 555: { if (auth_type == LEVEL_ADMIN) { parameter = get_param (cmd_params, "", true); if (parameter.length() == 0) { Preferences prefs; parameter = DEFAULT_USER_PWD; prefs.begin(NAMESPACE, false); if (prefs.putString(USER_PWD_ENTRY, parameter) != parameter.length()){ response = false; if (espresponse)espresponse->println ("error"); } else if (espresponse)espresponse->println ("ok"); prefs.end(); } else { if (isLocalPasswordValid (parameter.c_str() ) ) { Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(USER_PWD_ENTRY, parameter) != parameter.length()) { response = false; if (espresponse)espresponse->println ("error"); } else if (espresponse)espresponse->println ("ok"); prefs.end(); } else { if (espresponse)espresponse->println ("error"); response = false; } } } else { if (espresponse)espresponse->println ("error"); response = false; } break; } #endif #ifdef ENABLE_NOTIFICATIONS case 600: { //Send message #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if (parameter.length() == 0) { if (espresponse)espresponse->println ("Invalid message!"); return false; } if (notificationsservice.sendMSG("GRBL Notification", parameter.c_str())) { if (espresponse)espresponse->println ("ok"); } else { if (espresponse)espresponse->println ("Cannot send message!"); return false; } } break; //Set/Get Notification settings //[ESP610]type= T1= T2= TS= [pwd=] //Get will give type and settings only not the protected T1/T2 case 610: { //Send message #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ((parameter.length() == 0) && !espresponse) return false; //get if (parameter.length() == 0) { Preferences prefs; prefs.begin(NAMESPACE, true); uint8_t vi = prefs.getChar(NOTIFICATION_TYPE, DEFAULT_NOTIFICATION_TYPE); String defV = DEFAULT_TOKEN; parameter = (vi == ESP_PUSHOVER_NOTIFICATION)?"PUSHOVER":(vi == ESP_LINE_NOTIFICATION)?"LINE":(vi == ESP_EMAIL_NOTIFICATION)?"EMAIL":"NONE"; parameter+=" "; parameter+=prefs.getString(NOTIFICATION_TS, defV); espresponse->println(parameter.c_str()); prefs.end(); } else { //set #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif response = false; parameter = get_param (cmd_params, "type=", false); if (parameter.length() !=0) { uint8_t bbuf = (parameter == "NONE")?0:(parameter == "PUSHOVER")?ESP_PUSHOVER_NOTIFICATION:(parameter == "LINE")?ESP_LINE_NOTIFICATION:(parameter == "EMAIL")?ESP_EMAIL_NOTIFICATION:255; if (bbuf != 255){ Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putChar(NOTIFICATION_TYPE, bbuf) == 0){ if(espresponse)espresponse->println ("Error: Set failed!"); response = false; } else { response = true; } prefs.end(); } else{ if(espresponse)espresponse->println ("Error: wrong type!"); response = false; } } parameter = get_param (cmd_params, "T1=", false); if (parameter.length() !=0) { if (parameter.length() <=MAX_NOTIFICATION_TOKEN_LENGTH ){ Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(NOTIFICATION_T1, parameter) == 0){ if(espresponse)espresponse->println ("Error: Set failed!"); response = false; } else { response = true; } prefs.end(); } else{ if(espresponse)espresponse->println ("Error: token 1!"); response = false; } } parameter = get_param (cmd_params, "T2=", false); if (parameter.length() !=0) { if (parameter.length() <=MAX_NOTIFICATION_TOKEN_LENGTH ){ Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(NOTIFICATION_T2, parameter) == 0){ if(espresponse)espresponse->println ("Error: Set failed!"); response = false; } else { response = true; } prefs.end(); } else{ if(espresponse)espresponse->println ("Error: token 2!"); response = false; } } parameter = get_param (cmd_params, "TS=", false); if (parameter.length() !=0) { if (parameter.length() <=MAX_NOTIFICATION_SETTING_LENGTH ){ Preferences prefs; prefs.begin(NAMESPACE, false); if (prefs.putString(NOTIFICATION_TS, parameter) == 0){ if(espresponse)espresponse->println ("Error: Set failed!"); response = false; } else { response = true; } prefs.end(); } else{ if(espresponse)espresponse->println ("Error: settings!"); response = false; } } } //update settings notificationsservice.begin(); if(espresponse && response)espresponse->println ("ok"); } break; #endif //ENABLE_NOTIFICATIONS //[ESP700] pwd= case 700: { //read local file #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); if ( (parameter.length() > 0) && (parameter[0] != '/') ) { parameter = "/" + parameter; } if (!SPIFFS.exists(parameter)){ if (espresponse)espresponse->println ("Error:No such file!"); response = false; } else { File currentfile = SPIFFS.open (parameter, FILE_READ); if (currentfile) {//if file open success //until no line in file while (currentfile.available()) { String currentline = currentfile.readStringUntil('\n'); currentline.replace("\n",""); currentline.replace("\r",""); if (currentline.length() > 0) { int ESPpos = currentline.indexOf ("[ESP"); if (ESPpos > -1) { //is there the second part? int ESPpos2 = currentline.indexOf ("]", ESPpos); if (ESPpos2 > -1) { //Split in command and parameters String cmd_part1 = currentline.substring (ESPpos + 4, ESPpos2); String cmd_part2 = ""; //is there space for parameters? if (ESPpos2 < currentline.length() ) { cmd_part2 = currentline.substring (ESPpos2 + 1); } //if command is a valid number then execute command if(cmd_part1.toInt()!=0) { if (!execute_internal_command(cmd_part1.toInt(),cmd_part2, auth_type, espresponse)) response = false; } //if not is not a valid [ESPXXX] command ignore it } } else { //preprocess line String processedline = ""; char c; uint8_t line_flags = 0; for (uint16_t index=0; index < currentline.length(); index++){ c = currentline[index]; if (c == '\r' || c == ' ' || c == '\n') { // ignore these whitespace items } else if (c == '(') { line_flags |= LINE_FLAG_COMMENT_PARENTHESES; } else if (c == ')') { // End of '()' comment. Resume line allowed. if (line_flags & LINE_FLAG_COMMENT_PARENTHESES) { line_flags &= ~(LINE_FLAG_COMMENT_PARENTHESES); } } else if (c == ';') { // NOTE: ';' comment to EOL is a LinuxCNC definition. Not NIST. if (!(line_flags & LINE_FLAG_COMMENT_PARENTHESES)) // semi colon inside parentheses do not mean anything line_flags |= LINE_FLAG_COMMENT_SEMICOLON; } else { // add characters to the line if (!line_flags) { c = toupper(c); // make upper case processedline += c; } } } if (processedline.length() > 0)gc_execute_line((char *)processedline.c_str(), CLIENT_WEBUI); wait (1); } wait (1); } } currentfile.close(); if (espresponse)espresponse->println ("ok"); } else { if (espresponse)espresponse->println ("error"); response = false; } } break; } //Format SPIFFS //[ESP710]FORMAT pwd= case 710: #ifdef ENABLE_AUTHENTICATION if (auth_type != LEVEL_ADMIN) { if (espresponse)espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); { if (parameter == "FORMAT") { if (espresponse)espresponse->print ("Formating"); SPIFFS.format(); if (espresponse)espresponse->println ("...Done"); } else { if (espresponse)espresponse->println ("error"); response = false; } } break; //SPIFFS total size and used size //[ESP720]
case 720: if (!espresponse)return false; #ifdef ENABLE_AUTHENTICATION if (auth_type == LEVEL_GUEST) { espresponse->println ("Error: Wrong authentication!"); return false; } #endif parameter = get_param (cmd_params, "", true); espresponse->print (parameter.c_str()); espresponse->print ("SPIFFS Total:"); espresponse->print (ESPResponseStream::formatBytes (SPIFFS.totalBytes() ).c_str()); espresponse->print (" Used:"); espresponse->println (ESPResponseStream::formatBytes (SPIFFS.usedBytes() ).c_str()); break; //get fw version / fw target / hostname / authentication //[ESP800] case 800: { if (!espresponse)return false; String resp; resp = "FW version:"; resp += GRBL_VERSION ; resp += " ("; resp += GRBL_VERSION_BUILD; resp += ")"; resp += " # FW target:grbl-embedded # FW HW:"; #ifdef ENABLE_SD_CARD resp += "Direct SD"; #else resp += "No SD"; #endif resp += " # primary sd:/sd # secondary sd:none # authentication:"; #ifdef ENABLE_AUTHENTICATION resp += "yes"; #else resp += "no"; #endif #if defined (ENABLE_WIFI) #if defined (ENABLE_HTTP) resp += " # webcommunication: Sync: "; resp += String(web_server.port() + 1); resp += ":"; if (WiFi.getMode() == WIFI_MODE_AP) { resp += WiFi.softAPIP().toString(); } else if (WiFi.getMode() == WIFI_MODE_STA){ resp += WiFi.localIP().toString(); } else if (WiFi.getMode() == WIFI_MODE_APSTA) { resp += WiFi.softAPIP().toString(); } else { resp += "0.0.0.0"; } #endif resp += " # hostname:"; resp += wifi_config.Hostname(); if (WiFi.getMode() == WIFI_AP)resp += "(AP mode)"; #endif //to save time in decoding `?` resp += " # axis:"; resp += String(N_AXIS); if (espresponse)espresponse->println (resp.c_str()); } break; default: if (espresponse)espresponse->println ("Error: Incorrect Command"); response = false; break; } return response; } String COMMANDS::get_param(String & cmd_params, const char * id, bool withspace) { static String parameter; String sid = id; int start; int end = -1; if (cmd_params.indexOf("pwd=") == 0)cmd_params = " " + cmd_params; parameter = ""; //if no id it means it is first part of cmd if (strlen (id) == 0) { start = 0; } //else find id position else { start = cmd_params.indexOf (id); } //if no id found and not first part leave if (start == -1 ) { return parameter; } //password and SSID can have space so handle it //if no space expected use space as delimiter if (!withspace) { end = cmd_params.indexOf (" ", start); } #ifdef ENABLE_AUTHENTICATION //if space expected only one parameter but additional password may be present else if (sid != " pwd=") { end = cmd_params.indexOf (" pwd=", start); } #endif //if no end found - take all if (end == -1) { end = cmd_params.length(); } //extract parameter parameter = cmd_params.substring (start + strlen (id), end); //be sure no extra space parameter.trim(); return parameter; } #ifdef ENABLE_AUTHENTICATION bool COMMANDS::isLocalPasswordValid (const char * password) { char c; //limited size if ( (strlen (password) > MAX_LOCAL_PASSWORD_LENGTH) || (strlen (password) < MIN_LOCAL_PASSWORD_LENGTH) ) { return false; } //no space allowed for (int i = 0; i < strlen (password); i++) { c = password[i]; if (c == ' ') { return false; } } return true; } //check admin password bool COMMANDS::isadmin (String & cmd_params) { String adminpassword; String sadminPassword; Preferences prefs; prefs.begin(NAMESPACE, true); String defV = DEFAULT_ADMIN_PWD; sadminPassword = prefs.getString(ADMIN_PWD_ENTRY, defV); prefs.end(); adminpassword = get_param (cmd_params, "pwd=", true); if (!sadminPassword.equals (adminpassword) ) { return false; } else { return true; } } //check user password - admin password is also valid bool COMMANDS::isuser (String & cmd_params) { String userpassword; String suserPassword; Preferences prefs; prefs.begin(NAMESPACE, true); String defV = DEFAULT_USER_PWD; suserPassword = prefs.getString(USER_PWD_ENTRY, defV); prefs.end(); userpassword = get_param (cmd_params, "pwd=", true); //it is not user password if (!suserPassword.equals (userpassword) ) { //check admin password return isadmin (cmd_params); } else { return true; } } #endif //check is valid [ESPXXX] command //return XXX as cmd and command as cmd_params bool COMMANDS::check_command (const char * line, int * cmd, String & cmd_params) { String buffer = line; bool result = false; int ESPpos = buffer.indexOf ("[ESP"); if (ESPpos > -1) { //is there the second part? int ESPpos2 = buffer.indexOf ("]", ESPpos); if (ESPpos2 > -1) { //Split in command and parameters String cmd_part1 = buffer.substring (ESPpos + 4, ESPpos2); String cmd_part2 = ""; //is there space for parameters? if (ESPpos2 < buffer.length() ) { cmd_part2 = buffer.substring (ESPpos2 + 1); } //if command is a valid number then execute command if (cmd_part1.toInt() != 0) { *cmd = cmd_part1.toInt(); cmd_params = cmd_part2; result = true; } //if not is not a valid [ESPXXX] command } } return result; } /** * Restart ESP */ void COMMANDS::restart_ESP(){ restart_ESP_module=true; } /** * Handle not critical actions that must be done in sync environement */ void COMMANDS::handle() { COMMANDS::wait(0); //in case of restart requested if (restart_ESP_module) { ESP.restart(); while (1) {}; } }