<!-- SPDX-FileCopyrightText: Copyright 2026 Jetperch LLC
SPDX-License-Identifier: Apache-2.0

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->

<a id="js320-topics"></a>

# JS320 topics

The JS320 pubsub topic reference, generated with
`python -m pyjoulescope_driver metadata --out doc/js320.json` and
verified against a device with `metadata --diff doc/js320.json`.

```json
{
  "h/fs": {
    "dtype": "u32",
    "brief": "The sampling frequency.",
    "default": 1000000,
    "options": [
      [
        1000000,
        "1 MHz"
      ],
      [
        200000,
        "200 kHz"
      ],
      [
        100000,
        "100 kHz"
      ],
      [
        50000,
        "50 kHz"
      ],
      [
        20000,
        "20 kHz"
      ],
      [
        10000,
        "10 kHz"
      ],
      [
        5000,
        "5 kHz"
      ],
      [
        2000,
        "2 kHz"
      ],
      [
        1000,
        "1 kHz"
      ],
      [
        500,
        "500 Hz"
      ],
      [
        200,
        "200 Hz"
      ],
      [
        100,
        "100 Hz"
      ],
      [
        50,
        "50 Hz"
      ],
      [
        20,
        "20 Hz"
      ],
      [
        10,
        "10 Hz"
      ],
      [
        5,
        "5 Hz"
      ],
      [
        2,
        "2 Hz"
      ],
      [
        1,
        "1 Hz"
      ]
    ]
  },
  "h/fp": {
    "dtype": "u32",
    "brief": "The approximate sample publish frequency.",
    "default": 20,
    "options": [
      [
        100000,
        "100 kHz"
      ],
      [
        50000,
        "50 kHz"
      ],
      [
        20000,
        "20 kHz"
      ],
      [
        10000,
        "10 kHz"
      ],
      [
        5000,
        "5 kHz"
      ],
      [
        2000,
        "2 kHz"
      ],
      [
        1000,
        "1 kHz"
      ],
      [
        500,
        "500 Hz"
      ],
      [
        200,
        "200 Hz"
      ],
      [
        100,
        "100 Hz"
      ],
      [
        50,
        "50 Hz"
      ],
      [
        20,
        "20 Hz"
      ],
      [
        10,
        "10 Hz"
      ],
      [
        5,
        "5 Hz"
      ],
      [
        2,
        "2 Hz"
      ],
      [
        1,
        "1 Hz"
      ]
    ]
  },
  "h/i_scale": {
    "dtype": "f32",
    "brief": "The current signal scale factor.",
    "default": 1.0
  },
  "h/v_scale": {
    "dtype": "f32",
    "brief": "The voltage signal scale factor.",
    "default": 1.0
  },
  "c/ts/!req": {
    "dtype": "bin",
    "brief": "Timesync request",
    "detail": "Publish a MB_VALUE_STDMSG with type MB_STDMSG_TIMESYNC_SYNC. The host receives this, populates utc_recv and utc_send, and responds to !rsp."
  },
  "c/ts/!map": {
    "dtype": "bin",
    "brief": "Timesync map announcement",
    "detail": "Publish a MB_VALUE_STDMSG with type MB_STDMSG_TIMESYNC_MAP containing the computed counter-to-UTC mapping."
  },
  "c/ts/!rsp": {
    "dtype": "bin",
    "brief": "Timesync response",
    "detail": "The host responds to !req with a MB_VALUE_STDMSG containing MB_STDMSG_TIMESYNC_SYNC with utc_recv and utc_send populated."
  },
  "c/ts/!resync": {
    "dtype": "u8",
    "brief": "Force a timesync resynchronization burst."
  },
  "c/comm/sensor/!req": {
    "dtype": "u8",
    "brief": "Request to open (true) or close (false) the link interface."
  },
  "c/comm/sensor/state": {
    "dtype": "u8",
    "brief": "The link state: 0=disconnected, 1=connected.",
    "default": 0,
    "flags": [
      "ro"
    ]
  },
  "c/comm/sensor/tx/!stat": {
    "dtype": "bin",
    "brief": "The link transmit statistics."
  },
  "c/comm/sensor/rx/!stat": {
    "dtype": "bin",
    "brief": "The link receive statistics."
  },
  "c/comm/tpt/0/tx/cnt": {
    "dtype": "u8",
    "brief": "The target number of outstanding transmit frames.",
    "detail": "0 is off or any positive number is enabled.",
    "default": 0
  },
  "c/comm/tpt/0/tx/sz": {
    "dtype": "u16",
    "brief": "The transmit frame size in bytes.",
    "default": 0
  },
  "c/comm/tpt/0/tx/task": {
    "dtype": "u8",
    "brief": "The target task for transmit messages.",
    "default": 0
  },
  "c/comm/tpt/0/rx/!stat": {
    "dtype": "bin",
    "brief": "The receive statistics."
  },
  "c/comm/usbd/state": {
    "dtype": "u8",
    "brief": "The link state: 0=disconnected, 1=connected.",
    "default": 0,
    "flags": [
      "ro"
    ]
  },
  "c/comm/usbd/wd_en": {
    "dtype": "u8",
    "brief": "Comm watchdog enable. 1=normal, 0=inhibit the watchdog reset.",
    "default": 1
  },
  "c/comm/usbd/tx/!stat": {
    "dtype": "bin",
    "brief": "The device transmit (USB IN) statistics."
  },
  "c/comm/usbd/rx/!stat": {
    "dtype": "bin",
    "brief": "The device receive (USB OUT) statistics."
  },
  "c/./info": {
    "dtype": "stdmsg",
    "brief": "PubSub instance information.",
    "detail": "MB_STDMSG_PUBSUB_INFO with blob descriptors for memory-accessible binary data.",
    "flags": [
      "ro"
    ]
  },
  "c/./!ping": {
    "dtype": "bin",
    "brief": "Ping a message, replies on !pong."
  },
  "c/./!pong": {
    "dtype": "bin",
    "brief": "Response to a ping message."
  },
  "c/./!err": {
    "dtype": "stdmsg",
    "brief": "Asynchronous error reporting."
  },
  "c/./!state": {
    "dtype": "bin",
    "brief": "A state get or set command."
  },
  "c/./comm/./!add": {
    "dtype": "u8",
    "brief": "Comm link connected.",
    "detail": "Published by any comm task on this pubsub instance when its link transitions to CONNECTED.  Value is the publishing comm task id (u8).  Subscribers use this to drive connection-dependent behavior such as immediate timesync resync."
  },
  "c/./comm/./!rm": {
    "dtype": "u8",
    "brief": "Comm link disconnected.",
    "detail": "Published by any comm task on this pubsub instance when its upstream link leaves CONNECTED (disconnect request, link loss, or peer restart).  Value is the publishing comm task id (u8)."
  },
  "c/sys/tick/en": {
    "dtype": "bool",
    "brief": "Enable the statistics tick",
    "detail": "Manually disabling the tick when pwr==0 can result in unexpected system behavior.",
    "default": 1
  },
  "c/sys/tick/!ev": {
    "dtype": "u64",
    "brief": "The statistics system tick",
    "detail": "Modules should generate statistics using this tick. The value is the time of the system tick. This tick is automatically suppressed when pwr != 0."
  },
  "c/sys/pwr": {
    "dtype": "u8",
    "brief": "The system power state",
    "detail": "0 is fully on, 0x7f is normal sleep, 0xff is deepest sleep. Each specific system is free to define intermediate values.",
    "default": 0,
    "range": [
      0,
      255
    ]
  },
  "c/sys/fw/slot": {
    "dtype": "u8",
    "brief": "The active firmware image slot reported by the bootloader.",
    "default": 0,
    "flags": [
      "ro"
    ]
  },
  "c/sys/fw/version": {
    "dtype": "u32",
    "brief": "The firmware version reported by the bootloader.",
    "detail": "The version is formatted as major8.minor8.patch16",
    "default": 0,
    "format": "version",
    "flags": [
      "ro"
    ]
  },
  "c/sys/hw/version": {
    "dtype": "u8",
    "brief": "The hardware board version.",
    "detail": "The version is an integer",
    "default": 0,
    "flags": [
      "ro"
    ]
  },
  "c/sys/!reset": {
    "dtype": "u8",
    "detail": "Perform a system reset using the selected mb_chip_reset_type_e method",
    "options": [
      [
        0,
        "complete"
      ],
      [
        1,
        "bootloader"
      ],
      [
        2,
        "software"
      ],
      [
        3,
        "watchdog"
      ]
    ]
  },
  "c/sys/!cmd": {
    "dtype": "bin",
    "brief": "Boot and personality info command",
    "detail": "Publish a MB_VALUE_STDMSG with type MB_STDMSG_MEM containing a mb_stdmsg_mem_s read request. Target 1 reads the mb_boot_s structure. Target 2 reads the public mb_personality_app_s (through the app field, 76 bytes). The response is published to {origin_prefix}/!rsp."
  },
  "c/sys/util/!stat": {
    "dtype": "bin",
    "brief": "Resource utilization report",
    "detail": "Published as a MB_STDMSG_UTILIZATION stdmsg (mb_sys_util_v1_s) once per tick when the utilization option is enabled.  Reports CPU, stack, and heap utilization as measured/total u32 pairs so the receiver performs the division."
  },
  "c/fw/version": {
    "dtype": "u32",
    "brief": "The controller firmware version.",
    "detail": "The version is formatted as major8.minor8.patch16",
    "default": 0,
    "format": "version",
    "flags": [
      "ro"
    ]
  },
  "c/hw/version": {
    "dtype": "u8",
    "brief": "The hardware board version.",
    "detail": "The version is an integer",
    "default": 0,
    "flags": [
      "ro"
    ]
  },
  "c/mode": {
    "dtype": "u8",
    "brief": "Configure the operation mode.",
    "default": 0,
    "options": [
      [
        0,
        "normal"
      ],
      [
        1,
        "fw_update"
      ],
      [
        2,
        "jtag"
      ]
    ]
  },
  "c/trigger/dir": {
    "dtype": "bool",
    "brief": "Enable trigger output driver.",
    "default": 0
  },
  "c/trigger/filt": {
    "dtype": "bool",
    "brief": "Enable trigger output analog low-pass filter.",
    "default": 0
  },
  "c/gpio/vref": {
    "dtype": "u8",
    "brief": "The GPIO Vref source.",
    "default": 0,
    "options": [
      [
        0,
        "external"
      ],
      [
        1,
        "3v3"
      ]
    ]
  },
  "c/led/en": {
    "dtype": "u8",
    "brief": "Enable software control for Controller Status LED.",
    "default": 0
  },
  "c/led/red": {
    "dtype": "u8",
    "brief": "The red LED blink pattern.",
    "default": 0
  },
  "c/led/green": {
    "dtype": "u8",
    "brief": "The green LED blink pattern.",
    "default": 0
  },
  "c/led/blue": {
    "dtype": "u8",
    "brief": "The blue LED blink pattern.",
    "default": 0
  },
  "c/fwup/!cmd": {
    "dtype": "bin",
    "brief": "Firmware update command",
    "detail": "Binary mb_stdmsg_mem_s header with optional data payload. See mb/stdmsg.h."
  },
  "c/jtag/!cmd": {
    "dtype": "bin",
    "brief": "Issue a JTAG command."
  },
  "c/xspi/!cmd": {
    "dtype": "bin",
    "brief": "XSPI flash command",
    "detail": "Binary mb_stdmsg_mem_s header with optional data payload. See mb/stdmsg.h."
  },
  "s/./!err": {
    "dtype": "stdmsg",
    "brief": "Asynchronous error reporting."
  },
  "s/./info": {
    "dtype": "stdmsg",
    "brief": "PubSub instance information.",
    "detail": "MB_STDMSG_PUBSUB_INFO with blob descriptors for memory-accessible binary data.",
    "flags": [
      "ro"
    ]
  },
  "s/./!ping": {
    "dtype": "bin",
    "brief": "Ping a message, replies on !pong."
  },
  "s/./!pong": {
    "dtype": "bin",
    "brief": "Response to a ping message."
  },
  "s/./!state": {
    "dtype": "bin",
    "brief": "A state get or set command."
  },
  "s/./comm/./!add": {
    "dtype": "u8",
    "brief": "Comm link connected.",
    "detail": "Published by any comm task on this pubsub instance when its link transitions to CONNECTED.  Value is the publishing comm task id (u8).  Subscribers use this to drive connection-dependent behavior such as immediate timesync resync."
  },
  "s/./comm/./!rm": {
    "dtype": "u8",
    "brief": "Comm link disconnected.",
    "detail": "Published by any comm task on this pubsub instance when its upstream link leaves CONNECTED (disconnect request, link loss, or peer restart).  Value is the publishing comm task id (u8)."
  },
  "s/sys/tick/!ev": {
    "dtype": "u64",
    "brief": "The statistics system tick",
    "detail": "Modules should generate statistics using this tick. The value is the time of the system tick. This tick is automatically suppressed when pwr != 0."
  },
  "s/sys/tick/en": {
    "dtype": "bool",
    "brief": "Enable the statistics tick",
    "detail": "Manually disabling the tick when pwr==0 can result in unexpected system behavior.",
    "default": 1
  },
  "s/sys/pwr": {
    "dtype": "u8",
    "brief": "The system power state",
    "detail": "0 is fully on, 0x7f is normal sleep, 0xff is deepest sleep. Each specific system is free to define intermediate values.",
    "default": 0,
    "range": [
      0,
      255
    ]
  },
  "s/sys/fw/slot": {
    "dtype": "u8",
    "brief": "The active firmware image slot reported by the bootloader.",
    "default": 0,
    "flags": [
      "ro"
    ]
  },
  "s/sys/fw/version": {
    "dtype": "u32",
    "brief": "The firmware version reported by the bootloader.",
    "detail": "The version is formatted as major8.minor8.patch16",
    "default": 0,
    "format": "version",
    "flags": [
      "ro"
    ]
  },
  "s/sys/hw/version": {
    "dtype": "u8",
    "brief": "The hardware board version.",
    "detail": "The version is an integer",
    "default": 0,
    "flags": [
      "ro"
    ]
  },
  "s/sys/!reset": {
    "dtype": "u8",
    "detail": "Perform a system reset using the selected mb_chip_reset_type_e method",
    "options": [
      [
        0,
        "complete"
      ],
      [
        1,
        "bootloader"
      ],
      [
        2,
        "software"
      ],
      [
        3,
        "watchdog"
      ]
    ]
  },
  "s/sys/!cmd": {
    "dtype": "bin",
    "brief": "Boot and personality info command",
    "detail": "Publish a MB_VALUE_STDMSG with type MB_STDMSG_MEM containing a mb_stdmsg_mem_s read request. Target 1 reads the mb_boot_s structure. Target 2 reads the public mb_personality_app_s (through the app field, 76 bytes). The response is published to {origin_prefix}/!rsp."
  },
  "s/sys/util/!stat": {
    "dtype": "bin",
    "brief": "Resource utilization report",
    "detail": "Published as a MB_STDMSG_UTILIZATION stdmsg (mb_sys_util_v1_s) once per tick when the utilization option is enabled.  Reports CPU, stack, and heap utilization as measured/total u32 pairs so the receiver performs the division."
  },
  "s/ts/!req": {
    "dtype": "bin",
    "brief": "Timesync request",
    "detail": "Publish a MB_VALUE_STDMSG with type MB_STDMSG_TIMESYNC_SYNC. The host receives this, populates utc_recv and utc_send, and responds to !rsp."
  },
  "s/ts/!map": {
    "dtype": "bin",
    "brief": "Timesync map announcement",
    "detail": "Publish a MB_VALUE_STDMSG with type MB_STDMSG_TIMESYNC_MAP containing the computed counter-to-UTC mapping."
  },
  "s/ts/!rsp": {
    "dtype": "bin",
    "brief": "Timesync response",
    "detail": "The host responds to !req with a MB_VALUE_STDMSG containing MB_STDMSG_TIMESYNC_SYNC with utc_recv and utc_send populated."
  },
  "s/ts/!resync": {
    "dtype": "u8",
    "brief": "Force a timesync resynchronization burst."
  },
  "s/fpga/version": {
    "dtype": "u32",
    "brief": "The FPGA version.",
    "detail": "The version is formatted as major8.minor8.patch16",
    "default": 0,
    "format": "version",
    "flags": [
      "ro"
    ]
  },
  "s/adc/0/ctrl": {
    "dtype": "bool",
    "brief": "Enable ADC0 streaming.",
    "default": 0
  },
  "s/adc/0/sel": {
    "dtype": "u8",
    "brief": "Select the ADC channel for ADC0 streaming.",
    "default": 0
  },
  "s/adc/0/!data": {
    "dtype": "bin",
    "brief": "The ADC0 streaming data."
  },
  "s/adc/1/ctrl": {
    "dtype": "bool",
    "brief": "Enable ADC1 streaming.",
    "default": 0
  },
  "s/adc/1/sel": {
    "dtype": "u8",
    "brief": "Select the ADC channel for ADC1 streaming.",
    "default": 0
  },
  "s/adc/1/!data": {
    "dtype": "bin",
    "brief": "The ADC1 streaming data."
  },
  "s/adc/mode": {
    "dtype": "u8",
    "brief": "ADC forward mode (PCTS use only).",
    "detail": "Mode 1 decimates every ADC channel by 2 and interleaves\nch0/ch1 onto adc/0 and ch2/ch3 onto adc/1 (ignoring adc/N/sel).\nThe host deinterleaves with data[0::2] / data[1::2].",
    "default": 0,
    "options": [
      [
        0,
        "normal"
      ],
      [
        1,
        "pcts"
      ]
    ]
  },
  "s/adc/epoch": {
    "dtype": "bool",
    "brief": "ADC frame epoch tag (PCTS use only).",
    "detail": "Toggle after advancing the calibration point.  The bit rides in\nthe ADC frame header (commit source bit 3 -> host index bit 3),\nso stale in-flight frames from the previous point carry the old\nvalue and can be discarded by the host.",
    "default": 0
  },
  "s/i/ctrl": {
    "dtype": "bool",
    "brief": "Enable current streaming.",
    "default": 0
  },
  "s/i/range/mode": {
    "dtype": "u8",
    "brief": "Select the current range mode.",
    "default": 0,
    "options": [
      [
        0,
        "off",
        "1",
        "2",
        "3"
      ],
      [
        4,
        "auto"
      ],
      [
        5,
        "manual"
      ],
      [
        6,
        "test_dir"
      ],
      [
        7,
        "test_seq"
      ]
    ]
  },
  "s/i/range/mb4b": {
    "dtype": "u32",
    "brief": "Make-before-break MOSFET counter value.",
    "default": 15
  },
  "s/i/range/ctrl": {
    "dtype": "bool",
    "brief": "Enable current range streaming.",
    "default": 0
  },
  "s/i/range/src": {
    "dtype": "u32",
    "brief": "The source for the current range streaming channel.",
    "default": 0,
    "options": [
      [
        0,
        "current range",
        "i range"
      ],
      [
        1,
        "voltage range",
        "v range"
      ],
      [
        2,
        "ovr[3:0]"
      ],
      [
        3,
        "ovr[7:4]"
      ],
      [
        4,
        "gpio_in (gpi[3:0])"
      ],
      [
        5,
        "{trigger_in, trigger_out_w, gpio_out_w}"
      ]
    ]
  },
  "s/i/range/select": {
    "dtype": "u32",
    "brief": "The current range manual shunt resistor selection.",
    "default": 0,
    "options": [
      [
        0,
        "off"
      ],
      [
        129,
        "10 A"
      ],
      [
        130,
        "180 mA"
      ],
      [
        132,
        "18 mA"
      ],
      [
        136,
        "1.8 mA"
      ],
      [
        144,
        "180 \u00b5A",
        "180 uA"
      ],
      [
        160,
        "18 \u00b5A",
        "18 uA"
      ]
    ]
  },
  "s/i/range/min": {
    "dtype": "u8",
    "brief": "The least sensitive current range for autoranging",
    "default": 0,
    "options": [
      [
        0,
        "10 A"
      ],
      [
        1,
        "180 mA"
      ],
      [
        2,
        "18 mA"
      ],
      [
        3,
        "1.8 mA"
      ],
      [
        4,
        "180 \u00b5A",
        "180 uA"
      ],
      [
        5,
        "18 \u00b5A",
        "18 uA"
      ]
    ]
  },
  "s/i/range/max": {
    "dtype": "u8",
    "brief": "The most sensitive current range for autoranging",
    "default": 5,
    "options": [
      [
        0,
        "10 A"
      ],
      [
        1,
        "180 mA"
      ],
      [
        2,
        "18 mA"
      ],
      [
        3,
        "1.8 mA"
      ],
      [
        4,
        "180 \u00b5A",
        "180 uA"
      ],
      [
        5,
        "18 \u00b5A",
        "18 uA"
      ]
    ]
  },
  "s/i/range/predict": {
    "dtype": "u8",
    "brief": "Overflow-predict current range (0 = off).",
    "detail": "On overflow, the autoranger first hops to this range (when it is\nbelow the active range and ADC1 is parked and settled there)\nbefore falling through to i/range/min if the current still\noverflows.  0 disables prediction: overflow snaps straight to\ni/range/min.",
    "default": 0,
    "options": [
      [
        0,
        "10 A",
        "off"
      ],
      [
        1,
        "180 mA"
      ],
      [
        2,
        "18 mA"
      ],
      [
        3,
        "1.8 mA"
      ],
      [
        4,
        "180 \u00b5A",
        "180 uA"
      ],
      [
        5,
        "18 \u00b5A",
        "18 uA"
      ]
    ]
  },
  "s/i/i0_sel": {
    "dtype": "u8",
    "brief": "The manual shunt resistor selection for ADC0.",
    "default": 0
  },
  "s/i/i1_sel": {
    "dtype": "u8",
    "brief": "The manual shunt resistor selection for ADC1.",
    "default": 5
  },
  "s/i/i2_sel": {
    "dtype": "u8",
    "brief": "The manual shunt resistor selection for ADC2.",
    "default": 5
  },
  "s/i/order": {
    "dtype": "u8",
    "brief": "The priority order for which ADC input to use.",
    "default": 5,
    "options": [
      [
        0,
        "012",
        "adc0"
      ],
      [
        1,
        "021"
      ],
      [
        2,
        "102",
        "adc1"
      ],
      [
        3,
        "120"
      ],
      [
        4,
        "201",
        "adc2"
      ],
      [
        5,
        "210"
      ]
    ]
  },
  "s/i/!ack": {
    "dtype": "u64",
    "brief": "Acknowledge i/ctrl applied.  Value is the 16 MHz sample_id just after the update; frames that end at or before it predate the change."
  },
  "s/v/ctrl": {
    "dtype": "bool",
    "brief": "Enable voltage streaming.",
    "default": 0
  },
  "s/v/range/mode": {
    "dtype": "u8",
    "brief": "Select the voltage range mode.",
    "default": 0,
    "options": [
      [
        0,
        "auto"
      ],
      [
        1,
        "manual"
      ]
    ]
  },
  "s/v/range/select": {
    "dtype": "u32",
    "brief": "The voltage source selection.",
    "default": 0,
    "options": [
      [
        0,
        "15 V"
      ],
      [
        1,
        "2 V"
      ],
      [
        2,
        "+16 V rail"
      ],
      [
        3,
        "-16 V rail"
      ]
    ]
  },
  "s/v/!ack": {
    "dtype": "u64",
    "brief": "Acknowledge v/ctrl applied.  Value is the 16 MHz sample_id just after the update; frames that end at or before it predate the change."
  },
  "s/p/ctrl": {
    "dtype": "bool",
    "brief": "Enable power streaming.",
    "default": 0
  },
  "s/p/!ack": {
    "dtype": "u64",
    "brief": "Acknowledge p/ctrl applied.  Value is the 16 MHz sample_id just after the update; frames that end at or before it predate the change."
  },
  "s/stats/scnt": {
    "dtype": "u32",
    "brief": "Number of 1 Msps samples per block.",
    "default": 500000,
    "range": [
      0,
      10000000
    ]
  },
  "s/stats/ctrl": {
    "dtype": "bool",
    "brief": "Enable stats input data stream messages.",
    "default": 0
  },
  "s/stats/!clear": {
    "dtype": "bool",
    "brief": "Clear statistics."
  },
  "s/gpi/0/ctrl": {
    "dtype": "bool",
    "brief": "Enable general purpose input 0 data stream",
    "default": 0
  },
  "s/gpi/1/ctrl": {
    "dtype": "bool",
    "brief": "Enable general purpose input 1 data stream",
    "default": 0
  },
  "s/gpi/2/ctrl": {
    "dtype": "bool",
    "brief": "Enable general purpose input 2 data stream",
    "default": 0
  },
  "s/gpi/3/ctrl": {
    "dtype": "bool",
    "brief": "Enable general purpose input 3 data stream",
    "default": 0
  },
  "s/gpi/7/ctrl": {
    "dtype": "bool",
    "brief": "Enable trigger input data stream",
    "default": 0
  },
  "s/gpi/+/dwnN/mode": {
    "dtype": "u32",
    "brief": "The general purpose inputs and trigger downsampling mode",
    "default": 2,
    "options": [
      [
        0,
        "off"
      ],
      [
        1,
        "toggle"
      ],
      [
        2,
        "first"
      ],
      [
        3,
        "majority"
      ]
    ]
  },
  "s/gpi/+/dwnN/N": {
    "dtype": "u32",
    "brief": "The general purpose inputs and trigger downsample factor 0 - 16383",
    "default": 16
  },
  "s/gpi/+/dwnN/!ack": {
    "dtype": "u64",
    "brief": "Acknowledge gpi/+/dwnN/{mode,N} applied.  Value is the 16 MHz sample_id at which the new GPI decimation takes effect."
  },
  "s/gpi/+/!req": {
    "dtype": "bool",
    "brief": "Request the general-purpose input value."
  },
  "s/gpi/+/!value": {
    "dtype": "u32",
    "brief": "The requested general-purpose input values."
  },
  "s/gpi/src": {
    "dtype": "u8",
    "brief": "Source for the GPI streaming bus (diagnostic).",
    "detail": "Selects what feeds the gpi_decimate path. Mode 0 is the normal hardware GPI bus; modes 1 and 2 route internal ovr bits for autorange diagnostics.",
    "default": 0,
    "options": [
      [
        0,
        "normal"
      ],
      [
        1,
        "ovr_lo"
      ],
      [
        2,
        "ovr_hi"
      ]
    ]
  },
  "s/gpo/0/src": {
    "dtype": "u8",
    "brief": "Source byte for gpo[0] (8-bit {N[3:0], rsv, src[2:0]}).",
    "detail": "[2:0] = source code\n0  register   (drives the *_reg input from regfile)\n1  pps        (future, drives 0)\n2  uart       (future, drives 0)\n3  analog PCM (dsm_out from the shared analog_out instance)\n4  trigger N  (future, drives 0)\n5  overflow N (ovr[N])\n6  select N   (select[N])\n7  reserved   (drives 0)\n[7:4] N: 4-bit channel index for sources 4-6.",
    "default": 0
  },
  "s/gpo/1/src": {
    "dtype": "u8",
    "brief": "Source byte for gpo[1] (8-bit {N[3:0], rsv, src[2:0]}).",
    "detail": "See gpo/0/src for usage.",
    "default": 0
  },
  "s/gpo/7/src": {
    "dtype": "u8",
    "brief": "Source byte for trigger_out (8-bit {N[3:0], rsv, src[2:0]}).",
    "detail": "See gpo/0/src for usage.",
    "default": 0
  },
  "s/gpo/+/!value": {
    "dtype": "u32",
    "brief": "Force the GPO register bits (8-bit, used when the corresponding gpo/N/src is 0)."
  },
  "s/gpo/+/!set": {
    "dtype": "u32",
    "brief": "Set the indicated GPO register bits (only bits [7] trigger_out and [1:0] gpo)."
  },
  "s/gpo/+/!clr": {
    "dtype": "u32",
    "brief": "Clear the indicated GPO register bits (only bits [7] trigger_out and [1:0] gpo)."
  },
  "s/gpo/+/!req": {
    "dtype": "u8",
    "brief": "GPO read-back request; 0=gpo_val register, 1=post-mux output (gpo_status). Result on gpo/+/!raw.",
    "options": [
      [
        0,
        "register"
      ],
      [
        1,
        "output"
      ]
    ]
  },
  "s/gpo/+/!raw": {
    "dtype": "u32",
    "brief": "Most recent gpo read-back result."
  },
  "s/aout/value": {
    "dtype": "u32",
    "brief": "Manual 16-bit signed value driven to the PCM when src=4.",
    "default": 0
  },
  "s/aout/src": {
    "dtype": "u8",
    "brief": "Analog-out source selector (3 bits).",
    "default": 4,
    "options": [
      [
        0,
        "sample_id"
      ],
      [
        1,
        "current"
      ],
      [
        2,
        "voltage"
      ],
      [
        3,
        "power"
      ],
      [
        4,
        "register"
      ]
    ]
  },
  "s/aout/shift": {
    "dtype": "u8",
    "brief": "Left-shift count applied to the 48-bit latch (0..32).",
    "default": 0
  },
  "s/aout/!req": {
    "dtype": "bool",
    "brief": "Read back the actual analog_out FPGA register; result on aout/!raw."
  },
  "s/aout/!raw": {
    "dtype": "u32",
    "brief": "Most recent analog_out FPGA register raw u32 reading."
  },
  "s/dwnN/N": {
    "dtype": "u32",
    "brief": "The downsampling factor 0 - 1027 for i, v, p from 1 Msps",
    "detail": "Downsampling factors 0, 1 are passthrough.  2, 3 promote to 4.  Values 4-1000 perform downsampling.",
    "default": 0
  },
  "s/dwnN/mode": {
    "dtype": "u32",
    "brief": "The downsampling filter for i, v, p",
    "detail": "The sincN CIC order.  bypass passes through regardless of N.  The first order-1 outputs after a change are settling transients (0 for sinc1, 1 for sinc2, 2 for sinc3).",
    "default": 1,
    "options": [
      [
        0,
        "bypass"
      ],
      [
        1,
        "sinc1"
      ],
      [
        2,
        "sinc2"
      ],
      [
        3,
        "sinc3"
      ]
    ]
  },
  "s/dwnN/!ack": {
    "dtype": "u64",
    "brief": "Acknowledge dwnN/{N,mode} applied.  Value is the 16 MHz sample_id at which the new decimation takes effect."
  },
  "s/fuse/0/F": {
    "dtype": "u32",
    "brief": "Fuse accumulation constant 4q14.",
    "default": 0
  },
  "s/fuse/0/K": {
    "dtype": "u32",
    "brief": "Fuse dissipation constant 8q10.",
    "default": 0
  },
  "s/fuse/0/en": {
    "dtype": "bool",
    "brief": "Enable/disable the fuse.",
    "default": 0
  },
  "s/fuse/0/engaged": {
    "dtype": "bool",
    "brief": "Set to 1 when engaged, publish 0 to clear.",
    "default": 0
  },
  "s/fuse/1/F": {
    "dtype": "u32",
    "brief": "Fuse accumulation constant 4q14.",
    "default": 0
  },
  "s/fuse/1/K": {
    "dtype": "u32",
    "brief": "Fuse dissipation constant 8q10.",
    "default": 0
  },
  "s/fuse/1/en": {
    "dtype": "bool",
    "brief": "Enable/disable the fuse.",
    "default": 0
  },
  "s/fuse/1/engaged": {
    "dtype": "bool",
    "brief": "Set to 1 when engaged, publish 0 to clear.",
    "default": 0
  },
  "s/fuse/30/en": {
    "dtype": "bool",
    "brief": "Enable/disable the global per-channel fuse.  DISABLE AT YOUR OWN RISK.",
    "default": 1
  },
  "s/fuse/30/engaged": {
    "dtype": "bool",
    "brief": "Set to 1 when engaged, publish 0 to clear.",
    "default": 0
  },
  "s/fuse/31/en": {
    "dtype": "bool",
    "brief": "Enable/disable the global max fuse.  DISABLE AT YOUR OWN RISK.",
    "default": 1
  },
  "s/fuse/31/engaged": {
    "dtype": "bool",
    "brief": "Set to 1 when engaged, publish 0 to clear.",
    "default": 0
  },
  "s/fuse/+/!clear": {
    "dtype": "bool",
    "brief": "Clear all engaged fuses."
  },
  "s/led/en": {
    "dtype": "u8",
    "brief": "Enable software control for Sensor Status LED.",
    "default": 0
  },
  "s/led/red": {
    "dtype": "u8",
    "brief": "The red LED blink pattern.",
    "default": 0
  },
  "s/led/green": {
    "dtype": "u8",
    "brief": "The green LED blink pattern.",
    "default": 0
  },
  "s/led/blue": {
    "dtype": "u8",
    "brief": "The blue LED blink pattern.",
    "default": 0
  },
  "s/cal/!reload": {
    "dtype": "bool",
    "brief": "Reload ACTIVE cal from flash into FPGA cal memory."
  },
  "s/flash/!cmd": {
    "dtype": "bin",
    "brief": "SPI flash command",
    "detail": "Binary mb_stdmsg_mem_s header with optional data payload. See mb/stdmsg.h."
  }
}
```
