Created
May 4, 2020 08:50
-
-
Save maditnerd/0bf91523dfd903e5f2179da13badfb50 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// In a webbrowser go to http://sam.local/say/{message} to make it speak | |
// ex: http://sam.local/say/hello world | |
#include <Arduino.h> | |
#include <ESP8266SAM.h> | |
#include "AudioOutputI2SNoDAC.h" | |
#include <ESP8266mDNS.h> | |
#include <ESP8266NetBIOS.h> | |
#include <ESP8266SSDP.h> //Library for SSDP (Show ESP in Network on Windows) | |
#include <ESP8266WebServer.h> //Library for WebServer | |
#include <WiFiManager.h> | |
#include <uri/UriBraces.h> | |
AudioOutputI2SNoDAC *out = NULL; | |
ESP8266WebServer server(80); //Web Server on port 80 | |
WiFiManager wifiManager; | |
const char* NAME = "SAM"; | |
void setup() | |
{ | |
Serial.begin(115200); | |
out = new AudioOutputI2SNoDAC(); | |
out->begin(); | |
wifiManager.autoConnect(NAME); | |
MDNS.begin(NAME); | |
MDNS.addService("http", "tcp", 80); | |
NBNS.begin(NAME); | |
server.on(UriBraces("/say/{}"), []() { | |
String message_encoded = server.pathArg(0); | |
String message_decoded = urldecode(message_encoded); | |
const char* message = message_decoded.c_str(); | |
Serial.println(message_encoded); | |
Serial.println(message_decoded); | |
Serial.println(message); | |
ESP8266SAM *sam = new ESP8266SAM; | |
sam->Say(out, message); | |
delete sam; | |
server.send(200, "text/plain", "OK"); | |
}); | |
server.on("/description.xml", HTTP_GET, []() { | |
SSDP.schema(server.client()); | |
}); | |
server.begin(); | |
ssdp(); | |
} | |
void ssdp() { | |
//Simple Service Discovery Protocol : Display ESP in Windows Network Tab | |
SSDP.setSchemaURL("description.xml"); | |
SSDP.setHTTPPort(80); | |
SSDP.setName(NAME); | |
SSDP.setDeviceType("upnp: rootdevice"); | |
SSDP.setSerialNumber("000000000001"); | |
SSDP.setURL(" / "); | |
SSDP.setModelName("ESP8266SAM"); | |
SSDP.setModelNumber("0000000000001"); | |
SSDP.setModelURL("https://github.com/usini/remoteSAM"); | |
SSDP.setManufacturer("Usini"); | |
SSDP.setManufacturerURL("http://usini.eu"); | |
SSDP.begin(); | |
} | |
void loop() { | |
server.handleClient(); | |
} | |
char* string2char(String command) { | |
if (command.length() != 0) { | |
char *p = const_cast<char*>(command.c_str()); | |
return p; | |
} else { | |
return ""; | |
} | |
} | |
unsigned char h2int(char c) { | |
if (c >= '0' && c <= '9') { | |
return ((unsigned char)c - '0'); | |
} | |
if (c >= 'a' && c <= 'f') { | |
return ((unsigned char)c - 'a' + 10); | |
} | |
if (c >= 'A' && c <= 'F') { | |
return ((unsigned char)c - 'A' + 10); | |
} | |
return (0); | |
} | |
String urldecode(String str) | |
{ | |
String encodedString = ""; | |
char c; | |
char code0; | |
char code1; | |
for (int i = 0; i < str.length(); i++) { | |
c = str.charAt(i); | |
if (c == '+') { | |
encodedString += ' '; | |
} else if (c == '%') { | |
i++; | |
code0 = str.charAt(i); | |
i++; | |
code1 = str.charAt(i); | |
c = (h2int(code0) << 4) | h2int(code1); | |
encodedString += c; | |
} else { | |
encodedString += c; | |
} | |
yield(); | |
} | |
return encodedString; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment