gps.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "gps_uart.h"
  2. #include <furi.h>
  3. #include <gui/gui.h>
  4. #include <string.h>
  5. typedef enum
  6. {
  7. EventTypeTick,
  8. EventTypeKey,
  9. } EventType;
  10. typedef struct
  11. {
  12. EventType type;
  13. InputEvent input;
  14. } PluginEvent;
  15. static void render_callback(Canvas* const canvas, void* context)
  16. {
  17. const GpsUart* gps_uart = acquire_mutex((ValueMutex*)context, 25);
  18. if (gps_uart == NULL)
  19. {
  20. return;
  21. }
  22. canvas_set_font(canvas, FontSecondary);
  23. char buffer[64];
  24. snprintf(buffer, 64, "LAT: %f", (double)gps_uart->status.latitude);
  25. canvas_draw_str_aligned(canvas, 10, 10, AlignLeft, AlignBottom, buffer);
  26. snprintf(buffer, 64, "LON: %f", (double)gps_uart->status.longitude);
  27. canvas_draw_str_aligned(canvas, 10, 30, AlignLeft, AlignBottom, buffer);
  28. release_mutex((ValueMutex*)context, gps_uart);
  29. }
  30. static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue)
  31. {
  32. furi_assert(event_queue);
  33. PluginEvent event = {.type = EventTypeKey, .input = *input_event};
  34. furi_message_queue_put(event_queue, &event, FuriWaitForever);
  35. }
  36. int32_t gps_app(void* p)
  37. {
  38. UNUSED(p);
  39. FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent));
  40. GpsUart* gps_uart = gps_uart_enable();
  41. ValueMutex gps_uart_mutex;
  42. if (!init_mutex(&gps_uart_mutex, gps_uart, sizeof(GpsUart)))
  43. {
  44. FURI_LOG_E("GPS", "cannot create mutex\r\n");
  45. free(gps_uart);
  46. return 255;
  47. }
  48. // set system callbacks
  49. ViewPort* view_port = view_port_alloc();
  50. view_port_draw_callback_set(view_port, render_callback, &gps_uart_mutex);
  51. view_port_input_callback_set(view_port, input_callback, event_queue);
  52. // open GUI and register view_port
  53. Gui* gui = furi_record_open("gui");
  54. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  55. PluginEvent event;
  56. for (bool processing = true; processing;)
  57. {
  58. FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100);
  59. GpsUart* gps_uart = (GpsUart*)acquire_mutex_block(&gps_uart_mutex);
  60. if (event_status == FuriStatusOk)
  61. {
  62. // press events
  63. if (event.type == EventTypeKey)
  64. {
  65. if (event.input.type == InputTypePress)
  66. {
  67. switch (event.input.key)
  68. {
  69. case InputKeyUp:
  70. case InputKeyDown:
  71. case InputKeyRight:
  72. case InputKeyLeft:
  73. case InputKeyOk:
  74. break;
  75. case InputKeyBack:
  76. processing = false;
  77. break;
  78. }
  79. }
  80. }
  81. }
  82. else
  83. {
  84. FURI_LOG_D("GPS", "FuriMessageQueue: event timeout");
  85. }
  86. view_port_update(view_port);
  87. release_mutex(&gps_uart_mutex, gps_uart);
  88. }
  89. view_port_enabled_set(view_port, false);
  90. gui_remove_view_port(gui, view_port);
  91. furi_record_close("gui");
  92. view_port_free(view_port);
  93. furi_message_queue_free(event_queue);
  94. delete_mutex(&gps_uart_mutex);
  95. gps_uart_disable(gps_uart);
  96. return 0;
  97. }