391 lines
13 KiB
C++
391 lines
13 KiB
C++
//
|
|
//
|
|
#include "CustomHandlers.h"
|
|
#include "WiFiStateHandler.h"
|
|
|
|
// General Purpose helper stuff
|
|
|
|
// Handlers
|
|
|
|
void HandleNotFound() {
|
|
bool found = false;
|
|
const DirEntry *de = Directory;
|
|
Serial.printf("No Custom Handler for '%s'\n", server.uri().c_str()+1);
|
|
while (de->Filename) {
|
|
Serial.printf("test for '%s' with '%s'\n", de->Filename, server.uri().c_str()+1);
|
|
#if 0
|
|
if (0 == strcmp(server.uri().c_str()+1, de->Filename)) {
|
|
Serial.printf("send '%s' (%i B) as '%s'\n", de->Filename, de->Filesize, de->Filetype);
|
|
server.send_P(200, de->Filetype, (const char *)de->Filedata, de->Filesize);
|
|
found = true;
|
|
break;
|
|
}
|
|
#endif
|
|
de++;
|
|
}
|
|
if (!found) {
|
|
Serial.printf("!found '%s' - redirect to home\n", server.uri().c_str());
|
|
server.sendHeader("Location", "/", true);
|
|
server.send(302, "text/plain", "Not supported. Heading for home.");
|
|
}
|
|
}
|
|
|
|
void HandleMyIP_js() {
|
|
server.sendHeader("Access-Control-Allow-Origin", String("*"), true);
|
|
String message = "var mySite = 'http://";
|
|
message += String(WiFi.localIP()[0]);
|
|
message += "." + String(WiFi.localIP()[1]);
|
|
message += "." + String(WiFi.localIP()[2]);
|
|
message += "." + String(WiFi.localIP()[3]);
|
|
message += "';\n";
|
|
server.send(200, "text/javascript", message);
|
|
}
|
|
|
|
|
|
void HandleRootPage() {
|
|
if (server.hasArg("SW")) {
|
|
String newState = server.arg("SW");
|
|
if (newState == "1") {
|
|
// @todo SetCircuit(CMD_On);
|
|
Serial.printf("SW 1\n");
|
|
} else if (newState == "0") {
|
|
// @todo SetCircuit(CMD_Off);
|
|
Serial.printf("SW 0\n");
|
|
} else if (newState == "2") {
|
|
// @todo SetCircuit(CMD_Toggle);
|
|
Serial.printf("SW 2\n");
|
|
} else {
|
|
Serial.printf("SW %s ???\n", newState.c_str());
|
|
; // no action
|
|
}
|
|
}
|
|
// @todo String modeText = (isStationMode) ? "Station mode<br/>" : "Access Point mode<br/>";
|
|
// @todo String status = GetCircuitStatus() ? "On<br/>" : "Off<br/>";
|
|
String myIP = String(WiFi.localIP()[0]);
|
|
myIP += "." + String(WiFi.localIP()[1]);
|
|
myIP += "." + String(WiFi.localIP()[2]);
|
|
myIP += "." + String(WiFi.localIP()[3]);
|
|
server.send_P(200, "text/html", (const char *)index_htm);
|
|
}
|
|
|
|
static String EncType_str(uint8_t encType) {
|
|
switch (encType) {
|
|
case ENC_TYPE_NONE:
|
|
return "open";
|
|
break;
|
|
case ENC_TYPE_WEP:
|
|
return "wep";
|
|
break;
|
|
case ENC_TYPE_TKIP:
|
|
return "wpa psk";
|
|
break;
|
|
case ENC_TYPE_CCMP:
|
|
return "wpa2 psk";
|
|
break;
|
|
case ENC_TYPE_AUTO:
|
|
return "wpa wpa2 psk";
|
|
break;
|
|
default:
|
|
return "unknown";
|
|
break;
|
|
}
|
|
}
|
|
|
|
void HandleAPScan() {
|
|
// WiFi.scanNetworks will return the number of networks found
|
|
Serial.println("Scan ...");
|
|
int n = WiFi.scanNetworks(false, true); // blocking call and show hidden.
|
|
Serial.println("scan done.");
|
|
if (n == 0) {
|
|
Serial.println("no networks found");
|
|
} else {
|
|
Serial.print(n);
|
|
Serial.println(" networks found");
|
|
server.sendContent_P("HTTP/1.1 200 OK\r\n");
|
|
server.sendContent_P("Content-Type: text/html\r\n");
|
|
server.sendContent_P("\r\n");
|
|
server.sendContent_P(
|
|
"<!DOCTYPE html>\n"
|
|
"<html>\n"
|
|
"<head><title>Grow Controller - Scan</title></head>\n"
|
|
"<body>\n"
|
|
"<h1>Grow Controller - Scan</h1>"
|
|
);
|
|
|
|
server.sendContent_P(
|
|
" <form action=\"/config\">\n"
|
|
" <blockquote>\n"
|
|
" <table width='800' border='0'>\n"
|
|
" <tr bgcolor='#E0E0E0'><td colspan='2'>Net</td><td>RSSI</td><td>SSID</td><td>BSSID</td><td>Encryption</td><td>Channel</td><td>Hidden</td></tr>\n"
|
|
);
|
|
|
|
for (int i = 0; i < n; ++i) {
|
|
// Select, Network #, RSSI, SSID, BSSID, Channel, Hidden
|
|
String bgcolor = (i & 1) ? "#E0E0E0" : "#FFFFFF";
|
|
String record =
|
|
" <tr bgcolor='" + bgcolor + "'><td><input type='radio' name='ssid' value='" + WiFi.SSID(i) + "'></td>\n"
|
|
+ " <td>" + (i + 1) + "</td>\n"
|
|
+ " <td>" + WiFi.RSSI(i) + "</td>\n"
|
|
+ " <td>" + WiFi.SSID(i) + "<br/>"
|
|
+ " <img src='/green1x1.png' width='" + String(5 * (100 + WiFi.RSSI(i))) + "' height='3'></td>\n"
|
|
+ " <td>" + WiFi.BSSIDstr(i) + "</td>\n";
|
|
|
|
record += " <td>" + EncType_str(WiFi.encryptionType(i)) + "</td>\n";
|
|
record += " <td>" + String(WiFi.channel(i));
|
|
record += "</td>\n";
|
|
record += WiFi.isHidden(i)
|
|
? " <td>Yes</td>\n"
|
|
: " <td>No</td>\n";
|
|
record += " </tr>\n";
|
|
server.sendContent(record);
|
|
//
|
|
Serial.print(i + 1);
|
|
Serial.print(": ");
|
|
Serial.print(WiFi.SSID(i));
|
|
Serial.print(" (");
|
|
Serial.print(WiFi.RSSI(i));
|
|
Serial.print(")");
|
|
Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
|
|
}
|
|
server.sendContent_P(
|
|
" <tr><td> </td>\n"
|
|
" <td colspan='7'>\n"
|
|
" <input type=\"submit\" value=\"Select\" />\n"
|
|
" <input type=\"reset\"/>\n"
|
|
" </td>\n"
|
|
" </tr>\n"
|
|
" </table>\n"
|
|
" </blockquote>\n"
|
|
" </form>\n"
|
|
"NAV: "
|
|
" <a href='/'>Home</a> | "
|
|
" <a href='/config'>Config</a> | "
|
|
" <a href='/scan'>Scan</a> | "
|
|
" <a href='/rssi'>RSSI</a> | "
|
|
" <a href='/curr'>Current</a> | "
|
|
" <a href='/config?ssid=reset&pass=reset' onclick=\"return confirm('Are you sure?')\">Factory Reset</a> | "
|
|
" <a href='/about'>About</a>\n"
|
|
" <br/>\n"
|
|
"</body>\n"
|
|
"</html>\n"
|
|
);
|
|
}
|
|
}
|
|
|
|
void HandleAPConfigPage() {
|
|
String name = wifiConfig.getName();
|
|
String ssid = wifiConfig.getSSID();
|
|
String pass = wifiConfig.getPassword();
|
|
String url = wifiConfig.getURL();
|
|
String ntp = wifiConfig.getNTPServerName();
|
|
|
|
if (server.hasArg("ssid") && server.hasArg("pass")) {
|
|
String _ssid = server.hasArg("_ssid") ? server.arg("_ssid") : "";
|
|
String _pass = server.hasArg("_pass") ? server.arg("_pass") : "";
|
|
name = server.arg("name");
|
|
ssid = server.arg("ssid");
|
|
pass = server.arg("pass");
|
|
url = server.hasArg("url") ? server.arg("url") : "";
|
|
ntp = server.hasArg("ntp") ? server.arg("ntp") : "";
|
|
if (ssid == "reset" && pass == "reset") {
|
|
FactoryReset(true);
|
|
}
|
|
wifiConfig.setName(name);
|
|
wifiConfig.setSSID(ssid);
|
|
wifiConfig.setPassword(pass);
|
|
wifiConfig.setURL(url);
|
|
wifiConfig.setNTPServerName(ntp);
|
|
wifiConfig.save();
|
|
Serial.println("Settings saved.");
|
|
if (ssid != _ssid || pass != _pass) {
|
|
// They changed stuff that requires a restart.
|
|
server.send(200, "text/html", "Configuration Saved! Restarting in 3 sec...");
|
|
Serial.printf("Config saved. Restarting in 3 sec . . .");
|
|
delay(3000);
|
|
ESP.restart();
|
|
return;
|
|
}
|
|
}
|
|
|
|
String modeText = (WiFiStateGet() == WFC_JoinedAP) ? "Station mode<br/>" : "Access Point mode<br/>";
|
|
if (server.hasArg("ssid") && !server.hasArg("pass")) {
|
|
ssid = server.arg("ssid");
|
|
pass = "";
|
|
Serial.println("ssid: " + ssid + ", pass: " + pass);
|
|
}
|
|
if (server.hasArg("url"))
|
|
url = server.arg("url");
|
|
//if (server.hasArg("ntp"))
|
|
// ntp = server.arg("ntp");
|
|
server.send(200, "text/html",
|
|
"<!DOCTYPE html>\n"
|
|
"<html>\n"
|
|
"<head><title>Grow Controller - Config</title></head>\n"
|
|
"<body>\n"
|
|
"<h1>Grow Controller - Configuration</h1>"
|
|
" <form action=\"\">\n"
|
|
" <blockquote>\n"
|
|
" <table border='0'>\n"
|
|
" <tr>\n"
|
|
" <td>Node Name</td>\n"
|
|
" <td><input type=\"text\" size=\"32\" name=\"name\" value=\"" + name + "\" /></td>\n"
|
|
" </tr>\n"
|
|
" <tr>\n"
|
|
" <td>SSID</td>\n"
|
|
" <td><input type=\"text\" size=\"32\" name=\"ssid\" value=\"" + ssid + "\" /> **\n"
|
|
" <input type=\"hidden\" name=\"_ssid\" value=\"" + ssid + "\" /></td>\n"
|
|
" </tr>\n"
|
|
" <tr nowrap='nowrap'>\n"
|
|
" <td>Password</td>\n"
|
|
" <td nowrap='nowrap'><input type=\"password\" size=\"64\" name=\"pass\" value=\"" + pass + "\" /> **\n"
|
|
" <input type=\"hidden\" name=\"_pass\" value=\"" + pass + "\" /></td>\n"
|
|
" </tr>\n"
|
|
" <tr>\n"
|
|
" <td>Update URL</td>\n"
|
|
" <td><input type=\"text\" size=\"64\" name=\"url\" value=\"" + url + "\" /></td>\n"
|
|
" </tr>\n"
|
|
// " <tr>\n"
|
|
// " <td>NTP Server</td>\n"
|
|
// " <td><input type=\"text\" size=\"64\" name=\"ntp\" value=\"" + ntp + "\" /></td>\n"
|
|
// " </tr>\n"
|
|
" <tr>\n"
|
|
" <td> </td>\n"
|
|
" <td>\n"
|
|
" <input type=\"submit\" value=\"Save\" />\n"
|
|
" <input type=\"reset\"/> ** Changes to these will trigger a module restart.\n"
|
|
" </td>\n"
|
|
" </tr>\n"
|
|
" <tr>\n"
|
|
" <td colspan='2'><hr/></td>\n"
|
|
" </tr>\n"
|
|
" <tr>\n"
|
|
" <td> </td>\n"
|
|
" <td><a href='/swupdatecheck'>Check for SW update (module will restart if updated)</a></td/>\n"
|
|
" </tr>\n"
|
|
" </table>\n"
|
|
" </blockquote>\n"
|
|
" </form>\n"
|
|
"NAV: "
|
|
" <a href='/'>Home</a> | "
|
|
" <a href='/config'>Config</a> | "
|
|
" <a href='/scan'>Scan</a> | "
|
|
" <a href='/rssi'>RSSI</a> | "
|
|
" <a href='/curr'>Current</a> | "
|
|
" <a href='/config?ssid=reset&pass=reset' onclick=\"return confirm('Are you sure?')\">Factory Reset</a> | "
|
|
" <a href='/about'>About</a>\n"
|
|
" <br/>\n"
|
|
"</body>\n"
|
|
"</html>\n"
|
|
);
|
|
}
|
|
|
|
|
|
// ###################################################################
|
|
//
|
|
// Old handlers, for 'static' information that needs to be send to
|
|
// build a web page.
|
|
//
|
|
// This is to be obsoleted by the new method at the top of this file.
|
|
//
|
|
// ###################################################################
|
|
|
|
|
|
void HandlePlantModel() {
|
|
Serial.printf("PlantModel\n");
|
|
server.send_P(200, "image/png", plantmodel_png, sizeof(plantmodel_png));
|
|
}
|
|
void HandlePlantModel_css() {
|
|
server.sendHeader("Access-Control-Allow-Origin", String("*"), true);
|
|
server.send_P(200, "text/css", plantmodel_css);
|
|
}
|
|
void HandleButton_css() {
|
|
server.sendHeader("Access-Control-Allow-Origin", String("*"), true);
|
|
server.send_P(200, "text/css", button_css);
|
|
}
|
|
void HandleIndex_js() {
|
|
server.sendHeader("Access-Control-Allow-Origin", String("*"), true);
|
|
server.send_P(200, "text/javascript", index_js);
|
|
}
|
|
void HandleAbout_htm() {
|
|
server.sendHeader("Access-Control-Allow-Origin", String("*"), true);
|
|
server.send_P(200, "text/html", about_htm);
|
|
}
|
|
void HandleAbout_js() {
|
|
server.sendHeader("Access-Control-Allow-Origin", String("*"), true);
|
|
server.send_P(200, "text/javascript", about_js);
|
|
}
|
|
void HandleFavIcon() {
|
|
Serial.printf("favicon.ico\n");
|
|
server.send_P(200, "image/x-icon", favicon_ico, sizeof(favicon_ico));
|
|
}
|
|
void HandleIcon() {
|
|
Serial.printf("icon.png\n");
|
|
server.send_P(200, "image/png", icon_png, sizeof(icon_png));
|
|
}
|
|
void HandleOpenDoor() {
|
|
Serial.printf("open.png\n");
|
|
server.send_P(200, "image/png", open_png, sizeof(open_png));
|
|
}
|
|
void HandleGreen1x1() {
|
|
Serial.printf("green1x1.png\n");
|
|
server.send_P(200, "image/png", green1x1_png, sizeof(green1x1_png));
|
|
}
|
|
void HandleHeaterOn() {
|
|
Serial.printf("soilheater_on.png\n");
|
|
server.send_P(200, "image/png", soilheater_on_png, sizeof(soilheater_on_png));
|
|
}
|
|
void HandleHeaterOff() {
|
|
Serial.printf("soilheater_off.png\n");
|
|
server.send_P(200, "image/png", soilheater_off_png, sizeof(soilheater_off_png));
|
|
}
|
|
void HandleThermometer() {
|
|
Serial.printf("thermometer.png\n");
|
|
server.send_P(200, "image/png", thermometer_png, sizeof(thermometer_png));
|
|
}
|
|
void HandleSoilMoisture() {
|
|
Serial.printf("soilmoisture.png\n");
|
|
server.send_P(200, "image/png", soilmoisture_png, sizeof(soilmoisture_png));
|
|
}
|
|
void HandlePointer() {
|
|
Serial.printf("pointer.png\n");
|
|
server.send_P(200, "image/png", pointer_png, sizeof(pointer_png));
|
|
}
|
|
void HandleWater() {
|
|
Serial.printf("water.png\n");
|
|
server.send_P(200, "image/png", water_png, sizeof(water_png));
|
|
}
|
|
void HandleRSSIPage() {
|
|
server.send_P(200, "text/html", rssi_htm);
|
|
}
|
|
void HandleRSSI_js() {
|
|
server.send_P(200, "text/javascript", rssi_js);
|
|
}
|
|
void HandleCurrPage() {
|
|
server.send_P(200, "text/html", curr_htm);
|
|
}
|
|
void HandleCurr_js() {
|
|
server.send_P(200, "text/javascript", curr_js);
|
|
}
|
|
void HandleNav_js() {
|
|
server.send_P(200, "text/javascript", nav_js);
|
|
}
|
|
void HandleSWUpdateCheck() {
|
|
updateCheck = true;
|
|
HandleAPConfigPage();
|
|
}
|
|
|
|
#if 0
|
|
void HandleCircuitOn() {
|
|
//SetCircuit(CMD_On);
|
|
HandleGetState(); // Reply with current state
|
|
}
|
|
void HandleCircuitOff() {
|
|
//SetCircuit(CMD_Off);
|
|
HandleGetState(); // Reply with current state
|
|
}
|
|
void HandleCircuitToggle() {
|
|
//SetCircuit(CMD_Toggle);
|
|
HandleGetState(); // Reply with current state
|
|
}
|
|
#endif
|