diff --git a/firmware/l0dable/matrix.c b/firmware/l0dable/matrix.c new file mode 100644 index 0000000..c62d872 --- /dev/null +++ b/firmware/l0dable/matrix.c @@ -0,0 +1,62 @@ +#include + +#include "basic/basic.h" +#include "lcd/render.h" + +#include "usetable.h" + +#define SCREEN_WIDTH 12 +#define SCREEN_HEIGHT 8 +#define INVALID_POS 127 + +#define FONT_WIDTH 7 +#define FONT_HEIGHT 8 + +#define MATRIX_LINES_LENGTH 15 + +#define MAX_LINE_LENGTH 6 + +void ram(void){ + lcdClear(); + + struct matrix_line { + int head_x, head_y; + int cur_length; + int length; + } matrix_lines[MATRIX_LINES_LENGTH]; + + for (int i = 0; i < MATRIX_LINES_LENGTH; i++) { + matrix_lines[i].cur_length = -1; + } + + while (1) { + for(int i = 0; icur_length == -1) { + ml->head_x = getRandom() % SCREEN_WIDTH; + ml->head_y = getRandom() % SCREEN_HEIGHT - 1; + ml->length = getRandom() % MAX_LINE_LENGTH + 3; + ml->cur_length = 0; + } + // new char + if (ml->head_y < SCREEN_HEIGHT-1) { + ml->head_y++; + int chr = getRandom() % 95 + 33; + DoChar(ml->head_x * FONT_WIDTH, ml->head_y * FONT_HEIGHT, chr); + ml->cur_length++; + } + // remove chars (when length or bottom is reached) + if (ml->cur_length > ml->length || ml->head_y >= SCREEN_HEIGHT-1) { + DoChar(ml->head_x * FONT_WIDTH, (ml->head_y - ml->cur_length) * FONT_HEIGHT, ' '); + ml->cur_length--; + } + } + lcdDisplay(); + // Exit on enter+left + int key = getInputRaw(); + if(key== BTN_ENTER || key == BTN_LEFT) + return; + delayms(60); + }; +};