#include <mil.h>
#define BUFFERING_SIZE_MAX 22
MIL_INT MFTYPE ProcessingFunction(MIL_INT HookType, MIL_ID HookId, void* HookDataPtr);
typedef struct
{
MIL_ID MilImageLut;
MIL_ID MilImageDisp;
MIL_INT ProcessedImageCount;
} HookDataStruct;
void FPGALoadLut(MIL_ID LutId);
void FPGALutMap(MIL_ID SrcImageId, MIL_ID DstImageId, MIL_ID LutId);
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 MilLutBuffer ;
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("Press <Enter> to quit.\n"));
MosGetch();
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_GRAB+M_DISP+M_HOST_MEMORY+M_FPGA_ACCESSIBLE,
&MilImageDisp);
MbufClear(MilImageDisp, 0);
MdispSelect(MilDisplay, MilImageDisp);
MbufAlloc1d(MilSystem,
256,
8+M_UNSIGNED,
M_LUT+M_FPGA_ACCESSIBLE,
&MilLutBuffer);
MgenLutRamp(MilLutBuffer, 0, 255, 255, 0);
MdigGrabContinuous(MilDigitizer, MilImageDisp);
MosPrintf(MIL_TEXT("This example demonstrates how to use the Mfpga API to program\n"));
MosPrintf(MIL_TEXT("a LutMap primitive and do live processing.\n"));
MosPrintf(MIL_TEXT("Press <Enter> to continue.\n\n"));
MosGetchar();
MdigHalt(MilDigitizer);
FPGALoadLut(MilLutBuffer);
UserHookData.MilImageDisp = MilImageDisp;
UserHookData.MilImageLut = MilLutBuffer;
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(MilLutBuffer);
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);
FPGALutMap(ModifiedBufferId, UserHookDataPtr->MilImageDisp, UserHookDataPtr->MilImageLut);
UserHookDataPtr->ProcessedImageCount++;
MosPrintf(MIL_TEXT("Processing frame #%d.\r"), UserHookDataPtr->ProcessedImageCount);
return 0;
}