diff options
Diffstat (limited to 'puzzle')
-rw-r--r-- | puzzle/dummy/FreeRTOSConfig.h | 1 | ||||
-rw-r--r-- | puzzle/dummy/main.cpp | 5 | ||||
-rw-r--r-- | puzzle/dummy/mod.c | 3 | ||||
-rw-r--r-- | puzzle/neo/FreeRTOSConfig.h | 1 | ||||
-rw-r--r-- | puzzle/neo/main.cpp | 60 | ||||
-rw-r--r-- | puzzle/neo/mod.c | 3 | ||||
-rw-r--r-- | puzzle/smoketest/FreeRTOSConfig.h | 1 | ||||
-rw-r--r-- | puzzle/smoketest/main.cpp | 17 | ||||
-rw-r--r-- | puzzle/smoketest/mod.c | 3 | ||||
-rw-r--r-- | puzzle/vault/FreeRTOSConfig.h | 1 | ||||
-rw-r--r-- | puzzle/vault/main.cpp | 277 | ||||
-rw-r--r-- | puzzle/vault/mod.c | 3 |
12 files changed, 183 insertions, 192 deletions
diff --git a/puzzle/dummy/FreeRTOSConfig.h b/puzzle/dummy/FreeRTOSConfig.h index 072fdf7..35d9cae 100644 --- a/puzzle/dummy/FreeRTOSConfig.h +++ b/puzzle/dummy/FreeRTOSConfig.h @@ -49,4 +49,3 @@ #define INCLUDE_xTaskGetHandle 1 #define INCLUDE_xTaskResumeFromISR 1 #define INCLUDE_xQueueGetMutexHolder 1 - diff --git a/puzzle/dummy/main.cpp b/puzzle/dummy/main.cpp index d611014..5f78086 100644 --- a/puzzle/dummy/main.cpp +++ b/puzzle/dummy/main.cpp @@ -1,5 +1,4 @@ #include <Arduino.h> -void setup() { } -void loop() { } - +void setup() {} +void loop() {} diff --git a/puzzle/dummy/mod.c b/puzzle/dummy/mod.c index 058a585..559c4d3 100644 --- a/puzzle/dummy/mod.c +++ b/puzzle/dummy/mod.c @@ -1,6 +1,5 @@ -#include "pb.h" #include "pb-mod.h" +#include "pb.h" const char * PB_MOD_NAME = "dummy"; const i2c_addr_t PB_MOD_ADDR = PB_ADDR_MOD_DUMMY; - diff --git a/puzzle/neo/FreeRTOSConfig.h b/puzzle/neo/FreeRTOSConfig.h index c0acc49..d3a5d2f 100644 --- a/puzzle/neo/FreeRTOSConfig.h +++ b/puzzle/neo/FreeRTOSConfig.h @@ -49,4 +49,3 @@ #define INCLUDE_xTaskGetHandle 1 #define INCLUDE_xTaskResumeFromISR 1 #define INCLUDE_xQueueGetMutexHolder 1 - diff --git a/puzzle/neo/main.cpp b/puzzle/neo/main.cpp index 831f97e..f636b55 100644 --- a/puzzle/neo/main.cpp +++ b/puzzle/neo/main.cpp @@ -1,9 +1,9 @@ -#include <Arduino.h> -#include <Wire.h> -#include <Adafruit_NeoTrellis.h> -#include "pb-types.h" #include "pb-mod.h" +#include "pb-types.h" #include "pb.h" +#include <Adafruit_NeoTrellis.h> +#include <Arduino.h> +#include <Wire.h> #define MATRIX_SIZE 8 #define LED_COLOR_ON 0x0000FF // Color of the LEDs in ON state @@ -12,11 +12,14 @@ #define LED_COLOR_ORANGE 0xFFA500 // Orange color for IDLE state Adafruit_NeoTrellis t_array[MATRIX_SIZE / 4][MATRIX_SIZE / 4] = { - { Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_1), Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_2) }, - { Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_3), Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_4) }, + {Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_1), + Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_2)}, + {Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_3), + Adafruit_NeoTrellis(PB_ADDR_ADA_NEO_4)}, }; -Adafruit_MultiTrellis trellis((Adafruit_NeoTrellis *)t_array, MATRIX_SIZE / 4, MATRIX_SIZE / 4); +Adafruit_MultiTrellis trellis((Adafruit_NeoTrellis *) t_array, MATRIX_SIZE / 4, + MATRIX_SIZE / 4); bool neoMatrix[MATRIX_SIZE][MATRIX_SIZE]; // To track state of each pixel @@ -36,17 +39,19 @@ void toggleAdjacentLEDs(int x, int y) { int nx = x + dx, ny = y + dy; if (nx >= 0 && nx < MATRIX_SIZE && ny >= 0 && ny < MATRIX_SIZE) { neoMatrix[nx][ny] = !neoMatrix[nx][ny]; - trellis.setPixelColor(nx * MATRIX_SIZE + ny, neoMatrix[nx][ny] ? LED_COLOR_ON : LED_COLOR_OFF); + trellis.setPixelColor(nx * MATRIX_SIZE + ny, + neoMatrix[nx][ny] ? LED_COLOR_ON + : LED_COLOR_OFF); } } } } - bool isNeoPuzzleSolved() { for (int i = 0; i < MATRIX_SIZE; i++) { for (int j = 0; j < MATRIX_SIZE; j++) { - if (neoMatrix[i][j]) return false; // If any LED is on, puzzle is not solved + if (neoMatrix[i][j]) + return false; // If any LED is on, puzzle is not solved } } return true; @@ -69,7 +74,8 @@ TrellisCallback buttonCallback(keyEvent evt) { void setup() { Serial.begin(115200); - while (!Serial); // Wait for Serial to be read + while (!Serial) + ; // Wait for Serial to be read if (!trellis.begin()) { Serial.println("Failed to initialize NeoTrellis"); pb_hook_mod_state_write(PB_GS_NOINIT); @@ -77,14 +83,16 @@ void setup() { } void set_game_field() { - if (gamefield == false){ + if (gamefield == false) { // Initialize the matrix with a checkerboard pattern bool toggle = false; for (int i = 0; i < MATRIX_SIZE; i++) { for (int j = 0; j < MATRIX_SIZE; j++) { neoMatrix[i][j] = toggle; toggle = !toggle; - trellis.setPixelColor(i * MATRIX_SIZE + j, neoMatrix[i][j] ? LED_COLOR_ON : LED_COLOR_OFF); + trellis.setPixelColor(i * MATRIX_SIZE + j, neoMatrix[i][j] + ? LED_COLOR_ON + : LED_COLOR_OFF); } toggle = !toggle; } @@ -100,13 +108,9 @@ void set_game_field() { } } -pb_global_state_t pb_hook_mod_state_read() { - return puzzleState; -} +pb_global_state_t pb_hook_mod_state_read() { return puzzleState; } -void pb_hook_mod_state_write(pb_global_state_t state) { - puzzleState = state; -} +void pb_hook_mod_state_write(pb_global_state_t state) { puzzleState = state; } void flashCorners(uint32_t color) { unsigned long currentMillis = millis(); @@ -120,14 +124,19 @@ void flashCorners(uint32_t color) { int baseIndex = (i * 4 * MATRIX_SIZE) + (j * 4); if (ledState) { trellis.setPixelColor(baseIndex, color); // Top-left corner - trellis.setPixelColor(baseIndex + 3, color); // Top-right corner - trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE, color); // Bottom-left corner - trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE + 3, color); // Bottom-right corner + trellis.setPixelColor(baseIndex + 3, + color); // Top-right corner + trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE, + color); // Bottom-left corner + trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE + 3, + color); // Bottom-right corner } else { trellis.setPixelColor(baseIndex, LED_COLOR_OFF); trellis.setPixelColor(baseIndex + 3, LED_COLOR_OFF); - trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE, LED_COLOR_OFF); - trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE + 3, LED_COLOR_OFF); + trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE, + LED_COLOR_OFF); + trellis.setPixelColor(baseIndex + 3 * MATRIX_SIZE + 3, + LED_COLOR_OFF); } } } @@ -136,7 +145,7 @@ void flashCorners(uint32_t color) { } void loop() { - switch(puzzleState) { + switch (puzzleState) { case PB_GS_PLAYING: set_game_field(); trellis.read(); // Process button events @@ -155,4 +164,3 @@ void loop() { break; } } - diff --git a/puzzle/neo/mod.c b/puzzle/neo/mod.c index 7157d22..32b348a 100644 --- a/puzzle/neo/mod.c +++ b/puzzle/neo/mod.c @@ -1,6 +1,5 @@ -#include "pb.h" #include "pb-mod.h" +#include "pb.h" const char * PB_MOD_NAME = "neotrellis"; const i2c_addr_t PB_MOD_ADDR = PB_ADDR_MOD_NEOTRELLIS; - diff --git a/puzzle/smoketest/FreeRTOSConfig.h b/puzzle/smoketest/FreeRTOSConfig.h index 81c487f..44fc902 100644 --- a/puzzle/smoketest/FreeRTOSConfig.h +++ b/puzzle/smoketest/FreeRTOSConfig.h @@ -49,4 +49,3 @@ #define INCLUDE_xTaskGetHandle 1 #define INCLUDE_xTaskResumeFromISR 1 #define INCLUDE_xQueueGetMutexHolder 1 - diff --git a/puzzle/smoketest/main.cpp b/puzzle/smoketest/main.cpp index 3169ed5..35a4ec9 100644 --- a/puzzle/smoketest/main.cpp +++ b/puzzle/smoketest/main.cpp @@ -1,6 +1,6 @@ -#include <Arduino.h> -#include "lib/pbdrv/pb-types.h" #include "lib/pbdrv/pb-mod.h" +#include "lib/pbdrv/pb-types.h" +#include <Arduino.h> //! LED pin (on-board LED on Arduino Uno board) \ingroup puz_smoketest #define EXTERNAL_LED_PIN 13 @@ -9,17 +9,13 @@ pb_global_state_t state = PB_GS_NOINIT; -pb_global_state_t pb_hook_mod_state_read() { - return state; -} +pb_global_state_t pb_hook_mod_state_read() { return state; } -void pb_hook_mod_state_write(pb_global_state_t _state) { - state = _state; -} +void pb_hook_mod_state_write(pb_global_state_t _state) { state = _state; } void setup() { - pinMode(EXTERNAL_LED_PIN, OUTPUT); - pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(EXTERNAL_LED_PIN, OUTPUT); + pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { @@ -28,4 +24,3 @@ void loop() { if (!digitalRead(BUTTON_PIN)) // button is inverted state = PB_GS_SOLVED; } - diff --git a/puzzle/smoketest/mod.c b/puzzle/smoketest/mod.c index a1e2843..d9d5824 100644 --- a/puzzle/smoketest/mod.c +++ b/puzzle/smoketest/mod.c @@ -1,6 +1,5 @@ -#include "pb.h" #include "pb-mod.h" +#include "pb.h" const char * PB_MOD_NAME = "smoketest"; const i2c_addr_t PB_MOD_ADDR = PB_ADDR_MOD_SMOKETEST; - diff --git a/puzzle/vault/FreeRTOSConfig.h b/puzzle/vault/FreeRTOSConfig.h index c0acc49..d3a5d2f 100644 --- a/puzzle/vault/FreeRTOSConfig.h +++ b/puzzle/vault/FreeRTOSConfig.h @@ -49,4 +49,3 @@ #define INCLUDE_xTaskGetHandle 1 #define INCLUDE_xTaskResumeFromISR 1 #define INCLUDE_xQueueGetMutexHolder 1 - diff --git a/puzzle/vault/main.cpp b/puzzle/vault/main.cpp index 88d5b35..ba65c12 100644 --- a/puzzle/vault/main.cpp +++ b/puzzle/vault/main.cpp @@ -1,7 +1,7 @@ +#include "lib/pbdrv/pb-mod.h" +#include "lib/pbdrv/pb-types.h" #include <Arduino.h> #include <TM1637Display.h> -#include "lib/pbdrv/pb-types.h" -#include "lib/pbdrv/pb-mod.h" #define TOTAL_LEVELS 5 #define ROWS 4 @@ -9,38 +9,39 @@ #define CLK 2 #define DIO 3 #define SOLVED_PIN 53 -#define I2C_MODULE_ADDRESS 0x08 // Address of the puzzle module -#define HANDSHAKE_RECEIVED {0x70, 0x75, 0x7a, 0x62, 0x75, 0x73} // Magic command for the handshake -#define HANDSHAKE_SEND {0x67, 0x61, 0x6d, 0x69, 0x6e, 0x67} // Magic command for the handshake -#define REQUEST_STATE_CMD 0x53 // 'S' to request the game state +#define I2C_MODULE_ADDRESS 0x08 // Address of the puzzle module +#define HANDSHAKE_RECEIVED \ + { 0x70, 0x75, 0x7a, 0x62, 0x75, 0x73 } // Magic command for the handshake +#define HANDSHAKE_SEND \ + { 0x67, 0x61, 0x6d, 0x69, 0x6e, 0x67 } // Magic command for the handshake +#define REQUEST_STATE_CMD 0x53 // 'S' to request the game state const int ROW_PINS[ROWS] = {7, 6, 5, 4}; const int COL_PINS[COLS] = {10, 9, 8}; -const char* validButtons[TOTAL_LEVELS] = {"A2", "B1", "D3", "C2", "C3"}; +const char * validButtons[TOTAL_LEVELS] = {"A2", "B1", "D3", "C2", "C3"}; const char bombCode[] = "1234"; const uint8_t SEGMENT_MAP[] = { - 0b00111111, // 0 - 0b00000110, // 1 - 0b01011011, // 2 - 0b01001111, // 3 - 0b01100110, // 4 - 0b01101101, // 5 - 0b01111101, // 6 - 0b00000111, // 7 - 0b01111111, // 8 - 0b01101111, // 9 - 0b01110111, // A - 0b01111100, // B - 0b00111001, // C - 0b01011110, // D - 0b01111001, // E - 0b01110001 // F - // Add other letters if needed + 0b00111111, // 0 + 0b00000110, // 1 + 0b01011011, // 2 + 0b01001111, // 3 + 0b01100110, // 4 + 0b01101101, // 5 + 0b01111101, // 6 + 0b00000111, // 7 + 0b01111111, // 8 + 0b01101111, // 9 + 0b01110111, // A + 0b01111100, // B + 0b00111001, // C + 0b01011110, // D + 0b01111001, // E + 0b01110001 // F + // Add other letters if needed }; // This array of level codes matches the codes you might display per level. -const char* levelCodes[TOTAL_LEVELS] = {"A1", "B2", "D1", "C3", "A2"}; - +const char * levelCodes[TOTAL_LEVELS] = {"A1", "B2", "D1", "C3", "A2"}; // Puzzle state pb_global_state_t puzzleState = PB_GS_NOINIT; @@ -50,142 +51,138 @@ TM1637Display display(CLK, DIO); int currentLevel = 0; void blink_display(int num) { - if (num == 1) { - // Display "1111" with leading zeros shown if necessary - display.showNumberDecEx(1111, 0b11111111, true); - } else if (num == 0) { - // Display "0000" with leading zeros shown if necessary - display.showNumberDecEx(0, 0b11111111, true); - } - delay(500); - display.clear(); - delay(500); + if (num == 1) { + // Display "1111" with leading zeros shown if necessary + display.showNumberDecEx(1111, 0b11111111, true); + } else if (num == 0) { + // Display "0000" with leading zeros shown if necessary + display.showNumberDecEx(0, 0b11111111, true); + } + delay(500); + display.clear(); + delay(500); } +void display_final_code(const char * code) { + uint8_t segs[4] = {0, 0, 0, 0}; + int numDigits = strlen(code); + numDigits = numDigits > 4 ? 4 : numDigits; -void display_final_code(const char* code) { - uint8_t segs[4] = {0, 0, 0, 0}; - int numDigits = strlen(code); - numDigits = numDigits > 4 ? 4 : numDigits; + for (int i = 0; i < numDigits; i++) { + segs[i] = display.encodeDigit(code[i] - '0'); + } - for (int i = 0; i < numDigits; i++) { - segs[i] = display.encodeDigit(code[i] - '0'); - } - - display.setSegments(segs, numDigits, 0); + display.setSegments(segs, numDigits, 0); } void check_button_press() { - for (int col = 0; col < COLS; col++) { - digitalWrite(COL_PINS[col], LOW); - for (int row = 0; row < ROWS; row++) { - if (digitalRead(ROW_PINS[row]) == LOW) { - delay(50); - if (digitalRead(ROW_PINS[row]) == LOW) { - char keyPress[3] = {'A' + row, '1' + col, '\0'}; - Serial.print("Keypress detected: "); - Serial.println(keyPress); - if (strcmp(keyPress, validButtons[currentLevel]) == 0) { - currentLevel++; - if (currentLevel >= TOTAL_LEVELS) { - pb_hook_mod_state_write(PB_GS_SOLVED); - Serial.println("Puzzle solved!"); - display.showNumberDec(currentLevel + 1, true); - digitalWrite(SOLVED_PIN, HIGH); - } - } else { - currentLevel = 0; - } - while (digitalRead(ROW_PINS[row]) == LOW) {} // Ensure button release - } - } - } - digitalWrite(COL_PINS[col], HIGH); - } + for (int col = 0; col < COLS; col++) { + digitalWrite(COL_PINS[col], LOW); + for (int row = 0; row < ROWS; row++) { + if (digitalRead(ROW_PINS[row]) == LOW) { + delay(50); + if (digitalRead(ROW_PINS[row]) == LOW) { + char keyPress[3] = {'A' + row, '1' + col, '\0'}; + Serial.print("Keypress detected: "); + Serial.println(keyPress); + if (strcmp(keyPress, validButtons[currentLevel]) == 0) { + currentLevel++; + if (currentLevel >= TOTAL_LEVELS) { + pb_hook_mod_state_write(PB_GS_SOLVED); + Serial.println("Puzzle solved!"); + display.showNumberDec(currentLevel + 1, true); + digitalWrite(SOLVED_PIN, HIGH); + } + } else { + currentLevel = 0; + } + while (digitalRead(ROW_PINS[row]) == LOW) { + } // Ensure button release + } + } + } + digitalWrite(COL_PINS[col], HIGH); + } } void initialize_system() { - for (int i = 0; i < ROWS; i++) { - pinMode(ROW_PINS[i], INPUT_PULLUP); - } - for (int i = 0; i < COLS; i++) { - pinMode(COL_PINS[i], OUTPUT); - digitalWrite(COL_PINS[i], HIGH); - } - Serial.println("GPIO and display initialized."); + for (int i = 0; i < ROWS; i++) { + pinMode(ROW_PINS[i], INPUT_PULLUP); + } + for (int i = 0; i < COLS; i++) { + pinMode(COL_PINS[i], OUTPUT); + digitalWrite(COL_PINS[i], HIGH); + } + Serial.println("GPIO and display initialized."); } void display_code_for_level(int level) { - char code[3] = {0}; // Temp storage for level code - strncpy(code, levelCodes[level], 2); // Copy the level-specific code - - uint8_t segs[4] = {0}; // Segments to send to the display - - // Check if the first character is a letter and map it - if (isalpha(code[0])) { - if (code[0] >= 'A' && code[0] <= 'F') { - segs[0] = SEGMENT_MAP[code[0] - 'A' + 10]; // Maps A-F to their segment patterns - } else { - // Handle unexpected characters or extend SEGMENT_MAP for more letters - segs[0] = 0; // Display nothing for undefined letters - } - } else { - // Assume it's a number and map directly - segs[0] = SEGMENT_MAP[code[0] - '0']; - } - - // Check if the second character is a digit and map it - if (isdigit(code[1])) { - segs[1] = SEGMENT_MAP[code[1] - '0']; - } else { - // Handle unexpected characters - segs[1] = 0; // Display nothing for undefined digits - } - - // Set only the first two segments, leave others blank - display.setSegments(segs, 2, 0); // Display on leftmost two digits + char code[3] = {0}; // Temp storage for level code + strncpy(code, levelCodes[level], 2); // Copy the level-specific code + + uint8_t segs[4] = {0}; // Segments to send to the display + + // Check if the first character is a letter and map it + if (isalpha(code[0])) { + if (code[0] >= 'A' && code[0] <= 'F') { + segs[0] = SEGMENT_MAP[code[0] - 'A' + + 10]; // Maps A-F to their segment patterns + } else { + // Handle unexpected characters or extend SEGMENT_MAP for more letters + segs[0] = 0; // Display nothing for undefined letters + } + } else { + // Assume it's a number and map directly + segs[0] = SEGMENT_MAP[code[0] - '0']; + } + + // Check if the second character is a digit and map it + if (isdigit(code[1])) { + segs[1] = SEGMENT_MAP[code[1] - '0']; + } else { + // Handle unexpected characters + segs[1] = 0; // Display nothing for undefined digits + } + + // Set only the first two segments, leave others blank + display.setSegments(segs, 2, 0); // Display on leftmost two digits } +pb_global_state_t pb_hook_mod_state_read() { return puzzleState; } -pb_global_state_t pb_hook_mod_state_read() { - return puzzleState; -} - -void pb_hook_mod_state_write(pb_global_state_t state) { - puzzleState = state; -} +void pb_hook_mod_state_write(pb_global_state_t state) { puzzleState = state; } -void pb_hook_ev_main_state_update(pb_global_state_t state){ +void pb_hook_ev_main_state_update(pb_global_state_t state) { Serial.println("WE IN BOISS"); } void setup() { - Serial.begin(115200); - pinMode(SOLVED_PIN, OUTPUT); - digitalWrite(SOLVED_PIN, LOW); - display.setBrightness(0x0f); - initialize_system(); + Serial.begin(115200); + pinMode(SOLVED_PIN, OUTPUT); + digitalWrite(SOLVED_PIN, LOW); + display.setBrightness(0x0f); + initialize_system(); } void loop() { - switch(puzzleState) { - case PB_GS_PLAYING: - display_code_for_level(currentLevel); - check_button_press(); - delay(100); - break; - case PB_GS_SOLVED: - Serial.println("STATE = PB_GS_SOLVED"); - display_final_code(bombCode); - digitalWrite(SOLVED_PIN, HIGH); - break; - case PB_GS_NOINIT: - Serial.println("STATE = PB_GS_NOINIT"); - blink_display(0); - break; - case PB_GS_IDLE: - Serial.println("STATE = PB_GS_IDLE"); - blink_display(1); - break; - } + switch (puzzleState) { + case PB_GS_PLAYING: + display_code_for_level(currentLevel); + check_button_press(); + delay(100); + break; + case PB_GS_SOLVED: + Serial.println("STATE = PB_GS_SOLVED"); + display_final_code(bombCode); + digitalWrite(SOLVED_PIN, HIGH); + break; + case PB_GS_NOINIT: + Serial.println("STATE = PB_GS_NOINIT"); + blink_display(0); + break; + case PB_GS_IDLE: + Serial.println("STATE = PB_GS_IDLE"); + blink_display(1); + break; + } } diff --git a/puzzle/vault/mod.c b/puzzle/vault/mod.c index bae8a3d..250cb66 100644 --- a/puzzle/vault/mod.c +++ b/puzzle/vault/mod.c @@ -1,6 +1,5 @@ -#include "pb.h" #include "pb-mod.h" +#include "pb.h" const char * PB_MOD_NAME = "vault"; const i2c_addr_t PB_MOD_ADDR = PB_ADDR_MOD_VAULT; - |