diff --git a/WiFiManager.cpp b/WiFiManager.cpp index 9f529cf..00af662 100644 --- a/WiFiManager.cpp +++ b/WiFiManager.cpp @@ -76,19 +76,26 @@ const char* WiFiManagerParameter::getCustomHTML() { return _customHTML; } -void WiFiManager::addParameter(WiFiManagerParameter *p) { - if(_paramsCount + 1 > WIFI_MANAGER_MAX_PARAMS) - { - //Max parameters exceeded! - DEBUG_WM("WIFI_MANAGER_MAX_PARAMS exceeded, increase number (in WiFiManager.h) before adding more parameters!"); - DEBUG_WM("Skipping parameter with ID:"); - DEBUG_WM(p->getID()); - return; + +bool WiFiManager::addParameter(WiFiManagerParameter *p) { + if(_paramsCount + 1 > _max_params){ + // rezise the params array + _max_params += WIFI_MANAGER_MAX_PARAMS; + DEBUG_WM(F("Increasing _max_params to:")); + DEBUG_WM(_max_params); + WiFiManagerParameter** new_params = (WiFiManagerParameter**)realloc(_params, _max_params * sizeof(WiFiManagerParameter*)); + if (new_params != NULL) { + _params = new_params; + } else { + DEBUG_WM("ERROR: failed to realloc params, size not increased!"); + return false; + } } _params[_paramsCount] = p; _paramsCount++; DEBUG_WM("Adding parameter"); DEBUG_WM(p->getID()); + return true; } // constructors @@ -100,12 +107,24 @@ WiFiManager::WiFiManager():_debugPort(Serial) { if(_debug) debugPlatformInfo(); _usermode = WiFi.getMode(); WiFi.persistent(false); // disable persistent so scannetworks and mode switching do not cause overwrites + + // parameters + _max_params = WIFI_MANAGER_MAX_PARAMS; + _params = (WiFiManagerParameter**)malloc(_max_params * sizeof(WiFiManagerParameter*)); + } // destructor WiFiManager::~WiFiManager() { if(_userpersistent) WiFi.persistent(true); // reenable persistent, there is no getter we rely on _userpersistent WiFi.mode(_usermode); + + // parameters + if (_params != NULL){ + DEBUG_WM(F("freeing allocated params!")); + free(_params); + } + DEBUG_WM(F("unloading")); } diff --git a/WiFiManager.h b/WiFiManager.h index 72a7b47..15ae705 100644 --- a/WiFiManager.h +++ b/WiFiManager.h @@ -144,8 +144,8 @@ class WiFiManager void setAPCallback( void (*func)(WiFiManager*) ); //called when settings have been changed and connection was successful void setSaveConfigCallback( void (*func)(void) ); - //adds a custom parameter - void addParameter(WiFiManagerParameter *p); + //adds a custom parameter, returns false on failure + bool addParameter(WiFiManagerParameter *p); //if this is set, it will exit after config, even if connection is unsuccessful. void setBreakAfterConfig(boolean shouldBreak); //if this is set, portal will be blocking and wait until save or exit, is false user must manually process to handle config portal @@ -271,7 +271,8 @@ class WiFiManager void (*_savecallback)(void) = NULL; Stream& _debugPort; // debug output stream ref - WiFiManagerParameter* _params[WIFI_MANAGER_MAX_PARAMS]; + int _max_params; + WiFiManagerParameter** _params; template void DEBUG_WM(Generic text);