Cynic is a CLI tool that allows to send/receive Cyphal messages.
This post collects all the cynic commands that you might need for interacting with FluxGrip.
To simplify the commands, put the following into cynic.toml (should be located in the same directory you’re calling the cynic command from):
can = "slcan0" # or SocketCAN iface name
dsdl_root = ["/home/maksim/fluxgrip_software/lib/zubax_dsdl/zubax"]
[io]
"feedback" = "/home/maksim/fluxgrip_software/lib/zubax_dsdl/zubax/fluxgrip/Feedback.1.1.dsdl"
"com.zubax.fluxgrip/*/zubax.manage" = "/home/maksim/fluxgrip_software/lib/zubax_dsdl/zubax/fluxgrip/Manage.0.1.dsdl"
General
- List all topics
cn ls
# Resp:
# {"hash": 15629337813696154377, "evictions": 0, "subject": 26189, "name": "feedback"}
# {"hash": 11138084457145460620, "evictions": 0, "subject": 33172, "name": "command.i8"}
# {"hash": 8897801706557320498, "evictions": 0, "subject": 40785, "name": "com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage"}
Sub
feedback
cn sub feedback
# Resp: {"magnetized": false, "remagnetization": 0, "state": 0, "cycles_on_off": [0, 0], "error_code": 0, "_meta_": {"ts": "2026-08-20T16:12:11.900570+03:00", "remote": 93, "topic": "feedback", "tag": 14851841586369754921}}
Pub
command
# Demagnetize
cn pub command.i8 -- '\x00'
# Magnetize
cn pub command.i8 -- '\x01'
Manage
- Read node information
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{get_info: {}}' # Use the correct UID from cn ls!
# Resp: {"info": {"unique_id": 3221573376878701717, "product_type": 281479271677956, "software_version": 72368348290603951, "software_identity": 10288410575497419208, "product_name": "com.zubax.fluxgrip"}, "_meta_": {"ts": "2026-08-20T16:24:03.903569+03:00", "remote": 93, "topic": "com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage", "seqno": 0}}
- Read current configuration
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{configure: []}'
# Resp: {"config": {"version": 1, "prio_feedback": 4, "enable_second_can_interface": false, "can_bitrate": 1000000, "flyback_period_ns": 5000, "target_duty_cycle": [320, 210, 156, 123, 100, 85, 73, 64, 56], "min_duty_cycle": [150, 150, 100, 80, 20, 20, 20, 20, 20], "ramp_cap_voltage": [150, 150, 150, 150, 150, 150, 150, 150, 150], "ds": [-100, 100, -100, 100, -99, -92, -88, 80, 74, -67, -61, 56, 51, -46, -42, 38, 35, -32, -29, 27, 25, -22, -20, 18, -16, 14, -11, 10, -8, 7, -6, 5, -4, 4, -3, 3, -2, 2, -1, 2, -1, 2, -1, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "_meta_": {"ts": "2026-08-20T16:25:44.980102+03:00", "remote": 93, "topic": "com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage", "seqno": 0}}
- Write configuration (enabling second CAN interface)
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{configure: [{"version": 1, "prio_feedback": 4, "enable_second_can_interface": true, "can_bitrate": 1000000, "flyback_period_ns": 5000, "target_duty_cycle": [320, 210, 156, 123, 100, 85, 73, 64, 56], "min_duty_cycle": [150, 150, 100, 80, 20, 20, 20, 20, 20], "ramp_cap_voltage": [150, 150, 150, 150, 150, 150, 150, 150, 150], "ds": [-100, 100, -100, 100, -99, -92, -88, 80, 74, -67, -61, 56, 51, -46, -42, 38, 35, -32, -29, 27, 25, -22, -20, 18, -16, 14, -11, 10, -8, 7, -6, 5, -4, 4, -3, 3, -2, 2, -1, 2, -1, 2, -1, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}]}'
# Resp: {"config": {"version": 1, "prio_feedback": 4, "enable_second_can_interface": true, "can_bitrate": 1000000, "flyback_period_ns": 5000, "target_duty_cycle": [320, 210, 156, 123, 100, 85, 73, 64, 56], "min_duty_cycle": [150, 150, 100, 80, 20, 20, 20, 20, 20], "ramp_cap_voltage": [150, 150, 150, 150, 150, 150, 150, 150, 150], "ds": [-100, 100, -100, 100, -99, -92, -88, 80, 74, -67, -61, 56, 51, -46, -42, 38, 35, -32, -29, 27, 25, -22, -20, 18, -16, 14, -11, 10, -8, 7, -6, 5, -4, 4, -3, 3, -2, 2, -1, 2, -1, 2, -1, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "_meta_": {"ts": "2026-08-20T16:31:49.155988+03:00", "remote": 82, "topic": "com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage", "seqno": 0}}
- Clear remapping
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{remap: ""}'
- Set remapping
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{remap: "=my.namespace feedback=custom-feedback"}'
- Restart
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{restart: false}'
- Factory reset
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{restart: true}'
- Firmware update
Serve the image in one window:
# cd to wherever binary is stored
cn fs firmware-topic
Tell FluxGrip to start updating in another window:
cn req com.zubax.fluxgrip/2cb553eaeab5ec95/zubax.manage -- '{command: "upd firmware.bin firmware-topic"}'