mirror of
https://gitlab.com/wirelos/sprocket-lib.git
synced 2025-12-15 13:08:21 +01:00
move web plugins to sprocket-plugin-web repo, rename utils
This commit is contained in:
@@ -22,10 +22,7 @@ lib_deps =
|
|||||||
TaskScheduler
|
TaskScheduler
|
||||||
SPIFFS
|
SPIFFS
|
||||||
ESP8266mDNS
|
ESP8266mDNS
|
||||||
ArduinoOTA
|
|
||||||
painlessMesh
|
painlessMesh
|
||||||
ESPAsyncTCP
|
|
||||||
ESP Async WebServer
|
|
||||||
|
|
||||||
;[env:build]
|
;[env:build]
|
||||||
;src_filter = +<*> -<examples/>
|
;src_filter = +<*> -<examples/>
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
|
|
||||||
#ifndef __WIFI_APP__
|
|
||||||
#define __WIFI_APP__
|
|
||||||
|
|
||||||
#include <TaskScheduler.h>
|
|
||||||
#include <Sprocket.h>
|
|
||||||
#include <plugins/WebServerConfig.h>
|
|
||||||
#include <plugins/WebServerPlugin.cpp>
|
|
||||||
#include <plugins/WebConfigPlugin.cpp>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace std::placeholders;
|
|
||||||
|
|
||||||
class WiFiApp : public Sprocket {
|
|
||||||
public:
|
|
||||||
AsyncWebServer* server;
|
|
||||||
WiFiApp(SprocketConfig cfg, WebServerConfig webCfg) : Sprocket(cfg) {
|
|
||||||
server = new AsyncWebServer(webCfg.port);
|
|
||||||
addPlugin(new WebServerPlugin(webCfg, server));
|
|
||||||
addPlugin(new WebConfigPlugin(server));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "WiFiNet.h"
|
#include "WiFiNet.h"
|
||||||
#include "WiFiApp.h"
|
#include "Sprocket.h"
|
||||||
|
|
||||||
WiFiNet wifi(
|
WiFiNet wifi(
|
||||||
SPROCKET_MODE,
|
SPROCKET_MODE,
|
||||||
@@ -10,9 +10,9 @@ WiFiNet wifi(
|
|||||||
AP_PASSWORD,
|
AP_PASSWORD,
|
||||||
HOSTNAME,
|
HOSTNAME,
|
||||||
CONNECT_TIMEOUT);
|
CONNECT_TIMEOUT);
|
||||||
WiFiApp sprocket(
|
|
||||||
{STARTUP_DELAY, SERIAL_BAUD_RATE},
|
Sprocket sprocket(
|
||||||
{WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE, WEB_SERVER_PORT});
|
{STARTUP_DELAY, SERIAL_BAUD_RATE});
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <Sprocket.h>
|
#include <Sprocket.h>
|
||||||
#include <MeshNet.h>
|
#include <MeshNet.h>
|
||||||
#include <plugins/MeshNetworkPlugin.cpp>
|
#include <plugins/MeshNetworkPlugin.cpp>
|
||||||
|
#include <utils/print.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace std::placeholders;
|
using namespace std::placeholders;
|
||||||
@@ -24,7 +25,7 @@ class MeshApp : public Sprocket
|
|||||||
// add a task that sends stuff to the mesh
|
// add a task that sends stuff to the mesh
|
||||||
heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this));
|
heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this));
|
||||||
addTask(heartbeatTask);
|
addTask(heartbeatTask);
|
||||||
Serial.println("MeshApp activated");
|
PRINT_MSG(Serial,"MESH", "MeshApp activated");
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
using Sprocket::activate;
|
using Sprocket::activate;
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
#ifndef __WEB_CONFIG_PLUGIN_H__
|
|
||||||
#define __WEB_CONFIG_PLUGIN_H__
|
|
||||||
|
|
||||||
#include <FS.h>
|
|
||||||
#include "TaskSchedulerDeclarations.h"
|
|
||||||
#include "ArduinoOTA.h"
|
|
||||||
#include "Plugin.h"
|
|
||||||
#include <plugins/WebServerConfig.h>
|
|
||||||
#include <ESPAsyncWebServer.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace std::placeholders;
|
|
||||||
|
|
||||||
|
|
||||||
class WebConfigPlugin : public Plugin {
|
|
||||||
private:
|
|
||||||
AsyncWebServer* server;
|
|
||||||
public:
|
|
||||||
WebConfigPlugin(AsyncWebServer* webServer){
|
|
||||||
server = webServer;
|
|
||||||
server->serveStatic("/config.json", SPIFFS, "config.json");
|
|
||||||
}
|
|
||||||
void activate(Scheduler* userScheduler){
|
|
||||||
server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){
|
|
||||||
Serial.println("GET /heap");
|
|
||||||
request->send(200, "text/plain", String(ESP.getFreeHeap()));
|
|
||||||
});
|
|
||||||
server->on("/restart", HTTP_POST, [](AsyncWebServerRequest *request){
|
|
||||||
Serial.println("POST /restart");
|
|
||||||
ESP.restart();
|
|
||||||
});
|
|
||||||
server->on("/config", HTTP_POST, [](AsyncWebServerRequest *request){
|
|
||||||
Serial.println("POST /config");
|
|
||||||
if(request->hasParam("config", true) && request->hasParam("fileName", true)) {
|
|
||||||
String inStr = request->getParam("config", true)->value();
|
|
||||||
String fileName = request->getParam("fileName", true)->value();
|
|
||||||
File f = SPIFFS.open(fileName, "w");
|
|
||||||
if (!f) {
|
|
||||||
Serial.println("file open for write failed");
|
|
||||||
}
|
|
||||||
Serial.println("====== Writing to SPIFFS file =========");
|
|
||||||
f.print(inStr);
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
request->redirect("/");
|
|
||||||
});
|
|
||||||
Serial.println("WebConfig activated");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#ifndef __WEB_SERVER_CONFIG__
|
|
||||||
#define __WEB_SERVER_CONFIG__
|
|
||||||
|
|
||||||
struct WebServerConfig {
|
|
||||||
const char* contextPath;
|
|
||||||
const char* docRoot;
|
|
||||||
const char* defaultFile;
|
|
||||||
int port;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#ifndef __WEB_SERVER_PLUGIN__
|
|
||||||
#define __WEB_SERVER_PLUGIN__
|
|
||||||
|
|
||||||
#include <FS.h>
|
|
||||||
#include <ESPAsyncWebServer.h>
|
|
||||||
#include "TaskSchedulerDeclarations.h"
|
|
||||||
#include "Plugin.h"
|
|
||||||
#include <plugins/WebServerConfig.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace std::placeholders;
|
|
||||||
|
|
||||||
class WebServerPlugin : public Plugin {
|
|
||||||
private:
|
|
||||||
WebServerConfig config;
|
|
||||||
AsyncWebServer* server;
|
|
||||||
public:
|
|
||||||
WebServerPlugin(WebServerConfig cfg, AsyncWebServer* webServer){
|
|
||||||
config = cfg;
|
|
||||||
server = webServer;
|
|
||||||
}
|
|
||||||
void activate(Scheduler* userScheduler){
|
|
||||||
server->serveStatic(config.contextPath, SPIFFS, config.docRoot).setDefaultFile(config.defaultFile);
|
|
||||||
// TODO add auth if configured
|
|
||||||
// server->setAuthentication("user", "pass");
|
|
||||||
server->begin();
|
|
||||||
Serial.println("WebServer activated");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
28
src/utils/print.cpp
Normal file
28
src/utils/print.cpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#include "utils/print.h"
|
||||||
|
|
||||||
|
int FORMAT_BUFFER_SIZE(const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
int result = vsnprintf(NULL, 0, format, args);
|
||||||
|
va_end(args);
|
||||||
|
return result + 1; // safe byte for \0
|
||||||
|
}
|
||||||
|
void PRINT_MSG(Print &out, const char *prefix, const char *format, ...)
|
||||||
|
{
|
||||||
|
if (SPROCKET_PRINT)
|
||||||
|
{
|
||||||
|
out.print(String(prefix) + String("\t| "));
|
||||||
|
char formatString[128], *ptr;
|
||||||
|
strncpy_P(formatString, format, sizeof(formatString)); // copy in from program mem
|
||||||
|
// null terminate - leave last char since we might need it in worst case for result's \0
|
||||||
|
formatString[sizeof(formatString) - 2] = '\0';
|
||||||
|
ptr = &formatString[strlen(formatString) + 1]; // our result buffer...
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
vsnprintf(ptr, sizeof(formatString) - 1 - strlen(formatString), formatString, args);
|
||||||
|
va_end(args);
|
||||||
|
formatString[sizeof(formatString) - 1] = '\0';
|
||||||
|
out.println(ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
// TODO move to sprocket
|
// TODO move to sprocket
|
||||||
|
|
||||||
int FORMAT_BUFFER_SIZE(const char* format, ...);
|
int FORMAT_BUFFER_SIZE(const char *format, ...);
|
||||||
void PRINT_MSG(Print &out, const char* prefix, const char* format, ...);
|
void PRINT_MSG(Print &out, const char *prefix, const char *format, ...);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
#include "utils_print.h"
|
|
||||||
|
|
||||||
int FORMAT_BUFFER_SIZE(const char* format, ...) {
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
int result = vsnprintf(NULL, 0, format, args);
|
|
||||||
va_end(args);
|
|
||||||
return result + 1; // safe byte for \0
|
|
||||||
}
|
|
||||||
void PRINT_MSG(Print &out, const char* prefix, const char* format, ...) {
|
|
||||||
if(SPROCKET_PRINT){
|
|
||||||
out.print(String(prefix) + String("\t| "));
|
|
||||||
char formatString[128], *ptr;
|
|
||||||
strncpy_P( formatString, format, sizeof(formatString) ); // copy in from program mem
|
|
||||||
// null terminate - leave last char since we might need it in worst case for result's \0
|
|
||||||
formatString[ sizeof(formatString)-2 ]='\0';
|
|
||||||
ptr=&formatString[ strlen(formatString)+1 ]; // our result buffer...
|
|
||||||
va_list args;
|
|
||||||
va_start (args,format);
|
|
||||||
vsnprintf(ptr, sizeof(formatString)-1-strlen(formatString), formatString, args );
|
|
||||||
va_end (args);
|
|
||||||
formatString[ sizeof(formatString)-1 ]='\0';
|
|
||||||
out.println(ptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
#ifndef __WebUtils_H___
|
|
||||||
#define __WebUtils_H___
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <ESPAsyncWebServer.h>
|
|
||||||
#include <AsyncWebSocket.h>
|
|
||||||
#include <ESPAsyncTCP.h>
|
|
||||||
|
|
||||||
class WebUtils {
|
|
||||||
public:
|
|
||||||
static String getRequestParameterOrDefault(AsyncWebServerRequest *request, String param, String defaultValue, bool isPost = true){
|
|
||||||
if(request->hasParam(param, isPost)) {
|
|
||||||
return request->getParam(param, isPost)->value();
|
|
||||||
}
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
static String parseFrame(AwsEventType type, void * arg, uint8_t *data, size_t len) {
|
|
||||||
String msg = "";
|
|
||||||
if(type == WS_EVT_DATA){
|
|
||||||
AwsFrameInfo * info = (AwsFrameInfo*)arg;
|
|
||||||
if(info->opcode == WS_TEXT){
|
|
||||||
for(size_t i=0; i < info->len; i++) {
|
|
||||||
msg += (char) data[i];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
char buff[3];
|
|
||||||
for(size_t i=0; i < info->len; i++) {
|
|
||||||
sprintf(buff, "%02x ", (uint8_t) data[i]);
|
|
||||||
msg += buff ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
static String parseFrameAsString(AwsEventType type, void * arg, uint8_t *data, size_t len, int start = 0) {
|
|
||||||
String msg = "";
|
|
||||||
if(type == WS_EVT_DATA){
|
|
||||||
AwsFrameInfo * info = (AwsFrameInfo*)arg;
|
|
||||||
//if(info->final && info->index == 0 && info->len == len){
|
|
||||||
if(info->opcode == WS_TEXT){
|
|
||||||
for(size_t i=start; i < info->len; i++) {
|
|
||||||
msg += (char) data[i];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
char buff[3];
|
|
||||||
for(size_t i=start; i < info->len; i++) {
|
|
||||||
sprintf(buff, "%02x ", (uint8_t) data[i]);
|
|
||||||
msg += buff ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
/* static void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
|
|
||||||
if(type == WS_EVT_CONNECT){
|
|
||||||
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());
|
|
||||||
client->printf("Hello Client %u :)", client->id());
|
|
||||||
client->ping();
|
|
||||||
} else if(type == WS_EVT_DISCONNECT){
|
|
||||||
Serial.printf("ws[%s][%u] disconnect: %u\n", server->url(), client->id());
|
|
||||||
} else if(type == WS_EVT_ERROR){
|
|
||||||
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data);
|
|
||||||
} else if(type == WS_EVT_PONG){
|
|
||||||
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:"");
|
|
||||||
} else if(type == WS_EVT_DATA){
|
|
||||||
AwsFrameInfo * info = (AwsFrameInfo*)arg;
|
|
||||||
String msg = "";
|
|
||||||
//the whole message is in a single frame and we got all of it's data
|
|
||||||
if(info->final && info->index == 0 && info->len == len){
|
|
||||||
Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len);
|
|
||||||
|
|
||||||
if(info->opcode == WS_TEXT){
|
|
||||||
for(size_t i=0; i < info->len; i++) {
|
|
||||||
msg += (char) data[i];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
char buff[3];
|
|
||||||
for(size_t i=0; i < info->len; i++) {
|
|
||||||
sprintf(buff, "%02x ", (uint8_t) data[i]);
|
|
||||||
msg += buff ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Serial.printf("%s\n",msg.c_str());
|
|
||||||
|
|
||||||
if(info->opcode == WS_TEXT)
|
|
||||||
client->text("I got your text message");
|
|
||||||
else
|
|
||||||
client->binary("I got your binary message");
|
|
||||||
}
|
|
||||||
//message is comprised of multiple frames or the frame is split into multiple packets
|
|
||||||
else {
|
|
||||||
if(info->index == 0){
|
|
||||||
if(info->num == 0)
|
|
||||||
Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary");
|
|
||||||
Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len);
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len);
|
|
||||||
|
|
||||||
if(info->opcode == WS_TEXT){
|
|
||||||
for(size_t i=0; i < info->len; i++) {
|
|
||||||
msg += (char) data[i];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
char buff[3];
|
|
||||||
for(size_t i=0; i < info->len; i++) {
|
|
||||||
sprintf(buff, "%02x ", (uint8_t) data[i]);
|
|
||||||
msg += buff ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Serial.printf("%s\n",msg.c_str());
|
|
||||||
|
|
||||||
if((info->index + len) == info->len){
|
|
||||||
Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len);
|
|
||||||
if(info->final){
|
|
||||||
Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary");
|
|
||||||
if(info->message_opcode == WS_TEXT)
|
|
||||||
client->text("I got your text message");
|
|
||||||
else
|
|
||||||
client->binary("I got your binary message");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user