diff --git a/hod6/main.cpp b/hod6/main.cpp index 97936fb..d2deaa1 100644 --- a/hod6/main.cpp +++ b/hod6/main.cpp @@ -4,7 +4,7 @@ #define TARGET_TX_PIN USBTX #define TARGET_RX_PIN USBRX -#define BAUD_RATE 9600 +#define BAUD_RATE 115200 static BufferedSerial serial_port(TARGET_TX_PIN, TARGET_RX_PIN, BAUD_RATE); @@ -18,39 +18,71 @@ DigitalOut led(LED1); #define BUFFER_SIZE 64 static char rx_buffer[BUFFER_SIZE]; -void print_ascii_mask(uint32_t mask) +// Draw shifting mask with optional centered text +void draw_mask(uint32_t mask, int shift, const char *text = nullptr) { - for (int byte = 3; byte >= 0; byte--) { // High byte first - uint8_t b = (mask >> (byte * 8)) & 0xFF; + printf("\033[2J\033[H"); // clear + home + + for (int byte = 3; byte >= 0; byte--) { + uint8_t b = ((mask >> (byte * 8)) & 0xFF); + // Circular shift for movement illusion + uint8_t rotated = (b << shift) | (b >> (8 - shift)); for (int i = 7; i >= 0; i--) { - printf("%c", (b & (1 << i)) ? '#' : '.'); // '#' for 1, '.' for 0 + printf("%c", (rotated & (1 << i)) ? '#' : '.'); } printf("\r\n"); } - printf("\r\n"); + + // Message under the mask + if (text && text[0] != '\0') { + printf("\r\n[RX] %s\r\n", text); + } + + fflush(stdout); } int main(void) { serial_port.set_format(8, BufferedSerial::None, 1); - printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE); + + uint32_t mask = 0xF0F0A55A; + int shift = 0; + char message[BUFFER_SIZE] = {0}; + bool message_active = false; + Timer msg_timer; + Timer anim_timer; + msg_timer.start(); + anim_timer.start(); + while (true) { 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) { led = !led; - // serial_port.write(rx_buffer, num); - - printf("[RX] %s\r\n", rx_buffer); - uint32_t mask = 0xF0F0A55A; - print_ascii_mask(mask); + strncpy(message, rx_buffer, sizeof(message) - 1); + message_active = true; + msg_timer.reset(); } } - ThisThread::sleep_for(10ms); + if (message_active && msg_timer.elapsed_time() > 1s) { + message_active = false; + memset(message, 0, sizeof(message)); + } + + // if (message_active && msg_timer.elapsed_time() > 100ms) { + // shift = (shift + 1) % 8; + + // } + if (anim_timer.elapsed_time() >= 100ms) { + shift = (shift + 1) % 8; + anim_timer.reset(); + + draw_mask(mask, shift, message_active ? message : nullptr); + } + ThisThread::sleep_for(20ms); } }