const int gpioWebConf[] = CONFIG_WEB_CONTROLLED_GPIO;
const int pwmWebConf[] = CONFIG_CONTROLLED_PWM;
String gpioControlHTML = "";
String pwmControlHTML = "";
void WebHandleRoot() {
server.send(200, "text/html",
"
"
"You are connected to " + String(hostName) + "
"
"" + gpioControlHTML + pwmControlHTML + ""
);
}
void WebSendError(const char *error) {
server.send(500, "text/plain", error);
}
void WebBuildSSIDList(String &datalist){
int n = WiFi.scanNetworks();
datalist = "";
}
void WebHandleSetup() {
uint8_t mode;
char *confSsid = "";
char *confPassword = "";
char *confHost = "";
char *mqttServer = "";
char *mqttUser = "";
char *mqttPasswd = "";
int mqttPort = 1883;
int ip_config = 0;
uint32_t ip = 0;
uint32_t gw = 0;
uint32_t mask = 0;
uint32_t dns = 0;
uint32_t dns2 = 0;
String ssidlist;
WebBuildSSIDList(ssidlist);
EepromReadConfig(mode, &confSsid, &confPassword, &confHost, &mqttServer, &mqttUser, &mqttPasswd, mqttPort, ip_config, ip, gw, mask, dns, dns2);
server.send(200, "text/html", "");
}
void WebHandleGpio() {
if (!server.hasArg("gpio") || !server.hasArg("value")) {
server.send(500, "text/plain", "Bad arguments\r\n");
return;
}
MqttChangeGpioValue(server.arg("gpio").toInt(), server.arg("value").toInt());
server.send(200, "text/html", "GPIO" + server.arg("gpio") + " changed to " + server.arg("value") + "
");
}
void WebHandlePWM() {
if (!server.hasArg("gpio") || !server.hasArg("value")) {
server.send(500, "text/plain", "Bad arguments\r\n");
return;
}
MqttChangePWMValue(server.arg("gpio").toInt(), server.arg("value").toInt());
server.send(200, "text/html", "PWM" + server.arg("gpio") + " changed to " + server.arg("value") + "
");
}
boolean WebSetIp(IPAddress &addr, const char *id, const char *error) {
if (server.arg(id) != "" && !addr.fromString(server.arg(id).c_str())) {
WebSendError(error);
return false;
}
return true;
}
void WebHandleSave() {
IPAddress ip;
IPAddress gw;
IPAddress mask;
IPAddress dns;
IPAddress dns2;
if (!server.hasArg("ssid") || !server.hasArg("password") || !server.hasArg("host")
|| !server.hasArg("mqttServer") || !server.hasArg("mqttUser") || !server.hasArg("mqttPasswd")
|| !server.hasArg("mqttPort") || !server.hasArg("ip_config") || !server.hasArg("ip")
|| !server.hasArg("gw") || !server.hasArg("mask") || !server.hasArg("dns")
|| !server.hasArg("dns2")) {
server.send(500, "text/plain", "Bad arguments\r\n");
return;
}
//Check Ip configuration
if (server.arg("ip_config").toInt() == 1) {
if (!WebSetIp(ip, "ip", "Incorrect IP") || !WebSetIp(gw, "gw", "Incorrect Gateway") || !WebSetIp(mask, "mask", "Incorrect NetMask") ||
!WebSetIp(dns, "dns", "Incorrect DNS") || !WebSetIp(dns2, "dns2", "Incorrect DNS2")) {
return;
}
}
if (EepromSaveConfig(BOOTMODE_NORMAL, server.arg("ssid"), server.arg("password"),
server.arg("host"), server.arg("mqttServer"), server.arg("mqttUser"),
server.arg("mqttPasswd"), server.arg("mqttPort").toInt(),
server.arg("ip_config").toInt(), static_cast(ip), static_cast(gw),
static_cast(mask), static_cast(dns), static_cast(dns2)) < 0) {
WebSendError("Cannot Save Credentials (Too long ?Contains \";\"?)\r\n");
return;
}
if(WiFi.softAPIP() != IPAddress((uint32_t)0)){
//In STA mode, we can test the AP connection
WiFi.begin(server.arg("ssid").c_str(), server.arg("password").c_str());
server.send(200, "text/html", "Configuration Saved
"
"Check Wifi Configuration
");
}else{
server.send(200, "text/html", "Configuration Saved
"
"Reboot
");
}
}
void WebHandleOTA() {
SKETCH_DEBUG_PRINTLN("Boot mode Set to OTA");
EepromSaveBootMode(BOOTMODE_OTA);
server.send(200, "text/html", "OTA Mode set
"
"You can reboot now
"
"Reboot
");
}
void WebHandleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void WebHandleReboot() {
SKETCH_DEBUG_PRINTLN("HTTP request to reboot");
server.send(200, "text/html", "Device Reboot
");
ESP.restart();
}
String statusToString(wl_status_t status) {
switch(status){
case WL_IDLE_STATUS: return String("Idle");
case WL_NO_SSID_AVAIL: return String("Wifi not found");
case WL_CONNECTED: return String("Connected");
case WL_CONNECT_FAILED: return String("Connection failed (Wrong password ?)");
case WL_CONNECTION_LOST: return String("Connection Lost");
case WL_DISCONNECTED: return String("Connecting");
default: return String(status);
}
}
void WebHandleWifiStatus() {
String message;
if(WiFi.status() == WL_DISCONNECTED)
message += "";
message += "Wifi Connection Status
";
message += "Connection to ";
message += WiFi.SSID();
message += ":
";
message += statusToString(WiFi.status());
message += "
";
if(mode == BOOTMODE_SETUP && WiFi.status() == WL_CONNECTED){
message += "Wifi correctly setup!, you can reboot now
";
message += "Reboot
";
}
if(WiFi.status() == WL_CONNECT_FAILED || WiFi.status() == WL_NO_SSID_AVAIL){
message += "Try to reconfigure you WiFi details
";
message += "Enter Setup
";
}
server.send(200, "text/html", message);
}
void WebBuildGpioControl(){
if (NB_ELEMENTS(gpioWebConf) > 0){
gpioControlHTML += "";
}
}
void WebBuildPwmControl(){
if (NB_ELEMENTS(pwmWebConf) > 0){
pwmControlHTML += "";
}
}
void WebSetupServer(int ) {
WebBuildGpioControl();
WebBuildPwmControl();
server.on("/", WebHandleRoot);
server.on("/setup", WebHandleSetup);
server.on("/save", WebHandleSave);
server.on("/gpio", WebHandleGpio);
server.on("/pwm", WebHandlePWM);
server.on("/otamode", WebHandleOTA);
server.on("/reboot", WebHandleReboot);
server.on("/wifiStatus", WebHandleWifiStatus);
server.onNotFound(WebHandleNotFound);
server.begin();
SKETCH_DEBUG_PRINTLN("HTTP server started");
}