194 lines
6.7 KiB
C++
194 lines
6.7 KiB
C++
#include "helper.h"
|
|
|
|
// TODO: move to driver
|
|
void clean_bomb(void) {
|
|
// clear pending inputs
|
|
clear_all_pressed_released();
|
|
clear_wires_pressed_released_cut();
|
|
|
|
// clear leds
|
|
leds_clear();
|
|
leds_flush();
|
|
|
|
// clear module timer
|
|
stop_module_timer();
|
|
set_module_time(0);
|
|
uint8_t clear[4] = {0};
|
|
set_module_sseg_raw(clear);
|
|
|
|
// clear char lcd
|
|
lcd_clear();
|
|
lcd_set_cursor_vis(false);
|
|
lcd_cursor_home();
|
|
}
|
|
|
|
static const int STRING_MAX_LEN = 8;
|
|
void do_star_codes(StarCodeHandler* star_codes, int star_codes_len) {
|
|
KeypadKey key;
|
|
|
|
int current_idx = 0;
|
|
char current[STRING_MAX_LEN+1] = {0};
|
|
|
|
while (1) {
|
|
while (get_keypad_pressed(&key)) {
|
|
if (key == KeypadKey::star) {
|
|
current[0] = '*';
|
|
for (int i = 1; i < STRING_MAX_LEN; i++) {
|
|
current[i] = 0;
|
|
}
|
|
current_idx = 1;
|
|
} else if (key == KeypadKey::pound) {
|
|
// submit
|
|
if (current[0] == '\0') {
|
|
continue;
|
|
}
|
|
|
|
bool hit = false;
|
|
for (int i = 0; i < star_codes_len; i++) {
|
|
StarCodeHandler sch = star_codes[i];
|
|
if (strcmp(current, sch.code) == 0) {
|
|
hit = true;
|
|
lcd_print(1, 2, sch.display_text);
|
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
|
if (sch.callback != nullptr) {
|
|
(sch.callback)();
|
|
}
|
|
if (sch.should_exit) {
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!hit) {
|
|
lcd_print(1, 2, "Invalid Star Code");
|
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
|
}
|
|
|
|
// clear
|
|
for (int i = 0; i < STRING_MAX_LEN; i++) {
|
|
current[i] = 0;
|
|
}
|
|
current_idx = 0;
|
|
} else {
|
|
// out of room. skip
|
|
if (current_idx >= STRING_MAX_LEN) break;
|
|
// no code started.
|
|
if (current[0] != '*') continue;
|
|
|
|
char c = char_of_keypad_key(key);
|
|
current[current_idx++] = c;
|
|
}
|
|
// ESP_LOGI(STEP0_TAG, "Pressed: %c", c);
|
|
|
|
lcd_clear();
|
|
lcd_print(1, 1, current);
|
|
}
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(10));
|
|
}
|
|
}
|
|
|
|
static lv_obj_t* old_scr;
|
|
static lv_obj_t* scr;
|
|
|
|
static lv_style_t game_results_style;
|
|
static lv_obj_t* overall_results_label;
|
|
static lv_obj_t* breakdown_results_label;
|
|
static lv_obj_t* strike_numbers_label;
|
|
static lv_obj_t* step_times_label;
|
|
|
|
static void write_time(char* buf, int32_t game_time) {
|
|
char minus[2] = "\0";
|
|
if (game_time < 0) {
|
|
minus[0] = '-';
|
|
game_time = -game_time;
|
|
}
|
|
|
|
uint8_t hours = (game_time / (1000*60*60)) % 10;
|
|
uint8_t minutes = (game_time / (1000*60)) % 60;
|
|
uint8_t seconds = (game_time / (1000)) % 60;
|
|
|
|
sprintf(buf, "%s%d:%02d:%02d", minus, hours, minutes, seconds);
|
|
}
|
|
|
|
extern uint32_t initial_game_time;
|
|
void display_game_results(void) {
|
|
while (xSemaphoreTake(xGuiSemaphore, portMAX_DELAY) == pdFALSE) vTaskDelay(pdMS_TO_TICKS(10));
|
|
scr = lv_obj_create(NULL);
|
|
lv_obj_set_style_bg_color(scr, lv_color_black(), LV_STATE_DEFAULT);
|
|
|
|
lv_style_init(&game_results_style);
|
|
lv_style_set_text_color(&game_results_style, lv_color_white());
|
|
lv_style_set_text_align(&game_results_style, LV_TEXT_ALIGN_LEFT);
|
|
|
|
overall_results_label = lv_label_create(scr);
|
|
lv_obj_align(overall_results_label, LV_ALIGN_TOP_LEFT, 20, 20);
|
|
lv_obj_set_size(overall_results_label, 460, 140);
|
|
lv_obj_add_style(overall_results_label, &game_results_style, LV_STATE_DEFAULT);
|
|
|
|
breakdown_results_label = lv_label_create(scr);
|
|
lv_obj_align(breakdown_results_label, LV_ALIGN_BOTTOM_LEFT, 20, 0);
|
|
lv_obj_set_size(breakdown_results_label, 460, 140);
|
|
lv_obj_add_style(breakdown_results_label, &game_results_style, LV_STATE_DEFAULT);
|
|
|
|
strike_numbers_label = lv_label_create(scr);
|
|
lv_obj_align(strike_numbers_label, LV_ALIGN_BOTTOM_LEFT, 90, 0);
|
|
lv_obj_set_size(strike_numbers_label, 60, 140);
|
|
lv_obj_add_style(strike_numbers_label, &game_results_style, LV_STATE_DEFAULT);
|
|
lv_obj_set_style_text_align(strike_numbers_label, LV_TEXT_ALIGN_RIGHT, LV_STATE_DEFAULT);
|
|
|
|
step_times_label = lv_label_create(scr);
|
|
lv_obj_align(step_times_label, LV_ALIGN_BOTTOM_LEFT, 140, 0);
|
|
lv_obj_set_size(step_times_label, 80, 140);
|
|
lv_obj_add_style(step_times_label, &game_results_style, LV_STATE_DEFAULT);
|
|
lv_obj_set_style_text_align(step_times_label, LV_TEXT_ALIGN_RIGHT, LV_STATE_DEFAULT);
|
|
|
|
char buf[1024] = {0};
|
|
|
|
char time_buf_1[32] = {0};
|
|
char time_buf_2[32] = {0};
|
|
char time_buf_3[32] = {0};
|
|
char time_buf_4[32] = {0};
|
|
char time_buf_5[32] = {0};
|
|
char time_buf_6[32] = {0};
|
|
|
|
int32_t time_left = get_game_time();
|
|
int32_t time_spent = initial_game_time - time_left;
|
|
int32_t true_time_spent = time_spent - (total_strikes * STRIKE_TIME_PENALTY);
|
|
write_time(time_buf_1, time_left);
|
|
write_time(time_buf_2, time_spent);
|
|
write_time(time_buf_3, true_time_spent);
|
|
|
|
sprintf(buf,
|
|
"Finished!\n\tTotal Strikes: %ld\n\tTime Left (w/ penalties): %s\n\tTime Spent (w/ penalties): %s\n\tTrue Time Spent: %s\n\n",
|
|
total_strikes, time_buf_1, time_buf_2, time_buf_3
|
|
);
|
|
lv_label_set_text(overall_results_label, buf);
|
|
|
|
lv_label_set_text(breakdown_results_label, "Step Breakdown:\n\tStep 1: \n\tStep 2:\n\tStep 3:\n\tStep 4:\n\tStep 5:\n\tStep 6:");
|
|
|
|
sprintf(buf,
|
|
"\n%ld strikes\n%ld strikes\n%ld strikes\n%ld strikes\n%ld strikes\n%ld strikes",
|
|
step_strikes[0], step_strikes[1], step_strikes[2], step_strikes[3], step_strikes[4], step_strikes[5]
|
|
);
|
|
lv_label_set_text(strike_numbers_label, buf);
|
|
|
|
write_time(time_buf_1, initial_game_time - step_finish_times[0]);
|
|
write_time(time_buf_2, step_finish_times[0] - step_finish_times[1]);
|
|
write_time(time_buf_3, step_finish_times[1] - step_finish_times[2]);
|
|
write_time(time_buf_4, step_finish_times[2] - step_finish_times[3]);
|
|
write_time(time_buf_5, step_finish_times[3] - step_finish_times[4]);
|
|
write_time(time_buf_6, step_finish_times[4] - step_finish_times[5]);
|
|
sprintf(buf,
|
|
"\n%s\n%s\n%s\n%s\n%s\n%s",
|
|
time_buf_1, time_buf_2, time_buf_3, time_buf_4, time_buf_5, time_buf_6
|
|
);
|
|
lv_label_set_text(step_times_label, buf);
|
|
|
|
old_scr = lv_scr_act();
|
|
lv_scr_load(scr);
|
|
|
|
xSemaphoreGive(xGuiSemaphore);
|
|
}
|