Просмотр исходного кода

Add several more GPS fields to status struct and display.

Aaron Mavrinac 3 лет назад
Родитель
Сommit
1014b5d9a1
3 измененных файлов с 39 добавлено и 0 удалено
  1. 8 0
      gps.c
  2. 24 0
      gps_uart.c
  3. 7 0
      gps_uart.h

+ 8 - 0
gps.c

@@ -29,7 +29,15 @@ static void render_callback(Canvas* const canvas, void* context)
   snprintf(buffer, 64, "LAT: %f", (double)gps_uart->status.latitude);
   canvas_draw_str_aligned(canvas, 10, 10, AlignLeft, AlignBottom, buffer);
   snprintf(buffer, 64, "LON: %f", (double)gps_uart->status.longitude);
+  canvas_draw_str_aligned(canvas, 10, 20, AlignLeft, AlignBottom, buffer);
+  snprintf(buffer, 64, "C/S: %.1f / %.2fkn", (double)gps_uart->status.course, (double)gps_uart->status.speed);
   canvas_draw_str_aligned(canvas, 10, 30, AlignLeft, AlignBottom, buffer);
+  snprintf(buffer, 64, "ALT: %.1f %c", (double)gps_uart->status.altitude, gps_uart->status.altitude_units);
+  canvas_draw_str_aligned(canvas, 10, 40, AlignLeft, AlignBottom, buffer);
+  snprintf(buffer, 64, "FIX: %d", gps_uart->status.fix_quality);
+  canvas_draw_str_aligned(canvas, 10, 50, AlignLeft, AlignBottom, buffer);
+  snprintf(buffer, 64, "SAT: %d", gps_uart->status.satellites_tracked);
+  canvas_draw_str_aligned(canvas, 10, 60, AlignLeft, AlignBottom, buffer);
 
   release_mutex((ValueMutex*)context, gps_uart);
 }

+ 24 - 0
gps_uart.c

@@ -45,8 +45,25 @@ static void gps_uart_parse_nmea(GpsUart* gps_uart, char* line)
       struct minmea_sentence_rmc frame;
       if (minmea_parse_rmc(&frame, line))
       {
+        gps_uart->status.valid = frame.valid;
         gps_uart->status.latitude = minmea_tocoord(&frame.latitude);
         gps_uart->status.longitude = minmea_tocoord(&frame.longitude);
+        gps_uart->status.speed = minmea_tofloat(&frame.speed);
+        gps_uart->status.course = minmea_tofloat(&frame.course);
+      }
+    } break;
+
+    case MINMEA_SENTENCE_GGA:
+    {
+      struct minmea_sentence_gga frame;
+      if (minmea_parse_gga(&frame, line))
+      {
+        gps_uart->status.latitude = minmea_tocoord(&frame.latitude);
+        gps_uart->status.longitude = minmea_tocoord(&frame.longitude);
+        gps_uart->status.altitude = minmea_tofloat(&frame.altitude);
+        gps_uart->status.altitude_units = frame.altitude_units;
+        gps_uart->status.fix_quality = frame.fix_quality;
+        gps_uart->status.satellites_tracked = frame.satellites_tracked;
       }
     } break;
 
@@ -131,8 +148,15 @@ GpsUart* gps_uart_enable()
 {
   GpsUart* gps_uart = malloc(sizeof(GpsUart));
 
+  gps_uart->status.valid = false;
   gps_uart->status.latitude = 0.0;
   gps_uart->status.longitude = 0.0;
+  gps_uart->status.speed = 0.0;
+  gps_uart->status.course = 0.0;
+  gps_uart->status.altitude = 0.0;
+  gps_uart->status.altitude_units = ' ';
+  gps_uart->status.fix_quality = 0;
+  gps_uart->status.satellites_tracked = 0;
 
   gps_uart->thread = furi_thread_alloc();
   furi_thread_set_name(gps_uart->thread, "GpsUartWorker");

+ 7 - 0
gps_uart.h

@@ -7,8 +7,15 @@
 
 typedef struct
 {
+  bool valid;
   float latitude;
   float longitude;
+  float speed;
+  float course;
+  float altitude;
+  char altitude_units;
+  int fix_quality;
+  int satellites_tracked;
 } GpsStatus;
 
 typedef struct