diff --git a/debian/changelog b/debian/changelog index b6428fe..cc97922 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,6 +18,9 @@ dump1090-mutability (1.15~dev) UNRELEASED; urgency=medium * Support DC filtering (quite expensive) via --dcfilter * Track age of heading/speed/altitude; use this when deciding what to emit in FATSV format + * Notice synthetic mlat messages by looking for messages with a magic + timestamp value. If they arrive, tag the derived data as mlat-derived. + Don't include mlat-derived output in FATSV output to avoid loops. -- Oliver Jowett Thu, 19 Feb 2015 22:39:19 +0000 diff --git a/dump1090.h b/dump1090.h index f23527d..f57b6f1 100644 --- a/dump1090.h +++ b/dump1090.h @@ -160,6 +160,7 @@ typedef struct rtlsdr_dev rtlsdr_dev_t; #define MODES_ACFLAGS_LATLON_REL_OK (1<<15) // Indicates it's OK to do a relative CPR #define MODES_ACFLAGS_REL_CPR_USED (1<<16) // Lat/lon derived from relative CPR #define MODES_ACFLAGS_CATEGORY_VALID (1<<17) // Aircraft category is known +#define MODES_ACFLAGS_FROM_MLAT (1<<18) // Data was derived from multilateration #define MODES_ACFLAGS_LLEITHER_VALID (MODES_ACFLAGS_LLEVEN_VALID | MODES_ACFLAGS_LLODD_VALID) #define MODES_ACFLAGS_LLBOTH_VALID (MODES_ACFLAGS_LLEVEN_VALID | MODES_ACFLAGS_LLODD_VALID) diff --git a/mode_s.c b/mode_s.c index 53fd806..0fe2f2c 100644 --- a/mode_s.c +++ b/mode_s.c @@ -59,6 +59,11 @@ // // +/* A timestamp that indicates the data is synthetic, created from a + * multilateration result + */ +#define MAGIC_MLAT_TIMESTAMP 0xFF01A71A71A7ULL + //========================================================================= // // Given the Downlink Format (DF) of the message, return the message length in bits. @@ -563,6 +568,9 @@ int decodeModesMessage(struct modesMessage *mm, unsigned char *msg) mm->bFlags = 0; + if (mm->remote && mm->timestampMsg == MAGIC_MLAT_TIMESTAMP) + mm->bFlags |= MODES_ACFLAGS_FROM_MLAT; + // AA (Address announced) if (mm->msgtype == 11 || mm->msgtype == 17 || mm->msgtype == 18) { mm->addr = (msg[1] << 16) | (msg[2] << 8) | (msg[3]); diff --git a/net_io.c b/net_io.c index 85c0dac..2e65341 100644 --- a/net_io.c +++ b/net_io.c @@ -1513,6 +1513,8 @@ static void writeFATSV() char *p, *end; + int flags; + // skip non-ICAO if (a->addr & MODES_NON_ICAO_ADDRESS) continue; @@ -1527,16 +1529,19 @@ static void writeFATSV() emittedAge = (now - a->fatsv_last_emitted); - if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { + // ignore all mlat-derived data + flags = a->bFlags & ~a->mlatFlags; + + if (flags & MODES_ACFLAGS_ALTITUDE_VALID) { alt = a->altitude; altAge = now - a->seenAltitude; altValid = (altAge <= 30000); } - if (a->bFlags & MODES_ACFLAGS_AOG_VALID) { + if (flags & MODES_ACFLAGS_AOG_VALID) { groundValid = 1; - if (a->bFlags & MODES_ACFLAGS_AOG) { + if (flags & MODES_ACFLAGS_AOG) { // force zero altitude on ground alt = 0; altValid = 1; @@ -1545,17 +1550,17 @@ static void writeFATSV() } } - if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { + if (flags & MODES_ACFLAGS_LATLON_VALID) { latlonAge = now - a->seenLatLon; latlonValid = (latlonAge <= 30000); } - if (a->bFlags & MODES_ACFLAGS_HEADING_VALID) { + if (flags & MODES_ACFLAGS_HEADING_VALID) { trackAge = now - a->seenTrack; trackValid = (trackAge <= 30000); } - if (a->bFlags & MODES_ACFLAGS_SPEED_VALID) { + if (flags & MODES_ACFLAGS_SPEED_VALID) { speedAge = now - a->seenSpeed; speedValid = (speedAge <= 30000); } @@ -1604,7 +1609,7 @@ static void writeFATSV() p += snprintf(p, bufsize(p,end), "\tident\t%s", a->flight); } - if (a->bFlags & MODES_ACFLAGS_SQUAWK_VALID) { + if (flags & MODES_ACFLAGS_SQUAWK_VALID) { p += snprintf(p, bufsize(p,end), "\tsquawk\t%04x", a->modeA); } diff --git a/track.c b/track.c index 7465a5a..b7b11d5 100644 --- a/track.c +++ b/track.c @@ -535,6 +535,13 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm) // Update the aircrafts a->bFlags to reflect the newly received mm->bFlags; a->bFlags |= mm->bFlags; + // Update mlat flags. The mlat flags indicate which bits in bFlags + // were last set based on a mlat-derived message. + if (mm->bFlags & MODES_ACFLAGS_FROM_MLAT) + a->mlatFlags = (a->mlatFlags & a->bFlags) | mm->bFlags; + else + a->mlatFlags = (a->mlatFlags & a->bFlags) & ~mm->bFlags; + if (mm->msgtype == 32) { int flags = a->modeACflags; if ((flags & (MODEAC_MSG_MODEC_HIT | MODEAC_MSG_MODEC_OLD)) == MODEAC_MSG_MODEC_OLD) { diff --git a/track.h b/track.h index 734f9e2..51f74b8 100644 --- a/track.h +++ b/track.h @@ -75,6 +75,8 @@ struct aircraft { uint64_t seenSpeed; // Time (millis) at which speed was measured uint64_t seenTrack; // Time (millis) at which track was measured + int mlatFlags; // Data derived from mlat messages + long messages; // Number of Mode S messages received int modeA; // Squawk int modeC; // Altitude