|
@@ -31,7 +31,7 @@ typedef struct {
|
|
|
TextInput* text_input;
|
|
TextInput* text_input;
|
|
|
TextBox* text_box;
|
|
TextBox* text_box;
|
|
|
char input[TEXT_BUFFER_SIZE];
|
|
char input[TEXT_BUFFER_SIZE];
|
|
|
-} TextState;
|
|
|
|
|
|
|
+} AppState;
|
|
|
|
|
|
|
|
static void say_something(char* something) {
|
|
static void say_something(char* something) {
|
|
|
if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(1000)) {
|
|
if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(1000)) {
|
|
@@ -42,84 +42,103 @@ static void say_something(char* something) {
|
|
|
// return 0;
|
|
// return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// static void underscore_to_space(char* input) {
|
|
|
|
|
+// for(int i = 0; input[i] != '\0'; i++) {
|
|
|
|
|
+// if(input[i] == '_') {
|
|
|
|
|
+// app_state->input[i] = ' ';
|
|
|
|
|
+// } else {
|
|
|
|
|
+// app_state->input[i] = input[i];
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
+
|
|
|
static void text_input_callback(void* ctx) {
|
|
static void text_input_callback(void* ctx) {
|
|
|
- TextState* text_state = (TextState*)acquire_mutex((ValueMutex*)ctx, 25);
|
|
|
|
|
- FURI_LOG_D("SAM", "Input text: %s", text_state->input);
|
|
|
|
|
- FURI_LOG_D("SAM", "Upper text: %s", text_state->input);
|
|
|
|
|
- text_box_set_text(text_state->text_box, text_state->input);
|
|
|
|
|
- view_dispatcher_switch_to_view(text_state->view_dispatcher, 1);
|
|
|
|
|
|
|
+ AppState* app_state = (AppState*)acquire_mutex((ValueMutex*)ctx, 25);
|
|
|
|
|
+ FURI_LOG_D("SAM", "Input text: %s", app_state->input);
|
|
|
|
|
+
|
|
|
|
|
+ // underscore_to_space(app_state->input);
|
|
|
|
|
+ for(int i = 0; app_state->input[i] != '\0'; i++) {
|
|
|
|
|
+ if(app_state->input[i] == '_') {
|
|
|
|
|
+ app_state->input[i] = ' ';
|
|
|
|
|
+ } else {
|
|
|
|
|
+ app_state->input[i] = app_state->input[i];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- release_mutex((ValueMutex*)ctx, text_state);
|
|
|
|
|
|
|
+ text_box_set_text(app_state->text_box, app_state->input);
|
|
|
|
|
+ view_dispatcher_switch_to_view(app_state->view_dispatcher, 1);
|
|
|
|
|
+
|
|
|
|
|
+ release_mutex((ValueMutex*)ctx, app_state);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static bool back_event_callback(void* ctx) {
|
|
static bool back_event_callback(void* ctx) {
|
|
|
- const TextState* text_state = (TextState*)acquire_mutex((ValueMutex*)ctx, 25);
|
|
|
|
|
- view_dispatcher_stop(text_state->view_dispatcher);
|
|
|
|
|
- release_mutex((ValueMutex*)ctx, text_state);
|
|
|
|
|
|
|
+ const AppState* app_state = (AppState*)acquire_mutex((ValueMutex*)ctx, 25);
|
|
|
|
|
+ view_dispatcher_stop(app_state->view_dispatcher);
|
|
|
|
|
+ release_mutex((ValueMutex*)ctx, app_state);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void sam_state_init(TextState* const text_state) {
|
|
|
|
|
- text_state->view_dispatcher = view_dispatcher_alloc();
|
|
|
|
|
- text_state->text_input = text_input_alloc();
|
|
|
|
|
- text_state->text_box = text_box_alloc();
|
|
|
|
|
- text_box_set_font(text_state->text_box, TextBoxFontText);
|
|
|
|
|
|
|
+static void sam_state_init(AppState* const app_state) {
|
|
|
|
|
+ app_state->view_dispatcher = view_dispatcher_alloc();
|
|
|
|
|
+ app_state->text_input = text_input_alloc();
|
|
|
|
|
+ app_state->text_box = text_box_alloc();
|
|
|
|
|
+ text_box_set_font(app_state->text_box, TextBoxFontText);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void sam_state_free(TextState* const text_state) {
|
|
|
|
|
- text_input_free(text_state->text_input);
|
|
|
|
|
- text_box_free(text_state->text_box);
|
|
|
|
|
- view_dispatcher_remove_view(text_state->view_dispatcher, 0);
|
|
|
|
|
- view_dispatcher_remove_view(text_state->view_dispatcher, 1);
|
|
|
|
|
- view_dispatcher_free(text_state->view_dispatcher);
|
|
|
|
|
- free(text_state);
|
|
|
|
|
|
|
+static void sam_state_free(AppState* const app_state) {
|
|
|
|
|
+ text_input_free(app_state->text_input);
|
|
|
|
|
+ text_box_free(app_state->text_box);
|
|
|
|
|
+ view_dispatcher_remove_view(app_state->view_dispatcher, 0);
|
|
|
|
|
+ view_dispatcher_remove_view(app_state->view_dispatcher, 1);
|
|
|
|
|
+ view_dispatcher_free(app_state->view_dispatcher);
|
|
|
|
|
+ free(app_state);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
extern "C" int32_t sam_app(void* p) {
|
|
extern "C" int32_t sam_app(void* p) {
|
|
|
UNUSED(p);
|
|
UNUSED(p);
|
|
|
- TextState* text_state = (TextState*)malloc(sizeof(TextState));
|
|
|
|
|
|
|
+ AppState* app_state = (AppState*)malloc(sizeof(AppState));
|
|
|
|
|
|
|
|
FURI_LOG_D("SAM", "Running sam_state_init");
|
|
FURI_LOG_D("SAM", "Running sam_state_init");
|
|
|
- sam_state_init(text_state);
|
|
|
|
|
|
|
+ sam_state_init(app_state);
|
|
|
|
|
|
|
|
ValueMutex state_mutex;
|
|
ValueMutex state_mutex;
|
|
|
- if(!init_mutex(&state_mutex, text_state, sizeof(TextState))) {
|
|
|
|
|
|
|
+ if(!init_mutex(&state_mutex, app_state, sizeof(AppState))) {
|
|
|
FURI_LOG_E("SAM", "cannot create mutex\r\n");
|
|
FURI_LOG_E("SAM", "cannot create mutex\r\n");
|
|
|
- free(text_state);
|
|
|
|
|
|
|
+ free(app_state);
|
|
|
return 255;
|
|
return 255;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
FURI_LOG_D("SAM", "Assigning text input callback");
|
|
FURI_LOG_D("SAM", "Assigning text input callback");
|
|
|
text_input_set_result_callback(
|
|
text_input_set_result_callback(
|
|
|
- text_state->text_input,
|
|
|
|
|
|
|
+ app_state->text_input,
|
|
|
text_input_callback,
|
|
text_input_callback,
|
|
|
&state_mutex,
|
|
&state_mutex,
|
|
|
- text_state->input,
|
|
|
|
|
|
|
+ app_state->input,
|
|
|
TEXT_BUFFER_SIZE,
|
|
TEXT_BUFFER_SIZE,
|
|
|
//clear default text
|
|
//clear default text
|
|
|
true);
|
|
true);
|
|
|
- text_input_set_header_text(text_state->text_input, "Input");
|
|
|
|
|
|
|
+ text_input_set_header_text(app_state->text_input, "Input");
|
|
|
|
|
|
|
|
// Open GUI and register view_port
|
|
// Open GUI and register view_port
|
|
|
Gui* gui = (Gui*)furi_record_open("gui");
|
|
Gui* gui = (Gui*)furi_record_open("gui");
|
|
|
//gui_add_view_port(gui, view_port, GuiLayerFullscreen);
|
|
//gui_add_view_port(gui, view_port, GuiLayerFullscreen);
|
|
|
|
|
|
|
|
FURI_LOG_D("SAM", "Enabling view dispatcher queue");
|
|
FURI_LOG_D("SAM", "Enabling view dispatcher queue");
|
|
|
- view_dispatcher_enable_queue(text_state->view_dispatcher);
|
|
|
|
|
|
|
+ view_dispatcher_enable_queue(app_state->view_dispatcher);
|
|
|
|
|
|
|
|
FURI_LOG_D("SAM", "Adding text input view to dispatcher");
|
|
FURI_LOG_D("SAM", "Adding text input view to dispatcher");
|
|
|
view_dispatcher_add_view(
|
|
view_dispatcher_add_view(
|
|
|
- text_state->view_dispatcher, 0, text_input_get_view(text_state->text_input));
|
|
|
|
|
|
|
+ app_state->view_dispatcher, 0, text_input_get_view(app_state->text_input));
|
|
|
view_dispatcher_add_view(
|
|
view_dispatcher_add_view(
|
|
|
- text_state->view_dispatcher, 1, text_box_get_view(text_state->text_box));
|
|
|
|
|
|
|
+ app_state->view_dispatcher, 1, text_box_get_view(app_state->text_box));
|
|
|
|
|
+
|
|
|
FURI_LOG_D("SAM", "Attaching view dispatcher to GUI");
|
|
FURI_LOG_D("SAM", "Attaching view dispatcher to GUI");
|
|
|
- view_dispatcher_attach_to_gui(text_state->view_dispatcher, gui, ViewDispatcherTypeFullscreen);
|
|
|
|
|
- FURI_LOG_D("ceasar_cipher", "starting view dispatcher");
|
|
|
|
|
- view_dispatcher_set_navigation_event_callback(
|
|
|
|
|
- text_state->view_dispatcher, back_event_callback);
|
|
|
|
|
- view_dispatcher_set_event_callback_context(text_state->view_dispatcher, &state_mutex);
|
|
|
|
|
- view_dispatcher_switch_to_view(text_state->view_dispatcher, 0);
|
|
|
|
|
- view_dispatcher_run(text_state->view_dispatcher);
|
|
|
|
|
|
|
+ view_dispatcher_attach_to_gui(app_state->view_dispatcher, gui, ViewDispatcherTypeFullscreen);
|
|
|
|
|
+ FURI_LOG_D("SAM", "starting view dispatcher");
|
|
|
|
|
+ view_dispatcher_set_navigation_event_callback(app_state->view_dispatcher, back_event_callback);
|
|
|
|
|
+ view_dispatcher_set_event_callback_context(app_state->view_dispatcher, &state_mutex);
|
|
|
|
|
+ view_dispatcher_switch_to_view(app_state->view_dispatcher, 0);
|
|
|
|
|
+ view_dispatcher_run(app_state->view_dispatcher);
|
|
|
|
|
|
|
|
// for(bool running = true; running;) {
|
|
// for(bool running = true; running;) {
|
|
|
// PluginEvent event;
|
|
// PluginEvent event;
|
|
@@ -127,7 +146,8 @@ extern "C" int32_t sam_app(void* p) {
|
|
|
// FuriStatus event_status = furi_message_queue_get(event_queue, &event, FuriWaitForever);
|
|
// FuriStatus event_status = furi_message_queue_get(event_queue, &event, FuriWaitForever);
|
|
|
// if(event_status == FuriStatusOk) {
|
|
// if(event_status == FuriStatusOk) {
|
|
|
// if(event.input.key == InputKeyOk) {
|
|
// if(event.input.key == InputKeyOk) {
|
|
|
- say_something(text_state->input);
|
|
|
|
|
|
|
+ say_something(app_state->input);
|
|
|
|
|
+ FURI_LOG_D("SAM", "Spoken text: %s", app_state->input);
|
|
|
// }
|
|
// }
|
|
|
// if(event.input.key == InputKeyBack) {
|
|
// if(event.input.key == InputKeyBack) {
|
|
|
// running = false;
|
|
// running = false;
|
|
@@ -137,7 +157,7 @@ extern "C" int32_t sam_app(void* p) {
|
|
|
|
|
|
|
|
furi_record_close("gui");
|
|
furi_record_close("gui");
|
|
|
delete_mutex(&state_mutex);
|
|
delete_mutex(&state_mutex);
|
|
|
- sam_state_free(text_state);
|
|
|
|
|
|
|
+ sam_state_free(app_state);
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|