caesar_cipher.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include <furi.h>
  2. #include <input/input.h>
  3. #include <stdlib.h>
  4. #include <gui/gui.h>
  5. #include <gui/view.h>
  6. #include <gui/view_dispatcher.h>
  7. #include <gui/modules/text_input.h>
  8. #define TEXT_BUFFER_SIZE 256
  9. typedef enum {
  10. EventTypeTick,
  11. EventTypeKey,
  12. } EventType;
  13. typedef struct {
  14. EventType type;
  15. InputEvent input;
  16. } PluginEvent;
  17. typedef struct {
  18. ViewDispatcher* view_dispatcher;
  19. TextInput* text_input;
  20. char input[TEXT_BUFFER_SIZE];
  21. } CaesarState;
  22. //static void render_callback(Canvas* const canvas, void* ctx) {
  23. // const CaesarState* caesar_state = acquire_mutex((ValueMutex*)ctx, 25);
  24. // if(caesar_state == NULL) {
  25. // return;
  26. // }
  27. // // border around the edge of the screen
  28. // canvas_draw_frame(canvas, 0, 0, 128, 64);
  29. //
  30. // canvas_set_font(canvas, FontPrimary);
  31. //
  32. // release_mutex((ValueMutex*)ctx, caesar_state);
  33. //}
  34. //static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
  35. // furi_assert(event_queue);
  36. //
  37. // PluginEvent event = {.type = EventTypeKey, .input = *input_event};
  38. // furi_message_queue_put(event_queue, &event, FuriWaitForever);
  39. //}
  40. static void text_input_callback(void* ctx) {
  41. const CaesarState* caesar_state = acquire_mutex((ValueMutex*)ctx, 25);
  42. FURI_LOG_D("caesar_cipher", "Input text: %s", caesar_state->input);
  43. release_mutex((ValueMutex*)ctx, caesar_state);
  44. }
  45. static void caesar_cipher_state_init(CaesarState* const caesar_state) {
  46. caesar_state->view_dispatcher = view_dispatcher_alloc();
  47. caesar_state->text_input = text_input_alloc();
  48. // caesar_state->input = ""; - this is not python
  49. }
  50. static void caesar_cipher_state_free(CaesarState* const caesar_state) {
  51. text_input_free(caesar_state->text_input);
  52. view_dispatcher_remove_view(caesar_state->view_dispatcher, 0);
  53. view_dispatcher_free(caesar_state->view_dispatcher);
  54. free(caesar_state);
  55. }
  56. int32_t caesar_cipher_app() {
  57. FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
  58. CaesarState* caesar_state = malloc(sizeof(CaesarState));
  59. FURI_LOG_D("caesar_cipher", "Running caesar_cipher_state_init");
  60. caesar_cipher_state_init(caesar_state);
  61. ValueMutex state_mutex;
  62. if(!init_mutex(&state_mutex, caesar_state, sizeof(CaesarState))) {
  63. FURI_LOG_E("caesar_cipher", "cannot create mutex\r\n");
  64. free(caesar_state);
  65. return 255;
  66. }
  67. // Set system callbacks
  68. //ViewPort* view_port = view_port_alloc();
  69. //view_port_draw_callback_set(view_port, render_callback, &state_mutex);
  70. //view_port_input_callback_set(view_port, input_callback, event_queue);
  71. FURI_LOG_D("caesar_cipher", "Assigning text input callback");
  72. text_input_set_result_callback(
  73. caesar_state->text_input,
  74. text_input_callback,
  75. &state_mutex,
  76. caesar_state->input,
  77. TEXT_BUFFER_SIZE,
  78. //clear default text
  79. true
  80. );
  81. text_input_set_header_text(caesar_state->text_input, "Input");
  82. // Open GUI and register view_port
  83. Gui* gui = furi_record_open("gui");
  84. //gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  85. //FURI_LOG_D("caesar_cipher", "Enabling view dispatcher queue");
  86. //view_dispatcher_enable_queue(caesar_state->view_dispatcher);
  87. FURI_LOG_D("caesar_cipher", "Adding text input view to dispatcher");
  88. view_dispatcher_add_view(caesar_state->view_dispatcher, 0, text_input_get_view(caesar_state->text_input));
  89. FURI_LOG_D("caesar_cipher", "Attaching view dispatcher to GUI");
  90. view_dispatcher_attach_to_gui(caesar_state->view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  91. FURI_LOG_D("ceasar_cipher", "starting view dispatcher");
  92. //view_dispatcher_run(caesar_state->view_dispatcher);
  93. view_dispatcher_switch_to_view(caesar_state->view_dispatcher, 0);
  94. PluginEvent event;
  95. for(bool processing = true; processing;) {
  96. FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
  97. CaesarState* caesar_state = (CaesarState*)acquire_mutex_block(&state_mutex);
  98. if(event_status == FuriStatusOk) {
  99. // press events
  100. if(event.type == EventTypeKey) {
  101. if(event.input.type == InputTypePress) {
  102. switch(event.input.key) {
  103. case InputKeyUp:
  104. break;
  105. case InputKeyDown:
  106. break;
  107. case InputKeyRight:
  108. break;
  109. case InputKeyLeft:
  110. break;
  111. case InputKeyOk:
  112. break;
  113. case InputKeyBack:
  114. processing = false;
  115. break;
  116. }
  117. }
  118. }
  119. } else {
  120. FURI_LOG_D("caesar_cipher", "FuriMessageQueue: event timeout");
  121. // event timeout
  122. }
  123. //view_port_update(view_port);
  124. release_mutex(&state_mutex, caesar_state);
  125. }
  126. //view_port_enabled_set(view_port, false);
  127. //gui_remove_view_port(gui, view_port);
  128. furi_record_close("gui");
  129. //view_port_free(view_port);
  130. furi_message_queue_free(event_queue);
  131. delete_mutex(&state_mutex);
  132. caesar_cipher_state_free(caesar_state);
  133. return 0;
  134. }