#############################################################
#
# FILE: CircularAcquisition.py
# DATE: 11/10/2021
# AUTHOR: Arjun Krishna
# COMPANY: BitFlow, Inc.
# DESCRIPTION: A relatively simple example of capturing data
# to a circular buffer from a single frame grabber
# board. This example also demonstrates the use of
# software trigger, and reading and writing to registers.
#
#############################################################
import sys
if (sys.version_info.major >= 3 and sys.version_info.minor >= 8):
import os
#Following lines specifying, the location of DLLs, are required for Python Versions 3.8 and greater
os.add_dll_directory("C:\BitFlow SDK 6.5\Bin64")
os.add_dll_directory("C:\Program Files\CameraLink\Serial")
import BFModule.BufferAcquisition as Buf
import BFModule.Display as Disp
import time
import msvcrt
from datetime import datetime
keepUpdating = True
def main():
global keepUpdating
print('Circular Acquisition Example')
print('---------------------------------')
CirAq = Buf.clsCircularAcquisition()#Buf.ErrorMode.ErIgnore)
#Call Open board function by showing the Board select dialog
CirAq.Open()
#Get board info parameters to create and open a display surface
xsize = CirAq.GetBoardInfo(Buf.InquireParams.XSize)
ysize = CirAq.GetBoardInfo(Buf.InquireParams.YSize)
dispBitsPerPix = CirAq.GetBoardInfo(Buf.InquireParams.BitsPerPixDisplay) #Number of bits per pixel of the display. Currently this value must = 8, 24, or 32.
imageBitsPerPix = CirAq.GetBoardInfo(Buf.InquireParams.BitsPerPix)
#Create display surface
dispSurf = Disp.clsDispSurf(xsize, ysize, dispBitsPerPix, imageBitsPerPix)
#Get the number of buffers to allocate
while 1:
try:
numBuffers = int(input('\nEnter number of buffers to allocate: '))
except ValueError:
print('Invalid entry. Try again.')
else:
break
#Allocate the requested number of buffers
CirAq.BufferSetup(numBuffers)
#Setup acquisition using the default options
CirAq.AqSetup(Buf.SetupOptions.DisableAqErrorSig)
##Open the display surface
dispSurf.Open()
##Get pointer to the memory buffer of the bitmap behind a display surface
dispSurf.getBitmap()
print("\nPress \'G\' to start Acquisition")
print("Press \'S\' to Stop Acquisition")
if(CirAq.GetTriggerMode() != Buf.TriggerModes.FreeRun):
print("Press \'T\' to issue a SW Trigger")
print("Press \'R\' to read a register value")
print("Press \'W\' to write to a register")
print("Press \'A\' to get Acquisition Status")
print("\nPress \'X\' to exit test\n")
while keepUpdating:
if (msvcrt.kbhit()):
try:
keyPressed = msvcrt.getch().decode('utf-8').upper()
except Exception as e:
print(e)
else:
try:
if (keyPressed == 'X'):
print('Exit Program.')
keepUpdating = False
CirAq.AqCleanup()
break
elif (keyPressed == 'G'):
print('Aquisition Started.')
#Start acquisition
CirAq.AqControl(Buf.AcqCommands.Start, Buf.AcqControlOptions.Async)
elif(keyPressed == 'S'):
#Stop acquisition
CirAq.AqControl(Buf.AcqCommands.Stop, Buf.AcqControlOptions.Async)
print('Aquisition Stopped.')
CirAq.GetCaptureStatus()
elif(keyPressed == 'T'):
#Issue trigger
CirAq.IssueSoftwareTrigger()
print('Trigger Sent.')
elif(keyPressed == 'R'):
print('Reading register value . . .')
regName = input('Enter Register Name:')
try:
regID = CirAq.RegId(regName)
except Exception as e:
print(e)
else:
print('Reg ', regName, ' value = ', CirAq.RegPeek(regID))
elif(keyPressed == 'W'):
print('Writing to a register . . .')
regName = input('Enter Register Name:')
try:
regID = CirAq.RegId(regName)
except Exception as e:
print(e)
else:
regVal = int(input("Enter value to write: "))
CirAq.RegPoke(regID, regVal)
elif(keyPressed == 'A'):
print('Acquisition Status:')
AqStat = CirAq.GetAcqStatus()
print(' -Start:\t', AqStat.Start)
print(' -Stop:\t', AqStat.Stop)
print(' -Abort:\t', AqStat.Abort)
print(' -Pause:\t', AqStat.Pause)
print(' -Cleanup:\t', AqStat.Cleanup)
except Exception as e:
print(e, '\n')
else:
try:
if(CirAq.GetAcqStatus().Start == True):
curBuf = CirAq.WaitForFrame(0)
if (dispSurf.isOpen()):
dispSurf.updateDisplay(CirAq.GetBufArray(), curBuf, Disp.DispOptions.FORMAT_NORMAL)
except Exception as e:
print(e)
pass
#Close the display surface and free the resources
dispSurf.Close()
#Clean up acquisition
CirAq.AqCleanup()
#Free allocated resources
CirAq.BufferCleanup()
#Close the board
CirAq.Close()
if __name__ == "__main__":
main()