mirror of
https://gitlab.com/wirelos/sprocket-lib.git
synced 2025-12-14 12:46:50 +01:00
move web plugins to sprocket-plugin-web repo, rename utils
This commit is contained in:
@@ -22,10 +22,7 @@ lib_deps =
|
||||
TaskScheduler
|
||||
SPIFFS
|
||||
ESP8266mDNS
|
||||
ArduinoOTA
|
||||
painlessMesh
|
||||
ESPAsyncTCP
|
||||
ESP Async WebServer
|
||||
|
||||
;[env:build]
|
||||
;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 "WiFiNet.h"
|
||||
#include "WiFiApp.h"
|
||||
#include "Sprocket.h"
|
||||
|
||||
WiFiNet wifi(
|
||||
SPROCKET_MODE,
|
||||
@@ -10,9 +10,9 @@ WiFiNet wifi(
|
||||
AP_PASSWORD,
|
||||
HOSTNAME,
|
||||
CONNECT_TIMEOUT);
|
||||
WiFiApp sprocket(
|
||||
{STARTUP_DELAY, SERIAL_BAUD_RATE},
|
||||
{WEB_CONTEXT_PATH, WEB_DOC_ROOT, WEB_DEFAULT_FILE, WEB_SERVER_PORT});
|
||||
|
||||
Sprocket sprocket(
|
||||
{STARTUP_DELAY, SERIAL_BAUD_RATE});
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <Sprocket.h>
|
||||
#include <MeshNet.h>
|
||||
#include <plugins/MeshNetworkPlugin.cpp>
|
||||
#include <utils/print.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace std::placeholders;
|
||||
@@ -24,7 +25,7 @@ class MeshApp : public Sprocket
|
||||
// add a task that sends stuff to the mesh
|
||||
heartbeatTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MeshApp::heartbeat, this));
|
||||
addTask(heartbeatTask);
|
||||
Serial.println("MeshApp activated");
|
||||
PRINT_MSG(Serial,"MESH", "MeshApp activated");
|
||||
return this;
|
||||
}
|
||||
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
|
||||
|
||||
int FORMAT_BUFFER_SIZE(const char* format, ...);
|
||||
void PRINT_MSG(Print &out, const char* prefix, const char* format, ...);
|
||||
int FORMAT_BUFFER_SIZE(const char *format, ...);
|
||||
void PRINT_MSG(Print &out, const char *prefix, const char *format, ...);
|
||||
|
||||
#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