altos: Put locked/unlocked GPS status in APRS comments
[fw/altos] / src / drivers / ao_aprs.c
index 25a651ca3a836ac4eb9593606a84ced0be9856a6..0a6c72ce9e2a1af03fd81f131982bf660e6e78fb 100644 (file)
@@ -488,9 +488,29 @@ static void tncCompressInt(uint8_t *dest, int32_t value, int len) {
        }
 }
 
-#if HAS_ADC
+static int ao_num_sats(void)
+{
+    int i;
+    int n = 0;
+
+    for (i = 0; i < ao_gps_tracking_data.channels; i++) {
+       if (ao_gps_tracking_data.sats[i].svid)
+           n++;
+    }
+    return n;
+}
+
+static char ao_gps_locked(void)
+{
+    if (ao_gps_data.flags & AO_GPS_VALID)
+       return 'L';
+    else
+       return 'U';
+}
+
 static int tncComment(uint8_t *buf)
 {
+#if HAS_ADC
        struct ao_data packet;
        
        ao_arch_critical(ao_data_get(&packet););
@@ -500,24 +520,32 @@ static int tncComment(uint8_t *buf)
        int16_t main = ao_ignite_decivolt(AO_SENSE_MAIN(&packet));
 
        return sprintf((char *) buf,
-                      "B:%d.%d A:%d.%d M:%d.%d",
+                      "%c%d B%d.%d A%d.%d M%d.%d",
+                      ao_gps_locked(),
+                      ao_num_sats(),
                       battery/10,
                       battery % 10,
                       apogee/10,
                       apogee%10,
                       main/10,
                       main%10);
-}
+#else
+       return sprintf((char *) buf,
+                      "%c%d",
+                      ao_gps_locked(),
+                      ao_num_sats());
 #endif
+}
 
 /**
  *   Generate the plain text position packet.
  */
 static int tncPositionPacket(void)
 {
-    int32_t    latitude = 0;
-    int32_t    longitude = 0;
-    int32_t    altitude = 0;
+    static int32_t     latitude;
+    static int32_t     longitude;
+    static int32_t     altitude;
+    int32_t            lat, lon, alt;
     uint8_t    *buf;
 
     if (ao_gps_data.flags & AO_GPS_VALID) {
@@ -528,39 +556,34 @@ static int tncPositionPacket(void)
            altitude = 0;
     }
 
-    altitude = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048;
-    
     buf = tncBuffer;
     *buf++ = '!';
 
     /* Symbol table ID */
     *buf++ = '/';
 
-    latitude = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000;
-    longitude = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000;
+    lat = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000;
+    lon = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000;
 
 #define ALTITUDE_LOG_BASE      0.001998002662673f      /* log(1.002) */
 
-    altitude = logf((float) altitude) * (1/ALTITUDE_LOG_BASE);
+    alt = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048;
+    alt = logf((float) altitude) * (1/ALTITUDE_LOG_BASE);
 
-    tncCompressInt(buf, latitude, 4);
+    tncCompressInt(buf, lat, 4);
     buf += 4;
-    tncCompressInt(buf, longitude, 4);
+    tncCompressInt(buf, lon, 4);
     buf += 4;
 
     /* Symbol code */
     *buf++ = '\'';
 
-    tncCompressInt(buf, altitude, 2);
+    tncCompressInt(buf, alt, 2);
     buf += 2;
 
     *buf++ = 33 + ((1 << 5) | (2 << 3));
 
-#if HAS_ADC
     buf += tncComment(buf);
-#else
-    *buf = '\0';
-#endif
 
     return buf - tncBuffer;
 }