In the meantime, you can communicate between the webpage and the photon using HTTP requests, handled by the “myPage” function, so long as SYSTEM_THREAD(ENABLED)
is called. Here’s my code to control the color of an Internet Button using a simple SoftAP webpage.
#pragma SPARK_NO_PREPROCESSOR
#include "Particle.h"
#include "softap_http.h"
#include "InternetButton.h"
SYSTEM_THREAD(ENABLED);
int r, g, b = 0;
struct Page
{
const char* url;
const char* mime_type;
const char* data;
};
const char index_html[] = "<html><div align=\"center\"><form action=\"color\" method=\"get\"><input id=\"background-color\" name=\"color\" type=\"color\"/><input type=\"submit\" value=\"Go!\"/></form></div></html>";
Page myPages[] = {
{ "/index.html", "text/html", index_html },
{ nullptr }
};
void myPage(const char* url, ResponseCallback* cb, void* cbArg, Reader* body, Writer* result, void* reserved)
{
String urlString = String(url);
Serial.printlnf("handling page %s", url);
char* data = body->fetch_as_string();
Serial.println(String(data));
free(data);
if (strcmp(url,"/index")==0) {
Serial.println("sending redirect");
Header h("Location: /index.html\r\n");
cb(cbArg, 0, 301, "text/plain", &h);
return;
}
if (urlString.indexOf("/color") != -1) {
r = (int)strtol(urlString.substring(14, 16).c_str(), nullptr, 16);
g = (int)strtol(urlString.substring(16, 18).c_str(), nullptr, 16);
b = (int)strtol(urlString.substring(18).c_str(), nullptr, 16);
Serial.println(r);
Serial.println(g);
Serial.println(b);
}
int8_t idx = 0;
for (;;idx++) {
Page& p = myPages[idx];
if (!p.url) {
idx = -1;
break;
}
else if (strcmp(url, p.url)==0) {
break;
}
}
if (idx==-1) {
Header h("Location: /index.html\r\n");
cb(cbArg, 0, 301, "text/plain", &h);
}
else {
cb(cbArg, 0, 200, myPages[idx].mime_type, nullptr);
result->write(myPages[idx].data);
}
}
unsigned long t = 0;
InternetButton button = InternetButton();
STARTUP(softap_set_application_page_handler(myPage, nullptr));
void setup() {
WiFi.listen();
button.begin();
}
void loop() {
if (millis()-t >= 200) {
button.allLedsOn(r, g, b);
t = millis();
}
}