2015-02-08 15:27:03 +01:00
|
|
|
// Part of dump1090, a Mode S message decoder for RTLSDR devices.
|
|
|
|
//
|
|
|
|
// track.h: aircraft state tracking prototypes
|
|
|
|
//
|
|
|
|
// Copyright (c) 2014,2015 Oliver Jowett <oliver@mutability.co.uk>
|
|
|
|
//
|
|
|
|
// This file is free software: you may copy, redistribute and/or modify it
|
|
|
|
// under the terms of the GNU General Public License as published by the
|
|
|
|
// Free Software Foundation, either version 2 of the License, or (at your
|
|
|
|
// option) any later version.
|
|
|
|
//
|
|
|
|
// This file is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
// This file incorporates work covered by the following copyright and
|
|
|
|
// permission notice:
|
|
|
|
//
|
|
|
|
// Copyright (C) 2012 by Salvatore Sanfilippo <antirez@gmail.com>
|
|
|
|
//
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without
|
|
|
|
// modification, are permitted provided that the following conditions are
|
|
|
|
// met:
|
|
|
|
//
|
|
|
|
// * Redistributions of source code must retain the above copyright
|
|
|
|
// notice, this list of conditions and the following disclaimer.
|
|
|
|
//
|
|
|
|
// * Redistributions in binary form must reproduce the above copyright
|
|
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
|
|
// documentation and/or other materials provided with the distribution.
|
|
|
|
//
|
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
|
|
#ifndef DUMP1090_TRACK_H
|
|
|
|
#define DUMP1090_TRACK_H
|
|
|
|
|
2015-02-10 22:49:37 +01:00
|
|
|
/* Maximum age of tracked aircraft in milliseconds */
|
|
|
|
#define TRACK_AIRCRAFT_TTL 300000
|
2015-02-08 15:27:03 +01:00
|
|
|
|
2015-02-10 22:49:37 +01:00
|
|
|
/* Maximum age of a tracked aircraft with only 1 message received, in milliseconds */
|
|
|
|
#define TRACK_AIRCRAFT_ONEHIT_TTL 60000
|
2015-02-08 15:37:35 +01:00
|
|
|
|
2015-02-18 01:12:35 +01:00
|
|
|
/* Maximum validity of an aircraft position */
|
|
|
|
#define TRACK_AIRCRAFT_POSITION_TTL 60000
|
|
|
|
|
2015-02-08 15:27:03 +01:00
|
|
|
/* Structure used to describe the state of one tracked aircraft */
|
|
|
|
struct aircraft {
|
|
|
|
uint32_t addr; // ICAO address
|
|
|
|
char flight[16]; // Flight number
|
|
|
|
double signalLevel[8]; // Last 8 Signal Amplitudes
|
2016-01-01 14:42:30 +01:00
|
|
|
int altitude; // Altitude (Baro)
|
|
|
|
int altitude_hae; // Altitude (HAE)
|
|
|
|
int hae_delta; // Difference between HAE and Baro altitudes
|
2015-02-08 15:27:03 +01:00
|
|
|
int speed; // Velocity
|
|
|
|
int track; // Angle of flight
|
|
|
|
int vert_rate; // Vertical rate.
|
2015-06-16 00:13:04 +02:00
|
|
|
|
2015-02-10 22:49:37 +01:00
|
|
|
uint64_t seen; // Time (millis) at which the last packet was received
|
2015-06-16 00:13:04 +02:00
|
|
|
uint64_t seenLatLon; // Time (millis) at which lat, lon was measured
|
|
|
|
uint64_t seenAltitude; // Time (millis) at which altitude was measured
|
|
|
|
uint64_t seenSpeed; // Time (millis) at which speed was measured
|
|
|
|
uint64_t seenTrack; // Time (millis) at which track was measured
|
|
|
|
|
2015-06-28 21:04:09 +02:00
|
|
|
int mlatFlags; // Data derived from mlat messages
|
|
|
|
|
2015-02-08 15:27:03 +01:00
|
|
|
long messages; // Number of Mode S messages received
|
|
|
|
int modeA; // Squawk
|
|
|
|
int modeC; // Altitude
|
|
|
|
long modeAcount; // Mode A Squawk hit Count
|
|
|
|
long modeCcount; // Mode C Altitude hit Count
|
|
|
|
int modeACflags; // Flags for mode A/C recognition
|
|
|
|
|
|
|
|
int fatsv_emitted_altitude; // last FA emitted altitude
|
2015-06-16 00:13:04 +02:00
|
|
|
int fatsv_emitted_track; // last FA emitted track
|
|
|
|
int fatsv_emitted_speed; // last FA emitted speed
|
2015-02-10 22:49:37 +01:00
|
|
|
uint64_t fatsv_last_emitted; // time (millis) aircraft was last FA emitted
|
2015-02-08 15:27:03 +01:00
|
|
|
|
|
|
|
// Encoded latitude and longitude as extracted by odd and even CPR encoded messages
|
2015-02-18 01:12:35 +01:00
|
|
|
uint64_t odd_cprtime;
|
2015-02-08 15:27:03 +01:00
|
|
|
int odd_cprlat;
|
|
|
|
int odd_cprlon;
|
2015-02-18 01:12:35 +01:00
|
|
|
unsigned odd_cprnuc;
|
|
|
|
|
|
|
|
uint64_t even_cprtime;
|
2015-02-08 15:27:03 +01:00
|
|
|
int even_cprlat;
|
|
|
|
int even_cprlon;
|
2015-02-18 01:12:35 +01:00
|
|
|
unsigned even_cprnuc;
|
|
|
|
|
2015-02-08 15:27:03 +01:00
|
|
|
double lat, lon; // Coordinated obtained from CPR encoded data
|
2015-02-18 01:12:35 +01:00
|
|
|
unsigned pos_nuc; // NUCp of last computed position
|
|
|
|
|
2015-02-22 13:15:26 +01:00
|
|
|
unsigned category; // Aircraft category A0 - D7 encoded as a single hex byte
|
|
|
|
|
2015-02-08 15:27:03 +01:00
|
|
|
int bFlags; // Flags related to valid fields in this structure
|
|
|
|
struct aircraft *next; // Next aircraft in our linked list
|
If we squelch the first message from an aircraft, emit it when we see a second message.
This is possible now that the SBS output doesn't rely on the global block timestamp;
the output will look like this:
MSG,8,111,11111,4AC954,111111,2015/02/08,17:57:53.917,2015/02/08,17:57:53.936,,,,,,,,,,,,0
MSG,7,111,11111,392AEB,111111,2015/02/08,17:57:53.744,2015/02/08,17:57:53.936,,15375,,,,,,,,,,0
MSG,8,111,11111,392AEB,111111,2015/02/08,17:57:53.917,2015/02/08,17:57:53.936,,,,,,,,,,,,0
MSG,6,111,11111,800387,111111,2015/02/08,17:57:53.919,2015/02/08,17:57:53.936,,,,,,,,4745,0,0,0,0
where the "receive timestamp" (first time column) goes backwards to reflect the original reception
time of the delayed message, but the "forwarded timestamp" (second time column) reflects the actual
forwarding time.
2015-02-08 19:00:18 +01:00
|
|
|
|
|
|
|
struct modesMessage first_message; // A copy of the first message we received for this aircraft.
|
2015-02-08 15:27:03 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Update aircraft state from data in the provided mesage.
|
|
|
|
* Return the tracked aircraft.
|
|
|
|
*/
|
|
|
|
struct modesMessage;
|
|
|
|
struct aircraft *trackUpdateFromMessage(struct modesMessage *mm);
|
|
|
|
|
|
|
|
/* Call periodically */
|
|
|
|
void trackPeriodicUpdate();
|
|
|
|
|
|
|
|
#endif
|