#include #include #include #include #include "config.h" #include "index.h" #include "fonts.h" #include "lowLevel.h" #include "upload_page.h" #include "prototypes.h" #ifdef __AVR__ #include // 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] = { {},{} }; 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, bool handle_pos_via_cursor = true, short pos_x = 0, short pos_y = 0, unsigned char scroll_slowness = 1, 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(); scrollAllScrollableTexts(); pixels.show(); }