diff --git a/WiFiManager.cpp b/WiFiManager.cpp index 03d5050..235b9b9 100644 --- a/WiFiManager.cpp +++ b/WiFiManager.cpp @@ -601,8 +601,8 @@ uint8_t WiFiManager::processConfigPortal(){ DEBUG_WM(F("Got IP Address:")); DEBUG_WM(WiFi.localIP()); - if ( _savecallback != NULL) { - _savecallback(); + if ( _savewificallback != NULL) { + _savewificallback(); } stopConfigPortal(); return WL_CONNECTED; // CONNECT SUCCESS @@ -614,8 +614,8 @@ uint8_t WiFiManager::processConfigPortal(){ // do save callback // @todo this is more of an exiting callback than a save, clarify when this should actually occur // confirm or verify data was saved to make this more accurate callback - if ( _savecallback != NULL) { - _savecallback(); + if ( _savewificallback != NULL) { + _savewificallback(); } stopConfigPortal(); return WL_CONNECT_FAILED; // CONNECT FAIL @@ -1330,18 +1330,8 @@ void WiFiManager::handleParamSave() { DEBUG_WM(DEBUG_DEV,F("Method:"),server->method() == HTTP_GET ? (String)FPSTR(S_GET) : (String)FPSTR(S_POST)); handleRequest(); - // @todo use new callback for before paramsaves - if ( _presavecallback != NULL) { - _presavecallback(); - } - doParamSave(); - // @todo use new callback for paramsaves - if ( _savecallback != NULL) { - _savecallback(); - } - String page = getHTTPHead(FPSTR(S_titleparamsaved)); // @token titleparamsaved page += FPSTR(HTTP_PARAMSAVED); page += FPSTR(HTTP_END); @@ -1353,13 +1343,18 @@ void WiFiManager::handleParamSave() { } void WiFiManager::doParamSave(){ + // @todo use new callback for before paramsaves, is this really needed? + if ( _presavecallback != NULL) { + _presavecallback(); + } + //parameters if(_paramsCount > 0){ DEBUG_WM(DEBUG_VERBOSE,F("Parameters")); DEBUG_WM(DEBUG_VERBOSE,FPSTR(D_HR)); for (int i = 0; i < _paramsCount; i++) { if (_params[i] == NULL) { - break; + break; // @todo might not be needed anymore } //read parameter from server String name = (String)FPSTR(S_parampre)+(String)i; @@ -1376,6 +1371,11 @@ void WiFiManager::doParamSave(){ } DEBUG_WM(DEBUG_VERBOSE,FPSTR(D_HR)); } + + if ( _saveparamscallback != NULL) { + _saveparamscallback(); + } + } /** @@ -2007,33 +2007,44 @@ void WiFiManager::setBreakAfterConfig(boolean shouldBreak) { /** * setAPCallback, set a callback when softap is started * @access public - * @param {[type]} void (*func)(WiFiManager* myWiFiManager) [description] + * @param {[type]} void (*func)(WiFiManager* wminstance) */ void WiFiManager::setAPCallback( std::function func ) { _apcallback = func; } - + /** * setSaveConfigCallback, set a save config callback after closing configportal - * @todo only calls if configportal stopped + * @note calls only if wifi is saved or changed, or setBreakAfterConfig(true) * @access public - * @param {[type]} void (*func)(void) [description] + * @param {[type]} void (*func)(void) */ void WiFiManager::setSaveConfigCallback( std::function func ) { - _savecallback = func; + _savewificallback = func; } -//start up reset config callback -void WiFiManager::setConfigResetCallback(void(*func)(void)) { +/** + * setConfigResetCallback, set a callback to occur when a resetSettings() occurs + * @access public + * @param {[type]} void(*func)(void) + */ +void WiFiManager::setConfigResetCallback( std::function func ) { _resetcallback = func; } -//sets a custom element to add to head, like a new style tag /** - * setPreSaveConfigCallback, set a pre save config callback after closing configportal - * @todo only calls if configportal stopped + * setSaveParamsCallback, set a save params callback on params save in wifi or params pages * @access public - * @param {[type]} void (*func)(void) [description] + * @param {[type]} void (*func)(void) + */ +void WiFiManager::setSaveParamsCallback( std::function func ) { + _saveparamscallback = func; +} + +/** + * setPreSaveConfigCallback, set a callback to fire before saving wifi or params + * @access public + * @param {[type]} void (*func)(void) */ void WiFiManager::setPreSaveConfigCallback( std::function func ) { _presavecallback = func; @@ -2049,10 +2060,9 @@ void WiFiManager::setCustomHeadElement(const char* element) { _customHeadElement = element; } -//if this is true, remove duplicated Access Points - defaut true /** * toggle wifiscan hiding of duplicate ssid names - * if enabled, then the webportal wifiscan page will show all aps + * if this is false, wifiscan will remove duplicat Access Points - defaut true * @access public * @param boolean removeDuplicates [true] */ diff --git a/WiFiManager.h b/WiFiManager.h index b591f50..1774d24 100644 --- a/WiFiManager.h +++ b/WiFiManager.h @@ -182,12 +182,16 @@ class WiFiManager int getParametersCount(); + // SET CALLBACKS + //called when AP mode and config portal is started void setAPCallback( std::function func ); //called when settings reset have been triggered - void setConfigResetCallback(void(*func)(void)); - //called when settings have been changed and connection was successful + void setConfigResetCallback( std::function func ); + //called when wifi settings have been changed and connection was successful ( or setBreakAfterConfig(true) ) void setSaveConfigCallback( std::function func ); + //called when settings have been changed and connection was successful + void setSaveParamsCallback( std::function func ); //called when settings before have been changed and connection was successful void setPreSaveConfigCallback( std::function func ); @@ -277,7 +281,8 @@ class WiFiManager #else using WM_WebServer = ESP8266WebServer; #endif - std::unique_ptr server; + + std::unique_ptr server; std::vector _menuIds; std::vector _menuIdsDefault = {"wifi","info","exit"}; @@ -477,10 +482,12 @@ class WiFiManager void DEBUG_WM(wm_debuglevel_t level, Generic text,Genericb textb); // callbacks + // @todo use cb list (vector) maybe event ids, allow no return value std::function _apcallback; - std::function _savecallback; + std::function _savewificallback; std::function _presavecallback; - void (*_resetcallback)(void) = NULL; // @todo change to std func + std::function _saveparamscallback; + std::function _resetcallback; template auto optionalIPFromString(T *obj, const char *s) -> decltype( obj->fromString(s) ) { diff --git a/examples/DEV/OnDemandConfigPortal/OnDemandConfigPortal.ino b/examples/DEV/OnDemandConfigPortal/OnDemandConfigPortal.ino index e8be11b..3ded79b 100644 --- a/examples/DEV/OnDemandConfigPortal/OnDemandConfigPortal.ino +++ b/examples/DEV/OnDemandConfigPortal/OnDemandConfigPortal.ino @@ -7,6 +7,7 @@ const char* modes[] = { "NULL", "STA", "AP", "STA+AP" }; WiFiManager wm; +bool TEST_CP = true; // always start the configportal char ssid[] = "*************"; // your network SSID (name) char pass[] = "********"; // your network password @@ -34,20 +35,24 @@ void debugchipid(){ // ESP32 Chip ID = 507726A4AE30 } -void saveCallback(){ - Serial.println("saveCallback fired"); +void saveWifiCallback(){ + Serial.println("[CALLBACK] saveCallback fired"); } //gets called when WiFiManager enters configuration mode void configModeCallback (WiFiManager *myWiFiManager) { - Serial.println("configModeCallback fired"); + Serial.println("[CALLBACK] configModeCallback fired"); // myWiFiManager->setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); // Serial.println(WiFi.softAPIP()); //if you used auto generated SSID, print it // Serial.println(myWiFiManager->getConfigPortalSSID()); } +void saveParamCallback(){ + Serial.println("[CALLBACK] saveParamCallback fired"); +} + void setup() { // put your setup code here, to run once: Serial.begin(115200); @@ -68,7 +73,6 @@ void setup() { // wm.erase(); wm.setClass("invert"); - wm.setAPCallback(configModeCallback); //sets timeout until configuration portal gets turned off //useful to make it all retry or go to sleep @@ -77,16 +81,6 @@ void setup() { // wm.setConnectTimeout(5); // wm.setShowStaticFields(true); - // uint8_t menu[] = {wm.MENU_WIFI,wm.MENU_INFO,wm.MENU_PARAM,wm.MENU_CLOSE}; - // wm.setMenu(menu); - - // std::vector menu = {wm.MENU_WIFI,wm.MENU_INFO,wm.MENU_PARAM,wm.MENU_CLOSE,wm.MENU_SEP,wm.MENU_ERASE,wm.MENU_EXIT}; - // wm.setMenu(menu); - -// std::vector menu = {wm.MENU_WIFI,wm.MENU_INFO,wm.MENU_PARAM,wm.MENU_CLOSE,wm.MENU_SEP,wm.MENU_ERASE,wm.MENU_EXIT}; - // wm.setMenu(menu); - - WiFiManagerParameter custom_html("

This Is Custom HTML

"); WiFiManagerParameter custom_mqtt_server("server", "mqtt server", "", 40); WiFiManagerParameter custom_mqtt_port("port", "mqtt port", "", 6); @@ -95,7 +89,9 @@ void setup() { WiFiManagerParameter custom_ipaddress("input_ip", "input IP", "", 15,"pattern='\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}'"); // callbacks - wm.setSaveConfigCallback(saveCallback); + wm.setAPCallback(configModeCallback); + wm.setSaveConfigCallback(saveWifiCallback); + wm.setSaveParamsCallback(saveParamCallback); //add all your parameters here wm.addParameter(&custom_html); @@ -108,21 +104,11 @@ void setup() { custom_html.setValue("test",4); custom_token.setValue("test",4); - // MENU_WIFI = 0, - // MENU_WIFINOSCAN = 1, - // MENU_INFO = 2, - // MENU_PARAM = 3, - // MENU_CLOSE = 4, - // MENU_RESTART = 5, - // MENU_EXIT = 6, - // MENU_ERASE = 7, - // MENU_SEP = 8 - // const char* menu[] = {"wifi","wifinoscan","info","param","close","sep","erase","restart","exit"}; // wm.setMenu(menu,9); std::vector menu = {"wifi","wifinoscan","info","param","close","sep","erase","restart","exit"}; - wm.setMenu(menu); + // wm.setMenu(menu); // set static sta ip // wm.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); @@ -152,10 +138,10 @@ void setup() { if(!wm.autoConnect("AutoConnectAP")) { Serial.println("failed to connect and hit timeout"); } - else { + else if(TEST_CP) { // start configportal always - // wm.setConfigPortalTimeout(60); - // wm.startConfigPortal(); + wm.setConfigPortalTimeout(60); + wm.startConfigPortal(); } pinMode(TRIGGER_PIN, INPUT);