parent
521a00ce47
commit
c2593c2207
@ -1 +1 @@ |
|||||||
Subproject commit 1a699948bb07d789f827d831f3994fc1b2d962de |
Subproject commit e5944123376d0d0a4f8547cd27b3aa7bef166f2a |
@ -0,0 +1,110 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
#include <cgiwebsocket.h> |
||||||
|
#include <httpdespfs.h> |
||||||
|
|
||||||
|
#include "web.h" |
||||||
|
#include "screen.h" |
||||||
|
#include "uart_driver.h" |
||||||
|
|
||||||
|
#define URL_WS_UPDATE "/ws/update.cgi" |
||||||
|
|
||||||
|
/* Routes are defined at the bottom of the file */ |
||||||
|
|
||||||
|
/**
|
||||||
|
* Main page template substitution |
||||||
|
* |
||||||
|
* @param connData |
||||||
|
* @param token |
||||||
|
* @param arg |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
httpd_cgi_state ICACHE_FLASH_ATTR tplScreen(HttpdConnData *connData, char *token, void **arg) |
||||||
|
{ |
||||||
|
if (token == NULL) { |
||||||
|
// Release data object
|
||||||
|
screenSerializeToBuffer(NULL, 0, arg); |
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
||||||
|
const int bufsiz = 512; |
||||||
|
char buff[bufsiz]; |
||||||
|
|
||||||
|
if (streq(token, "screenData")) { |
||||||
|
httpd_cgi_state cont = screenSerializeToBuffer(buff, bufsiz, arg); |
||||||
|
httpdSend(connData, buff, -1); |
||||||
|
return cont; |
||||||
|
} |
||||||
|
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
||||||
|
// --- Sockets ---
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Broadcast screen state to sockets |
||||||
|
*/ |
||||||
|
void ICACHE_FLASH_ATTR screen_notifyChange() |
||||||
|
{ |
||||||
|
// TODO cooldown / buffering to reduce nr of such events
|
||||||
|
|
||||||
|
void *data = NULL; |
||||||
|
|
||||||
|
const int bufsiz = 512; |
||||||
|
char buff[bufsiz]; |
||||||
|
for (int i = 0; i < 20; i++) { |
||||||
|
httpd_cgi_state cont = screenSerializeToBuffer(buff, bufsiz, &data); |
||||||
|
int flg = 0; |
||||||
|
if (cont == HTTPD_CGI_MORE) flg |= WEBSOCK_FLAG_MORE; |
||||||
|
if (i > 0) flg |= WEBSOCK_FLAG_CONT; |
||||||
|
cgiWebsockBroadcast(URL_WS_UPDATE, buff, (int) strlen(buff), flg); |
||||||
|
if (cont == HTTPD_CGI_DONE) break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Socket received a message */ |
||||||
|
void ICACHE_FLASH_ATTR myWebsocketRecv(Websock *ws, char *data, int len, int flags) |
||||||
|
{ |
||||||
|
dbg("Sock RX str: %s, len %d", data, len); |
||||||
|
|
||||||
|
if (strstarts(data, "STR:")) { |
||||||
|
// pass string verbatim
|
||||||
|
UART_WriteString(UART0, data+4, UART_TIMEOUT_US); |
||||||
|
} |
||||||
|
else if (strstarts(data, "BTN:")) { |
||||||
|
// send button as low ASCII value 1-9
|
||||||
|
int btnNum = data[4] - '0'; |
||||||
|
if (btnNum > 0 && btnNum < 10) { |
||||||
|
UART_WriteChar(UART0, (unsigned char)btnNum, UART_TIMEOUT_US); |
||||||
|
} |
||||||
|
} |
||||||
|
else if (strstarts(data, "TAP:")) { |
||||||
|
// TODO
|
||||||
|
warn("TODO mouse input handling not implemented!"); |
||||||
|
} |
||||||
|
else { |
||||||
|
warn("Bad command."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Socket connected for updates */ |
||||||
|
void ICACHE_FLASH_ATTR myWebsocketConnect(Websock *ws) |
||||||
|
{ |
||||||
|
info("Socket connected to "URL_WS_UPDATE); |
||||||
|
ws->recvCb = myWebsocketRecv; |
||||||
|
} |
||||||
|
|
||||||
|
/** Routes */ |
||||||
|
HttpdBuiltInUrl builtInUrls[] = { //ICACHE_RODATA_ATTR
|
||||||
|
// redirect func for the captive portal
|
||||||
|
ROUTE_CGI_ARG("*", cgiRedirectApClientToHostname, "esp8266.nonet"), |
||||||
|
|
||||||
|
ROUTE_WS(URL_WS_UPDATE, myWebsocketConnect), |
||||||
|
|
||||||
|
// TODO add funcs for WiFi management (when web UI is added)
|
||||||
|
|
||||||
|
ROUTE_TPL_FILE("/", tplScreen, "term.tpl"), |
||||||
|
ROUTE_FILESYSTEM(), |
||||||
|
ROUTE_END(), |
||||||
|
}; |
@ -0,0 +1,12 @@ |
|||||||
|
#ifndef WEB_H |
||||||
|
#define WEB_H |
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
extern HttpdBuiltInUrl builtInUrls[]; |
||||||
|
|
||||||
|
/** Broadcast screen state to sockets */ |
||||||
|
void screen_notifyChange(); |
||||||
|
|
||||||
|
#endif //WEB_H
|
Loading…
Reference in new issue