= Communications Overview

                  ┌─────────────────────────────────────────────────────────┐
    Plugins       │      Plugins using decoded and raw data messaging       │
                  └─────────────────────────────────────────────────────────┘           
                  
                  ┌─────────────────────────────────────────────────────────┐
                  │                    Plugin message API                   │
                  └───────────────────────────────────────────────┐         │
                                                                  │         │
                  ┌───────────────────────────────────────────┐   │         │
    Application   │     Application messages (decoded data)   │   │         │
                  ├╶╶╶╶╶╶-╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶┤   │         │
                  │      Message source priorities            │   │         │
                  │           Protocol handlers               │   │         │
                  │                                           │   │         │
                  │  nmea0183    nmea2000    signalK   ...    │   │         │
                  └───────────────────────────────────────────┘   └─────────┘
    
                  ┌─────────────────────────────────────────────────────────┐
    Transport     │             Navigation messages (raw data)              │
                  └─────────────────────────────────────────────────────────┘
    
                  ┌─────────────────────────────────────────────────────────┐
                  │                   Driver registry                       │
    Drivers       ├╶╶╶╶╶╶╶-┬╶╶╶╶╶╶╶╶╶╶-┬╶╶╶╶╶╶╶┬╶╶╶╶╶╶╶╶╶╶┬╶╶╶╶╶╶╶╶╶┬╶╶╶╶╶╶╶┤
                  │ 0183   │ Actisense │ Linux │ iKonvert │ SignalK │       │
                  │        │ NGT-1     │ CAN   │          │ +ipv4   │ ...   │
                  │        │           │       │          │ TCP/IP  │       │
                  └────────┴───────────┴───────┴──────────┴─────────┴───────┘
    

All internal communications described here is based on the *observable*
library which is available in *libs/*. This library implements a basic
observable pattern allowing parties to listen a. k. a. subscribe to
incoming messages.

All new-style drivers are named like *comm-drv-\**.
These handles the low-level communication details.
Incoming messages from the outside are made available on the navigation
messages bus.
Both core parts and plugins listens to this bus, acting on messages when
they arrive.

These messages are of type`ǸavMsg` defined in *comm_navmsg.h*.
This is a unified, common type for all sorts of messages including NMEA2000,
NMEA0183 and SignalK.

In the core, *comm_decoder* acts as a dispatcher which listens to the 
message bus and invokes various parts when messages arrives. 
*comm_decoder* also handles priorities when receiving the same data from 
multiple sources, selecting the data source to use.

For plugins, a simplified API is available, see the
xref::plugin-messaging.adoc[Plugins Communications API].

When sending messages, upper layers needs to know which driver to use.
To that end, drivers registers themselves in the *drv_registry* which
maintains an actual list of available drivers.


