kopia lustrzana https://github.com/dl2alf/AirScout
80 wiersze
3.3 KiB
C#
80 wiersze
3.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace LibADSB
|
|
{
|
|
// public class for storing subsequent position messages
|
|
public class AircraftPositions
|
|
{
|
|
public AirbornePositionMsg last_even_airborne;
|
|
public AirbornePositionMsg last_odd_airborne;
|
|
public SurfacePositionMsg last_even_surface;
|
|
public SurfacePositionMsg last_odd_surface;
|
|
public double[] last_position; // lat lon
|
|
public bool supplA;
|
|
}
|
|
|
|
/**
|
|
* General decoder for ADS-B messages
|
|
* @author Matthias Schäfer <schaefer@sero-systems.de>
|
|
*/
|
|
public class Decoder
|
|
{
|
|
|
|
/**
|
|
* A top-down ADS-B decoder. Use instanceof to check for the message type.
|
|
* @param raw_message The Mode S message in hex representation
|
|
*/
|
|
public static ModeSReply GenericDecoder(String raw_message)
|
|
{
|
|
ModeSReply modes = new ModeSReply(raw_message);
|
|
// check parity; Note: some receivers set parity to 0
|
|
if (modes.IsZeroParity() || modes.CheckParity)
|
|
{
|
|
// check if it is an ADS-B message
|
|
if (modes.DownlinkFormat == 17 || modes.DownlinkFormat == 18)
|
|
{
|
|
ExtendedSquitter es1090 = new ExtendedSquitter(raw_message);
|
|
|
|
// what kind of extended squitter?
|
|
byte ftc = es1090.FormatTypeCode;
|
|
if (ftc >= 1 && ftc <= 4) // identification message
|
|
return new IdentificationMsg(raw_message);
|
|
if (ftc >= 5 && ftc <= 8) // surface position message
|
|
return new SurfacePositionMsg(raw_message);
|
|
if ((ftc >= 9 && ftc <= 18) || (ftc >= 20 && ftc <= 22)) // airborne position message
|
|
return new AirbornePositionMsg(raw_message);
|
|
if (ftc == 19) { // possible velocity message, check subtype
|
|
int subtype = es1090.Message[0]&0x7;
|
|
|
|
if (subtype == 1 || subtype == 2) // velocity over ground
|
|
return new VelocityOverGroundMsg(raw_message);
|
|
else if (subtype == 3 || subtype == 4) // airspeed & heading
|
|
return new AirspeedHeadingMsg(raw_message);
|
|
}
|
|
/*
|
|
if (ftc == 28) { // aircraft status message, check subtype
|
|
int subtype = es1090.getMessage()[0]&0x7;
|
|
|
|
if (subtype == 1) // emergency/priority status
|
|
return new EmergencyOrPriorityStatusMsg(raw_message);
|
|
if (subtype == 2) // TCAS resolution advisory report
|
|
return new TCASResolutionAdvisoryMsg(raw_message);
|
|
}
|
|
|
|
if (ftc == 31) { // operational status message
|
|
int subtype = es1090.getMessage()[0]&0x7;
|
|
|
|
if (subtype == 0 || subtype == 1) // airborne or surface?
|
|
return new OperationalStatusMsg(raw_message);
|
|
}
|
|
*/
|
|
return es1090; // unknown extended squitter
|
|
}
|
|
}
|
|
return modes; // unknown mode s reply
|
|
}
|
|
}
|
|
} |