Files
pti-ledy/server.ino
T
2026-02-05 14:40:45 +01:00

155 lines
4.1 KiB
Arduino

#include <WiFi.h>
#include <WebServer.h>
#include <ArduinoJson.h>
#include "structs.h"
#include "upload_page.h"
#include "prototypes.h"
const char* ssid = "PPIA";
const char* password = "pawelpdaldonejta";
unsigned char brightness = 100;
WebServer server(80);
Pixel new_image[16][16];
char* fileContent = nullptr;
size_t fileContent_len = 0;
String upload_error_message = "";
void handleBrightness() {
if (server.hasArg("value")) {
brightness = server.arg("value").toInt();
}
server.send(200, "text/plain", "OK");
}
void handleRoot()
{
server.send(200, "text/html", index_html);
}
void handleUploadPage()
{
server.send(200, "text/html", upload_page_html);
}
void handleBmpUpload() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
upload_error_message = "";
if (fileContent) {
free(fileContent);
fileContent = nullptr;
fileContent_len = 0;
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
if (upload.name == "image") {
fileContent = (char*)realloc(fileContent, fileContent_len + upload.currentSize);
memcpy(fileContent + fileContent_len, upload.buf, upload.currentSize);
fileContent_len += upload.currentSize;
}
} else if (upload.status == UPLOAD_FILE_END) {
if (upload.name == "image") {
// Read BMP header
char header[54];
memcpy(header, fileContent, 54);
int dataOffset = *(int*)&header[10];
int width = *(int*)&header[18];
int height = *(int*)&header[22];
short bitsPerPixel = *(short*)&header[28];
if (bitsPerPixel != 24) {
upload_error_message = "Unsupported BMP format: Only 24-bit BMPs are supported";
return;
}
if (width < 1 || width > 48 || height < 1 || height > 16) {
upload_error_message = "Invalid image dimensions";
return;
}
saved_images[0].width = width;
saved_images[0].height = height;
// Read pixel data
int row_padded = (width*3 + 3) & (~3);
char* pixel_data = fileContent + dataOffset;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int bmp_row = height - 1 - y;
saved_images[0].pixels[y][x].b = pixel_data[bmp_row*row_padded + x*3 + 0];
saved_images[0].pixels[y][x].g = pixel_data[bmp_row*row_padded + x*3 + 1];
saved_images[0].pixels[y][x].r = pixel_data[bmp_row*row_padded + x*3 + 2];
}
}
free(fileContent);
fileContent = nullptr;
fileContent_len = 0;
}
}
}
void handleText() {
if (server.hasArg("text") && server.hasArg("color") && server.hasArg("position") && server.hasArg("slowness")) {
String text_str = server.arg("text");
String colorStr = server.arg("color");
String position = server.arg("position");
unsigned char slowness = server.arg("slowness").toInt();
char text[TEXT_MAX_LENGTH + 1];
text_str.toCharArray(text, TEXT_MAX_LENGTH + 1);
uint32_t color = strtol(colorStr.substring(1).c_str(), NULL, 16);
if (position == "top") {
addNewTextNode(text, color, false, 43, 0, slowness, true, false);
} else if (position == "bottom") {
addNewTextNode(text, color, false, -text_str.length() * 6, 9, slowness, true, false);
}
server.send(200, "text/plain", "OK");
} else {
server.send(400, "text/plain", "Invalid arguments");
}
}
void start_server()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/text", HTTP_POST, handleText);
server.on("/brightness", HTTP_POST, handleBrightness);
server.on("/upload-page", HTTP_GET, handleUploadPage);
server.on("/upload-bmp", HTTP_POST, []() {
if (upload_error_message.length() > 0) {
server.send(400, "text/plain", upload_error_message);
} else {
server.send(200, "text/plain", "Upload OK");
}
}, handleBmpUpload);
server.begin();
}
void handle_server()
{
server.handleClient();
}