}
}
-#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););
int16_t battery = ao_battery_decivolt(packet.adc.v_batt);
+#ifdef AO_SENSE_DROGUE
int16_t apogee = ao_ignite_decivolt(AO_SENSE_DROGUE(&packet));
+#endif
+#ifdef AO_SENSE_MAIN
int16_t main = ao_ignite_decivolt(AO_SENSE_MAIN(&packet));
+#endif
return sprintf((char *) buf,
- "B:%d.%d A:%d.%d M:%d.%d",
+ "%c%d B%d.%d"
+#ifdef AO_SENSE_DROGUE
+ " A%d.%d"
+#endif
+#ifdef AO_SENSE_MAIN
+ " M%d.%d"
+#endif
+ , ao_gps_locked(),
+ ao_num_sats(),
battery/10,
- battery % 10,
- apogee/10,
- apogee%10,
- main/10,
- main%10);
-}
+ battery % 10
+#ifdef AO_SENSE_DROGUE
+ , apogee/10,
+ apogee%10
+#endif
+#ifdef AO_SENSE_MAIN
+ , main/10,
+ main%10
+#endif
+ );
+#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 = ao_gps_data.latitude;
- int32_t longitude = ao_gps_data.longitude;
- int32_t altitude = ao_gps_data.altitude;
+ static int32_t latitude;
+ static int32_t longitude;
+ static int32_t altitude;
+ int32_t lat, lon, alt;
uint8_t *buf;
- if (altitude < 0)
- altitude = 0;
- altitude = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048;
-
+ if (ao_gps_data.flags & AO_GPS_VALID) {
+ latitude = ao_gps_data.latitude;
+ longitude = ao_gps_data.longitude;
+ altitude = ao_gps_data.altitude;
+ if (altitude < 0)
+ altitude = 0;
+ }
+
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;
}