SimpleCirc.py

#############################################################
 # 
 # FILE:        SimpleCirc.py
 # DATE:        1/14/2022
 # AUTHOR:      Arjun Krishna
 # COMPANY:     BitFlow, Inc.
 # DESCRIPTION: A simple example of capturing data 
 #              to a circular buffer from a single frame grabber 
 #              board.
 #
#############################################################

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

# The main function
def main():
    
    numBuffers = 1000

    print('Circular Acquisition Example')
    print('---------------------------------')

    CirAq = Buf.clsCircularAcquisition()

    #Call Open board function by showing the Board select dialog
    
    CirAq.Open()
    #CirAq.Open(0) # Use this to open board 0 without displaying the board select dialog

    #Get board info parameters
    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 and open Display surface using the above parameters
    dispSurf = Disp.clsDispSurf(xsize, ysize, dispBitsPerPix, imageBitsPerPix)

    #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()
    
    #Start Acquisition
    CirAq.AqControl(Buf.AcqCommands.Start, Buf.AcqControlOptions.Wait)
    print("Acquisition Started.")

    print("\nPress \'X\' to close acquisition and exit.\n")

    keepUpdating = True

    while keepUpdating:        
        if (msvcrt.kbhit()):
            try:
                keyPressed = msvcrt.getch().decode('utf-8').upper()
            except Exception as e:
                print(e)
            else:
                try:
                    if (keyPressed == 'X'):
                         #Stop acquisition
                        CirAq.AqControl(Buf.AcqCommands.Stop, Buf.AcqControlOptions.Async)
                        keepUpdating = False
                        print("Acquisition Stopped.\n")
                        break                    
                except Exception as e:
                        print(e, '\n')
                        break
        else:
            try:
                if(CirAq.GetAcqStatus().Start == True):
                    BufInfo = CirAq.WaitForFrame_BufInfo(0)
                    TS = BufInfo.TimeStamp
                    print(TS.hour, ':', TS.min, '.', TS.sec)
                    if (dispSurf.isOpen()):
                        dispSurf.updateDisplay(CirAq.GetBufArray(), BufInfo.FrameCount, Disp.DispOptions.FORMAT_NORMAL)
            except Exception as e:
                print(e)
                pass
                        
    #Print capture stats
    capStatus = CirAq.GetCaptureStatus()
    print("Frames Captured = ", capStatus[0])
    print("Frames Missed = ", capStatus[1])
                        
    #Cleanup acquisition
    CirAq.AqCleanup()

   #Close the display surface and free the resources
    dispSurf.Close()
    
    #Free allocated resources
    CirAq.BufferCleanup()

    #Close the board
    CirAq.Close()


if __name__ == "__main__":
    main()