diff --git a/ledy.ino b/ledy.ino index 191c0c1..f405af0 100644 --- a/ledy.ino +++ b/ledy.ino @@ -133,15 +133,21 @@ void scrollAllScrollableTexts(bool split_scroll_mode = false) } } -void drawImageFromMemoryByIndex(unsigned char image_index, short pos_x, short pos_y) +void drawImageFromMemoryByIndex(unsigned char image_index, short pos_x, short pos_y, unsigned char dim_percentage = 0) { Image* img = &saved_images[image_index]; + + auto dimBy = [dim_percentage](unsigned char color) + { + return color * (100 - dim_percentage) / 100; + }; + for (unsigned char y = 0; y < img->height; y++) { - for (unsigned char x = 0; x < img->width; x++) - { - setPixel(x + pos_x, y + pos_y, pixels.Color(img->pixels[y][x].r, img->pixels[y][x].g, img->pixels[y][x].b)); - } + for (unsigned char x = 0; x < img->width; x++) + { + setPixel(x + pos_x, y + pos_y, pixels.Color(dimBy(img->pixels[y][x].r), dimBy(img->pixels[y][x].g), dimBy(img->pixels[y][x].b))); + } } } @@ -164,6 +170,19 @@ void loop() { pixels.clear(); handle_server(); - scrollAllScrollableTexts(); + + if (saved_images[0].width > 0) + { + drawImageFromMemoryByIndex(0, 0, 0); + } + else + { + if (text_nodes[0].is_deleted && text_nodes[2].is_deleted) + { + + } + scrollAllScrollableTexts(); + } + pixels.show(); } \ No newline at end of file diff --git a/prototypes.h b/prototypes.h index c84cb36..dd3fc03 100644 --- a/prototypes.h +++ b/prototypes.h @@ -11,7 +11,7 @@ extern TextNode text_nodes[MAX_TEXT_NODES_COUNT]; extern Cursor cursor; -void drawImageFromMemoryByIndex(unsigned char image_index, short pos_x, short pos_y); +void drawImageFromMemoryByIndex(unsigned char image_index, short pos_x, short pos_y, unsigned char dim_percentage = 0); void setPixel(short x, short y, uint32_t color); void start_server(); void handle_server(); diff --git a/server.ino b/server.ino index 43c3b46..20a25be 100644 --- a/server.ino +++ b/server.ino @@ -13,6 +13,7 @@ WebServer server(80); Pixel new_image[16][16]; char* fileContent = nullptr; size_t fileContent_len = 0; +String upload_error_message = ""; void handleRoot() @@ -29,6 +30,7 @@ void handleUploadPage() void handleBmpUpload() { HTTPUpload& upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { + upload_error_message = ""; if (fileContent) { free(fileContent); fileContent = nullptr; @@ -46,11 +48,18 @@ void handleBmpUpload() { 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) { - server.send(400, "text/plain", "Invalid image dimensions"); + upload_error_message = "Invalid image dimensions"; return; } @@ -59,20 +68,16 @@ void handleBmpUpload() { // Read pixel data int row_padded = (width*3 + 3) & (~3); - char* pixel_data = fileContent + 54; + char* pixel_data = fileContent + dataOffset; - for (int y = height - 1; y >= 0; y--) { + for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - saved_images[0].pixels[y][x].b = pixel_data[y*row_padded + x*3 + 0]; - saved_images[0].pixels[y][x].g = pixel_data[y*row_padded + x*3 + 1]; - saved_images[0].pixels[y][x].r = pixel_data[y*row_padded + x*3 + 2]; + 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]; } } - - pixels.clear(); - drawImageFromMemoryByIndex(0, 0, 0); - pixels.show(); - server.send(200, "text/plain", "OK"); free(fileContent); fileContent = nullptr; @@ -86,7 +91,7 @@ void handleBmpUpload() { void handleShowSaved() { pixels.clear(); - drawImageFromMemoryByIndex(0, 0, 0); + drawImageFromMemoryByIndex(0, 0, 0, 100); pixels.show(); server.send(200, "text/plain", "OK"); } @@ -106,7 +111,11 @@ void start_server() server.on("/show-saved", handleShowSaved); server.on("/upload-page", HTTP_GET, handleUploadPage); server.on("/upload-bmp", HTTP_POST, []() { - server.send(200, "text/plain", ""); + 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(); }