WebServer: API for colored scrolling text messages

This commit is contained in:
Thomas Kolb 2019-12-24 18:11:09 +01:00
parent f28de024d8
commit 2b8d75a475
3 changed files with 84 additions and 33 deletions

View file

@ -47,6 +47,7 @@ class WebServer
static void handleColor(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res); static void handleColor(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res);
static void handleSetAnim(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res); static void handleSetAnim(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res);
static void handleListAnim(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res); static void handleListAnim(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res);
static void handleText(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res);
static void handleChallenge(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res); static void handleChallenge(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res);
static void handleAuthTest(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res); static void handleAuthTest(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res);
static void handleUpdate(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res); static void handleUpdate(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res);

View file

@ -51,10 +51,10 @@ void AnimationController::changeAnimation(AnimationController::DefaultAnimation
case FONT_TEST: case FONT_TEST:
{ {
Bitmap bmp(16, 16); Bitmap bmp(0, 0);
Font::textToBitmap("Hello World!", &bmp, Fader::Color{0, 0, 32, 32}); Font::textToBitmap("Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZ", &bmp, Fader::Color{0, 0, 32, 32});
changeAnimation(std::unique_ptr<Animation>(new ImageScrollerAnimation(m_fader, &bmp)), transition); changeAnimation(std::unique_ptr<Animation>(new ImageScrollerAnimation(m_fader, &bmp, 5)), transition);
} }
break; break;

View file

@ -8,6 +8,7 @@
#include "Config.h" #include "Config.h"
#include "Fader.h" #include "Fader.h"
#include "Font.h"
#include "Animation/AllAnimations.h" #include "Animation/AllAnimations.h"
#include "Animation/AnimationController.h" #include "Animation/AnimationController.h"
@ -75,6 +76,39 @@ static void error400(httpsserver::HTTPResponse *res, const std::string &reason)
res->setStatusCode(400); res->setStatusCode(400);
} }
static bool parseColor(const std::string &colorstr, Fader::Color *color, std::string *error)
{
if(colorstr.length() != 8) {
*error = "Wrong length of color string (expected 8 hex digits).";
return false;
}
uint32_t colorval = 0;
for(size_t i = 0; i < 8; i++) {
colorval <<= 4;
char c = colorstr[i];
if(c >= 'A' && c <= 'F') {
colorval |= c - 'A' + 10;
} else if(c >= 'a' && c <= 'f') {
colorval |= c - 'a' + 10;
} else if(c >= '0' && c <= '9') {
colorval |= c - '0';
} else {
*error = "Invalid character in color string (allowed: 0-9, a-f, A-F)";
return false;
}
}
color->r = (colorval & 0xFF000000) >> 24;
color->g = (colorval & 0x00FF0000) >> 16;
color->b = (colorval & 0x0000FF00) >> 8;
color->w = (colorval & 0x000000FF) >> 0;
return true;
}
void WebServer::handleColor(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res) void WebServer::handleColor(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res)
{ {
res->setHeader("Content-Type", "text/plain"); res->setHeader("Content-Type", "text/plain");
@ -88,46 +122,25 @@ void WebServer::handleColor(httpsserver::HTTPRequest *req, httpsserver::HTTPResp
std::string colorstr = params->getRequestParameter("color"); std::string colorstr = params->getRequestParameter("color");
if(colorstr.length() != 8) { Fader::Color color;
error400(res, "Wrong length of color string (expected 8 hex digits)."); std::string errorMessage;
if(!parseColor(colorstr, &color, &errorMessage)) {
error400(res, errorMessage);
return; return;
} }
uint32_t color = 0;
for(size_t i = 0; i < 8; i++) {
color <<= 4;
char c = colorstr[i];
if(c >= 'A' && c <= 'F') {
color |= c - 'A' + 10;
} else if(c >= 'a' && c <= 'f') {
color |= c - 'a' + 10;
} else if(c >= '0' && c <= '9') {
color |= c - '0';
} else {
error400(res, "Invalid character in color string (allowed: 0-9, a-f, A-F)");
return;
}
}
uint8_t r = (color & 0xFF000000) >> 24;
uint8_t g = (color & 0x00FF0000) >> 16;
uint8_t b = (color & 0x0000FF00) >> 8;
uint8_t w = (color & 0x000000FF) >> 0;
res->print("Color changed to r:"); res->print("Color changed to r:");
res->print(r); res->print(color.r);
res->print(" g:"); res->print(" g:");
res->print(g); res->print(color.g);
res->print(" b:"); res->print(" b:");
res->print(b); res->print(color.b);
res->print(" w:"); res->print(" w:");
res->println(w); res->println(color.w);
WebServer::instance().m_animController->changeAnimation( WebServer::instance().m_animController->changeAnimation(
std::unique_ptr<Animation>( std::unique_ptr<Animation>(
new FadeToColorAnimation(WebServer::instance().m_fader, Fader::Color{r,g,b,w})), new FadeToColorAnimation(WebServer::instance().m_fader, color)),
false); false);
} }
@ -183,6 +196,40 @@ void WebServer::handleListAnim(httpsserver::HTTPRequest *req, httpsserver::HTTPR
res->print("]"); res->print("]");
} }
void WebServer::handleText(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res)
{
res->setHeader("Content-Type", "text/plain");
httpsserver::ResourceParameters * params = req->getParams();
if(!params->isRequestParameterSet("text")) {
error400(res, "Required parameter 'text' not set.");
return;
}
Fader::Color color;
if(params->isRequestParameterSet("color")) {
std::string colorstr = params->getRequestParameter("color");
std::string errorMessage;
if(!parseColor(colorstr, &color, &errorMessage)) {
error400(res, errorMessage);
return;
}
} else {
color = Fader::Color{0, 0, 0, 32};
}
Bitmap bmp;
Font::textToBitmap(params->getRequestParameter("text").c_str(), &bmp, color);
WebServer::instance().m_animController->changeAnimation(
std::unique_ptr<Animation>(
new ImageScrollerAnimation(WebServer::instance().m_fader, &bmp, 5)),
false);
}
void WebServer::handleUpdate(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res) void WebServer::handleUpdate(httpsserver::HTTPRequest *req, httpsserver::HTTPResponse *res)
{ {
res->setHeader("Content-Type", "text/plain"); res->setHeader("Content-Type", "text/plain");
@ -286,6 +333,8 @@ void WebServer::serverTask(void *arg)
new httpsserver::ResourceNode("/api/setanim", "GET", WebServer::handleSetAnim); new httpsserver::ResourceNode("/api/setanim", "GET", WebServer::handleSetAnim);
httpsserver::ResourceNode *nodeAPIListAnim = httpsserver::ResourceNode *nodeAPIListAnim =
new httpsserver::ResourceNode("/api/listanim", "GET", WebServer::handleListAnim); new httpsserver::ResourceNode("/api/listanim", "GET", WebServer::handleListAnim);
httpsserver::ResourceNode *nodeAPIText =
new httpsserver::ResourceNode("/api/text", "GET", WebServer::handleText);
httpsserver::ResourceNode *nodeAPIUpdate = httpsserver::ResourceNode *nodeAPIUpdate =
new httpsserver::ResourceNode("/api/update", "POST", WebServer::handleUpdate); new httpsserver::ResourceNode("/api/update", "POST", WebServer::handleUpdate);
httpsserver::ResourceNode *nodeAPIChallenge = httpsserver::ResourceNode *nodeAPIChallenge =
@ -303,6 +352,7 @@ void WebServer::serverTask(void *arg)
server.m_server->registerNode(nodeAPIColor); server.m_server->registerNode(nodeAPIColor);
server.m_server->registerNode(nodeAPISetAnim); server.m_server->registerNode(nodeAPISetAnim);
server.m_server->registerNode(nodeAPIListAnim); server.m_server->registerNode(nodeAPIListAnim);
server.m_server->registerNode(nodeAPIText);
server.m_server->registerNode(nodeAPIUpdate); server.m_server->registerNode(nodeAPIUpdate);
server.m_server->registerNode(nodeAPIChallenge); server.m_server->registerNode(nodeAPIChallenge);
server.m_server->registerNode(nodeAPIAuthTest); server.m_server->registerNode(nodeAPIAuthTest);