#include <mil.h>
#define BUFFERING_SIZE_MAX 22
MIL_INT MFTYPE ProcessingFunction(MIL_INT HookType, MIL_ID HookId, void* HookDataPtr);
typedef struct
{
MIL_ID MilImageOffset;
MIL_ID MilImageGain;
MIL_ID MilImageDisp;
MIL_INT DivisionFactor;
MIL_INT ProcessedImageCount;
} HookDataStruct;
void FPGAOffsetGain(MIL_ID SrcImageId, MIL_ID OffsetImageId,
MIL_ID GainImageId, MIL_INT Src4, MIL_ID DstImageId);
int MosMain(void)
{
MIL_ID MilApplication;
MIL_ID MilSystem ;
MIL_ID MilDisplay ;
MIL_ID MilDigitizer ;
MIL_ID MilGrabBufferList[BUFFERING_SIZE_MAX] = { 0 };
MIL_INT MilGrabBufferListSize;
MIL_ID MilImageGain ;
MIL_ID MilImageOffset;
MIL_ID MilImageDisp ;
MIL_INT SizeX, SizeY, BoardType, n, NbFrames = 0;
MIL_INT ProcessFrameCount = 0;
MIL_DOUBLE ProcessFrameRate = 0;
HookDataStruct UserHookData;
MappAllocDefault(M_DEFAULT, &MilApplication, &MilSystem, &MilDisplay, &MilDigitizer, M_NULL);
MsysInquire(MilSystem, M_BOARD_TYPE, &BoardType);
if(!(BoardType & M_PF))
{
MosPrintf(MIL_TEXT("Error, this example needs a processing FPGA installed on your\n"));
MosPrintf(MIL_TEXT("board to continue.\n"));
MosPrintf(MIL_TEXT("Exiting example.\n"));
MappFreeDefault(MilApplication, MilSystem, MilDisplay, MilDigitizer, M_NULL);
return 0;
}
SizeX = MdigInquire(MilDigitizer, M_SIZE_X, M_NULL);
SizeY = MdigInquire(MilDigitizer, M_SIZE_Y, M_NULL);
MappControl(M_DEFAULT, M_ERROR, M_PRINT_DISABLE);
for(MilGrabBufferListSize = 0;
MilGrabBufferListSize<BUFFERING_SIZE_MAX; MilGrabBufferListSize++)
{
MbufAlloc2d(MilSystem,
SizeX,
SizeY,
8+M_UNSIGNED,
M_IMAGE+M_GRAB+M_PROC+M_FPGA_ACCESSIBLE,
&MilGrabBufferList[MilGrabBufferListSize]);
if (MilGrabBufferList[MilGrabBufferListSize])
MbufClear(MilGrabBufferList[MilGrabBufferListSize], 0xFF);
else
break;
}
MappControl(M_DEFAULT, M_ERROR, M_PRINT_ENABLE);
for (n=0; n<2 && NbFrames; n++)
{
MilGrabBufferListSize--;
MbufFree(MilGrabBufferList[MilGrabBufferListSize]);
}
MbufAlloc2d(MilSystem, SizeX, SizeY, 8+M_UNSIGNED,
M_IMAGE+M_PROC+M_FPGA_ACCESSIBLE, &MilImageGain);
MbufClear(MilImageGain, 16);
MbufAlloc2d(MilSystem, SizeX, SizeY, 8+M_UNSIGNED,
M_IMAGE+M_PROC+M_FPGA_ACCESSIBLE+M_FAST_MEMORY, &MilImageOffset);
MbufClear(MilImageOffset, 2);
MbufAlloc2d(MilSystem, SizeX, SizeY, 8+M_UNSIGNED,
M_IMAGE+M_GRAB+M_DISP+M_HOST_MEMORY+M_FPGA_ACCESSIBLE, &MilImageDisp);
MbufClear(MilImageDisp, 0);
MdispSelect(MilDisplay, MilImageDisp);
MdigGrabContinuous(MilDigitizer, MilImageDisp);
MosPrintf(MIL_TEXT("This example demonstrates how to use the Mfpga API to program\n"));
MosPrintf(MIL_TEXT("an OffsetGain primitive and do live processing.\n"));
MosPrintf(MIL_TEXT("Press <Enter> to continue.\n\n"));
MosGetchar();
MdigHalt(MilDigitizer);
UserHookData.MilImageDisp = MilImageDisp;
UserHookData.MilImageOffset = MilImageOffset;
UserHookData.MilImageGain = MilImageGain;
UserHookData.DivisionFactor = 8;
UserHookData.ProcessedImageCount = 0;
MdigProcess(MilDigitizer, MilGrabBufferList, MilGrabBufferListSize,
M_START, M_DEFAULT, ProcessingFunction, &UserHookData);
MosPrintf(MIL_TEXT("Press <Enter> to stop.\n\n"));
MosGetch();
MdigProcess(MilDigitizer, MilGrabBufferList, MilGrabBufferListSize,
M_STOP, M_DEFAULT, ProcessingFunction, &UserHookData);
MdigInquire(MilDigitizer, M_PROCESS_FRAME_COUNT, &ProcessFrameCount);
MdigInquire(MilDigitizer, M_PROCESS_FRAME_RATE, &ProcessFrameRate);
MosPrintf(MIL_TEXT("\n\n%ld frames grabbed at %.1f frames/sec (%.1f ms/frame).\n"),
ProcessFrameCount, ProcessFrameRate, 1000.0/ProcessFrameRate);
MosPrintf(MIL_TEXT("Press <Enter> to end.\n\n"));
MosGetch();
while(MilGrabBufferListSize > 0)
MbufFree(MilGrabBufferList[--MilGrabBufferListSize]);
MbufFree(MilImageGain);
MbufFree(MilImageOffset);
MbufFree(MilImageDisp);
MappFreeDefault(MilApplication, MilSystem, MilDisplay, MilDigitizer, M_NULL);
return 0;
}
MIL_INT MFTYPE ProcessingFunction(MIL_INT HookType, MIL_ID HookId, void* HookDataPtr)
{
HookDataStruct *UserHookDataPtr = (HookDataStruct *)HookDataPtr;
MIL_ID ModifiedBufferId;
MdigGetHookInfo(HookId, M_MODIFIED_BUFFER+M_BUFFER_ID, &ModifiedBufferId);
FPGAOffsetGain(ModifiedBufferId, UserHookDataPtr->MilImageOffset,
UserHookDataPtr->MilImageGain, 4, UserHookDataPtr->MilImageDisp);
UserHookDataPtr->ProcessedImageCount++;
MosPrintf(MIL_TEXT("Processing frame #%d.\r"), UserHookDataPtr->ProcessedImageCount);
return 0;
}