template.c.example 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include <furi.h>
  2. typedef enum {
  3. EventTypeTick,
  4. EventTypeKey,
  5. // add your events type
  6. } EventType;
  7. typedef struct {
  8. union {
  9. InputEvent input;
  10. // add your events payload
  11. } value;
  12. EventType type;
  13. } Event;
  14. typedef struct {
  15. // describe state here
  16. } State;
  17. static void render_callback(Canvas* canvas, void* ctx) {
  18. State* state = (State*)acquire_mutex((ValueMutex*)ctx, 25);
  19. canvas_clear(canvas);
  20. // draw your app
  21. release_mutex((ValueMutex*)ctx, state);
  22. }
  23. static void input_callback(InputEvent* input_event, void* ctx) {
  24. osMessageQueueId_t event_queue = (QueueHandle_t)ctx;
  25. Event event;
  26. event.type = EventTypeKey;
  27. event.value.input = *input_event;
  28. osMessageQueuePut(event_queue, &event, 0, 0);
  29. }
  30. int32_t template_app(void* p) {
  31. osMessageQueueId_t event_queue = osMessageQueueNew(8, sizeof(Event), NULL);
  32. State _state;
  33. /* init state here */
  34. ValueMutex state_mutex;
  35. if(!init_mutex(&state_mutex, &_state, sizeof(State))) {
  36. printf("cannot create mutex\r\n");
  37. return 255;
  38. }
  39. ViewPort* view_port = view_port_alloc();
  40. view_port_draw_callback_set(view_port, render_callback, &state_mutex);
  41. view_port_input_callback_set(view_port, input_callback, event_queue);
  42. // Open GUI and register view_port
  43. Gui* gui = furi_record_open("gui");
  44. if(gui == NULL) {
  45. printf("gui is not available\r\n");
  46. return 255;
  47. }
  48. gui_add_view_port(gui, view_port, /* specify UI layer */);
  49. Event event;
  50. while(1) {
  51. osStatus_t event_status = osMessageQueueGet(
  52. event_queue, &event, NULL,
  53. /* specify timeout */
  54. );
  55. State* state = (State*)acquire_mutex_block(&state_mutex);
  56. if(event_status == osOK) {
  57. if(event.type == EventTypeKey) {
  58. // press events
  59. if(event.value.input.type == InputTypeShort && event.value.input.key == InputKeyBack) {
  60. }
  61. if(event.value.input.type == InputTypeShort && event.value.input.key == InputKeyUp) {
  62. }
  63. if(event.value.input.type == InputTypeShort && event.value.input.key == InputKeyDown) {
  64. }
  65. if(event.value.input.type == InputTypeShort && event.value.input.key == InputKeyLeft) {
  66. }
  67. if(event.value.input.type == InputTypeShort && event.value.input.key == InputKeyRight) {
  68. }
  69. if(event.value.input.key == InputKeyOk) {
  70. }
  71. }
  72. } else {
  73. // event timeout
  74. }
  75. // common code, for example, force update UI
  76. // view_port_update(view_port);
  77. release_mutex(&state_mutex, state);
  78. }
  79. return 0;
  80. }