sam_app.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <furi.h>
  2. #include <furi_hal_speaker.h>
  3. // #include <furi_hal.h>
  4. #include <stdlib.h>
  5. #include <input/input.h>
  6. #include <gui/gui.h>
  7. #include <gui/view.h>
  8. #include <gui/view_dispatcher.h>
  9. #include <gui/modules/text_input.h>
  10. #include <gui/modules/text_box.h>
  11. #include "stm32_sam.h"
  12. #define TEXT_BUFFER_SIZE 256
  13. STM32SAM voice;
  14. typedef enum {
  15. EventTypeTick,
  16. EventTypeKey,
  17. } EventType;
  18. typedef struct {
  19. EventType type;
  20. InputEvent input;
  21. } PluginEvent;
  22. typedef struct {
  23. ViewDispatcher* view_dispatcher;
  24. TextInput* text_input;
  25. TextBox* text_box;
  26. char input[TEXT_BUFFER_SIZE];
  27. } TextState;
  28. static void say_something(char* something) {
  29. if(furi_hal_speaker_is_mine() || furi_hal_speaker_acquire(1000)) {
  30. voice.begin();
  31. voice.say(something);
  32. furi_hal_speaker_release();
  33. }
  34. // return 0;
  35. }
  36. static void text_input_callback(void* ctx) {
  37. TextState* text_state = (TextState*)acquire_mutex((ValueMutex*)ctx, 25);
  38. FURI_LOG_D("SAM", "Input text: %s", text_state->input);
  39. FURI_LOG_D("SAM", "Upper text: %s", text_state->input);
  40. text_box_set_text(text_state->text_box, text_state->input);
  41. view_dispatcher_switch_to_view(text_state->view_dispatcher, 1);
  42. release_mutex((ValueMutex*)ctx, text_state);
  43. }
  44. static bool back_event_callback(void* ctx) {
  45. const TextState* text_state = (TextState*)acquire_mutex((ValueMutex*)ctx, 25);
  46. view_dispatcher_stop(text_state->view_dispatcher);
  47. release_mutex((ValueMutex*)ctx, text_state);
  48. return true;
  49. }
  50. static void sam_state_init(TextState* const text_state) {
  51. text_state->view_dispatcher = view_dispatcher_alloc();
  52. text_state->text_input = text_input_alloc();
  53. text_state->text_box = text_box_alloc();
  54. text_box_set_font(text_state->text_box, TextBoxFontText);
  55. }
  56. static void sam_state_free(TextState* const text_state) {
  57. text_input_free(text_state->text_input);
  58. text_box_free(text_state->text_box);
  59. view_dispatcher_remove_view(text_state->view_dispatcher, 0);
  60. view_dispatcher_remove_view(text_state->view_dispatcher, 1);
  61. view_dispatcher_free(text_state->view_dispatcher);
  62. free(text_state);
  63. }
  64. extern "C" int32_t sam_app(void* p) {
  65. UNUSED(p);
  66. TextState* text_state = (TextState*)malloc(sizeof(TextState));
  67. FURI_LOG_D("SAM", "Running sam_state_init");
  68. sam_state_init(text_state);
  69. ValueMutex state_mutex;
  70. if(!init_mutex(&state_mutex, text_state, sizeof(TextState))) {
  71. FURI_LOG_E("SAM", "cannot create mutex\r\n");
  72. free(text_state);
  73. return 255;
  74. }
  75. FURI_LOG_D("SAM", "Assigning text input callback");
  76. text_input_set_result_callback(
  77. text_state->text_input,
  78. text_input_callback,
  79. &state_mutex,
  80. text_state->input,
  81. TEXT_BUFFER_SIZE,
  82. //clear default text
  83. true);
  84. text_input_set_header_text(text_state->text_input, "Input");
  85. // Open GUI and register view_port
  86. Gui* gui = (Gui*)furi_record_open("gui");
  87. //gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  88. FURI_LOG_D("SAM", "Enabling view dispatcher queue");
  89. view_dispatcher_enable_queue(text_state->view_dispatcher);
  90. FURI_LOG_D("SAM", "Adding text input view to dispatcher");
  91. view_dispatcher_add_view(
  92. text_state->view_dispatcher, 0, text_input_get_view(text_state->text_input));
  93. view_dispatcher_add_view(
  94. text_state->view_dispatcher, 1, text_box_get_view(text_state->text_box));
  95. FURI_LOG_D("SAM", "Attaching view dispatcher to GUI");
  96. view_dispatcher_attach_to_gui(text_state->view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  97. FURI_LOG_D("ceasar_cipher", "starting view dispatcher");
  98. view_dispatcher_set_navigation_event_callback(
  99. text_state->view_dispatcher, back_event_callback);
  100. view_dispatcher_set_event_callback_context(text_state->view_dispatcher, &state_mutex);
  101. view_dispatcher_switch_to_view(text_state->view_dispatcher, 0);
  102. view_dispatcher_run(text_state->view_dispatcher);
  103. // for(bool running = true; running;) {
  104. // PluginEvent event;
  105. // FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
  106. // FuriStatus event_status = furi_message_queue_get(event_queue, &event, FuriWaitForever);
  107. // if(event_status == FuriStatusOk) {
  108. // if(event.input.key == InputKeyOk) {
  109. say_something(text_state->input);
  110. // }
  111. // if(event.input.key == InputKeyBack) {
  112. // running = false;
  113. // }
  114. // }
  115. // }
  116. furi_record_close("gui");
  117. delete_mutex(&state_mutex);
  118. sam_state_free(text_state);
  119. return 0;
  120. }