template.c.example 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "flipper_v2.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(CanvasApi* 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. void template_app(void* p) {
  31. osMessageQueueId_t event_queue = osMessageQueueNew(1, 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\n");
  37. furiac_exit(NULL);
  38. }
  39. Widget* widget = widget_alloc();
  40. widget_draw_callback_set(widget, render_callback, &state_mutex);
  41. widget_input_callback_set(widget, input_callback, event_queue);
  42. // Open GUI and register widget
  43. GuiApi* gui = (GuiApi*)furi_open("gui");
  44. if(gui == NULL) {
  45. printf("gui is not available\n");
  46. furiac_exit(NULL);
  47. }
  48. gui->add_widget(gui, widget, /* 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.state && event.value.input.input == InputBack) {
  60. }
  61. if(event.value.input.state && event.value.input.input == InputUp) {
  62. }
  63. if(event.value.input.state && event.value.input.input == InputDown) {
  64. }
  65. if(event.value.input.state && event.value.input.input == InputLeft) {
  66. }
  67. if(event.value.input.state && event.value.input.input == InputRight) {
  68. }
  69. if(event.value.input.input == InputOk) {
  70. }
  71. }
  72. } else {
  73. // event timeout
  74. }
  75. // common code, for example, force update UI
  76. // widget_update(widget);
  77. release_mutex(&state_mutex, state);
  78. }
  79. }