summary refs log tree commit diff stats
path: root/firmware/include
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/include')
-rw-r--r--firmware/include/game/blocks.h9
-rw-r--r--firmware/include/game/game_state.h38
-rw-r--r--firmware/include/inputs/button.h5
-rw-r--r--firmware/include/inputs/input.h17
-rw-r--r--firmware/include/ui/ui.h22
5 files changed, 89 insertions, 2 deletions
diff --git a/firmware/include/game/blocks.h b/firmware/include/game/blocks.h
new file mode 100644
index 0000000..7e9b75f
--- /dev/null
+++ b/firmware/include/game/blocks.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <stdint.h>
+
+namespace game {
+
+enum class Block : uint8_t { T, L, J, O, I, Z, S, NONE };
+
+}
diff --git a/firmware/include/game/game_state.h b/firmware/include/game/game_state.h
new file mode 100644
index 0000000..0878545
--- /dev/null
+++ b/firmware/include/game/game_state.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include <array>
+#include <stdint.h>
+
+#include "game/blocks.h"
+#include "inputs/input.h"
+
+namespace game {
+
+constexpr uint8_t NUM_ROWS { 20 };
+constexpr uint8_t NUM_COLS { 10 };
+
+class GameState {
+public:
+    GameState();
+
+    void update(const inputs::Input& input);
+
+    uint32_t get_score();
+    uint8_t get_level();
+
+    Block get_next_block();
+
+    Block get_block(uint8_t row, uint8_t col);
+
+private:
+    void move_down();
+    void move_right();
+    void move_left();
+
+    void rotate_right();
+    void rotate_left();
+
+    std::array<Block, NUM_ROWS * NUM_COLS> grid;
+};
+
+}
diff --git a/firmware/include/inputs/button.h b/firmware/include/inputs/button.h
index c3530ae..908ea22 100644
--- a/firmware/include/inputs/button.h
+++ b/firmware/include/inputs/button.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include <cstdint>
+#include <stdint.h>
 
 namespace inputs {
 
@@ -8,9 +8,12 @@ class Button {
 public:
     Button(uint8_t pin);
 
+    void init();
+
     bool is_pressed();
 
 private:
+    uint8_t pin;
 };
 
 }
diff --git a/firmware/include/inputs/input.h b/firmware/include/inputs/input.h
index 7899ce7..116bd9c 100644
--- a/firmware/include/inputs/input.h
+++ b/firmware/include/inputs/input.h
@@ -6,7 +6,14 @@ namespace inputs {
 
 class Input {
 public:
-    Input(/* pins */);
+    Input(
+        uint8_t down_pin,
+        uint8_t up_pin,
+        uint8_t right_pin,
+        uint8_t left_pin,
+        uint8_t a_pin,
+        uint8_t b_pin,
+        uint8_t pause_pin);
 
     void init();
 
@@ -16,8 +23,16 @@ public:
     bool left_pressed();
     bool a_pressed();
     bool b_pressed();
+    bool pause_pressed();
 
 private:
+    Button down;
+    Button up;
+    Button left;
+    Button right;
+    Button a;
+    Button b;
+    Button pause;
 };
 
 }
diff --git a/firmware/include/ui/ui.h b/firmware/include/ui/ui.h
new file mode 100644
index 0000000..44b4555
--- /dev/null
+++ b/firmware/include/ui/ui.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include <Adafruit_ST7735.h>
+#include <stdint.h>
+
+#include "game/game_state.h"
+
+namespace ui {
+
+class UI {
+public:
+    UI(int8_t tft_cs, int8_t tft_rst, int8_t tft_dc);
+
+    void init();
+
+    void render_screen(const game::GameState& state);
+
+private:
+    Adafruit_ST7735 tft;
+};
+
+}