CircularAcquisition.py

#############################################################
 # 
 # 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()