MediaWiki has been updated to version 1.35.1. Please report any problems here.


From FlightGear wiki
Jump to navigation Jump to search

Controller-pilot data link communication (CPDLC) is a direct connection between ATC and aircraft through which controllers can communicate with pilots based on text, thereby relieving radio traffic. Its use is increasing everywhere in real life, while no aircraft is equipped in FlightGear yet.

If taken up in the 2020 Hackathon, this feature missing today could become available quite soon, as no serious core change seems necessary, at least for first versions to start working.

Recent efforts

This would not start from scratch. Recent efforts have already taken place towards making it possible:

  • ATC-pie already integrates CPDLC: it is working for other session types (e.g. solo), and an IRC-based (simple text) infrastructure for FG sessions is already in place, including transfers between data authorities, etc. (all it needs now is to be contacted by aircraft!)---see #Available ATC-pie IRC scheme further down;
  • work is currently in progress on a cockpit CPDLC panel;
  • a CPDLC middleware is under dev, required at this point because FG models cannot open their own TCP connections.


The following could be done in the hackathon:

  • write the Nasal to exchange the right data with the outside system;
  • involving core dev's at least for the design choice, a way to get rid of the middleware eventually, e.g. allow Nasal connections to FG-approved servers (like or integrate specific accesses in the C++ code base (sort of the same history as FGCom, going from standalone executables to an option in the FG menu)?
  • can someone create a sketch of a block diagram of the elements that need to communicate and the connections between them? -- p callahan
Block diagram for CPDLC subsystem

The block diagram describes how such a system might operate. The crucial elements are the IRC Hook and the FlightGear API. These are what the aircraft / ATC talk to directly, and therefore where input and output occur.

The IRC hook will require elements such as:

  • Connection
  • Respond to PING
  • Disconnection
  • Transmit and receive PRIVMSG to a specified UID
  • Error handling - if UID does not exist, if server disconnects, if ...

The FlightGear API will require elements such as:

  • Connection
  • Disconnection
  • Transmit + receive message element (including message history as a vector)

One option is to have a /sim/network/cpcdlc/received/ message sender status .. etc ….

and then an additional


Then in C++ you fill in all the ‘received’ values from your socket callback, and fire value changed on the signal property. This will allow a Nasal listener to process the received data.

For message history, you could either have multiple received nodes (e.g. received[0], [1], [2]) or else a Nasal hook that accesses a vector.

For transmitted messages, a similar scheme would work; however, what would probably be better would be:

fgcommand(‘cpcdlc-transmit’,{‘receient’:’blah’, ‘mesage’:’foobarzot’,<etc, etc>});

We’d use the same to establish the connection:

fgcommand(‘cpcdlc-connect’,{ ’server’: “’, ‘port’ : 666, ‘callsign’ : ‘wibble’, <etc, etc? ‘recv-path’ : ‘/sim/network/cpcdlc/received’, ‘recv-signal’ : /sim/network/cpcdlc/signals/received' });

Available ATC-pie IRC scheme

When connected to an IRC server, e.g., ATC-pie features an integrated text chat system for ATCs to coordinate off the (public) FG text chat. The choice of IRC and plain text lines was in part motivated by the possibility for users of other clients (e.g. OpenRadar) still to take part via their own IRC client.

The connection is also used to embed special commands, in the form of escaped text lines, starting with ___ATC-pie___ , e.g. for strip exchange (handovers) or "who-has" requests. Commands were later added to support CPDLC, which is ready for ACFT to connect. What follows is a description of those CPDLC-related commands.

Note that the IRC nicknames are assumed to match the FGMS network callsigns, so the first line sent after connection is always:

NICK <callsign>\r\n

Then, from an ACFT point of view, every CPDLC command is sent to the current (or requested) data authority (ATC) via an escaped chat message line:

PRIVMSG <atc> :___ATC-pie___ <command_line>\r\n

Command lines that an aircraft can send to an ATC are:

  • CPDLC_CONNECT: attempt log-on
  • CPDLC_MSG <msg_contents>: connected CPDLC dialogue message (see below)
  • CPDLC_DISCONNECT: connection shut down

Command lines that an aircraft can receive from an ATC are:

  • CPDLC_CONNECT: accepted log-on, or new data authority (link has been transferred)
  • CPDLC_MSG <msg_contents>: connected CPDLC dialogue msg (see below)
  • CPDLC_DISCONNECT: connection voluntarily dropped by ATC, or refused log-on

The contents of connected dialogue messages (contained in CPDLC_MSG lines) can be discussed as part of the interface between aircraft and ATC-pie, but for the moment they are of either format below:

  • REQUEST <display_text>(<sep_char><encoded_instruction>)*: likely answered with an INSTR msg
  • INSTR <display_text>(<sep_char><encoded_instruction>)*: never sent by ACFT, only received
  • ACK: acknowledgement/"WILCO"
  • REJECT <optional_reason>
  • TEXT <free_text>