Skip to content

Commit e0f794b

Browse files
committed
Track MRAR data per-aircraft and emit in aircraft.json
1 parent 95ab1c0 commit e0f794b

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

net_io.c

+35-1
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,29 @@ static const char *nav_altitude_source_enum_string(nav_altitude_source_t src)
16121612
}
16131613
}
16141614

1615+
static const char *mrar_source_enum_string(mrar_source_t src)
1616+
{
1617+
switch (src) {
1618+
case MRAR_SOURCE_INVALID: return "invalid";
1619+
case MRAR_SOURCE_INS: return "ins";
1620+
case MRAR_SOURCE_GNSS: return "gnss";
1621+
case MRAR_SOURCE_DMEDME: return "dmedme";
1622+
case MRAR_SOURCE_VORDME: return "vordme";
1623+
default: return "reserved";
1624+
}
1625+
}
1626+
1627+
static const char *hazard_enum_string(hazard_t hazard)
1628+
{
1629+
switch (hazard) {
1630+
case HAZARD_NIL: return "nil";
1631+
case HAZARD_LIGHT: return "light";
1632+
case HAZARD_MODERATE: return "moderate";
1633+
case HAZARD_SEVERE: return "severe";
1634+
default: return "invalid";
1635+
}
1636+
}
1637+
16151638
char *generateAircraftJson(const char *url_path, int *len) {
16161639
uint64_t now = mstime();
16171640
struct aircraft *a;
@@ -1715,12 +1738,23 @@ char *generateAircraftJson(const char *url_path, int *len) {
17151738
p = safe_snprintf(p, end, ",\"gva\":%u", a->gva);
17161739
if (trackDataValid(&a->sda_valid))
17171740
p = safe_snprintf(p, end, ",\"sda\":%u", a->sda);
1741+
if (trackDataValid(&a->mrar_source_valid))
1742+
p = safe_snprintf(p, end, ",\"mrar_source\":\"%s\"", mrar_source_enum_string(a->mrar_source));
1743+
if (trackDataValid(&a->wind_valid))
1744+
p = safe_snprintf(p, end, ",\"wind_speed\":%.0f,\"wind_dir\":%.1f", a->wind_speed, a->wind_dir);
1745+
if (trackDataValid(&a->temperature_valid))
1746+
p = safe_snprintf(p, end, ",\"temperature\":%.2f", a->temperature);
1747+
if (trackDataValid(&a->pressure_valid))
1748+
p = safe_snprintf(p, end, ",\"pressure\":%.0f", a->pressure);
1749+
if (trackDataValid(&a->turbulence_valid))
1750+
p = safe_snprintf(p, end, ",\"turbulence\":\"%s\"", hazard_enum_string(a->turbulence));
1751+
if (trackDataValid(&a->humidity_valid))
1752+
p = safe_snprintf(p, end, ",\"humidity\":%.1f", a->humidity);
17181753
if (a->modeA_hit)
17191754
p = safe_snprintf(p, end, ",\"modea\":true");
17201755
if (a->modeC_hit)
17211756
p = safe_snprintf(p, end, ",\"modec\":true");
17221757

1723-
17241758
p = safe_snprintf(p, end, ",\"mlat\":");
17251759
p = append_flags(p, end, a, SOURCE_MLAT);
17261760
p = safe_snprintf(p, end, ",\"tisb\":");

track.c

+37
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ static struct aircraft *trackCreateAircraft(struct modesMessage *mm) {
130130
F(sil, 60, 70); // ADS-B only
131131
F(gva, 60, 70); // ADS-B only
132132
F(sda, 60, 70); // ADS-B only
133+
F(mrar_source, 60, 70); // Comm-B only
134+
F(wind, 60, 70); // Comm-B only
135+
F(temperature, 60, 70); // Comm-B only
136+
F(pressure, 60, 70); // Comm-B only
137+
F(turbulence, 60, 70); // Comm-B only
138+
F(humidity, 60, 70); // Comm-B only
133139
#undef F
134140

135141
Modes.stats_current.unique_aircraft++;
@@ -1237,6 +1243,31 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
12371243
a->sda = mm->accuracy.sda;
12381244
}
12391245

1246+
if (mm->mrar_source_valid && accept_data(&a->mrar_source_valid, mm->source)) {
1247+
a->mrar_source = mm->mrar_source;
1248+
}
1249+
1250+
if (mm->wind_valid && accept_data(&a->wind_valid, mm->source)) {
1251+
a->wind_speed = mm->wind_speed;
1252+
a->wind_dir = mm->wind_dir;
1253+
}
1254+
1255+
if (mm->temperature_valid && accept_data(&a->temperature_valid, mm->source)) {
1256+
a->temperature = mm->temperature;
1257+
}
1258+
1259+
if (mm->pressure_valid && accept_data(&a->pressure_valid, mm->source)) {
1260+
a->pressure = mm->pressure;
1261+
}
1262+
1263+
if (mm->turbulence_valid && accept_data(&a->turbulence_valid, mm->source)) {
1264+
a->turbulence = mm->turbulence;
1265+
}
1266+
1267+
if (mm->humidity_valid && accept_data(&a->humidity_valid, mm->source)) {
1268+
a->humidity = mm->humidity;
1269+
}
1270+
12401271
// Now handle derived data
12411272

12421273
// derive geometric altitude if we have baro + delta
@@ -1400,6 +1431,12 @@ static void trackRemoveStaleAircraft(uint64_t now)
14001431
EXPIRE(sil);
14011432
EXPIRE(gva);
14021433
EXPIRE(sda);
1434+
EXPIRE(mrar_source);
1435+
EXPIRE(wind);
1436+
EXPIRE(temperature);
1437+
EXPIRE(pressure);
1438+
EXPIRE(turbulence);
1439+
EXPIRE(humidity);
14031440
#undef EXPIRE
14041441
prev = a; a = a->next;
14051442
}

track.h

+16
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,22 @@ struct aircraft {
226226
unsigned gva : 2; // GVA from opstatus
227227
unsigned sda : 2; // SDA from opstatus
228228

229+
// data extracted from MRAR
230+
data_validity mrar_source_valid;
231+
data_validity wind_valid; // speed and direction
232+
data_validity pressure_valid;
233+
data_validity temperature_valid;
234+
data_validity turbulence_valid;
235+
data_validity humidity_valid;
236+
237+
mrar_source_t mrar_source;
238+
float wind_speed;
239+
float wind_dir;
240+
float pressure;
241+
float temperature;
242+
hazard_t turbulence;
243+
float humidity;
244+
229245
int modeA_hit; // did our squawk match a possible mode A reply in the last check period?
230246
int modeC_hit; // did our altitude match a possible mode C reply in the last check period?
231247

0 commit comments

Comments
 (0)