Constellation Preview Release 0.5#

Last time, we announced the biggest release we had so far. Today, we are happy to announce an even larger release, Constellation version 0.5, named Scutum.

Breaking Changes#

Programs using previous versions of Constellation are not compatible with this version due to the breaking changes to our core protocols.

This release also contains two minor breaking changes for existing Python satellites.

  1. CSCPMessage is now CSCP1Message

    For CSCP commands decorated using @cscp_requestable, the request parameter is now of type CSCP1Message instead of CSCPMessage. The message class also moved from constellation.core.cscp to constellation.core.message.cscp1.

  2. SatelliteState is now part of core.message.cscp1

    For CSCP commands checking the current satellite state, the SatelliteState object moved from constellation.core.fsm to constellation.core.message.cscp1.

New Features#

Satellite Roles#

Satellites in a Constellation operate autonomously. This requires additional information on how to react in case of failures or unforeseen situations. Following the decentralized approach of Constellation, this information is provided by each satellite via their heartbeats. Each satellite should defines independently how other satellites in the Constellation should react in case of problems.

Constellation now provides a new framework parameter for satellites called _role, which can be used to determine the behavior of other satellites in case a of failure. More details can be found in the operator guide.

Conditional Transitions#

In some cases it can be required to initialize, launch, start or stop satellites in a specific order - they might for example depend on receiving a hardware clock from another satellite that is only available after initializing.

For this purpose, Constellation now provides the _require_<transitional state>_after framework parameters for satellites, available for each transition (e.g. initializing or launching). More details can be found in the operator guide.

Scriptable Controller#

The Python implementation now includes a new scriptable controller class which makes it easier to write scripts to control a Constellation:

from constellation.core.controller import ScriptableController
from constellation.core.message.cscp1 import SatelliteState

# Create controller
group_name = "edda"
ctrl = ScriptableController(group_name)
constellation = ctrl.constellation

# Initialize
constllation.initialize({})
ctrl.await_state(SatelliteState.INIT)

More details and a how-to can be found in the operator guide

Detailed Changelog#

The following changes related to protocols are included in this release:

  • MR!407/MR!743: Implements conditional transitions for satellites. This allows to ensure that satellites are initialized/launched/etc in a specific order while being fully autonomous.

  • MR!524: Add message flags to CHP. This allows to set roles to specific satellites determining the behavior of other satellites in case they experience a failure.

  • MR!739: CHIRP now uses UDP multicasts instead of UDP broadcasts. This also fixes network discovery on MacOS.

  • MR!713: Implements congestion control in CHP. This prevents flooding the network with heartbeats in setups with many satellites.

  • MR!789: Time parameters in TOML are now properly handled

The following new satellites have been added in this release:

  • MR!728: LeCroy, a satellite to store waveforms from a LeCroy scope

  • MR!750: FlightRecorder, satellite which can be used to store log messages

The following changes related to satellites are included in this release:

  • MR!791: Fix the installation instructions for the CaenHV satellite

  • MR!764: Support reconfiguration of the Sputnik satellite

  • MR!762: Fix the expected payload for the get_temp command of the LakeShore218 satellite

  • MR!755: Adds a get_data_rate command to DevNullReceiver satellite to allow for scripted benchmarks

  • MR!709: Adds SWMR (Single Writer Multiple Reader) option to H5DataWriter

  • MR!793: Added a launch_delay parameter to Sputnik for allow testing conditional transitions

The following changes related to the user interfaces are included in this release:

  • MR!772: Improve run timer in MissionControl to properly display the run time even if a run is started by another instance

  • MR!720: Minor UI polishing for command dialog

The following improvements for the C++ version are included in this release:

  • MR!697: Controllers can detect cyclic dependencies in conditional transitions

  • MR!781: Using getArray() on a Configuration object now also works if the underlying value is a single value of the request type

  • MR!751: Rework of the exec library, allowing for better selection of network interfaces and simplifies embedding satellites into existing programs

  • MR!746: Better handle restarted satellites after a fatal crash

  • MR!607: Adds measurement queue class for controllers as a step towards a scan feature in MissionControl

  • MR!704: Adds setting and getting an std::set for Configuration objects

  • MR!718: Implements a StatListener for telemetry

  • MR!747: Emit the file path as metric for receiver satellites

  • MR!742: Fix logging thread pool on MacOS

  • MR!719: Make _data_transmitters optional for receiver satellites

  • MR!727: Fix bug where exceptions in the running function were not caught

  • MR!717: Reduce time in poller during which the mutex is locked

  • MR!716: Check configuration parameters containing satellites for valid canonical names

  • MR!708: Store data license tag for transmitters in run metadata

  • MR!701: Add option to use jemalloc as memory allocator for improved data transmission performance

The following improvements for the Python version are included in this release:

  • MR!775: Fix Python satellites ignoring other satellites after they failed once

  • MR!770: Adds a ScriptableController class which simplifies creating a Python script controlling a Constellation

  • MR!758: Rework the CLI to allow for easier selection of the network interfaces

  • MR!744: Implements a dedicated message class for CSCP1 decoding and encoding

  • MR!748: Improve Python tests

  • MR!711: Improve BOR and EOR handling in DataSender

  • MR!457: Only lower-case CSCP commands, not other CSCP verbs

  • MR!735: Fix rare TypeError: unsupported operand type(s) for +=: 'NoneType' and 'str' bug during initialization

  • MR!715: Remote tip in IPython controller

  • MR!714: Add await_state function to controller for easier scripting

  • MR!792: Remove obsolete ConstellationListInterfaces tool

The following miscellaneous changes are included in this release:

  • MR!786: Publish new releases to Zenodo

  • MR!784: Add about section to the website

  • MR!314: Add Python API docs to the website

  • MR!740: Update installation instructions for MacOS

  • MR!732: Fix installation instructions for Alma

  • MR!731: Add how-to for creating scans using Python

  • MR!689: Add Qt installation instructions and mention some build options

Notes#

The software is publicly available under the EUPL-1.2 from the DESY GitLab repository. In addition, the Python version is available on PyPI and the C++ version is available on Flathub for Linux.

It should be noted that this is a preview release and some interfaces and protocols might change until the first official major release.