.. _cspifc:

==============
CSP Interfaces
==============

The Polaris receiver is operated remotely via `CubeSat Space Protocol (CSP) <http://www.libcsp.org/>`_ messages. The :ref:`polaris-adsb-client`, :ref:`prop-client`, and :ref:`btp` all contain wrapper function around CSP protocols. In addition, Polaris also implements the standard CSP service ports such as ``CSP_PING`` and ``CSP_REBOOT``.

Configuration CSP parameters
----------------------------

By default, the receiver uses address ``23`` but this can be changed by adjusting the address property ``sys.csp.address`` and saving the ``sys`` group. The system must be rebooted for the address change to take effect.

The receiver supports CSP via CAN-bus (``CAN`` interface) and RS-422 (``KISS`` interface) in the P1 connector. Both interfaces are always enabled for incoming messages, but the default routing table sends egress messages on the CAN interface for all traffic except loopback. The interface rates can be set using the ``sys.can.rate`` and ``sys.uart.rate`` properties. By default, the RS-422 interface is configured for a point-to-point link. By setting the ``sys.uart.multidrop`` property to ``true`` the interface can be configured for multidrop mode where the output is only driven when actively transmitting. 

The current routing table can be listed using the ``csp route show`` command in the debug shell:

.. code-block:: none

    [polaris] csp route show 
    20/5 LOOP
    0/0 CAN

The results are listed using `CIDR notation <https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing>`_. CSP addresses are 5 bits long so, ``20/5`` is an exact match to address ``20``, i.e. the loopback address. ``0/0`` marks the default route. To adjust CSP routing, the ``sys.csp.routes`` property should be used. As an example, to send all traffic via the RS-422/KISS interface set the property to ``0/0 KISS`` and save the ``sys`` group. It is not necessary to add an explicit route for the loopback interface.

The CSP connection can be tested using the ``csp ping`` debug shell command. This can be combined with the ``watch`` command to e.g. ping a system 10 times and report the number of successful replies. This example pings address 1 with 100 byte frames:

.. code-block:: none

    [polaris] watch -c10 -s csp ping -s100 1
    Running command 'csp ping -s100 1' every 1000 ms
    Reply in 3.138 ms
    Reply in 3.159 ms
    Reply in 3.833 ms
    Reply in 3.146 ms
    Reply in 3.896 ms
    Reply in 3.102 ms
    Reply in 3.709 ms
    Reply in 3.126 ms
    Reply in 3.730 ms
    Reply in 3.194 ms
    10 executions, 10 success 0 failures
