Files
pti-ledy/ledy.ino
T
2026-02-04 14:42:44 +01:00

209 lines
14 KiB
Arduino

#include <Adafruit_NeoPixel.h>
#include <WiFi.h>
#include <WebServer.h>
#include <ArduinoJson.h>
#include "config.h"
#include "index.h"
#include "fonts.h"
#include "lowLevel.h"
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
TextNode text_nodes[MAX_TEXT_NODES_COUNT];
Cursor cursor;
short ever_created_text_nodes = 0;
Image saved_images[MAX_IMAGES_SAVED] = {
{
{
// Row 0
{{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,255,0}, {255,255,0}, {255,255,0}, {255,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,0,255}, {255,0,255}, {255,0,255}, {255,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,255}, {0,255,255}, {0,255,255}, {0,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 1
{{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,255,0}, {255,255,0}, {255,255,0}, {255,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,0,255}, {255,0,255}, {255,0,255}, {255,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,255}, {0,255,255}, {0,255,255}, {0,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 2
{{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,255,0}, {255,255,0}, {255,255,0}, {255,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,0,255}, {255,0,255}, {255,0,255}, {255,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,255}, {0,255,255}, {0,255,255}, {0,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 3
{{255,0,0}, {255,0,0}, {255,0,0}, {255,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,255,0}, {255,255,0}, {255,255,0}, {255,255,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {255,0,255}, {255,0,255}, {255,0,255}, {255,0,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,255,255}, {0,255,255}, {0,255,255}, {0,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 4
{{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 5
{{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 6
{{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 7
{{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
// Row 8
{{255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}},
// Row 9
{{255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}},
// Row 10
{{255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}},
// Row 11
{{255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}, {255,255,255}},
// Row 12
{{128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}},
// Row 13
{{128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}},
// Row 14
{{128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}},
// Row 15
{{128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}, {128,128,128}}
},
48, // width
16 // height
},
{}
};
short getTextNodeY2(TextNode *node)
{
return node->pos_y + node->characterSize.height - 1;
}
short getTextNodeX2(TextNode *node)
{
if (node->character_count == 0) return node->pos_x;
return node->pos_x + (node->characterSize.width * node->character_count) + (node->character_count - 1) - 1;
}
void addNewTextNode
(
char text[TEXT_MAX_LENGTH + 1], uint32_t color = 0x00010101, bool handle_pos_via_cursor = true, short pos_x = 0, short pos_y = 0,
unsigned char scroll_slowness = 0, bool is_scrolling = true, bool is_small = true
)
{
unsigned char text_length = strlen(text);
if (text_length == 0){return;}
for (unsigned char i = 0; i < MAX_TEXT_NODES_COUNT; i++)
{
if (text_nodes[i].is_deleted)
{
strncpy(text_nodes[i].content, text, TEXT_MAX_LENGTH);
text_nodes[i].color = color;
if (handle_pos_via_cursor)
{
text_nodes[i].pos_x = cursor.x;
text_nodes[i].pos_y = cursor.y;
}
else
{
text_nodes[i].pos_x = pos_x;
text_nodes[i].pos_y = pos_y;
}
text_nodes[i].characterSize.height = is_small ? SMALL_TEXT_HEIGHT : MEDIUM_TEXT_HEIGHT;
text_nodes[i].characterSize.width = is_small ? SMALL_TEXT_WIDTH : MEDIUM_TEXT_WIDTH;
text_nodes[i].character_count = text_length;
text_nodes[i].scroll_slowness = scroll_slowness;
text_nodes[i].is_scrolling = is_scrolling;
text_nodes[i].is_deleted = false;
ever_created_text_nodes++;
if (handle_pos_via_cursor)
{
cursor.x += (text_nodes[i].characterSize.width + 1) * text_length;
}
break;
}
}
}
void scrollAllScrollableTexts(bool split_scroll_mode = false)
{
for (unsigned char i = 0; i < MAX_TEXT_NODES_COUNT; i++)
{
if (text_nodes[i].is_deleted) {continue;}
if (text_nodes[i].is_scrolling)
{
if (text_nodes[i].scroll_slowness > text_nodes[i].scroll_progress)
{
text_nodes[i].scroll_progress++;
}
else
{
text_nodes[i].scroll_progress = 0;
short x1 = text_nodes[i].pos_x;
short x2 = getTextNodeX2(&text_nodes[i]);
if (split_scroll_mode || text_nodes[i].pos_y < 7)
{
if (x2 < 0)
{
text_nodes[i].is_deleted = true;
continue;
}
text_nodes[i].pos_x--;
}
else
{
if (x1 > DISPLAY_MAX_X)
{
text_nodes[i].is_deleted = true;
continue;
}
text_nodes[i].pos_x++;
}
}
}
cursor.x = text_nodes[i].pos_x;
cursor.y = text_nodes[i].pos_y;
for (unsigned char j = 0; j < text_nodes[i].character_count; j++)
{
char ch = text_nodes[i].content[j];
if (ch < '!' || ch > '~')
{
ch = ' ';
}
drawCharacter(font7x5[ch - ' '], text_nodes[i].characterSize.height, text_nodes[i].characterSize.width, text_nodes[i].color, &cursor);
}
}
}
void drawImageFromMemoryByIndex(unsigned char image_index, short pos_x, short pos_y)
{
Image* img = &saved_images[image_index];
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));
}
}
}
void setup()
{
Serial.begin(115200);
Serial.println("----------------------------------------------------");
pixels.begin();
pixels.clear();
addNewTextNode("NET", 0xFF050505, false, 0, 0);
addNewTextNode("AWAIT", 0xFF050505, false, 0, 9);
pixels.show();
start_server();
}
void loop()
{
pixels.clear();
handle_server();
if (text_nodes[0].is_deleted && text_nodes[2].is_deleted)
{
}
scrollAllScrollableTexts();
pixels.show();
}