diff --git a/.gitignore b/.gitignore index a7b2ed0..8fd87e2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build/ managed_components/ dependencies.lock sdkconfig.old +.cache/ diff --git a/main/drivers/leds.h b/main/drivers/leds.h index 907012a..fab831e 100644 --- a/main/drivers/leds.h +++ b/main/drivers/leds.h @@ -24,14 +24,14 @@ typedef enum { rfid = 10, keypad = 11, char_lcd = 12, - s4 = 13, - s3 = 14, - s2 = 15, - s1 = 16, - b1 = 17, - b2 = 18, - b3 = 19, - b4 = 20, + switch4 = 13, + switch3 = 14, + switch2 = 15, + switch1 = 16, + button1 = 17, + button2 = 18, + button3 = 19, + button4 = 20, } Led; void init_leds(void); diff --git a/main/drivers/sseg.cpp b/main/drivers/sseg.cpp index 64fc154..6ccfded 100644 --- a/main/drivers/sseg.cpp +++ b/main/drivers/sseg.cpp @@ -8,18 +8,18 @@ void init_sseg() { sseg = new TM1640(SSEG_PIN_DATA, SSEG_PIN_CLK, 8); } -void set_game_sseg_raw(uint8_t* digits) { - sseg->setSegments(0, digits[0]); - sseg->setSegments(1, digits[1]); - sseg->setSegments(2, digits[2]); - sseg->setSegments(3, digits[3]); +void set_game_sseg_raw(const uint8_t* digits) { + sseg->setSegments(digits[0], 0); + sseg->setSegments(digits[1], 1); + sseg->setSegments(digits[2], 2); + sseg->setSegments(digits[3], 3); } -void set_module_sseg_raw(uint8_t* digits) { - sseg->setSegments(4, digits[0]); - sseg->setSegments(5, digits[1]); - sseg->setSegments(6, digits[2]); - sseg->setSegments(7, digits[3]); +void set_module_sseg_raw(const uint8_t* digits) { + sseg->setSegments(digits[0], 4); + sseg->setSegments(digits[1], 5); + sseg->setSegments(digits[2], 6); + sseg->setSegments(digits[3], 7); } void set_game_sseg_num(unsigned int value, int dot_pos) { diff --git a/main/drivers/sseg.h b/main/drivers/sseg.h index 53afd78..ffc84e9 100644 --- a/main/drivers/sseg.h +++ b/main/drivers/sseg.h @@ -17,14 +17,14 @@ void init_sseg(); /// the bits 0-6 map to segments A-G, and bit 7 is DP. /// /// `digits` must have len >= 4. -void set_game_sseg_raw(uint8_t* digits); +void set_game_sseg_raw(const uint8_t* digits); /// sets the module seven segment to the value of the digits /// /// the bits 0-6 map to segments A-G, and bit 7 is DP. /// /// `digits` must have len >= 4. -void set_module_sseg_raw(uint8_t* digits); +void set_module_sseg_raw(const uint8_t* digits); /// sets the game timer to the given number, with the dot at position `dot_pos` from the right (0 => right-most digit). void set_game_sseg_num(unsigned int value, int dot_pos); diff --git a/main/steps/step5.hpp b/main/steps/step5.hpp index 535d29e..5836814 100644 --- a/main/steps/step5.hpp +++ b/main/steps/step5.hpp @@ -1,10 +1,106 @@ #ifndef STEP_5_HPP #define STEP_5_HPP +#include "../drivers/bottom_half.h" +#include +#include + static const char *STEP5_TAG = "step5"; +Led speaker_led = speaker; + +const uint8_t SSEG_NUMS[10] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; +const uint8_t SSEG_MAPS[5][4] = { + {0b0101101, 0b1111010, 0b1000010, 0b1010100}, + {0b01000101, 0b00100100, 0b00110110, 0b01111011}, + {0b00101010, 0b00000010, 0b00010111, 0b00111100}, + {0b00111000, 0b01010010, 0b00101011, 0b00111010}, + {0b01000111, 0b00011001, 0b01111000, 0b00111110} +}; + +const int INDICATOR_RED[5] = {60, 0, 0, 35, 20}; +const int INDICATOR_GREEN[5] = {0, 0, 60, 25, 20}; +const int INDICATOR_BLUE[5] = {0, 60, 0, 0, 20}; + +// random number generators +std::random_device rd; +std::mt19937 gen(rd()); +std::uniform_int_distribution<> answer_dist(0, 9); +std::uniform_int_distribution<> map_dist(0, 4); +std::uniform_int_distribution<> display_dist(0, 3); +std::uniform_int_distribution<> random_segment_dist(0, 127); + +int answer = 0; +uint8_t answer_sseg = SSEG_NUMS[0]; +char answer_char = '0'; +uint8_t display_map[4] = {0b00000000, 0b00000000, 0b00000000, 0b00000000}; +int chosen_map = 0; + +void new_puzzle(void) { + // scramble lights + for (int i = 0; i < 5; i++) { + led_strip_set_pixel(leds, speaker_led, INDICATOR_RED[map_dist(gen)], INDICATOR_GREEN[map_dist(gen)], INDICATOR_BLUE[map_dist(gen)]); + led_strip_refresh(leds); + + uint8_t random_segments[4] = {0, 0, 0, 0}; + for (int i = 0; i < 4; i++) { + random_segments[i] = random_segment_dist(gen); + } + set_module_sseg_raw(random_segments); + vTaskDelay(pdMS_TO_TICKS(100)); + } + + answer = answer_dist(gen); + answer_sseg = SSEG_NUMS[answer]; + answer_char = '0' + answer; + // ESP_LOGI(STEP5_TAG, "Answer: %i", answer); + + chosen_map = map_dist(gen); + for (int i = 0; i < 4; ++i) { + display_map[i] = SSEG_MAPS[chosen_map][i]; + } + // ESP_LOGI(STEP5_TAG, "Chosen Map: %i", chosen_map); + + ESP_ERROR_CHECK(led_strip_set_pixel(leds, speaker_led, INDICATOR_RED[chosen_map], INDICATOR_GREEN[chosen_map], INDICATOR_BLUE[chosen_map])); + ESP_ERROR_CHECK(led_strip_refresh(leds)); + + for (int i = 0; i < 8; i++) { + bool bit = (answer_sseg >> i) & 1; + if (bit == 1) { + // choose display and flip bit + int display = display_dist(gen); + display_map[display] ^= (1 << i); + // ESP_LOGI(STEP5_TAG, "Flipping bit %i on display %i", i, display); + } + } +} + void step5(void) { - + KeypadKey key; + int solved_times = 0; + + new_puzzle(); + while(solved_times < 3) { + // for every bit in the answer- + set_module_sseg_raw(display_map); + if (get_pressed_keypad(&key)) { + char c = char_of_keypad_key(key); + // ESP_LOGI(STEP0_TAG, "Pressed: %c", c); + if (c == answer_char) { + solved_times++; + if (solved_times < 3) { + new_puzzle(); + } else { + uint8_t display_tmp[4] = {0b00000000, 0b00000000, 0b00000000, 0b00000000}; + set_module_sseg_raw(display_tmp); + } + } else { + strike("Incorrect Character!"); + } + } + vTaskDelay(pdMS_TO_TICKS(10)); + } + } #endif /* STEP_5_HPP */ \ No newline at end of file diff --git a/sdkconfig b/sdkconfig index 92b8d76..3b1f3c5 100644 --- a/sdkconfig +++ b/sdkconfig @@ -1,6 +1,6 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.2.1 Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.2.2 Project Configuration # CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 @@ -331,6 +331,7 @@ CONFIG_SOC_WIFI_WAPI_SUPPORT=y CONFIG_SOC_WIFI_CSI_SUPPORT=y CONFIG_SOC_WIFI_MESH_SUPPORT=y CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_PHY_NEEDS_USB_WORKAROUND=y CONFIG_SOC_BLE_SUPPORTED=y CONFIG_SOC_BLE_MESH_SUPPORTED=y CONFIG_SOC_BLE_50_SUPPORTED=y @@ -435,6 +436,7 @@ CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y CONFIG_ESP_ROM_USB_OTG_NUM=3 CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y CONFIG_ESP_ROM_GET_CLK_FREQ=y CONFIG_ESP_ROM_HAS_HAL_WDT=y CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y @@ -557,6 +559,7 @@ CONFIG_APPTRACE_LOCK_ENABLE=y # Bluetooth # # CONFIG_BT_ENABLED is not set +CONFIG_BT_ALARM_MAX_NUM=50 # end of Bluetooth # @@ -744,7 +747,10 @@ CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # # GDB Stub # +CONFIG_ESP_GDBSTUB_ENABLED=y # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 # end of GDB Stub # @@ -909,6 +915,7 @@ CONFIG_ESP_PHY_RF_CAL_PARTIAL=y # CONFIG_ESP_PHY_RF_CAL_NONE is not set # CONFIG_ESP_PHY_RF_CAL_FULL is not set CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set # end of PHY # @@ -1206,6 +1213,7 @@ CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set # end of Kernel # @@ -1493,7 +1501,9 @@ CONFIG_MBEDTLS_CMAC_C=y CONFIG_MBEDTLS_HARDWARE_AES=y CONFIG_MBEDTLS_AES_USE_INTERRUPT=y CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +# CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER is not set CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 CONFIG_MBEDTLS_HARDWARE_SHA=y @@ -1580,7 +1590,7 @@ CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y # CONFIG_MBEDTLS_CHACHA20_C is not set # CONFIG_MBEDTLS_HKDF_C is not set # CONFIG_MBEDTLS_THREADING_C is not set -# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y # end of mbedTLS # @@ -2222,6 +2232,8 @@ CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y # CONFIG_EVENT_LOOP_PROFILING is not set CONFIG_POST_EVENTS_FROM_ISR=y CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 # CONFIG_OTA_ALLOW_HTTP is not set # CONFIG_ESP_SYSTEM_PD_FLASH is not set CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000