diff --git a/semestralka1/src/hardware/button.cpp b/semestralka1/src/hardware/button.cpp new file mode 100644 index 0000000..90b20c3 --- /dev/null +++ b/semestralka1/src/hardware/button.cpp @@ -0,0 +1,19 @@ +// src/hardware/button.cpp +#include "button.h" + +ButtonHandler::ButtonHandler(PinName pin) : button(pin) { + // ISR for button press (falling edge) + button.fall(callback(this, &ButtonHandler::on_pressed)); +} + +void ButtonHandler::on_pressed() { + pressed_flag = true; +} + +ButtonEvent ButtonHandler::poll() { + if (pressed_flag) { + pressed_flag = false; + return ButtonEvent::Pressed; + } + return ButtonEvent::None; +} diff --git a/semestralka1/src/hardware/button.h b/semestralka1/src/hardware/button.h new file mode 100644 index 0000000..60e4080 --- /dev/null +++ b/semestralka1/src/hardware/button.h @@ -0,0 +1,21 @@ +// src/hardware/button.h +#pragma once +#include "mbed.h" + +enum class ButtonEvent { + None = 0, + Pressed = 1, +}; + +class ButtonHandler { +private: + InterruptIn button; + volatile bool pressed_flag = false; + + void on_pressed(); + +public: + ButtonHandler(PinName pin = BUTTON1); + + ButtonEvent poll(); +}; diff --git a/semestralka1/src/hardware/uart.cpp b/semestralka1/src/hardware/uart.cpp deleted file mode 100644 index fdcb811..0000000 --- a/semestralka1/src/hardware/uart.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// src/hardware/uart.cpp -#include "uart.h" -#include - -UartReader::UartReader(BufferedSerial &serial) : serial_port(serial) { - memset(rx_buffer, 0, sizeof(rx_buffer)); - memset(message, 0, sizeof(message)); -} - -UartEvent UartReader::poll() { - 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) { - strncpy(message, rx_buffer, sizeof(message) - 1); - message_active = true; - changed = true; - triggered = true; - } - } - - // casovac na 1s zobrazenia spravy - if (!timer_started) { - msg_timer.start(); - timer_started = true; - } - - // po jednu sekundu sa sprava zobrazi - if (message_active && msg_timer.elapsed_time() > MESSAGE_DISPLAY_DURATION) { - message_active = false; - memset(message, 0, sizeof(message)); - msg_timer.reset(); - changed = true; - } - - if (triggered) - return UartEvent::Triggered; - if (changed) - return UartEvent::MessageUpdate; - return UartEvent::NoChange; -} - -const char* UartReader::get_message() const { - return message_active ? message : nullptr; -} diff --git a/semestralka1/src/hardware/uart.h b/semestralka1/src/hardware/uart.h deleted file mode 100644 index 044cb70..0000000 --- a/semestralka1/src/hardware/uart.h +++ /dev/null @@ -1,35 +0,0 @@ -// src/hardware/uart.h -#pragma once -#include "mbed.h" -#include - -constexpr size_t UART_BUFFER_SIZE = 64; -constexpr auto MESSAGE_DISPLAY_DURATION = 1s; - -enum class UartEvent { - NoChange = 0, // No new data - MessageUpdate = 1, // Message changed (received or expired) - Triggered = 2 // New message received (trigger action) -}; - -class UartReader { -private: - BufferedSerial &serial_port; - - char rx_buffer[UART_BUFFER_SIZE]; - char message[UART_BUFFER_SIZE]; - bool message_active = false; - - Timer msg_timer; - bool timer_started = false; - -public: - UartReader(BufferedSerial &serial); - - // Poll for UART events - UartEvent poll(); - - // Get current message (nullptr if no active message) - const char* get_message() const; - bool has_message() const { return message_active; } -}; diff --git a/semestralka1/src/render/background.cpp b/semestralka1/src/render/background.cpp index 3462def..3f29f89 100644 --- a/semestralka1/src/render/background.cpp +++ b/semestralka1/src/render/background.cpp @@ -5,7 +5,7 @@ #include #include -void draw_mask(const char *unused_filename, int shift, const char *text) { +void draw_mask(const char *unused_filename, int shift) { // Terminal clear + home printf("\033[2J\033[H"); @@ -25,9 +25,5 @@ void draw_mask(const char *unused_filename, int shift, const char *text) { printf("\r\n"); } - if (text && text[0] != '\0') { - printf("\r\n[RX] %s\r\n", text); - } - fflush(stdout); } diff --git a/semestralka1/src/render/background.h b/semestralka1/src/render/background.h index d3b642b..1a32640 100644 --- a/semestralka1/src/render/background.h +++ b/semestralka1/src/render/background.h @@ -4,4 +4,4 @@ constexpr int VIEW_WIDTH = 90; // Draws the ASCII art background with optional message -void draw_mask(const char *unused_filename, int shift, const char *text = nullptr); +void draw_mask(const char *unused_filename, int shift); diff --git a/semestralka1/src/render/loop.cpp b/semestralka1/src/render/loop.cpp index a8faf2e..4a38189 100644 --- a/semestralka1/src/render/loop.cpp +++ b/semestralka1/src/render/loop.cpp @@ -8,14 +8,13 @@ #include "../game/state.h" #include "../game/animation.h" #include "../game/collision.h" -#include "../hardware/uart.h" +#include "../hardware/button.h" #include "../render/player.h" #include "../render/obstacle.h" #include "../timing/speed_controller.h" #include "../timing/movement_controller.h" #include "../game/obstacle_system.h" -extern BufferedSerial serial_port; extern DigitalOut led; // Constants @@ -23,12 +22,12 @@ extern DigitalOut led; constexpr int PLAYER_X = 29; constexpr int PLAYER_Y = 6; -void draw_mask(const char *unused_filename, int shift, const char *text); +void draw_mask(const char *unused_filename, int shift); void render_loop(int speed) { MovementState player_state; AnimationController animation; - UartReader uart(serial_port); + ButtonHandler button; MovementController mover(PLAYER_X, VIEW_WIDTH); SpeedController timing; timing.set_ground_speed(speed); @@ -64,24 +63,19 @@ void render_loop(int speed) { int spawn_x = VIEW_WIDTH; int idx = spawn_obstacle(s_type, spawn_x); if (idx >= 0) { - obstacle_pool[idx].active = true; + obstacle_pool[idx].active = true; } } need_redraw = false; - UartEvent uart_event = uart.poll(); + ButtonEvent button_event = button.poll(); - if (uart_event == UartEvent::MessageUpdate) { - need_redraw = true; - } - - if (uart_event == UartEvent::Triggered) { + if (button_event == ButtonEvent::Pressed) { PlayerState current = player_state.get_state(); if (current == PlayerState::Walk || current == PlayerState::Run) { player_state.start_crawl(PlayerState::Crawl1); - } - else if (current == PlayerState::Crawl1) { + } else if (current == PlayerState::Crawl1) { player_state.start_crawl(PlayerState::Crawl2); } @@ -108,7 +102,7 @@ void render_loop(int speed) { if (need_redraw) { player_state.toggle_walk_frame(player_speed, anim_tick_counter); - draw_mask(bg_file, animation.get_shift(), uart.get_message()); + draw_mask(bg_file, animation.get_shift()); FrameSelection frame = player_state.get_frame_selection(); CharacterPosition draw_pos = get_aligned_frame_position(pos, frame.movement, frame.frame_index);