Przeglądaj źródła

New GPS test interface

Daniele Lacamera 1 rok temu
rodzic
commit
0a4b04c02e
1 zmienionych plików z 72 dodań i 29 usunięć
  1. 72 29
      src/main.c

+ 72 - 29
src/main.c

@@ -7,10 +7,7 @@
 //#define HZ2MS(X) ((uint64_t)((X * 53000.0)/(SystemCoreClock)))
 //
 #define BMP180_SOLDERING_OFF_T 190
-#define BMP180_SOLDERING_OFF_P 12050
-
-
-
+#define BMP180_SOLDERING_OFF_P 11800
 
 void init_uart0(void)
 {	
@@ -98,7 +95,7 @@ static void init_i2c0(void)
 #define BMP180_OSS_UHR 3
 
 #define BMP180_REG_T        0x2E
-static const uint32_t BMP180_OSS = BMP180_OSS_UHR; 
+static const uint32_t BMP180_OSS = BMP180_OSS_UHR;
 static const uint8_t BMP180_REG_P_ARRAY[4] = {0x34, 0x74, 0xB4, 0xF4};
 static const uint8_t BMP180_REG_P_TIME[4] = {5, 8, 14, 26};
 #define BMP180_REG_P BMP180_REG_P_ARRAY[BMP180_OSS]
@@ -143,7 +140,7 @@ static uint32_t compensate_pressure(uint32_t up)
     x1 = (BMP180.creg.AC3 * BMP180.B6) >> 13;
     x2 = (BMP180.creg.B1 * ((BMP180.B6 * BMP180.B6) >> 12)) >> 16;
     x3 = ((x1 + x2) + 2)  >> 2;
-    BMP180.B4 = (BMP180.creg.AC4 * (x3 + 32768UL)) >> 15; 
+    BMP180.B4 = (BMP180.creg.AC4 * (x3 + 32768UL)) >> 15;
     BMP180.B7 = (up - BMP180.B3) * (50000UL >> BMP180_OSS);
     if (BMP180.B7 < 0x80000000UL)
         p = (BMP180.B7 * 2) / BMP180.B4;
@@ -329,19 +326,23 @@ static uint32_t bmp180_read_P(void)
     return (uint32_t)((data_xlsb + (data_lsb << 8) + (data_msb << 16)) >> (8 - BMP180_OSS));
 }
 
+
+/* UART/GPS */
+
+static struct minmea_sentence_rmc global_minmea_gps;
+static struct minmea_sentence_gga global_minmea_gga;
+
 static char uart_data_receive_blocking(uint32_t usart_periph)
 {
     while (usart_flag_get(usart_periph, USART_FLAG_RBNE) != SET) {
             continue;
     }
-
     return usart_data_receive(usart_periph);
 }
 
 static void get_nmea_line(char *buf)
 {
     int i = 0;
-
     while (uart_data_receive_blocking(USART1) != '$') {
         /* sync with the beginning of the line */
     }
@@ -355,26 +356,43 @@ static void get_nmea_line(char *buf)
     buf[i] = 0;
 }
 
-static int read_gps(struct minmea_sentence_gga *frame)
+static int read_gps(void)
 {
     char nmea_buf[MAX_NMEA];
     int ret;
-
+    int gga = 0, rmc = 0;
+    int nmea_id;
     do {
         get_nmea_line(nmea_buf);
-    } while(strncmp(nmea_buf, "$GPGGA", strlen("$GPGGA")) != 0);
-
-    ret = minmea_parse_gga(frame, nmea_buf);
+        nmea_id = minmea_sentence_id(nmea_buf, 0);
+        switch(nmea_id) {
+            case MINMEA_SENTENCE_RMC:
+                ret = minmea_parse_rmc(&global_minmea_gps, nmea_buf);
+                rmc++;
+#ifdef DEBUG_NMEA
+                LCD_ShowString(0, 0, (u8 *)nmea_buf, YELLOW);
+                delay_1ms(200);
+#endif
+                break;
+            case MINMEA_SENTENCE_GGA:
+                ret = minmea_parse_gga(&global_minmea_gga, nmea_buf);
+                gga++;
+#ifdef DEBUG_NMEA
+                LCD_ShowString(0, 0, (u8 *)nmea_buf, MAGENTA);
+                delay_1ms(200);
+#endif
+                break;
+            default:
+                ret = !0;
+                break;
+        }
+    } while((ret != 0) && (gga == 0));
     if (!ret) {
         LCD_ShowString(0, 0, (u8 *)("PARSING ERROR"), RED);
         LCD_ShowString(0, 32, (u8 *)nmea_buf, RED);
         delay_1ms(2000);
-    } else {
-        LCD_ShowString(0, 32, (u8 *)nmea_buf, RED);
-        delay_1ms(200);
-
+        return -1;
     }
-
     return 0;
 }
 
@@ -391,7 +409,6 @@ int main(void)
     uint32_t up;
     uint32_t pressure;
     int32_t temperature;
-    struct minmea_sentence_gga gps_data = { 0 };
 
     SystemInit();
     /* Init GPIOs */
@@ -419,18 +436,44 @@ int main(void)
 
     while (1)
     {
-        read_gps(&gps_data);
-        LCD_Clear(BLACK);
-        snprintf(gps, MAX_ROW-1, "%02d:%02d:%02d", gps_data.time.hours, gps_data.time.minutes, gps_data.time.seconds);
-        LCD_ShowString (0, 0, (u8 *)gps, GREEN);
-        snprintf(gps, MAX_ROW-1, "%d,%d", gps_data.latitude.value, gps_data.longitude.value);
-        LCD_ShowString (0, 16, (u8 *)gps, GREEN);
-        snprintf(gps, MAX_ROW-1, "H:%d", gps_data.altitude.value/gps_data.altitude.scale);
-        LCD_ShowString (0, 32, (u8 *)gps, GREEN);
+        if (read_gps() < 0) {
+            LCD_Clear(BLACK);
+            snprintf(gps, MAX_ROW-1, "Waiting for GPS");
+            LCD_ShowString (8, 0, (u8 *)gps, GREEN);
+        } else {
+            LCD_Clear(BLACK);
+            snprintf(gps, MAX_ROW-1, "t:%02d:%02d:%02d",
+                    global_minmea_gga.time.hours,
+                    global_minmea_gga.time.minutes,
+                    global_minmea_gga.time.seconds);
+
+            if (global_minmea_gga.satellites_tracked > 0) {
+                LCD_ShowString (0, 0, (u8 *)gps, CYAN);
+            } else {
+                LCD_ShowString (0, 0, (u8 *)gps, RED);
+            }
+
+
+            //snprintf(gps, MAX_ROW-1, "%d,%d", gps_data.latitude.value, gps_data.longitude.value);
+            snprintf(gps, MAX_ROW-1,"v:%d, sat:%d, q:%d",
+                    (int)global_minmea_gps.valid,
+                    global_minmea_gga.satellites_tracked,
+                    global_minmea_gga.fix_quality);
+            if (global_minmea_gps.valid) {
+                LCD_ShowString (0, 16, (u8 *)gps, GREEN);
+                snprintf(gps, MAX_ROW-1, "H:%d hdop:%d",
+                        global_minmea_gga.altitude.value /
+                        global_minmea_gga.altitude.scale,
+                        global_minmea_gga.hdop);
+                LCD_ShowString (0, 32, (u8 *)gps, GREEN);
+            } else {
+                LCD_ShowString (0, 16, (u8 *)gps, RED);
+            }
+        }
         ut = bmp180_read_T();
         up = bmp180_read_P();
-        LCD_ShowString(0, 48, (u8 *)(prs), GREEN);
-        LCD_ShowString(0, 64, (u8 *)(tmp), GREEN);
+        LCD_ShowString(0, 48, (u8 *)(prs), CYAN);
+        LCD_ShowString(0, 64, (u8 *)(tmp), CYAN);
 
         /* Device offset */
         ut -= BMP180_SOLDERING_OFF_T;