gps.c 3.1 KB

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