mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-25 03:29:58 -07:00
114 lines
3.2 KiB
C
114 lines
3.2 KiB
C
#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;
|
|
}
|
|
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;
|
|
}
|