UmberHubManager/api/examples/c_cpp/BrainStem2-Application-Notes/brainstem_network.py

111 lines
5.2 KiB
Python
Executable File

###############################################################################
# Filename: brainstem_network.py
# Prepared By: James Dudley
# Date Prepared: March 7, 2018
# Date Revised: March 7, 2018
# Revision: 0.0.1
###############################################################################
import brainstem # Import BrainStem API
from brainstem.result import Result # For easy access to error constants
from time import sleep, time
USB_CHANNEL = 0
RAIL0_SET_VOLTAGE = 2200000 # Set voltage for MTM-PM-1 Rail 0
RAIL1_SET_VOLTAGE = 2800000 # Set voltage for MTM-IO-SERIAL Rail 1
CYCLE_TIME = 0.02 # Time to pause between readings, seconds
# Generic function to run BrainStem commands with error checking
def step(func, func_str, *args):
print '>> ' + func_str[0].upper() + func_str[1:] # Capitalize first letter of string
res = func(*args)
err = val = res
if isinstance(val, Result):
err = res.error
val = res.value
else:
err = Result.NO_ERROR
if err is not Result.NO_ERROR:
raise Exception('Error %s: %d' % (func_str, err))
return val
def main():
# Create each MTM object
# Apply a module offset of 24 to the MTM-PM-1 module (determined by the DIP switch on the development board)
ioserial = brainstem.stem.MTMIOSerial() # Uses default module address
# Module offset is applied simply to demonstrate module offset, and is not strictly required in this case
# Make sure the DIP switch for MTM-PM-1 is set to 1-1-0-0 (0b1100 * 2 = offset of 24)
pm = brainstem.stem.MTMPM1(brainstem.stem.MTMPM1.BASE_ADDRESS + 24)
stem = brainstem.stem.MTMUSBStem() # Uses default module address
# Initialize error tracker
err = Result.NO_ERROR
try:
# Discover and connect to MTM-IO-SERIAL object
# First, get a list of all available USB modules (Note: MTM-PM-1 shows up because there's a pass-through
# USB channel on the MTM-IO-SERIAL, which is connected to the MTM-PM-1 edge connector USB on the development board)
spec_array = step(brainstem.discover.findAllModules, 'discover USB modules', brainstem.link.Spec.USB)
# Next, iterate through each link Spec in the array and connect if it's the MTM-IO-SERIAL module
for spec in spec_array:
if spec.model == brainstem.defs.MODEL_MTM_IOSERIAL:
step(ioserial.connectFromSpec, 'connecting to MTM-IO-SERIAL from spec', spec)
break
connection_status = step(ioserial.isConnected, 'checking MTM-IO-SERIAL connection status')
if connection_status is not True:
raise Excepetion('Error finding MTM-IO-SERIAL module: no MTM-IO-SERIAL link Spec discovered')
# Connect the MTM-PM-1 and MTM-USBSTEM modules over the BrainStem network,
# using the MTM-IO-SERIAL as the primary module.
step(pm.connectThroughLinkModule, 'connecting to MTM-PM-1 over BS network', ioserial)
step(stem.connectThroughLinkModule, 'connecting to MTM-USBSTEM over BS network', ioserial)
# Set both modules to route through the MTM-IO-SERIAL module (turn "ON" ioserial.routeToMe)
step(ioserial.system.routeToMe, 'setting MTM-IO-SERIAL routeToMe', 1)
# Try out a few examples of functionality from each MTM module
# 1 - Set MTM-PM-1 Rail 0 and measure the voltage using MTM-USBSTEM A2D0
step(pm.rail[0].setVoltage, 'setting Rail 0 voltage to %.3fV' % (RAIL0_SET_VOLTAGE/1.e6), RAIL0_SET_VOLTAGE)
step(pm.rail[0].setEnable, 'enabling Rail 0', 1)
sleep(CYCLE_TIME)
a2d0_voltage = step(stem.analog[0].getVoltage, 'reading A2D0 voltage')
print '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
print 'MTM-PM-1 Rail 0: %.3fV' % (RAIL0_SET_VOLTAGE/1.e6)
print 'MTM-USBSTEM A2D0: %.3fV' % (a2d0_voltage / 1.e6)
print '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
# 2 - (optional) Toggle MTM-IO-SERIAL USB channel on/off
step(ioserial.usb.setPortEnable, 'enabling USB channel %d' % USB_CHANNEL, USB_CHANNEL)
raw_input('Verify USB device enumeration (optional) and press Enter to continue...')
step(ioserial.usb.setPortDisable, 'disabling USB channel %d' % USB_CHANNEL, USB_CHANNEL)
# 3 - Set MTM-IO-SERIAL Rail 1 and measure the voltage using MTM-USBSTEM A2D1
step(ioserial.rail[1].setVoltage, 'setting Rail 1 voltage to %.3fV' % (RAIL1_SET_VOLTAGE/1.e6), RAIL1_SET_VOLTAGE)
step(ioserial.rail[1].setEnable, 'enabling Rail 1', 1)
sleep(CYCLE_TIME)
a2d1_voltage = step(stem.analog[1].getVoltage, 'reading A2D1 voltage')
print '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
print 'MTM-IO-SERIAL Rail 1: %.3fV' % (RAIL1_SET_VOLTAGE/1.e6)
print 'MTM-USBSTEM A2D1: %.3fV' % (a2d1_voltage / 1.e6)
print '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
except Exception as exc:
print exc
finally:
stem.disconnect() # Clean up possible remaining connections
pm.disconnect()
ioserial.disconnect()
del stem # Clean up MTM objects
del pm
del ioserial
if __name__ == '__main__':
main()