#include #include #include #include #include #include #include "scrambler.h" #include "furi_hal_random.h" bool scrambleStarted = false; char scramble_str[100] = {0}; char scramble_start[100] = {0}; char scramble_end[100] = {0}; bool notifications_enabled = false; static void success_vibration() { furi_hal_vibro_on(false); furi_hal_vibro_on(true); furi_delay_ms(50); furi_hal_vibro_on(false); return; } void split_array(char original[], int size, char first[], char second[]) { int32_t mid = size / 2; if(size % 2 != 0) { mid++; } int32_t first_index = 0, second_index = 0; for(int32_t i = 0; i < size; i++) { if(i < mid) { first[first_index++] = original[i]; } else { if(i == mid && (original[i] == '2' || original[i] == '\'')) { continue; } second[second_index++] = original[i]; } } first[first_index] = '\0'; second[second_index] = '\0'; } void genScramble() { scrambleReplace(); strcpy(scramble_str, printData()); split_array(scramble_str, strlen(scramble_str), scramble_start, scramble_end); } static void draw_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 4, 13, "Rubik's Cube Scrambler"); canvas_set_font(canvas, FontSecondary); canvas_draw_str_aligned(canvas, 64, 28, AlignCenter, AlignCenter, scramble_start); canvas_draw_str_aligned(canvas, 64, 38, AlignCenter, AlignCenter, scramble_end); elements_button_center(canvas, "New"); elements_button_left(canvas, notifications_enabled ? "On" : "Off"); } static void input_callback(InputEvent* input_event, void* ctx) { furi_assert(ctx); FuriMessageQueue* event_queue = ctx; furi_message_queue_put(event_queue, input_event, FuriWaitForever); } int32_t rubiks_cube_scrambler_main(void* p) { UNUSED(p); InputEvent event; FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, draw_callback, NULL); view_port_input_callback_set(view_port, input_callback, event_queue); Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); while(true) { furi_check(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk); if(event.key == InputKeyOk && event.type == InputTypeShort) { genScramble(); if(notifications_enabled) { success_vibration(); } } if(event.key == InputKeyLeft && event.type == InputTypeShort) { if(notifications_enabled) { notifications_enabled = false; } else { notifications_enabled = true; success_vibration(); } } if(event.key == InputKeyBack) { break; } view_port_update(view_port); } furi_message_queue_free(event_queue); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_record_close(RECORD_GUI); return 0; }