Controller-pilot data link communication

From FlightGear wiki
Jump to navigation Jump to search
WIP.png 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

Screenshot of the generic CPDLC dialog add-on
Displays the A320 CPDLC cockpit instrumentation

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.)