****** USBTMC ****** Role: device only. USB Test and Measurement Class (USBTMC) carries instrument commands and responses. The optional USB488 subclass adds IEEE-488-style status, trigger, and service-request behavior; SCPI command parsing remains an application concern. Configuration and descriptors ============================= Enable ``CFG_TUD_USBTMC``. Set ``CFG_TUD_USBTMC_ENABLE_488`` when USB488 is implemented and ``CFG_TUD_USBTMC_ENABLE_INT_EP`` when an interrupt IN endpoint is present. Construct the configuration from ``TUD_USBTMC_IF_DESCRIPTOR``, ``TUD_USBTMC_BULK_DESCRIPTORS``, and, when enabled, ``TUD_USBTMC_INT_DESCRIPTOR``. .. list-table:: :header-rows: 1 :widths: 42 16 42 * - Option - Default - What it controls * - ``CFG_TUD_USBTMC`` - ``0`` - Enables the device class. The current driver exposes one instrument interface. * - ``CFG_TUD_USBTMC_ENABLE_488`` - ``1`` - Builds USB488 capability, status-byte, and trigger support. Set it to ``0`` for base USBTMC only. * - ``CFG_TUD_USBTMC_ENABLE_INT_EP`` - Example-defined - Selects whether the example descriptor includes the notification endpoint; keep this consistent with the capabilities response. * - ``CFG_TUD_USBTMC_INT_EP_SIZE`` - ``2`` bytes - Internal interrupt notification buffer. It must fit the notification format and descriptor packet size. Return a static capabilities structure from ``tud_usbtmc_get_capabilities_cb()``. Its flags must agree with the descriptor and callbacks actually implemented. Message flow ============ .. list-table:: :header-rows: 1 :widths: 45 55 * - API or callback - What it does * - ``tud_usbtmc_open_cb()`` - Announces an opened interface; initialize instrument transaction state and arrange the first bus read. * - ``tud_usbtmc_msgBulkOut_start_cb()`` / ``tud_usbtmc_msg_data_cb()`` - Accepts a device-dependent OUT header and subsequent payload chunks. Return ``false`` when the message cannot be accepted. * - ``tud_usbtmc_msgBulkIn_request_cb()`` - Receives a host request for instrument data and should queue the response when ready. * - ``tud_usbtmc_transmit_dev_msg_data()`` - Queues response data with EOM/termination flags. The source remains application-owned and must stay unchanged until completion. * - ``tud_usbtmc_msgBulkIn_complete_cb()`` - Releases the response buffer and lets the application queue more data or restart command reception. * - ``tud_usbtmc_transmit_notification_data()`` - Copies one interrupt notification when that endpoint is present; ``false`` means the previous notification is still pending. * - ``tud_usbtmc_start_bus_read()`` - Arms the next bulk OUT transfer. Call it after every path that becomes ready to receive another command. * - ``tud_usbtmc_initiate_*_cb()`` / ``tud_usbtmc_check_*_cb()`` - Starts and reports progress for abort/clear control requests. * - ``tud_usbtmc_get_stb_cb()`` / ``tud_usbtmc_msg_trigger_cb()`` - Supplies the USB488 status byte and handles a USB488 trigger message. For host-to-instrument messages, TinyUSB calls ``tud_usbtmc_msgBulkOut_start_cb()`` followed by one or more ``tud_usbtmc_msg_data_cb()`` calls. ``transfer_complete`` marks a USB transfer, not necessarily the end of the USBTMC message; use the message header and EOM information to frame commands. When the host requests instrument data, prepare a response in ``tud_usbtmc_msgBulkIn_request_cb()`` and queue it with ``tud_usbtmc_transmit_dev_msg_data()``. The driver retains the buffer pointer, so keep the data valid and unchanged until ``tud_usbtmc_msgBulkIn_complete_cb()``. Call ``tud_usbtmc_start_bus_read()`` during or soon after open and after each message/completion path that is ready to accept another command. Failing to restart the read is a common reason an instrument answers once and then stops. Implement abort and clear callbacks as a coherent state machine: stop the pending operation, report progress through the corresponding check callback, and restart the bus read when recovery completes. With USB488 enabled, ``tud_usbtmc_get_stb_cb()`` supplies the status byte and ``tud_usbtmc_msg_trigger_cb()`` handles trigger messages. The :doc:`../../examples/device/usbtmc` example implements ``*IDN?``, USB488 status/trigger handling, abort/clear, and a PyVISA test script. Specifications used: *USB Test and Measurement Class Specification*, Revision 1.0, and *USBTMC USB488 Subclass Specification*, Revision 1.0.