#include "mil.h"
#include "mil3dcam_pfocus.h"
bool GetBufInfoAndValidate(MIL_ID MilBuf, MIL_BUFFER_INFO* ppBuf);
template <class T>
void DoConversion(const void* pVoidSrc , void* pVoidPos, void* pVoidInt,
MIL_INT SrcOffset, MIL_INT SrcPitch, MIL_INT SizeLine);
MIL_INT MFTYPE M3dcamPFocusToMIL(MIL_ID MilPFocusImage,
MIL_ID MilPositionImage,
MIL_ID MilIntensityImage,
MIL_ID MilEncoderImage,
const PFocusParams* ConvParamsPtr)
{
if ( ConvParamsPtr->DataResolution != 8 &&
ConvParamsPtr->DataResolution != 10 &&
ConvParamsPtr->DataResolution != 12 )
return CONVERSION_FAILURE;
if ( ConvParamsPtr->StatusLine != STATUS_LINE_ENABLED &&
ConvParamsPtr->StatusLine != STATUS_LINE_DISABLED )
return CONVERSION_FAILURE;
if (ConvParamsPtr->CycleTimeMicroseconds <= 0)
return CONVERSION_FAILURE;
MIL_BUFFER_INFO PFocusBuf, PositionBuf, IntensityBuf;
if ( !GetBufInfoAndValidate(MilPFocusImage , &PFocusBuf ) )
return CONVERSION_FAILURE;
if ( !GetBufInfoAndValidate(MilPositionImage , &PositionBuf ) )
return CONVERSION_FAILURE;
if ( !GetBufInfoAndValidate(MilIntensityImage, &IntensityBuf) )
return CONVERSION_FAILURE;
if (MfuncBufSizeX(PFocusBuf) < PFOCUS_3D_DATA_WIDTH)
return CONVERSION_FAILURE;
MIL_INT ExpectedSrcSizeY = MfuncBufSizeX(PositionBuf);
if (ConvParamsPtr->StatusLine == STATUS_LINE_ENABLED)
ExpectedSrcSizeY += 1;
if (MfuncBufSizeY(PFocusBuf) != ExpectedSrcSizeY)
return CONVERSION_FAILURE;
if (ConvParamsPtr->DataResolution == 8)
{
if (MfuncBufSizeBit(PFocusBuf) != 8 || MfuncBufSizeBit(IntensityBuf) != 8)
return CONVERSION_FAILURE;
}
else
{
if (MfuncBufSizeBit(PFocusBuf) != 16 || MfuncBufSizeBit(IntensityBuf) != 16)
return CONVERSION_FAILURE;
}
if (MfuncBufSizeX(PositionBuf) != MfuncBufSizeX(IntensityBuf))
return CONVERSION_FAILURE;
if (MfuncBufSizeY(PositionBuf) != 1 || MfuncBufSizeY(IntensityBuf) != 1)
return CONVERSION_FAILURE;
if (MfuncBufSizeBit(PositionBuf) != 16)
return CONVERSION_FAILURE;
MbufControl(MfuncBufId(PFocusBuf ), M_LOCK+M_READ , M_DEFAULT);
MbufControl(MfuncBufId(PositionBuf ), M_LOCK+M_WRITE, M_DEFAULT);
MbufControl(MfuncBufId(IntensityBuf), M_LOCK+M_WRITE, M_DEFAULT);
MIL_INT SizeLine = MfuncBufSizeX(PositionBuf);
MIL_INT SrcPitch = MfuncBufPitch(PFocusBuf);
const void* pVoidSrc = (const void*) MfuncBufHostAddress(PFocusBuf);
void* pVoidPos = (void*) MfuncBufHostAddress(PositionBuf );
void* pVoidInt = (void*) MfuncBufHostAddress(IntensityBuf);
if (pVoidSrc == NULL || pVoidPos == NULL || pVoidInt == NULL)
return CONVERSION_FAILURE;
MIL_INT SrcOffset = MfuncBufSizeX(PFocusBuf) - PFOCUS_3D_DATA_WIDTH;
if (ConvParamsPtr->DataResolution == 8)
{
DoConversion<MIL_UINT8 >(pVoidSrc , pVoidPos, pVoidInt,
SrcOffset, SrcPitch, SizeLine);
}
else
{
DoConversion<MIL_UINT16>(pVoidSrc , pVoidPos, pVoidInt,
SrcOffset, SrcPitch, SizeLine);
}
MbufControl(MfuncBufId(PFocusBuf ), M_UNLOCK, M_DEFAULT);
MbufControl(MfuncBufId(PositionBuf ), M_UNLOCK, M_DEFAULT);
MbufControl(MfuncBufId(IntensityBuf), M_UNLOCK, M_DEFAULT);
return CONVERSION_SUCCESS;
}
template <class T>
void DoConversion(const void* pVoidSrc , void* pVoidPos, void* pVoidInt,
MIL_INT SrcOffset, MIL_INT SrcPitch, MIL_INT SizeLine)
{
const T * pSrc = static_cast<const T *>(pVoidSrc) + SrcOffset;
MIL_UINT16* pPos = static_cast<MIL_UINT16*>(pVoidPos);
T * pInt = static_cast<T *>(pVoidInt);
for (MIL_INT i = 0; i < SizeLine; ++i)
{
if (pSrc[2] != 0)
{
pPos[i] = ( (static_cast<MIL_UINT16>(pSrc[0]) << 8) | pSrc[1] );
pInt[i] = pSrc[3];
}
else
{
pPos[i] = MIL_UINT16_MAX;
pInt[i] = 0;
}
pSrc += SrcPitch;
}
}
bool GetBufInfoAndValidate(MIL_ID MilBuf, MIL_BUFFER_INFO* ppBuf)
{
if (MilBuf != M_NULL)
{
MIL_INT64 ObjectType;
MappInquireObject(M_DEFAULT, MilBuf, M_OBJECT_TYPE, &ObjectType);
if (ObjectType != M_IMAGE)
return false;
MIL_BUFFER_INFO pBuf;
MfuncInquire(MilBuf, M_BUFFER_INFO, &pBuf);
MIL_INT ImgSizeBand = MfuncBufSizeBand(pBuf);
MIL_INT ImgType = MfuncBufType(pBuf);
MIL_INT ImgSign = ImgType & (M_SIGNED | M_UNSIGNED | M_FLOAT);
MIL_INT ImgSizeBit = MfuncBufSizeBit(pBuf);
MIL_INT64 ImgFormat = MfuncBufFormat(pBuf);
if ( ImgSizeBand == 1 &&
ImgSign == M_UNSIGNED &&
(ImgSizeBit == 8 || ImgSizeBit == 16) &&
(ImgFormat & M_COMPRESS) != M_COMPRESS &&
(ImgFormat & M_PACKED ) != M_PACKED )
{
*ppBuf = pBuf;
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}