|
|
@@ -0,0 +1,133 @@
|
|
|
+#include <stdio.h>
|
|
|
+#include <furi.h>
|
|
|
+#include <gui/gui.h>
|
|
|
+#include <input/input.h>
|
|
|
+#include <gui/elements.h>
|
|
|
+#include <furi_hal.h>
|
|
|
+
|
|
|
+#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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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;
|
|
|
+}
|