Controller-pilot data link communication
Work in progress This article or section will be worked on in the upcoming hours or days. See history for the latest developments. |
Controller-pilot data link communication (CPDLC) is a direct connection between ATC and aircraft through which pilots and controllers can communicate based on text, thereby relieving radio traffic. Its use is increasing everywhere in real life, and an extension to FlightGear is currently under development to support it in the multi-player environment.
Status in FlightGear multi-player
Recent efforts have already taken place towards implementing it in MP:
- the Virtual FSWeekend Hackathon 2020 attracted a team to work on the CPDLC proposal;
- CPDLC extension was merged to 'next' in January 2021;
- a generic CPDLC dialog add-on is available (see screenshot); Nasal helpers in this addon should be moved to FGDATA once stable (needs feedback from aircraft developers)
- work is currently in progress on at least one cockpit CPDLC panel;
- ATC client ATC-pie is fully operational, ready to service its first logons to come.
Technical section: protocol message line format
From a FlightGear model point of view, four fgCommands are available:
cpdlc-connect
with an ATC callsign argument;cpdlc-send
with a formatted text line argument representing the CPDLC message to send, see cpdlc_message below;cpdlc-next-message
, to collect the next queued message, also formatted as per cpdlc_message below;cpdlc-disconnect
.
A message is known to be queued and ready for a cpdlc-next-message
call when property /network/cpdlc/rx/new-message
is true.
Dequeued messages are collected in /network/cpdlc/rx/message
.
At any connected moment, the current "data authority" (ATC currently connected to the data link) is available in /network/cpdlc/link/data-authority
.
Below is the format for the exchanged messages, in an EBNF style mixed with regular expressions.
cpdlc_message ::= // second format useful if '|' present inside an element | <msg_element> ('|' <msg_element>)* // no spaces around separator | <custom_separator:SEP> ' ' <msg_element> (' ' <SEP> ' ' <msg_element>)* custom_separator ::= [^0-9A-Za-z ]+ msg_element ::= <msg_element_identifier> (' ' <msg_element_parameter>)* msg_element_identifier ::= [A-Z]{3}[DU]-[0-9]+ // as specified in ICAO doc 4444 msg_element_parameter ::= | [0-9]{3} // heading and speed parameters | (FL)?[0-9]+ // altitude/FL | RIGHT|LEFT // direction (e.g. in turn instr's) | ... | .* // free texts (route, "due to" reason, etc.)