Yakut v0.11 released

This release fixes a regression introduced in the last one and brings much-needed tools for node configuration management.

  • List registers on the specified nodes: y rl 100-128
  • Read registers from a node or several:
    • cat node_registers.yaml | y rb 123
    • y rl 100-128 | y --yaml rb > config.yaml
  • Configure node(s) from a file: cat config.yaml | y rb
  • Read a single register from a group of nodes: y r 122-126 m.inductance_dq
  • Write a single register on a group of nodes: y r 122-126 m.inductance_dq 14e-6 14e-6
  • Invoke uavcan.node.ExecuteCommand on one or multiple nodes: y cmd 100-128 restart.

Data type names supplied to y sub/pub/call are now case-insensitive (but in many cases they are not required thanks to automatic discovery).

New shorter options were added for common use cases: -j/-y/-t do the same thing as --format=json/--format=yaml/--format=tsvh, respectively. For y sub, option --sync does the right thing automatically so the user doesn’t have to think about which synchronization policy should be chosen.

The README was extended with a practical usage example: GitHub - OpenCyphal/yakut: Simple CLI tool for diagnostics and debugging of Cyphal networks.

Speaking of which, that README is getting too big and I am thinking that the Yakut docs need a new medium. Maybe it should be split into several Markdown files. Maybe we should transform that into a static website using GitHub Pages or something. Suggestions welcome.

The PyCyphal Demo chapter was updated to reflect the new capabilities: Demo — PyCyphal 1.8.3 documentation

Here is a comparison of two identical invocations between v0.9 and v0.11:

v0.9:

# Case-sensitive, version numbers required:
y sub 2347:uavcan.si.unit.voltage.Scalar.1.0

# Each field value has to be named explicitly:
y pub 2345:uavcan.si.unit.temperature.Scalar.1.0   'kelvin: 250' \
      2346:uavcan.si.sample.temperature.Scalar.1.0 'kelvin: 240'

v0.11:

# Case-insensitive, version not required:
y sub 2347:uavcan.si.unit.voltage.scalar

# Fields and outer objects may be omitted, in this case positional initialization is used:
y pub 2345:uavcan.si.unit.temperature.scalar   250 \
      2346:uavcan.si.sample.temperature.scalar 'kelvin: 240'