Co-locate record include with its usage in examples.
[erlang-x-plane-data.git] / README.md
CommitLineData
3549a33a
SK
1[![Build Status](https://travis-ci.org/ibnfirnas/erlang-x_plane_data.svg?branch=master)](https://travis-ci.org/ibnfirnas/erlang-x_plane_data)
2
3X-Plane UDP data parser
4=======================
d014d93e 5
ca0b3fd4
SK
6![Data output in the cockpit](screenshot.png)
7
25c95554
SK
8Examples
9--------
10
11### Receive data packet
12
13```erlang
14{ok, Socket} = gen_udp:open(Port, [binary, {active, false}]),
15{ok, {_, _, <<XPlaneDataPacket/binary>>}} = gen_udp:recv(Socket, 0),
16```
17
18### Parse data packet
19
20```erlang
84fa8ccb 21{ok, {64=Index, GroupsRaw}=DataRaw} = x_plane_data_raw:of_bin(XPlaneDataPacket),
25c95554
SK
22```
23
24### Access parsed data
64c0d81f 25
84fa8ccb
SK
26#### Raw
27
28At this stage, only the structure of the packet was parsed. No attempt at
29interpreting the values have been made:
30
64c0d81f 31```erlang
25c95554 32% Speeds are in group 3
84fa8ccb 33{3, Speeds} = lists:keyfind(3, 1, GroupsRaw),
25c95554
SK
34{ VindKias
35, VindKeas
36, VtrueKtas
37, VtrueKtgs
38, _
39, VindMph
40, VtrueMphas
41, VtrueMphgs
42} = Speeds,
43
44% Pitch roll and headings values are in group 17
84fa8ccb 45{17, PitchRollHeadings} = lists:keyfind(17, 1, GroupsRaw),
25c95554
SK
46{ PitchDeg
47, RollDeg
48, HdingTrue
49, HdingMag
50, _
51, _
52, _
53, _
54} = PitchRollHeadings,
64c0d81f
SK
55```
56
84fa8ccb
SK
57#### Named
58
59Here we identify what each of the numbered groups mean in a given X-Plane
3f512f37
SK
60version. Right now only X-Plane 10 (packet index 64) is supported and I only
61identified 3 groups so far:
84fa8ccb 62
924626bc
SK
63| packet index | group index | group name |
64|--------------|-------------|----------------------|
65| 64 | 3 | `speeds` |
66| 64 | 17 | `pitch_roll_heading` |
67| 64 | 20 | `lat_lon_alt` |
84fa8ccb
SK
68
69Unidentified groups (with index other than what is listed above) will be
70absent from the list of named groups (think of `x_plane_data_named:of_raw/1` as
71a filter), so you'll have to access their raw version, if needed.
72
73##### Identify
74```erlang
75{ok, {x_plane_data_v10, GroupsNamed}} = x_plane_data_named:of_raw(DataRaw),
76```
77
78##### Access
79```erlang
c80f9c88 80-include_lib("x_plane_data/include/x_plane_data_group_speeds.hrl").
84fa8ccb
SK
81{speeds, #x_plane_data_group_speeds
82 { vind_kias = VindKias
83 , vind_keas = VindKeas
84 , vtrue_ktas = VtrueKtas
85 , vtrue_ktgs = VtrueKtgs
86 , vind_mph = VindMph
87 , vtrue_mphas = VtrueMphas
88 , vtrue_mphgs = VtrueMphgs
89 }
90} = lists:keyfind(speeds, 1, GroupsNamed),
91
859f8f9a
SK
92...
93
94-include_lib("x_plane_data/include/x_plane_data_group_pitch_roll_heading.hrl").
84fa8ccb
SK
95{pitch_roll_heading, #x_plane_data_group_pitch_roll_heading
96 { pitch_deg = PitchDeg
97 , roll_deg = RollDeg
98 , hding_true = HdingTrue
99 , hding_mag = HdingMag
100 }
101} = lists:keyfind(pitch_roll_heading, 1, GroupsNamed),
102```
103
4698884e
SK
104Packet structure
105----------------
d014d93e 106
4698884e
SK
107```erlang
108<<"DATA", PacketIndex:8/integer, Groups/binary>>,
109<< GroupIndex:32/little-integer
110 , GroupValue1:32/little-float
111 , GroupValue2:32/little-float
112 , GroupValue3:32/little-float
113 , GroupValue4:32/little-float
114 , GroupValue5:32/little-float
115 , GroupValue6:32/little-float
116 , GroupValue7:32/little-float
117 , GroupValue8:32/little-float
118 , GroupsRest/binary
119>> = Groups,
120```
121
122Where `PacketIndex` indicates something like a schema version, i.e. what each
123of the numbered groups means. For example, in X-Plane 10, packet index is 64
124(character `"@"`) and group 3 contains speed data, in which the 8 group values
125are:
126
127| Location | Label | Description |
128|----------|---------------|-------------|
129| 1 | `vind_kias` | Velocity indicated, in knots indicated airspeed. |
130| 2 | `vind_keas` | Velocity indicated, in knots equivalent airspeed (the calibrated airspeed corrected for adiabatic compressible flow at the craft's current altitude). |
131| 3 | `vtrue_ktas` | Velocity true (the speed of the craft relative to undisturbed air), in knots true airspeed. |
132| 4 | `vtrue_ktgs` | Velocity true, in knots true ground speed. |
133| 5 | | Unused. Contains a dummy value. |
134| 6 | `vind_mph` | Velocity indicated, in miles per hour. |
135| 7 | `vtrue_mphas` | Velocity true, in miles per hour airspeed. |
136| 8 | `vtrue_mphgs` | Velocity true, in miles per hour ground speed. |
137
138
139References
140----------
141
142- `X-Plane_10_manual.pdf` (distributed with X-Plane 10)
d014d93e
SK
143- http://b58.svglobe.com/data.html
144- http://www.nuclearprojects.com/xplane/xplaneref.html
This page took 0.028607 seconds and 4 git commands to generate.