gui-test.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #include <furi.h>
  2. #include <gui/gui.h>
  3. #include <gui/view_port.h>
  4. #include <gui/view.h>
  5. #include <gui/view_dispatcher.h>
  6. #include <gui/modules/dialog.h>
  7. #include <gui/modules/dialog_ex.h>
  8. #include <gui/modules/submenu.h>
  9. #include <gui/modules/text_input.h>
  10. #include <gui/modules/byte_input.h>
  11. #include <gui/modules/popup.h>
  12. #define GUI_TEST_FLAG_EXIT 0x00000001U
  13. typedef enum {
  14. GuiTesterViewTextInput = 0,
  15. GuiTesterViewSubmenu,
  16. GuiTesterViewDialog,
  17. GuiTesterViewDialogEx,
  18. GuiTesterViewPopup,
  19. GuiTesterViewByteInput,
  20. GuiTesterViewLast
  21. } GuiTesterView;
  22. typedef struct {
  23. ViewDispatcher* view_dispatcher;
  24. Dialog* dialog;
  25. DialogEx* dialog_ex;
  26. Submenu* submenu;
  27. TextInput* text_input;
  28. Popup* popup;
  29. ByteInput* byte_input;
  30. GuiTesterView view_index;
  31. } GuiTester;
  32. static GuiTester* gui_test_alloc(void) {
  33. GuiTester* gui_tester = furi_alloc(sizeof(GuiTester));
  34. gui_tester->view_dispatcher = view_dispatcher_alloc();
  35. gui_tester->view_index = GuiTesterViewByteInput;
  36. gui_tester->dialog = dialog_alloc();
  37. view_dispatcher_add_view(
  38. gui_tester->view_dispatcher, GuiTesterViewDialog, dialog_get_view(gui_tester->dialog));
  39. gui_tester->dialog_ex = dialog_ex_alloc();
  40. view_dispatcher_add_view(
  41. gui_tester->view_dispatcher,
  42. GuiTesterViewDialogEx,
  43. dialog_ex_get_view(gui_tester->dialog_ex));
  44. gui_tester->submenu = submenu_alloc();
  45. view_dispatcher_add_view(
  46. gui_tester->view_dispatcher, GuiTesterViewSubmenu, submenu_get_view(gui_tester->submenu));
  47. gui_tester->text_input = text_input_alloc();
  48. view_dispatcher_add_view(
  49. gui_tester->view_dispatcher,
  50. GuiTesterViewTextInput,
  51. text_input_get_view(gui_tester->text_input));
  52. gui_tester->popup = popup_alloc();
  53. view_dispatcher_add_view(
  54. gui_tester->view_dispatcher, GuiTesterViewPopup, popup_get_view(gui_tester->popup));
  55. gui_tester->byte_input = byte_input_alloc();
  56. view_dispatcher_add_view(
  57. gui_tester->view_dispatcher,
  58. GuiTesterViewByteInput,
  59. byte_input_get_view(gui_tester->byte_input));
  60. return gui_tester;
  61. }
  62. static void gui_test_free(GuiTester* gui_tester) {
  63. furi_assert(gui_tester);
  64. view_dispatcher_remove_view(gui_tester->view_dispatcher, GuiTesterViewDialog);
  65. dialog_free(gui_tester->dialog);
  66. view_dispatcher_remove_view(gui_tester->view_dispatcher, GuiTesterViewDialogEx);
  67. dialog_ex_free(gui_tester->dialog_ex);
  68. view_dispatcher_remove_view(gui_tester->view_dispatcher, GuiTesterViewSubmenu);
  69. submenu_free(gui_tester->submenu);
  70. view_dispatcher_remove_view(gui_tester->view_dispatcher, GuiTesterViewTextInput);
  71. text_input_free(gui_tester->text_input);
  72. view_dispatcher_remove_view(gui_tester->view_dispatcher, GuiTesterViewPopup);
  73. popup_free(gui_tester->popup);
  74. view_dispatcher_remove_view(gui_tester->view_dispatcher, GuiTesterViewByteInput);
  75. byte_input_free(gui_tester->byte_input);
  76. view_dispatcher_free(gui_tester->view_dispatcher);
  77. free(gui_tester);
  78. }
  79. static void next_view(void* context) {
  80. furi_assert(context);
  81. GuiTester* gui_tester = context;
  82. gui_tester->view_index++;
  83. if(gui_tester->view_index >= GuiTesterViewLast) {
  84. gui_tester->view_index = 0;
  85. }
  86. view_dispatcher_switch_to_view(gui_tester->view_dispatcher, gui_tester->view_index);
  87. }
  88. static void popup_callback(void* context) {
  89. next_view(context);
  90. }
  91. static void submenu_callback(void* context, uint32_t index) {
  92. next_view(context);
  93. }
  94. static void dialog_callback(DialogResult result, void* context) {
  95. next_view(context);
  96. }
  97. static void dialog_ex_callback(DialogExResult result, void* context) {
  98. next_view(context);
  99. }
  100. static void text_input_callback(void* context) {
  101. next_view(context);
  102. }
  103. static void byte_input_callback(void* context) {
  104. next_view(context);
  105. }
  106. static void event_cb(const void* value, void* ctx) {
  107. furi_assert(value);
  108. furi_assert(ctx);
  109. const InputEvent* event = value;
  110. if(event->key == InputKeyBack && event->type == InputTypeLong) {
  111. osThreadFlagsSet((osThreadId_t)ctx, GUI_TEST_FLAG_EXIT);
  112. }
  113. }
  114. int32_t gui_test(void* param) {
  115. (void)param;
  116. PubSub* event_record = furi_record_open("input_events");
  117. PubSubItem* event_pubsub = subscribe_pubsub(event_record, event_cb, (void*)osThreadGetId());
  118. GuiTester* gui_tester = gui_test_alloc();
  119. Gui* gui = furi_record_open("gui");
  120. view_dispatcher_attach_to_gui(gui_tester->view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  121. // Submenu
  122. submenu_add_item(gui_tester->submenu, "Read", 0, submenu_callback, gui_tester);
  123. submenu_add_item(gui_tester->submenu, "Saved", 0, submenu_callback, gui_tester);
  124. submenu_add_item(gui_tester->submenu, "Emulate", 0, submenu_callback, gui_tester);
  125. submenu_add_item(gui_tester->submenu, "Enter manually", 0, submenu_callback, gui_tester);
  126. submenu_add_item(gui_tester->submenu, "Blah blah", 0, submenu_callback, gui_tester);
  127. submenu_add_item(gui_tester->submenu, "Set time", 0, submenu_callback, gui_tester);
  128. submenu_add_item(gui_tester->submenu, "Gender-bender", 0, submenu_callback, gui_tester);
  129. submenu_add_item(
  130. gui_tester->submenu, "Hack American Elections", 0, submenu_callback, gui_tester);
  131. submenu_add_item(gui_tester->submenu, "Hack the White House", 0, submenu_callback, gui_tester);
  132. // Dialog
  133. dialog_set_result_callback(gui_tester->dialog, dialog_callback);
  134. dialog_set_context(gui_tester->dialog, gui_tester);
  135. dialog_set_header_text(gui_tester->dialog, "Delete Abc123?");
  136. dialog_set_text(gui_tester->dialog, "ID: F0 00 01 02 03 04\nAre you shure?");
  137. dialog_set_left_button_text(gui_tester->dialog, "Yes");
  138. dialog_set_right_button_text(gui_tester->dialog, "No");
  139. // Dialog extended
  140. dialog_ex_set_result_callback(gui_tester->dialog_ex, dialog_ex_callback);
  141. dialog_ex_set_context(gui_tester->dialog_ex, gui_tester);
  142. dialog_ex_set_header(gui_tester->dialog_ex, "Dallas", 95, 12, AlignCenter, AlignCenter);
  143. dialog_ex_set_text(
  144. gui_tester->dialog_ex, "F6 E5 D4\nC3 B2 A1", 95, 32, AlignCenter, AlignCenter);
  145. dialog_ex_set_icon(gui_tester->dialog_ex, 0, 1, &I_DolphinExcited_64x63);
  146. dialog_ex_set_left_button_text(gui_tester->dialog_ex, "More");
  147. dialog_ex_set_right_button_text(gui_tester->dialog_ex, "Save");
  148. // Popup
  149. popup_set_callback(gui_tester->popup, popup_callback);
  150. popup_set_context(gui_tester->popup, gui_tester);
  151. popup_set_icon(gui_tester->popup, 0, 2, &I_DolphinMafia_115x62);
  152. popup_set_text(gui_tester->popup, "Deleted", 83, 19, AlignLeft, AlignBottom);
  153. popup_set_timeout(gui_tester->popup, 5000);
  154. popup_enable_timeout(gui_tester->popup);
  155. // Text input
  156. const uint8_t text_input_text_len = 64;
  157. char* text_input_text = calloc(text_input_text_len + 1, 1);
  158. memcpy(text_input_text, "New_ke", strlen("New_ke"));
  159. text_input_set_result_callback(
  160. gui_tester->text_input,
  161. text_input_callback,
  162. gui_tester,
  163. text_input_text,
  164. text_input_text_len,
  165. false);
  166. text_input_set_header_text(gui_tester->text_input, "Name the key");
  167. const uint8_t byte_input_bytes_len = 16;
  168. uint8_t byte_input_bytes[16] = {
  169. 0x00,
  170. 0x01,
  171. 0x02,
  172. 0x03,
  173. 0x04,
  174. 0x05,
  175. 0x06,
  176. 0x07,
  177. 0x08,
  178. 0x09,
  179. 0x0A,
  180. 0x0B,
  181. 0x0C,
  182. 0x0D,
  183. 0x0E,
  184. 0x0F};
  185. byte_input_set_result_callback(
  186. gui_tester->byte_input,
  187. byte_input_callback,
  188. NULL,
  189. gui_tester,
  190. byte_input_bytes,
  191. byte_input_bytes_len);
  192. byte_input_set_header_text(gui_tester->byte_input, "Enter the key");
  193. view_dispatcher_switch_to_view(gui_tester->view_dispatcher, gui_tester->view_index);
  194. while(1) {
  195. if(osThreadFlagsWait(GUI_TEST_FLAG_EXIT, osFlagsWaitAny, osWaitForever)) {
  196. break;
  197. }
  198. }
  199. unsubscribe_pubsub(event_pubsub);
  200. free(text_input_text);
  201. gui_test_free(gui_tester);
  202. return 0;
  203. }