Page 1 of 1

StoreProhibited Exception on variable access from class

Posted: Fri Jul 13, 2018 5:48 am
by terratrembel
Hi
I'm trying to update via a Webinterface the SSID, Password, Port, etc. on my ESP32.
For that I've written a class, to handle everything which depends on WiFi. When I try to update a variable, I get the error:

Code: Select all

Guru Meditation Error: Core  1 panic'ed (StoreProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x4000169e  PS      : 0x00060330  A0      : 0x800da3a1  A1      : 0x3ffbf650
A2      : 0x00000021  A3      : 0x3ffaf219  A4      : 0x0000000b  A5      : 0x0000ff00

A6      : 0x00ff0000  A7      : 0xff000000  A8      : 0x00000064  A9      : 0x3ffbf620
A10     : 0x00000021  A11     : 0x000000ff  A12     : 0x000000ff  A13     : 0x0000ff00
A14     : 0x00ff0000  A15     : 0xff000000  SAR     : 0x0000000a  EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000021  LBEG    : 0x40001699  LEND    : 0x400016aa  LCOUNT  : 0xffffffff

Backtrace: 0x4000169e:0x3ffbf650 0x400da39e:0x3ffbf660 0x400d9699:0x3ffbf680 0x400d98da:0x3ffbf6b0 0x400d1f8b:0x3ffbf6d0 0x400d56f1:0x3ffbf7
10 0x400d576d:0x3ffbf760 0x4012d681:0x3ffbf780 0x4012d8ad:0x3ffbf7d0

Rebooting...

My Code is the following:

Credentials.h:

Code: Select all

#ifndef __CREDENTIALS_H__
#define __CREDENTIALS_H__
#include <Arduino.h>

struct Credentials{
        char ssid[33];
        char password[65];
        char name[33];
        int port;
};

#endif
WiFiConfig.h:

Code: Select all

#ifndef __CREDENTIALSSTRUCT_H__
#define __CREDENTIALSSTRUCT_H__

#include "Arduino.h"
#include "WiFi.h"
#include "ESPmDNS.h"
#include "ESPAsyncWebServer.h"

#include "Credentials.h"

class WiFiConfig {
public:
  WiFiConfig(Credentials &, AsyncWebServer &);
  bool changeSSID(AsyncWebServerRequest *request);
  bool setCONFIGMode();

private:
  struct Credentials* _configs;
  AsyncWebServer* _webServer;
};

#endif
WiFiConfig.cpp:

Code: Select all

#include "WiFiConfig.h"

WiFiConfig::WiFiConfig(Credentials &configs, AsyncWebServer &webServer) : _configs(&configs), _webServer(&webServer)
{}

bool WiFiConfig::changeSSID(AsyncWebServerRequest *request)
{
       AsyncWebParameter* param = request->getParam("ssid_input",true);
       param->value().toCharArray(_configs->ssid,sizeof(_configs->ssid));	//This line causes the failure
       Serial.println(_configs->ssid);
       return true;
}

bool WiFiConfig::setCONFIGMode()
{
       IPAddress apIP(192, 168, 1, 1);
       IPAddress &gateway = apIP;
       IPAddress subnet(255,255,255,0);
       WiFi.mode(WIFI_AP);
       WiFi.softAPConfig(apIP, gateway, subnet);
       WiFi.softAP(_configs->ssid, _configs->password);
       
       WiFi.setHostname(_configs->name);
       if (!MDNS.begin(_configs->name)) {
          Serial.println("Error setting up MDNS responder!");
       }
       MDNS.addService("http", "tcp", _configs->port);
       
       _webServer->on("/", HTTP_GET, [](AsyncWebServerRequest *request){
          request->redirect("/config.html");
       });
        
       _webServer->on("/changeSSID", HTTP_POST, [this](AsyncWebServerRequest *request)
       {
          this->changeSSID(request);
       });
        
       return true;
}


main.cpp:

Code: Select all

#include "Arduino.h"

#include "Credentials.h"
#include "WiFiConfig.h"

Credentials configs = {"SamplePWD", "ExamplePWD", "ExampleMDNS", 80}; //last one is the port
AsyncWebServer webServer(configs.port);

void setup(){
       Serial.begin(115200);
       WiFiConfig wifi(configs, webServer);
       wifi.setCONFIGMode();
       webServer.begin();
}

void loop() {}
This is a minimal version of my source, since it's where the Exception is thrown.
The problem is caused on accessing "_configs->ssid" from a "_webServer->on" function.

Has somebody had a similar error, or knows what I'm doing wrong?

Best,
Terratrembel