Skip to content

xandkar/erlang-x-plane-data

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status

X-Plane UDP data parser

Data output in the cockpit

Examples

Receive data packet

{ok, Socket} = gen_udp:open(Port, [binary, {active, false}]),
{ok, {_, _, <<XPlaneDataPacket/binary>>}} = gen_udp:recv(Socket, 0),

Parse data packet

{ok, {64=Index, GroupsRaw}=DataRaw} = x_plane_data_raw:of_bin(XPlaneDataPacket),

Access parsed data

Raw

At this stage, only the structure of the packet was parsed. No attempts at interpreting the values have been made:

% Speeds are in group 3
{3, Speeds} = lists:keyfind(3, 1, GroupsRaw),
{ VindKias
, VindKeas
, VtrueKtas
, VtrueKtgs
, _
, VindMph
, VtrueMphas
, VtrueMphgs
} = Speeds,

% Pitch roll and headings values are in group 17
{17, PitchRollHeadings} = lists:keyfind(17, 1, GroupsRaw),
{ PitchDeg
, RollDeg
, HdingTrue
, HdingMag
, _
, _
, _
, _
} = PitchRollHeadings,

Named

Here we identify what each of the numbered groups mean in a given X-Plane version. Right now only X-Plane 10 (packet index 64) is supported and I only identified 3 groups so far:

packet index group index group name
64 3 speeds
64 17 pitch_roll_heading
64 20 lat_lon_alt

Unidentified groups (with index other than what is listed above) will be absent from the list of named groups (think of x_plane_data_named:of_raw/1 as a filter), so you'll have to access their raw version, if needed.

Identify
{ok, {x_plane_data_v10, GroupsNamed}} = x_plane_data_named:of_raw(DataRaw),
Access
-include_lib("x_plane_data/include/x_plane_data_group_speeds.hrl").
{speeds, #x_plane_data_group_speeds
    { vind_kias   = VindKias
    , vind_keas   = VindKeas
    , vtrue_ktas  = VtrueKtas
    , vtrue_ktgs  = VtrueKtgs
    , vind_mph    = VindMph
    , vtrue_mphas = VtrueMphas
    , vtrue_mphgs = VtrueMphgs
    }
} = lists:keyfind(speeds, 1, GroupsNamed),

...

-include_lib("x_plane_data/include/x_plane_data_group_pitch_roll_heading.hrl").
{pitch_roll_heading, #x_plane_data_group_pitch_roll_heading
    { pitch_deg  = PitchDeg
    , roll_deg   = RollDeg
    , hding_true = HdingTrue
    , hding_mag  = HdingMag
    }
} = lists:keyfind(pitch_roll_heading, 1, GroupsNamed),

...

-include_lib("x_plane_data/include/x_plane_data_group_lat_lon_alt.hrl").
{lat_lon_alt, #x_plane_data_group_lat_lon_alt
    { lat_deg   = LatDeg
    , lon_deg   = LonDeg
    , alt_ftmsl = AltFtmsl
    , alt_ftagl = AltFtagl
    , on_runwy  = OnRunwy
    , alt_ind   = AltInd
    , lat_south = LatSouth
    , lon_west  = LonWest
    }
} = lists:keyfind(lat_lon_alt, 1, GroupsNamed),

Packet structure

<<"DATA", PacketIndex:8/integer, Groups/binary>>,
<< GroupIndex:32/little-integer
 , GroupValue1:32/little-float
 , GroupValue2:32/little-float
 , GroupValue3:32/little-float
 , GroupValue4:32/little-float
 , GroupValue5:32/little-float
 , GroupValue6:32/little-float
 , GroupValue7:32/little-float
 , GroupValue8:32/little-float
 , GroupsRest/binary
>> = Groups,

Where PacketIndex indicates something like a schema version, i.e. what each of the numbered groups means. For example, in X-Plane 10, packet index is 64 (character "@") and group 3 contains speed data, in which the 8 group values are:

Location Label Description
1 vind_kias Velocity indicated, in knots indicated airspeed.
2 vind_keas Velocity indicated, in knots equivalent airspeed (the calibrated airspeed corrected for adiabatic compressible flow at the craft's current altitude).
3 vtrue_ktas Velocity true (the speed of the craft relative to undisturbed air), in knots true airspeed.
4 vtrue_ktgs Velocity true, in knots true ground speed.
5 Unused. Contains a dummy value.
6 vind_mph Velocity indicated, in miles per hour.
7 vtrue_mphas Velocity true, in miles per hour airspeed.
8 vtrue_mphgs Velocity true, in miles per hour ground speed.

References

About

X-Plane UDP data parser for Erlang

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published