Actuator-Controller-HITL/code/MCC_Interface.py
SchrodingerError 482d724e20 Initial Commit
2024-08-14 14:42:16 -05:00

200 lines
6.8 KiB
Python

from mcculw import ul as mcculw
from mcculw.enums import (AiChanType, BoardInfo, Status, InterfaceType,
FunctionType, InfoType, ScanOptions,
ULRange, AnalogInputMode, DigitalPortType, DigitalIODirection)
import time
class MCC3114():
def __init__(self):
self.range = ULRange.BIP10VOLTS
self.board_num = self.setup_device()
if self.board_num == -1:
print("Could not setup MCC3114")
self.config_outputs()
self.current_voltage_outputs: list[float] = [0.0]*16
self.set_all_to_zero()
def __del__(self):
self.set_all_to_zero()
def setup_device(self) -> int:
'''Sets up the device without Instacal configuration files'''
board_num = 0
board_index = 0
find_device = "USB-3114"
board_num = -1
dev_list = mcculw.get_daq_device_inventory(InterfaceType.USB)
if len(dev_list) > 0:
for device in dev_list:
if str(device) == find_device:
board_num = board_index
mcculw.create_daq_device(board_num, device)
board_index = board_index + 1
if board_num == -1:
print(f"Device {find_device} not found")
return board_num
else:
print("No devices detected")
return board_num
return board_num
def config_outputs(self):
if self.board_num == -1:
return
for ch in range(16):
mcculw.set_config(
InfoType.BOARDINFO, self.board_num, ch,
BoardInfo.DACRANGE, self.range
)
def set_all_to_zero(self):
'''Make the voltage outputs be 0.0 V when the program exits or we delete the object'''
if self.board_num == -1:
return
for i in range(16):
self.voltage_write(channel=i, voltage=0.0)
def voltage_write(self, channel:int, voltage: float):
if self.board_num == -1:
return
if channel < 0 or channel > 15:
print(f"Channel: {channel} is out of range for the MCC USB-3114. Valid range is [0, 15]")
return
if voltage < -10:
print(f"Voltage: {voltage} is out of range for the MCC USB-3114 in this configuration. Valid range is [-10, 10] V")
voltage = -10
if voltage > 10:
print(f"Voltage: {voltage} is out of range for the MCC USB-3114 in this configuration. Valid range is [-10, 10] V")
voltage = 10
try:
mcculw.v_out(self.board_num, channel, self.range, voltage)
self.current_voltage_outputs[channel] = voltage
except Exception as exc:
print(f"Exception occurred doing voltage write to MCC USB-3114: {exc}")
class MCC202():
def __init__(self):
self.range = ULRange.BIP10VOLTS
self.digital_type = DigitalPortType.AUXPORT
self.board_num = self.setup_device()
if self.board_num == -1:
print("Could not setup MCC202")
self.current_analog_inputs: list[float] = [0.0] * 8
self.current_digital_inputs: list[int] = [0] * 8
def __del__(self):
pass # No specific cleanup required for inputs
def setup_device(self) -> int:
'''Sets up the device without Instacal configuration files'''
board_num = 0
board_index = 0
find_device = "USB-202"
board_num = -1
dev_list = mcculw.get_daq_device_inventory(InterfaceType.USB)
if len(dev_list) > 0:
for device in dev_list:
if str(device) == find_device:
board_num = board_index
mcculw.create_daq_device(board_num, device)
board_index = board_index + 1
if board_num == -1:
print(f"Device {find_device} not found")
return board_num
else:
print("No devices detected")
return board_num
return board_num
def config_inputs(self):
if self.board_num == -1:
return
for ch in range(8):
mcculw.set_config(
InfoType.BOARDINFO, self.board_num, ch,
BoardInfo.RANGE, self.range
)
for ch in range(8):
mcculw.d_config_port(self.board_num, self.digital_type, DigitalIODirection.IN)
def print_all_channels(self):
for i in range(8):
print(f"Analog channel {i} reads {self.current_analog_inputs[i]} Volts")
for i in range(8):
print(f"Digital channel {i} reads {self.current_digital_inputs[i]}")
def voltage_read(self, channel: int) -> float:
if self.board_num == -1:
return 0.0
if channel < 0 or channel > 7:
print(f"Channel: {channel} is out of range for the MCC USB-202. Valid range is [0, 7]")
return 0.0
try:
voltage = mcculw.v_in(self.board_num, channel, self.range)
self.current_analog_inputs[channel] = voltage
return voltage
except Exception as exc:
print(f"Exception occurred doing voltage read from MCC USB-202: {exc}")
return 0.0
def read_all_analog_channels(self):
'''Read all analog input channels and update the current_analog_inputs list'''
for i in range(8):
self.voltage_read(i)
def digital_read(self, channel: int) -> int:
if self.board_num == -1:
return -1
if channel < 0 or channel > 7:
print(f"Digital channel: {channel} is out of range for the MCC USB-202. Valid range is [0, 7]")
return -1
try:
state = mcculw.d_bit_in(self.board_num, self.digital_type, channel)
self.current_digital_inputs[channel] = state
return state
except Exception as exc:
print(f"Exception occurred doing digital read from MCC USB-202: {exc}")
return -1
def read_all_digital_channels(self):
'''Read all digital input channels and update the current_digital_inputs list'''
for i in range(8):
self.digital_read(i)
def read_all_channels(self):
for i in range(8):
self.voltage_read(i)
self.digital_read(i)
def main():
mcculw.ignore_instacal() # ONLY CALL ONCE
#mcc3114 = MCC3114()
mcc202 = MCC202()
while True:
mcc202.read_all_channels()
mcc202.print_all_channels()
time.sleep(3)
#mcc3114.voltage_write(1, 5)
#mcc3114.voltage_write(7, 5)
#time.sleep(100)
if __name__ == "__main__":
main()