How to use the Python bindings.
The C++ classes and methods for this library are implemented by the Python module vib.
import vib
service = vib.Service()
service.Open(0)
print("Serial number: " + service.GetSerialNumber())
digitalOutput = vib.DigitalOutput()
digitalOutput.Open(0)
digitalOutput.Reset()
print("Setting digital output to 0x55")
digitalOutput.Set(0x55)
import vib
try:
led = vib.Led()
led.Open()
except:
print("The Led device cannot be openend / is not available")
exit
led.Reset()
print("Setting LED0: on")
led.SetLED(0, True)
print("Setting LED1: signal generator, blinking three times")
led.ConfigureGenerator(0, 3, 200, 200, 2000)
led.SetMode(1, led.MODE.GEN0)
import vib
print('Connecting DigitalInput to DigitalOutput as follows:')
print()
print('IN(0) --> Multiplexer(0) --+----------------> OUT(0)')
print(' |')
print(' |----(invert)----> OUT(1)')
print()
print('IN(1) --> Multiplexer(1) --+----------------> OUT(2)')
print(' |')
print(' |----(invert)----> OUT(3)')
digitalOutput = vib.DigitalOutput()
digitalOutput.Open(0)
digitalOutput.Reset()
multiplexer = vib.Multiplexer()
multiplexer.Open(0)
digitalInput = vib.DigitalInput()
digitalInput.Open(0)
digitalInput.ConfigureDebounceTime(1000, 1000)
multiplexer.ConnectOutput(0, multiplexer.SOURCE.DIG_IN0);
multiplexer.ConnectOutput(1, multiplexer.SOURCE.DIG_IN1);
digitalOutput.SetSource(0, digitalOutput.SOURCE.MUX_OUT0, False);
digitalOutput.SetSource(1, digitalOutput.SOURCE.MUX_OUT0, True);
digitalOutput.SetSource(2, digitalOutput.SOURCE.MUX_OUT1, False);
digitalOutput.SetSource(3, digitalOutput.SOURCE.MUX_OUT1, True);
import time
import vib
service = vib.Service()
service.Open()
digOut = vib.DigitalOutput()
digOut.Open()
digOut.Reset()
mux = vib.Multiplexer()
mux.Open()
mux.ConnectOutput(0, vib.Multiplexer.SOURCE.ON)
digOut.SetSource(0, digOut.SOURCE.MUX_OUT0, True)
try:
print("Configuring watchdog to reset the Multiplexer after 3 seconds")
service.WatchdogSetup(True, 3000, vib.Service.WDT_RESET_TYPE.MULTIPLEXER)
except:
print(" Error: Watchdog reset type for Multiplexer is not available")
exit
print("Waiting for Watchdog timeout to expire...")
while not service.WatchdogHasFired():
time.sleep(0.1)
print("The Watchdog has fired, OUT0 should be active now")
import vib
triggerUnit = vib.TriggerGenerator()
triggerUnit.Open(0)
triggerUnit.Reset()
digitalOutput = vib.DigitalOutput()
digitalOutput.Open(0)
digitalOutput.Reset()
multiplexer = vib.Multiplexer()
multiplexer.Open(0)
multiplexer.Reset()
print('DigitalOutput 0: configure a generator to create a 10 Hz trigger signal')
triggerUnit.ConfigureSet("GenA_tLow=50ms GenA_tHigh=50ms");
triggerUnit.ConfigureSet("TrigOut0_Mux=GenA");
print('DigitalOutput 1: configure a Divider to reduce the frequency of the signal by 5')
triggerUnit.ConfigureSet("DividerA=5,TrigIn0_Both");
triggerUnit.ConfigureSet("MuxIntern0=DividerA");
triggerUnit.ConfigureSet("TrigOut1_Mux=TrigIntern0");
print('DigitalOutput 2: configure Counter to generate a pulse after 8 trigger signals')
triggerUnit.ConfigureSet("CounterA=8,TrigIn0_Rising");
triggerUnit.ConfigureSet("CounterA_ON=7");
triggerUnit.ConfigureSet("CounterA_OFF=8");
triggerUnit.ConfigureSet("CounterA_Reset=Auto");
triggerUnit.ConfigureSet("CounterA_Start=On");
triggerUnit.ConfigureSet("MuxIntern1=CounterA");
triggerUnit.ConfigureSet("TrigOut2_Mux=TrigIntern1");
print('DigitalOutput 3: configure LUT0 to mask the trigger signal with the output')
print(' of the divider')
triggerUnit.ConfigureSet("LUT0=TrigIn0&TrigIntern0");
triggerUnit.ConfigureSet("MuxIntern2=LUT0");
triggerUnit.ConfigureSet("TrigOut3_Mux=TrigIntern2");
multiplexer.ConnectOutput(0, multiplexer.SOURCE.TRIGGEN_OUT0);
multiplexer.ConnectOutput(1, multiplexer.SOURCE.TRIGGEN_OUT1);
multiplexer.ConnectOutput(2, multiplexer.SOURCE.TRIGGEN_OUT2);
multiplexer.ConnectOutput(3, multiplexer.SOURCE.TRIGGEN_OUT3);
digitalOutput.SetSource(0, digitalOutput.SOURCE.MUX_OUT0, False);
digitalOutput.SetSource(1, digitalOutput.SOURCE.MUX_OUT1, False);
digitalOutput.SetSource(2, digitalOutput.SOURCE.MUX_OUT2, False);
digitalOutput.SetSource(3, digitalOutput.SOURCE.MUX_OUT3, False);
import vib
print('This examples uses an IOScheduler in automatic requeue mode.')
print('- A 10 Hz signal generator (TriggerGenerator) is used as trigger source for the IOScheduler.')
print('- This signal is copied to DigitalOutput 0')
print('- An output sequence of four pulses is pushed into the IOScheduler (output value 1)')
print('- The last entry resets the IOScheduler sequence itself (output value 2)')
print('- The output signal of the IOScheduler is copied to DigitalOutput 1')
triggerUnit = vib.TriggerGenerator()
triggerUnit.Open(0)
triggerUnit.Reset()
digitalOutput = vib.DigitalOutput()
digitalOutput.Open(0)
digitalOutput.Reset()
multiplexer = vib.Multiplexer()
multiplexer.Open(0)
multiplexer.Reset()
ioScheduler = vib.IOScheduler()
ioScheduler.Open(0)
ioScheduler.Reset()
triggerUnit.ConfigureSet("GenA_tLow=50ms GenA_tHigh=50ms");
triggerUnit.ConfigureSet("TrigOut0_Mux=GenA");
multiplexer.ConnectOutput(0, multiplexer.SOURCE.TRIGGEN_OUT0);
digitalOutput.SetSource(0, digitalOutput.SOURCE.MUX_OUT0, False);
ioScheduler.SetTriggerSource(0, False);
ioScheduler.SetAutomaticRequeueMode(True)
multiplexer.ConnectOutput(1, multiplexer.SOURCE.IOSCHEDULER_0_OUT1);
ioScheduler.SetCounterResetSource(ioScheduler.RST_SRC.MUX_OUT1, False, True)
ioScheduler.SetCounterFreeze(True)
ioScheduler.Start()
ioScheduler.PushValue(1, 1)
ioScheduler.PushValue(2, 0)
ioScheduler.PushValue(4, 1)
ioScheduler.PushValue(6, 0)
ioScheduler.PushValue(9, 1)
ioScheduler.PushValue(12, 0)
ioScheduler.PushValue(16, 1)
ioScheduler.PushValue(20, 0)
ioScheduler.PushValue(25, 2)
multiplexer.ConnectOutput(2, multiplexer.SOURCE.IOSCHEDULER_0_OUT0);
digitalOutput.SetSource(1, digitalOutput.SOURCE.MUX_OUT2, False);
ioScheduler.SetCounterFreeze(False)
import vib
cl_module_id = 0
cam_channel = 0
cl_mode = vib.CameraLinkIn.INMODE_TYPE.CL_1TAP_8BIT
cl_flags = vib.CameraLinkIn.INMODE_FLAGS.DEFAULT
width = 640
height = 480
buffers = 4
print("Initializing grabber...")
cl = vib.CameraLinkIn()
cl.Open(cl_module_id)
cl.ConfigureCLInput(cam_channel, cl_mode, cl_flags, width, height)
print("Allocating {} buffers and starting acquisition...".format(buffers))
for i in range(buffers):
buf = cl.AllocateImageBuffer(cam_channel)
cl.AddImageBufferForCapturing(cam_channel, buf)
frame = 0
print("Starting acquisition loop, press CTRL-C to stop the program.")
while True:
try:
result = cl.WaitForImageBuffer(cam_channel, 1000)
ptr = result[0]
bufIsValid = result[1]
if ptr:
if not bufIsValid:
print("The camera image is broken")
cl.AddImageBufferForCapturing(cam_channel, ptr)
continue
else:
print("Acquisition timeout")
continue
frame = frame + 1
print("\rFrame: {}".format(frame), end = '')
cl.AddImageBufferForCapturing(cam_channel, ptr)
except KeyboardInterrupt:
break
print("Stopping acquisition...")
cl.AbortBufferUsage(cam_channel)
print("Releasing buffers...")
while True:
result = cl.WaitForImageBuffer(cam_channel, 0)
if result[0] is None:
break
cl.FreeImageBuffer(cam_channel, result[0])
print("End.")
import vib
try:
import numpy as np
import cv2 as cv
except:
raise RuntimeError("OpenCV not found, run 'apt install --no-install-recommends python3-opencv'")
cl_module_id = 0
cam_channel = 0
cl_mode = vib.CameraLinkIn.INMODE_TYPE.CL_1TAP_8BIT
cl_flags = vib.CameraLinkIn.INMODE_FLAGS.DEFAULT
width = 640
height = 480
buffers = 4
print("Initializing grabber...")
cl = vib.CameraLinkIn()
cl.Open(cl_module_id)
cl.ConfigureCLInput(cam_channel, cl_mode, cl_flags, width, height)
print("Allocating {} buffers and starting acquisition...".format(buffers))
for i in range(buffers):
buf = cl.AllocateImageBuffer(cam_channel)
cl.AddImageBufferForCapturing(cam_channel, buf)
cv.namedWindow("Camera", cv.WINDOW_NORMAL | cv.WINDOW_KEEPRATIO)
cv.resizeWindow("Camera", width, height)
frame = 0
print("Press 'q' in window to stop")
while (cv.waitKey(1) != ord('q')):
result = cl.WaitForImageBuffer(cam_channel, 1000)
ptr = result[0]
bufIsValid = result[1]
if ptr:
if not bufIsValid:
print("The camera image is broken")
cl.AddImageBufferForCapturing(cam_channel, ptr)
continue
else:
print("Acquisition timeout")
continue
frame = frame + 1
image = np.ndarray((height, width), dtype=np.uint8, buffer=ptr).copy()
cv.putText(image, "Frame: {}".format(frame), (30, 50),
cv.FONT_HERSHEY_SIMPLEX, 1.4, (200, 200, 250), 2, cv.LINE_AA)
cv.imshow("Camera", image)
cl.AddImageBufferForCapturing(cam_channel, ptr)
print("Stopping acquisition...")
cl.AbortBufferUsage(cam_channel)
print("Releasing buffers...")
while True:
result = cl.WaitForImageBuffer(cam_channel, 0)
if result[0] is None:
break
cl.FreeImageBuffer(cam_channel, result[0])
cv.destroyAllWindows()
print("End.")
import vib
print("Searching for vib devices...")
systemInfo = vib.VIBSystem.GetSystemInfo()
for systemType in systemInfo:
for index in range(systemType.GetNumberEntities()):
system = vib.VIBSystem.CreateInstance(systemType.GetSystemType(), index)
print(" Found hardware component: {}, System type: {}, index: {}".format(system.GetHardwareType().name, systemType.GetSystemType().name, index))
for fwIndex in range(2):
try:
version = system.GetFirmwareVersion(fwIndex)
print(" Firmware version (component {}): {}.{}.{}.{}".format(fwIndex, version[0], version[1], version[2], version[3]))
except:
break
deviceInfo = system.GetDeviceInfo()
if len(deviceInfo) != system.GetNumberOfDeviceTypes():
raise RuntimeError("Number of device types failed (VIBSystem.GetNumberOfDeviceTypes() / (VIBSystem.GetDeviceInfo())")
for deviceType in deviceInfo:
print(" Found {} devices: {}".format(deviceType.GetNumberEntities(), deviceType.GetDeviceType().name))
vib.VIBSystem.DeleteInstance(system)