diff --git a/flake.nix b/flake.nix index d01c91e..18dbc0b 100644 --- a/flake.nix +++ b/flake.nix @@ -55,6 +55,7 @@ pkgs.probe-rs-tools pkgs.bear pkgs.chafa + pkgs.imagemagick mbedTools pyOcd ]; diff --git a/semestralka1/chafa/background.jpg b/semestralka1/chafa/background/background.jpg similarity index 100% rename from semestralka1/chafa/background.jpg rename to semestralka1/chafa/background/background.jpg diff --git a/semestralka1/chafa/background_dark.jpg b/semestralka1/chafa/background/background_dark.jpg similarity index 100% rename from semestralka1/chafa/background_dark.jpg rename to semestralka1/chafa/background/background_dark.jpg diff --git a/semestralka1/chafa/background_dark_inverted.txt b/semestralka1/chafa/background/background_dark_inverted.txt similarity index 100% rename from semestralka1/chafa/background_dark_inverted.txt rename to semestralka1/chafa/background/background_dark_inverted.txt diff --git a/semestralka1/chafa/background_inverted.txt b/semestralka1/chafa/background/background_inverted.txt similarity index 100% rename from semestralka1/chafa/background_inverted.txt rename to semestralka1/chafa/background/background_inverted.txt diff --git a/semestralka1/chafa/character/2out.txt b/semestralka1/chafa/character/2out.txt new file mode 100644 index 0000000..df9ca75 --- /dev/null +++ b/semestralka1/chafa/character/2out.txt @@ -0,0 +1,7 @@ +.....a@$.. +.....7PF.. +..yaM@@__y +..@.y@FFF~ +..._$M@_.. +yaa@~.`@y. +........@r diff --git a/semestralka1/chafa/character/3out.txt b/semestralka1/chafa/character/3out.txt new file mode 100644 index 0000000..43ea850 --- /dev/null +++ b/semestralka1/chafa/character/3out.txt @@ -0,0 +1,7 @@ +.g@$ +.7PF +y@$. +0@F. +4@$. +y$@. +u@.. diff --git a/semestralka1/chafa/character/out.txt b/semestralka1/chafa/character/out.txt new file mode 100644 index 0000000..1d0b30e --- /dev/null +++ b/semestralka1/chafa/character/out.txt @@ -0,0 +1,9 @@ +......_g@$w.. +......4@@@F.. +.....yyyy`... +...g@~@@@y_ys +..4F..@@FTF~. +.....g@@g,... +..._a@^.4@_.. +4R@F~....7@y. +..........~@. diff --git a/semestralka1/chafa/character/out_crawl1.txt b/semestralka1/chafa/character/out_crawl1.txt new file mode 100644 index 0000000..305701c --- /dev/null +++ b/semestralka1/chafa/character/out_crawl1.txt @@ -0,0 +1,4 @@ +.._$@. +.$By`. +4@$@@a +aa@W@. diff --git a/semestralka1/chafa/character/out_crawl2.txt b/semestralka1/chafa/character/out_crawl2.txt new file mode 100644 index 0000000..51eec29 --- /dev/null +++ b/semestralka1/chafa/character/out_crawl2.txt @@ -0,0 +1,3 @@ +a@@Bw_, +7@@Db@$ +4@@PF#@ diff --git a/semestralka1/chafa/character/predloha.jpg b/semestralka1/chafa/character/predloha.jpg new file mode 100644 index 0000000..7928d71 Binary files /dev/null and b/semestralka1/chafa/character/predloha.jpg differ diff --git a/semestralka1/chafa/character/predloha2.jpg b/semestralka1/chafa/character/predloha2.jpg new file mode 100644 index 0000000..7b7ea44 Binary files /dev/null and b/semestralka1/chafa/character/predloha2.jpg differ diff --git a/semestralka1/chafa/character/predloha2_scaled.xcf b/semestralka1/chafa/character/predloha2_scaled.xcf new file mode 100644 index 0000000..6c0e98b Binary files /dev/null and b/semestralka1/chafa/character/predloha2_scaled.xcf differ diff --git a/semestralka1/chafa/character/predloha_crawl1.jpg b/semestralka1/chafa/character/predloha_crawl1.jpg new file mode 100644 index 0000000..28731fc Binary files /dev/null and b/semestralka1/chafa/character/predloha_crawl1.jpg differ diff --git a/semestralka1/chafa/character/predloha_crawl2.jpg b/semestralka1/chafa/character/predloha_crawl2.jpg new file mode 100644 index 0000000..1429843 Binary files /dev/null and b/semestralka1/chafa/character/predloha_crawl2.jpg differ diff --git a/semestralka1/chafa/character/predloha_run_a.jpg b/semestralka1/chafa/character/predloha_run_a.jpg new file mode 100644 index 0000000..96d8ece Binary files /dev/null and b/semestralka1/chafa/character/predloha_run_a.jpg differ diff --git a/semestralka1/chafa/character/predloha_run_b.jpg b/semestralka1/chafa/character/predloha_run_b.jpg new file mode 100644 index 0000000..fd0613d Binary files /dev/null and b/semestralka1/chafa/character/predloha_run_b.jpg differ diff --git a/semestralka1/chafa/character/run_chafa.txt b/semestralka1/chafa/character/run_chafa.txt new file mode 100644 index 0000000..f6fdc11 --- /dev/null +++ b/semestralka1/chafa/character/run_chafa.txt @@ -0,0 +1,4 @@ +chafa --symbols ascii-block -c none --fill none --invert --size=13x20 predloha_run_a.jpg > out.txt + +a = 78x111 +b = 34x111 diff --git a/semestralka1/src/render/loop.cpp b/semestralka1/src/render/loop.cpp index 9b0cf58..be6c30f 100644 --- a/semestralka1/src/render/loop.cpp +++ b/semestralka1/src/render/loop.cpp @@ -4,6 +4,7 @@ #include "background.h" #include "mbed.h" #include "player.h" +#include "player_mask.h" #include extern BufferedSerial serial_port; @@ -17,19 +18,24 @@ static bool message_active = false; void draw_mask(const char *unused_filename, int shift, const char *text); -static bool read_uart() { +// Returns: +// 0 = no change - walk1 +// 1 = normal redraw - walk2 +// 2 = button triggered - crawl1 +static int read_uart() { bool changed = false; + bool triggered = false; // cita spravu z uartu if (serial_port.readable()) { memset(rx_buffer, 0, sizeof(rx_buffer)); ssize_t num = serial_port.read(rx_buffer, sizeof(rx_buffer) - 1); if (num > 0) { - // toogle ledky - led = !led; + led = !led; // toogle ledky strncpy(message, rx_buffer, sizeof(message) - 1); message_active = true; changed = true; + triggered = true; } } @@ -49,11 +55,15 @@ static bool read_uart() { changed = true; } - return changed; + if (triggered) + return 2; // LED toggled press + if (changed) + return 1; + return 0; } static bool update_animation(Timer &anim_timer, int &shift, int speed) { - if (anim_timer.elapsed_time() >= 200ms) { + if (anim_timer.elapsed_time() >= 170ms) { // speed determines scroll steps per tick shift += speed; anim_timer.reset(); @@ -75,17 +85,28 @@ void render_loop(int speed) { while (true) { need_redraw = false; - if (read_uart()) { - need_redraw = true; - } + int uart_state = read_uart(); // returns 0/1/2 + if (uart_state == 1) + need_redraw = true; + + bool triggered = (uart_state == 2); if (update_animation(anim_timer, shift, speed)) need_redraw = true; - if (need_redraw) { - draw_mask(bg_file, shift, message_active ? message : nullptr); - draw_player(18, 16); - ThisThread::sleep_for(50ms); + if (need_redraw || triggered) { + draw_mask(bg_file, shift, message_active ? message : nullptr); + + static int frame = 0; + if (triggered) { + // Display triggered frame once + draw_player(18, 13, 2); + } else { + draw_player(18, 13, frame); + frame = (frame + 1) % 2; // alternate between frame 0 and 1 + } + + ThisThread::sleep_for(50ms); } ThisThread::sleep_for(25ms); diff --git a/semestralka1/src/render/player.cpp b/semestralka1/src/render/player.cpp index 4e4e3a7..3913dc3 100644 --- a/semestralka1/src/render/player.cpp +++ b/semestralka1/src/render/player.cpp @@ -4,16 +4,32 @@ #include "player_mask.h" #include -void draw_player(int view_width, int view_height) { - const int sprite_height = PLAYER_MASK_LINES; - const int sprite_width = 3; // all rows are same width (3 chars) +void draw_player(int view_width, int view_height, int frame_index) { + if (frame_index < 0 || frame_index >= PLAYER_FRAME_COUNT) + frame_index = 0; // fallback + + const char **sprite = PLAYER_FRAMES[frame_index]; + int sprite_height = 0; + if (frame_index == 0) + sprite_height = PLAYER_MASK_LINES_FRAME_1; + else if (frame_index == 1) + sprite_height = PLAYER_MASK_LINES_FRAME_2; + else + sprite_height = PLAYER_MASK_LINES_FRAME_3; + + // Width from first line + int sprite_width = 0; + if (sprite_height > 0) { + const char *first_line = sprite[0]; + while (first_line[sprite_width] != '\0') + sprite_width++; + } int center_x = view_width / 2 - sprite_width / 2; int center_y = view_height / 2 - sprite_height / 2; for (int i = 0; i < sprite_height; i++) { - printf("\033[%d;%dH%s", center_y + i + 1, center_x + 1, PLAYER_MASK[i]); + printf("\033[%d;%dH%s", center_y + i + 1, center_x + 1, sprite[i]); } - fflush(stdout); } diff --git a/semestralka1/src/render/player.h b/semestralka1/src/render/player.h index 846513d..85c8686 100644 --- a/semestralka1/src/render/player.h +++ b/semestralka1/src/render/player.h @@ -2,4 +2,4 @@ #pragma once // Draw the player object centered over the background -void draw_player(int view_width, int view_height); +void draw_player(int view_width, int view_height, int frame_index); diff --git a/semestralka1/src/render/player_mask.h b/semestralka1/src/render/player_mask.h index 13bfb94..9b23672 100644 --- a/semestralka1/src/render/player_mask.h +++ b/semestralka1/src/render/player_mask.h @@ -1,12 +1,50 @@ // src/render/player_mask.h + #pragma once -// Simple 3x3 player sprite for overlay drawing -static const char *PLAYER_MASK[] = { - " @ ", - "/|\\", - "/ \\" +// Player frame 1 +static const char *PLAYER_MASK_FRAME_1[] = { + ".....a@$..", + ".....7PF..", + "..yaM@@__y", + "..@.y@FFF~", + "..._$M@_..", + "yaa@~.`@y.", + "........@r" }; -static const int PLAYER_MASK_LINES = - sizeof(PLAYER_MASK) / sizeof(PLAYER_MASK[0]); +// Player frame 2 +static const char *PLAYER_MASK_FRAME_2[] = { + ".g@$", + ".7PF", + "y@$.", + "0@F.", + "4@$.", + "y$@.", + "u@.." +}; + +// Player frame 3 (triggered) +static const char *PLAYER_MASK_FRAME_3[] = { + ".._$@.", + ".$By`.", + "4@$@@a", + "aa@W@." +}; + +// Combine frames for easy access +static const char **PLAYER_FRAMES[] = { + PLAYER_MASK_FRAME_1, // 0 + PLAYER_MASK_FRAME_2, // 1 + PLAYER_MASK_FRAME_3 // 2 (triggered) +}; + +static const int PLAYER_FRAME_COUNT = sizeof(PLAYER_FRAMES) / sizeof(PLAYER_FRAMES[0]); + +// Line counts per frame +static const int PLAYER_MASK_LINES_FRAME_1 = + sizeof(PLAYER_MASK_FRAME_1) / sizeof(PLAYER_MASK_FRAME_1[0]); +static const int PLAYER_MASK_LINES_FRAME_2 = + sizeof(PLAYER_MASK_FRAME_2) / sizeof(PLAYER_MASK_FRAME_2[0]); +static const int PLAYER_MASK_LINES_FRAME_3 = + sizeof(PLAYER_MASK_FRAME_3) / sizeof(PLAYER_MASK_FRAME_3[0]);