updates to bottom half code and "debug switches" helper

This commit is contained in:
2025-03-25 19:27:20 -05:00
parent b594d6fcb3
commit 5bb6b05002
9 changed files with 243 additions and 191 deletions
+44 -15
View File
@@ -258,34 +258,63 @@ static void set_game_time(void) {
}
static void print_bin(char* out_str, uint8_t n) {
out_str[0] = ((n & 0b1000) ? '1' : '0');
out_str[1] = ((n & 0b0100) ? '1' : '0');
out_str[2] = ((n & 0b0010) ? '1' : '0');
out_str[3] = ((n & 0b0001) ? '1' : '0');
static void print_4bin_rev(char* out_str, uint8_t n) {
out_str[0] = ((n & 0b0001) ? '1' : '0');
out_str[1] = ((n & 0b0010) ? '1' : '0');
out_str[2] = ((n & 0b0100) ? '1' : '0');
out_str[3] = ((n & 0b1000) ? '1' : '0');
out_str[4] = '\0';
}
static void debug_switches(void) {
clean_bomb();
uint8_t switch_state = 0;
uint8_t button_state = 0;
uint8_t switch_state = 0xFF;
uint8_t button_state = 0xFF;
char buff[5] = {0};
char bin_buf[5] = {0};
char buf[21] = {0};
KeypadKey key;
ButtonKey button;
SwitchKey switch_;
while (1) {
uint8_t new_button_state = get_button_state();
if (new_button_state != button_state) {
button_state = new_button_state;
print_bin(buff, button_state);
ESP_LOGI("main", "b: 0b%s", buff);
if (get_pressed_button(&button)) {
sprintf(buf, "Button Pressed: %d ", button);
lcd_print(0, 3, buf);
ESP_LOGI(TAG, "%s", buf);
}
if (get_released_button(&button)) {
sprintf(buf, "Button Released: %d ", button);
lcd_print(0, 3, buf);
ESP_LOGI(TAG, "%s", buf);
}
if (get_flipped_down_switch(&switch_)) {
sprintf(buf, "Switch Down: %d ", switch_);
lcd_print(0, 3, buf);
ESP_LOGI(TAG, "%s", buf);
}
if (get_flipped_up_switch(&switch_)) {
sprintf(buf, "Switch Up: %d ", switch_);
lcd_print(0, 3, buf);
ESP_LOGI(TAG, "%s", buf);
}
uint8_t new_switch_state = get_switch_state();
if (new_switch_state != switch_state) {
switch_state = new_switch_state;
print_bin(buff, switch_state);
ESP_LOGI("main", "s: 0b%s", buff);
print_4bin_rev(bin_buf, switch_state);
sprintf(buf, "s: %s", bin_buf);
lcd_print(1, 0, buf);
ESP_LOGI(TAG, "%s", buf);
}
uint8_t new_button_state = get_button_state();
if (new_button_state != button_state) {
button_state = new_button_state;
print_4bin_rev(bin_buf, button_state);
sprintf(buf, "b: %s", bin_buf);
lcd_print(1, 1, buf);
ESP_LOGI(TAG, "%s", buf);
}
if (get_pressed_keypad(&key) && key == KeypadKey::pound) {
+6 -6
View File
@@ -149,7 +149,7 @@ static uint8_t four_bit_flag(bool b0, bool b1, bool b2, bool b3) {
;
}
static void print_bin(char* out_str, uint8_t n) {
static void print_4bin(char* out_str, uint8_t n) {
out_str[0] = ((n & 0b1000) ? '1' : '0');
out_str[1] = ((n & 0b0100) ? '1' : '0');
out_str[2] = ((n & 0b0010) ? '1' : '0');
@@ -173,19 +173,19 @@ static void print_bin(char* out_str, uint8_t n) {
static void debug_correct_values(uint8_t correct_buttons, uint8_t button_mask, uint8_t correct_switches) {
char buf[20] = {0};
print_bin(buf, correct_switches);
print_4bin(buf, correct_switches);
ESP_LOGI(TAG, "Expected Switch State: 0b%s", buf);
print_bin(buf, correct_buttons);
print_4bin(buf, correct_buttons);
ESP_LOGI(TAG, "Expected Button State: 0b%s", buf);
print_bin(buf, button_mask);
print_4bin(buf, button_mask);
ESP_LOGI(TAG, "Button Mask: 0b%s", buf);
}
static void debug_actual_values(uint8_t buttons, uint8_t switch_) {
char buf[20] = {0};
print_bin(buf, switch_);
print_4bin(buf, switch_);
ESP_LOGI(TAG, "Actual Switch State: 0b%s", buf);
print_bin(buf, buttons);
print_4bin(buf, buttons);
ESP_LOGI(TAG, "Actual Button State: 0b%s", buf);
ESP_LOGI(TAG, "");
}
+36 -36
View File
@@ -17,22 +17,22 @@ static int max(int n0, int n1, int n2, int n3, int n4, int n5);
void wires_to_string(WireColor* wires, char* out_wires_string) {
for (int i = 0; i < NUM_WIRES; i++) {
switch (wires[i]) {
case WireColor::red:
case WireColor::wire_red:
out_wires_string[i] = 'r';
break;
case WireColor::yellow:
case WireColor::wire_yellow:
out_wires_string[i] = 'y';
break;
case WireColor::green:
case WireColor::wire_green:
out_wires_string[i] = 'g';
break;
case WireColor::blue:
case WireColor::wire_blue:
out_wires_string[i] = 'b';
break;
case WireColor::black:
case WireColor::wire_black:
out_wires_string[i] = 'k';
break;
case WireColor::white:
case WireColor::wire_white:
out_wires_string[i] = 'w';
break;
}
@@ -52,22 +52,22 @@ void string_to_wires(char* wires_string, WireColor* out_wires) {
for (int i = 0; i < NUM_WIRES; i++) {
switch (wires_string[i]) {
case 'r':
out_wires[i] = WireColor::red;
out_wires[i] = WireColor::wire_red;
break;
case 'y':
out_wires[i] = WireColor::yellow;
out_wires[i] = WireColor::wire_yellow;
break;
case 'g':
out_wires[i] = WireColor::green;
out_wires[i] = WireColor::wire_green;
break;
case 'b':
out_wires[i] = WireColor::blue;
out_wires[i] = WireColor::wire_blue;
break;
case 'k':
out_wires[i] = WireColor::black;
out_wires[i] = WireColor::wire_black;
break;
case 'w':
out_wires[i] = WireColor::white;
out_wires[i] = WireColor::wire_white;
break;
}
}
@@ -144,17 +144,17 @@ void solve_wires(WireColor* wires, bool* out_cut) {
int white_pos_len = 0;
for (int i = 0; i < NUM_WIRES; i++) {
if (wires[i] == WireColor::red) {
if (wires[i] == WireColor::wire_red) {
red_pos[red_pos_len++] = i;
} else if (wires[i] == WireColor::yellow) {
} else if (wires[i] == WireColor::wire_yellow) {
yellow_pos[yellow_pos_len++] = i;
} else if (wires[i] == WireColor::green) {
} else if (wires[i] == WireColor::wire_green) {
green_pos[green_pos_len++] = i;
} else if (wires[i] == WireColor::blue) {
} else if (wires[i] == WireColor::wire_blue) {
blue_pos[blue_pos_len++] = i;
} else if (wires[i] == WireColor::black) {
} else if (wires[i] == WireColor::wire_black) {
black_pos[black_pos_len++] = i;
} else if (wires[i] == WireColor::white) {
} else if (wires[i] == WireColor::wire_white) {
white_pos[white_pos_len++] = i;
}
}
@@ -193,7 +193,7 @@ void solve_wires(WireColor* wires, bool* out_cut) {
}
// 2. cut the first wire if it is green or white
if (wires[0] == WireColor::green || wires[0] == WireColor::white) {
if (wires[0] == WireColor::wire_green || wires[0] == WireColor::wire_white) {
out_cut[0] = true;
if (debug) {
printf("C2. cutting %d\n", 0);
@@ -202,7 +202,7 @@ void solve_wires(WireColor* wires, bool* out_cut) {
// 3. cut blue wires in even positions (odd indexes)
for (int i = 1; i < NUM_WIRES; i += 2) {
if (wires[i] == WireColor::blue) {
if (wires[i] == WireColor::wire_blue) {
out_cut[i] = true;
if (debug) {
printf("C3. cutting %d\n", i);
@@ -213,8 +213,8 @@ void solve_wires(WireColor* wires, bool* out_cut) {
// 4. cut black and yellow wires next to black and yellow wires
for (int i = 0; i < NUM_WIRES-1; i++) {
if (
(wires[i] == WireColor::yellow || wires[i] == WireColor::black) &&
(wires[i+1] == WireColor::yellow || wires[i+1] == WireColor::black)
(wires[i] == WireColor::wire_yellow || wires[i] == WireColor::wire_black) &&
(wires[i+1] == WireColor::wire_yellow || wires[i+1] == WireColor::wire_black)
) {
out_cut[i] = true;
out_cut[i+1] = true;
@@ -228,10 +228,10 @@ void solve_wires(WireColor* wires, bool* out_cut) {
for (int green_idx = green_pos_len-1; green_idx >= 0; green_idx--) {
int pos = green_pos[green_idx];
if (
wires[pos-1] == WireColor::yellow ||
wires[pos-1] == WireColor::white ||
wires[pos+1] == WireColor::yellow ||
wires[pos+1] == WireColor::white
wires[pos-1] == WireColor::wire_yellow ||
wires[pos-1] == WireColor::wire_white ||
wires[pos+1] == WireColor::wire_yellow ||
wires[pos+1] == WireColor::wire_white
) {
out_cut[pos] = true;
if (debug) {
@@ -242,7 +242,7 @@ void solve_wires(WireColor* wires, bool* out_cut) {
}
// 6. cut all white wires if there is a red wire in the 5th position
if (wires[4] == WireColor::red) {
if (wires[4] == WireColor::wire_red) {
for (int white_idx = 0; white_idx < white_pos_len; white_idx++) {
out_cut[white_pos[white_idx]] = true;
if (debug) {
@@ -307,8 +307,8 @@ void solve_wires(WireColor* wires, bool* out_cut) {
// 12. cut any wire adjacent to both a yellow and blue wire
for (int i = 0; i < NUM_WIRES-2; i++) {
if (
(wires[i] == WireColor::yellow && wires[i+2] == WireColor::blue) ||
(wires[i] == WireColor::blue && wires[i+2] == WireColor::yellow)
(wires[i] == WireColor::wire_yellow && wires[i+2] == WireColor::wire_blue) ||
(wires[i] == WireColor::wire_blue && wires[i+2] == WireColor::wire_yellow)
) {
out_cut[i+1] = true;
if (debug) {
@@ -323,10 +323,10 @@ void solve_wires(WireColor* wires, bool* out_cut) {
for (int i = 0; i < blue_pos_len; i++) {
int pos = blue_pos[i];
if (
wires[pos-1] == WireColor::red ||
wires[pos-1] == WireColor::green ||
wires[pos+1] == WireColor::red ||
wires[pos+1] == WireColor::green
wires[pos-1] == WireColor::wire_red ||
wires[pos-1] == WireColor::wire_green ||
wires[pos+1] == WireColor::wire_red ||
wires[pos+1] == WireColor::wire_green
) {
out_cut[pos] = false;
if (debug) {
@@ -346,13 +346,13 @@ void solve_wires(WireColor* wires, bool* out_cut) {
}
// 3. never cut red or black wires in the 4th or 7th positions
if (wires[3] == WireColor::red || wires[3] == WireColor::black) {
if (wires[3] == WireColor::wire_red || wires[3] == WireColor::wire_black) {
out_cut[3] = false;
if (debug) {
printf("N3. Never cutting %d\n", 3);
}
}
if (wires[6] == WireColor::red || wires[6] == WireColor::black) {
if (wires[6] == WireColor::wire_red || wires[6] == WireColor::wire_black) {
out_cut[6] = false;
if (debug) {
printf("N3. Never cutting %d\n", 6);
@@ -390,7 +390,7 @@ void solve_wires(WireColor* wires, bool* out_cut) {
}
// 6. never cut a blue or green wire in the 8th postion
if (wires[7] == WireColor::blue || wires[7] == WireColor::green) {
if (wires[7] == WireColor::wire_blue || wires[7] == WireColor::wire_green) {
out_cut[7] = false;
if (debug) {
printf("N6. Never cutting %d\n", 7);
+6 -6
View File
@@ -10,12 +10,12 @@
#define NUM_WIRES 8
typedef enum {
red = 0,
yellow = 1,
green = 2,
blue = 3,
black = 4,
white = 5,
wire_red = 0,
wire_yellow = 1,
wire_green = 2,
wire_blue = 3,
wire_black = 4,
wire_white = 5,
} WireColor;
void solve_wires(WireColor* wires, bool* out_cut);