# MCCDriver

## class MCCDriver(device_id: str, buffer_multiplier: int = 2)[source]

Bases: [`DAQDriverBase`](https://dev.nominal.io/instro/ref/instruments/instro.daq.DAQDriverBase.md#instro.daq.DAQDriverBase "instro.daq.daq.DAQDriverBase")

MCC (Universal Library / mcculw) DAQ driver.

Initialize the MCC DAQ driver.

Parameters:
:   - **device_id**

      Device unique ID, optionally with a board number as
      `"<serial>:<board_number>"` (e.g. `"344371:0"`). Defaults to board 0.
    - **buffer_multiplier**

      Circular-buffer size relative to per-fetch size.
      Higher values tolerate more jitter at the cost of memory.

Attributes

| [`ai_channels`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.ai_channels "instro.daq.drivers.mcc.mccdaq.MCCDriver.ai_channels") | Frozen snapshot of configured AI channels, keyed by alias. |
| --- | --- |
| [`ai_hw_timing_config`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.ai_hw_timing_config "instro.daq.drivers.mcc.mccdaq.MCCDriver.ai_hw_timing_config") |  |
| [`ao_channels`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.ao_channels "instro.daq.drivers.mcc.mccdaq.MCCDriver.ao_channels") | Frozen snapshot of configured AO channels, keyed by alias. |
| [`ao_hw_timing_config`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.ao_hw_timing_config "instro.daq.drivers.mcc.mccdaq.MCCDriver.ao_hw_timing_config") |  |
| [`channels`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.channels "instro.daq.drivers.mcc.mccdaq.MCCDriver.channels") | Frozen snapshot of all configured AI/AO/DI/DO channels (excludes relays). |
| [`di_channels`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.di_channels "instro.daq.drivers.mcc.mccdaq.MCCDriver.di_channels") | Frozen snapshot of configured DI channels, keyed by alias. |
| [`di_hw_timing_config`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.di_hw_timing_config "instro.daq.drivers.mcc.mccdaq.MCCDriver.di_hw_timing_config") |  |
| [`do_channels`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.do_channels "instro.daq.drivers.mcc.mccdaq.MCCDriver.do_channels") | Frozen snapshot of configured DO channels, keyed by alias. |
| [`do_hw_timing_config`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.do_hw_timing_config "instro.daq.drivers.mcc.mccdaq.MCCDriver.do_hw_timing_config") |  |
| [`relay_channels`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.relay_channels "instro.daq.drivers.mcc.mccdaq.MCCDriver.relay_channels") | Frozen snapshot of configured relay channels, keyed by alias. |
| [`points_in_buffer`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.points_in_buffer "instro.daq.drivers.mcc.mccdaq.MCCDriver.points_in_buffer") |  |

Methods

| [`close`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.close "instro.daq.drivers.mcc.mccdaq.MCCDriver.close") | Disconnect from MCC device. |
| --- | --- |
| [`close_relay`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.close_relay "instro.daq.drivers.mcc.mccdaq.MCCDriver.close_relay") | Close the relay (connect the circuit). |
| [`configure_ai_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_channel") | Deprecated: use `configure_ai_voltage_channel`. |
| [`configure_ai_current_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_current_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_current_channel") | Configure a current input channel on the MCC DAQ device. |
| [`configure_ai_hw_timing`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_hw_timing "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_hw_timing") | Configure hardware timing for the specified channels. |
| [`configure_ai_thermocouple_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_thermocouple_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_thermocouple_channel") | Configure a thermocouple input channel on the MCC DAQ device. |
| [`configure_ai_voltage_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_voltage_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ai_voltage_channel") | Configure a voltage analog input channel on the MCC DAQ device. |
| [`configure_ao_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ao_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ao_channel") | Deprecated: use `configure_ao_voltage_channel`. |
| [`configure_ao_current_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ao_current_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ao_current_channel") | Register an AO current channel. |
| [`configure_ao_voltage_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ao_voltage_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_ao_voltage_channel") | Configure a voltage analog output channel on the MCC DAQ device. |
| [`configure_di_line_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_di_line_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_di_line_channel") | Parse `DigitalPortType/#`, configure the bit for DI, and register the line. |
| [`configure_di_port_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_di_port_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_di_port_channel") | Parse `DigitalPortType`, configure the port for DI, and register the port. |
| [`configure_do_line_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_do_line_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_do_line_channel") | Parse `DigitalPortType/#`, configure the bit for DO, and register the line. |
| [`configure_do_port_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_do_port_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.configure_do_port_channel") | Parse `DigitalPortType`, configure the port for DO, and register the port. |
| [`define_relay_channel`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.define_relay_channel "instro.daq.drivers.mcc.mccdaq.MCCDriver.define_relay_channel") | Build a `RelayChannel` for `physical_channel` (e.g. `"3101"` = slot 3 / channel 101). |
| [`fetch_analog`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.fetch_analog "instro.daq.drivers.mcc.mccdaq.MCCDriver.fetch_analog") | Block until `samples_per_channel` new samples are available, then drain the circular buffer. |
| [`get_actual_sample_rate`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.get_actual_sample_rate "instro.daq.drivers.mcc.mccdaq.MCCDriver.get_actual_sample_rate") | Actual hardware sample rate achieved after `start()`. |
| [`get_info`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.get_info "instro.daq.drivers.mcc.mccdaq.MCCDriver.get_info") | Device capabilities snapshot captured at `open()`. |
| [`open`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.open "instro.daq.drivers.mcc.mccdaq.MCCDriver.open") | Connect to MCC device. |
| [`open_relay`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.open_relay "instro.daq.drivers.mcc.mccdaq.MCCDriver.open_relay") | Open the relay (disconnect the circuit). |
| [`read_analog`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.read_analog "instro.daq.drivers.mcc.mccdaq.MCCDriver.read_analog") | Read from analog input channels; thermocouple channels return temperature in their configured unit. |
| [`read_digital_line`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.read_digital_line "instro.daq.drivers.mcc.mccdaq.MCCDriver.read_digital_line") | Read 0/1 from a single DI line (`DigitalLineChannel`). |
| [`read_digital_port`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.read_digital_port "instro.daq.drivers.mcc.mccdaq.MCCDriver.read_digital_port") | Read an N-bit value from a DI port (bit *i* reflects line *i*). |
| [`start`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.start "instro.daq.drivers.mcc.mccdaq.MCCDriver.start") | Start the MCC DAQ device for hw timed data acquisition. |
| [`stop`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.stop "instro.daq.drivers.mcc.mccdaq.MCCDriver.stop") | Stop the MCC DAQ device. |
| [`write_analog_value`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.write_analog_value "instro.daq.drivers.mcc.mccdaq.MCCDriver.write_analog_value") | Write an analog value to an analog output channel. |
| [`write_digital_line`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.write_digital_line "instro.daq.drivers.mcc.mccdaq.MCCDriver.write_digital_line") | Write 0/1 to a single DO line (`DigitalLineChannel`). |
| [`write_digital_port`](https://dev.nominal.io/instro/ref/instruments/instro.daq.drivers.mcc.mccdaq.MCCDriver.md#instro.daq.drivers.mcc.mccdaq.MCCDriver.write_digital_port "instro.daq.drivers.mcc.mccdaq.MCCDriver.write_digital_port") | Write an N-bit value to a DO port (bit *i* drives line *i*). |

### open()[source]

Connect to MCC device.

### close()[source]

Disconnect from MCC device.

### get_info() → MCCDeviceInfo[source]

Device capabilities snapshot captured at `open()`.

### configure_ai_channel(channel: AnalogChannel)[source]

Deprecated: use `configure_ai_voltage_channel`. Configure an analog input channel on the MCC DAQ device.

### configure_ai_voltage_channel( channel: AnalogChannel | AnalogVoltageChannel, )[source]

Configure a voltage analog input channel on the MCC DAQ device.

### configure_ai_thermocouple_channel( channel: AnalogThermocoupleChannel, )[source]

Configure a thermocouple input channel on the MCC DAQ device.

### configure_ai_current_channel( channel: AnalogCurrentChannel, )[source]

Configure a current input channel on the MCC DAQ device.

### configure_ao_channel(channel: AnalogChannel)[source]

Deprecated: use `configure_ao_voltage_channel`. Configure an analog output channel on the MCC DAQ device.

### configure_ao_voltage_channel( channel: AnalogChannel | AnalogVoltageChannel, )[source]

Configure a voltage analog output channel on the MCC DAQ device.

### configure_ai_hw_timing( hw_timing_config: HWTimingConfig, )[source]

Configure hardware timing for the specified channels.

### start(**kwargs)[source]

Start the MCC DAQ device for hw timed data acquisition.

### get_actual_sample_rate() → float | None[source]

Actual hardware sample rate achieved after `start()`.

Default returns `None` (driver doesn’t know or hasn’t started).
Override on drivers whose SDK reports the effective rate (NI, MCC,
LabJack T-series all do).

### stop(**kwargs)[source]

Stop the MCC DAQ device.

### read_analog() → MCCDAQData[source]

Read from analog input channels; thermocouple channels return temperature in their configured unit.

### fetch_analog() → MCCDAQData[source]

Block until `samples_per_channel` new samples are available, then drain the circular buffer.

### write_analog_value( channel: AnalogChannel, value: float, )[source]

Write an analog value to an analog output channel.

### configure_di_line_channel( physical_channel: str, logic: Logic, logic_level: float | None = None, alias: str | None = None, )[source]

Parse `DigitalPortType/#`, configure the bit for DI, and register the line.

### configure_do_line_channel( physical_channel: str, logic: Logic, logic_level: float | None = None, alias: str | None = None, )[source]

Parse `DigitalPortType/#`, configure the bit for DO, and register the line.

### configure_di_port_channel( physical_channel: str, logic: Logic, port_width: DigitalPortWidth, logic_level: float | None = None, alias: str | None = None, )[source]

Parse `DigitalPortType`, configure the port for DI, and register the port.

### configure_do_port_channel( physical_channel: str, logic: Logic, port_width: DigitalPortWidth, logic_level: float | None = None, alias: str | None = None, )[source]

Parse `DigitalPortType`, configure the port for DO, and register the port.

### write_digital_line( channel: DigitalChannel, data: int, )[source]

Write 0/1 to a single DO line (`DigitalLineChannel`).

### read_digital_line( channel: DigitalChannel, ) → int[source]

Read 0/1 from a single DI line (`DigitalLineChannel`).

### write_digital_port( channel: DigitalChannel, data: int, )[source]

Write an N-bit value to a DO port (bit *i* drives line *i*).

### property ai_channels: Mapping[str, AnalogChannel | AnalogVoltageChannel | AnalogCurrentChannel | AnalogThermocoupleChannel]

Frozen snapshot of configured AI channels, keyed by alias.

### property ai_hw_timing_config: HWTimingConfig | None

### property ao_channels: Mapping[str, AnalogChannel | AnalogVoltageChannel | AnalogCurrentChannel | AnalogThermocoupleChannel]

Frozen snapshot of configured AO channels, keyed by alias.

### property ao_hw_timing_config: HWTimingConfig | None

### property channels: tuple[DAQChannel, ...]

Frozen snapshot of all configured AI/AO/DI/DO channels (excludes relays).

### close_relay(channel: RelayChannel)

Close the relay (connect the circuit). Override if the driver supports relays.

### configure_ao_current_channel( channel: AnalogCurrentChannel, )

Register an AO current channel. Override if the driver supports analog current output.

### define_relay_channel( physical_channel: str, alias: str | None = None, ) → RelayChannel

Build a `RelayChannel` for `physical_channel` (e.g. `"3101"` = slot 3 / channel 101).

Default implementation suits the Keysight 34980A’s slot/channel
addressing; override if the driver needs different parsing. Overrides
must also record the resulting channel on `self._relay_channels`.

### property di_channels: Mapping[str, DigitalChannel]

Frozen snapshot of configured DI channels, keyed by alias.

### property di_hw_timing_config: HWTimingConfig | None

### property do_channels: Mapping[str, DigitalChannel]

Frozen snapshot of configured DO channels, keyed by alias.

### property do_hw_timing_config: HWTimingConfig | None

### open_relay(channel: RelayChannel)

Open the relay (disconnect the circuit). Override if the driver supports relays.

### read_digital_port( channel: DigitalChannel, ) → int[source]

Read an N-bit value from a DI port (bit *i* reflects line *i*).

### property relay_channels: Mapping[str, RelayChannel]

Frozen snapshot of configured relay channels, keyed by alias.

### points_in_buffer: int
