Skip to content

Example: I2C command example.ยค

"""Example: I2C command example."""

from nominal_instro.instruments.i2c import NominalI2C
from nominal_instro.instruments.i2c.types import I2CVendor, SystemDefinition
from nominal_instro.lib.publishers import NominalCorePublisher

VENDOR = I2CVendor.TOTAL_PHASE
RESOURCE_ID = "2239-764425"

DATASET_RID = "<dataset_rid>" # Replace with your dataset RID. 


def my_system_definition() -> SystemDefinition:
    """Defines the peripherals on the I2C bus.

    Typically, you'd want to put this definition in a seperate file from your main app.
    """
    from enum import Enum

    from nominal_instro.instruments.i2c.types import CommandDef, CommandDevice, CustomScaling, DataFormat

    # For use with ltc2309 ADC
    ADCChannel = Enum(
        "ADCChannel",
        {"CH0": 0x80, "CH1": 0xC0, "CH2": 0x90, "CH3": 0xD0, "CH4": 0xA0, "CH5": 0xE0, "CH6": 0xB0, "CH7": 0xF0},
    )

    ADCSleepMode = Enum("ADCSleepMode", {"WAKE": 0x00, "SLEEP": 0x04})

    ADCPolarityMode = Enum("ADCPolarityMode", {"BIPOLAR": 0x00, "UNIPOLAR": 0x08})

    def ltc2309_voltage_scaling(shifted: int) -> float:
        scaled = shifted / 4095 * 5 * 7.2
        return scaled

    ltc2309_voltage_format = DataFormat(
        transfer_bits=16, data_width_bits=12, data_lsb=4, scaling=CustomScaling(ltc2309_voltage_scaling)
    )

    adc1 = CommandDevice(
        name="VOLTAGE_ADC",
        address=0x09,
        valid_commands={
            "channel": CommandDef(name="channel", values=ADCChannel),
            "sleep_mode": CommandDef(name="sleep_mode", values=ADCSleepMode),
            "polarity_mode": CommandDef(name="polarity_mode", values=ADCPolarityMode),
        },
        batch_commands={
            "ch0": [ADCChannel.CH0, ADCPolarityMode.UNIPOLAR, ADCSleepMode.WAKE],
            "ch1": [ADCChannel.CH1, ADCPolarityMode.UNIPOLAR, ADCSleepMode.WAKE],
            "ch2": [ADCChannel.CH2, ADCPolarityMode.UNIPOLAR, ADCSleepMode.WAKE],
        },
        data_format=ltc2309_voltage_format,
    )

    return SystemDefinition(
        devices={
            adc1.name: adc1,
        }
    )


# This is the main app. It reads from an LTC2309 ADC.

# A system_definition is passed in which describes the
# peripherals on the I2C bus.

system_definition = my_system_definition()

i2c = NominalI2C.create(
    name="myI2C",
    vendor=I2CVendor.TOTAL_PHASE,
    resource=RESOURCE_ID,
    system_definition=system_definition,
)
i2c.add_publisher(NominalCorePublisher(dataset_rid=DATASET_RID))

try:
    value = i2c.query("VOLTAGE_ADC", "ch0")
    print(value)

finally:
    i2c.close()