Skip to content

Commit 34f2252

Browse files
Added Pylon Screen Grabbing
1 parent fade2de commit 34f2252

File tree

5 files changed

+95
-0
lines changed

5 files changed

+95
-0
lines changed

Drivers/Pylon/ACT/LibMCDriver_Pylon.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,19 @@
6161
<error name="INVALIDIDENTIFIER" code="1009" description="Invalid device identifier" />
6262
<error name="CONNECTIONIDENTIFIERALREADYINUSE" code="1010" description="Connection identifier already in use" />
6363
<error name="CONNECTIONIDENTIFIERNOTFOUND" code="1011" description="Connection identifier not found" />
64+
<error name="INVALIDPAYLOADSIZE" code="1012" description="Invalid payload size" />
65+
<error name="IMAGENOTREADY" code="1013" description="Image not ready" />
66+
<error name="COULDNOTGRABIMAGE" code="1014" description="Could not grab image" />
67+
<error name="UNSUPPORTEDGRABOFFSET" code="1015" description="Unsupported Grab Offset" />
68+
<error name="INVALIDGRABIMAGESIZE" code="1016" description="Invalid Grab Image Size" />
69+
<error name="IMAGEDATASIZEMISMATCH" code="1017" description="Image data size mismatch" />
70+
<error name="UNSUPPORTEDGRABPADDING" code="1018" description="Unsupported Grab Padding" />
71+
72+
73+
74+
75+
76+
6477

6578

6679

Drivers/Pylon/Headers/CppDynamic/libmcdriver_pylon_dynamic.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,13 @@ class ELibMCDriver_PylonException : public std::exception {
194194
case LIBMCDRIVER_PYLON_ERROR_INVALIDIDENTIFIER: return "INVALIDIDENTIFIER";
195195
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERALREADYINUSE: return "CONNECTIONIDENTIFIERALREADYINUSE";
196196
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERNOTFOUND: return "CONNECTIONIDENTIFIERNOTFOUND";
197+
case LIBMCDRIVER_PYLON_ERROR_INVALIDPAYLOADSIZE: return "INVALIDPAYLOADSIZE";
198+
case LIBMCDRIVER_PYLON_ERROR_IMAGENOTREADY: return "IMAGENOTREADY";
199+
case LIBMCDRIVER_PYLON_ERROR_COULDNOTGRABIMAGE: return "COULDNOTGRABIMAGE";
200+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABOFFSET: return "UNSUPPORTEDGRABOFFSET";
201+
case LIBMCDRIVER_PYLON_ERROR_INVALIDGRABIMAGESIZE: return "INVALIDGRABIMAGESIZE";
202+
case LIBMCDRIVER_PYLON_ERROR_IMAGEDATASIZEMISMATCH: return "IMAGEDATASIZEMISMATCH";
203+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABPADDING: return "UNSUPPORTEDGRABPADDING";
197204
}
198205
return "UNKNOWN";
199206
}
@@ -222,6 +229,13 @@ class ELibMCDriver_PylonException : public std::exception {
222229
case LIBMCDRIVER_PYLON_ERROR_INVALIDIDENTIFIER: return "Invalid device identifier";
223230
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERALREADYINUSE: return "Connection identifier already in use";
224231
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERNOTFOUND: return "Connection identifier not found";
232+
case LIBMCDRIVER_PYLON_ERROR_INVALIDPAYLOADSIZE: return "Invalid payload size";
233+
case LIBMCDRIVER_PYLON_ERROR_IMAGENOTREADY: return "Image not ready";
234+
case LIBMCDRIVER_PYLON_ERROR_COULDNOTGRABIMAGE: return "Could not grab image";
235+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABOFFSET: return "Unsupported Grab Offset";
236+
case LIBMCDRIVER_PYLON_ERROR_INVALIDGRABIMAGESIZE: return "Invalid Grab Image Size";
237+
case LIBMCDRIVER_PYLON_ERROR_IMAGEDATASIZEMISMATCH: return "Image data size mismatch";
238+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABPADDING: return "Unsupported Grab Padding";
225239
}
226240
return "unknown error";
227241
}

Drivers/Pylon/Headers/CppDynamic/libmcdriver_pylon_types.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ typedef void * LibMCDriver_Pylon_pvoid;
116116
#define LIBMCDRIVER_PYLON_ERROR_INVALIDIDENTIFIER 1009 /** Invalid device identifier */
117117
#define LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERALREADYINUSE 1010 /** Connection identifier already in use */
118118
#define LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERNOTFOUND 1011 /** Connection identifier not found */
119+
#define LIBMCDRIVER_PYLON_ERROR_INVALIDPAYLOADSIZE 1012 /** Invalid payload size */
120+
#define LIBMCDRIVER_PYLON_ERROR_IMAGENOTREADY 1013 /** Image not ready */
121+
#define LIBMCDRIVER_PYLON_ERROR_COULDNOTGRABIMAGE 1014 /** Could not grab image */
122+
#define LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABOFFSET 1015 /** Unsupported Grab Offset */
123+
#define LIBMCDRIVER_PYLON_ERROR_INVALIDGRABIMAGESIZE 1016 /** Invalid Grab Image Size */
124+
#define LIBMCDRIVER_PYLON_ERROR_IMAGEDATASIZEMISMATCH 1017 /** Image data size mismatch */
125+
#define LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABPADDING 1018 /** Unsupported Grab Padding */
119126

120127
/*************************************************************************************************************************
121128
Error strings for LibMCDriver_Pylon
@@ -144,6 +151,13 @@ inline const char * LIBMCDRIVER_PYLON_GETERRORSTRING (LibMCDriver_PylonResult nE
144151
case LIBMCDRIVER_PYLON_ERROR_INVALIDIDENTIFIER: return "Invalid device identifier";
145152
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERALREADYINUSE: return "Connection identifier already in use";
146153
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERNOTFOUND: return "Connection identifier not found";
154+
case LIBMCDRIVER_PYLON_ERROR_INVALIDPAYLOADSIZE: return "Invalid payload size";
155+
case LIBMCDRIVER_PYLON_ERROR_IMAGENOTREADY: return "Image not ready";
156+
case LIBMCDRIVER_PYLON_ERROR_COULDNOTGRABIMAGE: return "Could not grab image";
157+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABOFFSET: return "Unsupported Grab Offset";
158+
case LIBMCDRIVER_PYLON_ERROR_INVALIDGRABIMAGESIZE: return "Invalid Grab Image Size";
159+
case LIBMCDRIVER_PYLON_ERROR_IMAGEDATASIZEMISMATCH: return "Image data size mismatch";
160+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABPADDING: return "Unsupported Grab Padding";
147161
default: return "unknown error";
148162
}
149163
}

Drivers/Pylon/Implementation/libmcdriver_pylon_pylondeviceinstance.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,5 +190,45 @@ double CPylonDeviceInstance::getExposureTime()
190190

191191
void CPylonDeviceInstance::grabSingleGreyscaleImage(const LibMCDriver_Pylon_uint32 nChannelID, const LibMCDriver_Pylon_uint32 nTimeoutInMS, LibMCEnv::PImageData pImageInstance)
192192
{
193+
if (pImageInstance.get () == nullptr)
194+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_INVALIDPARAM);
195+
196+
int64_t nPayloadSize = getIntegerFeature("PayloadSize");
197+
if (nPayloadSize <= 0)
198+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_INVALIDPAYLOADSIZE);
199+
200+
std::vector<uint8_t> payloadBuffer;
201+
payloadBuffer.resize((size_t)nPayloadSize);
202+
sPylonGrabResult grabResult;
203+
memset((void*)&grabResult, 0, sizeof(sPylonGrabResult));
204+
pylonBool bReady = 0;
205+
206+
m_pPylonSDK->checkError(m_pPylonSDK->PylonDeviceGrabSingleFrame(m_pDeviceHandle, nChannelID, payloadBuffer.data (), nPayloadSize, &grabResult, &bReady, nTimeoutInMS));
207+
208+
if (bReady == 0)
209+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_IMAGENOTREADY);
210+
211+
if (grabResult.m_Status != ePylonGrabStatus::pgsGrabbed)
212+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_COULDNOTGRABIMAGE, "Could not grab image (#" + std::to_string (grabResult.m_nErrorCode) + ")");
213+
214+
if ((grabResult.m_OffsetX != 0) || (grabResult.m_OffsetY != 0))
215+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABOFFSET, "Unsupported Grab Offset (" + std::to_string(grabResult.m_OffsetX) + "/" + std::to_string(grabResult.m_OffsetY) + ")");
216+
217+
if ((grabResult.m_SizeX <= 0) || (grabResult.m_SizeY <= 0))
218+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_INVALIDGRABIMAGESIZE, "Invalid Grab Image Size (" + std::to_string(grabResult.m_SizeX) + "/" + std::to_string(grabResult.m_SizeY) + ")");
219+
220+
uint32_t nImageSizeX = 0;
221+
uint32_t nImageSizeY = 0;
222+
pImageInstance->GetSizeInPixels(nImageSizeX, nImageSizeY);
223+
224+
if ((nImageSizeX != (uint32_t)grabResult.m_SizeX) || (nImageSizeY != (uint32_t)grabResult.m_SizeY))
225+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_IMAGEDATASIZEMISMATCH, "Image data size does not match grabbed image size " +
226+
std::to_string(nImageSizeX) + "x" + std::to_string(nImageSizeY) + " != " +
227+
std::to_string(grabResult.m_SizeX) + "x" + std::to_string(grabResult.m_SizeY));
228+
229+
if ((grabResult.m_PaddingX != 0) || (grabResult.m_PaddingY != 0))
230+
throw ELibMCDriver_PylonInterfaceException(LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABPADDING, "Unsupported Grab Padding (" + std::to_string(grabResult.m_PaddingX) + "/" + std::to_string(grabResult.m_PaddingY) + ")");
231+
232+
pImageInstance->SetPixels(0, 0, nImageSizeX, nImageSizeY, LibMCEnv::eImagePixelFormat::GreyScale8bit, payloadBuffer);
193233

194234
}

Drivers/Pylon/Interfaces/libmcdriver_pylon_types.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ typedef void * LibMCDriver_Pylon_pvoid;
116116
#define LIBMCDRIVER_PYLON_ERROR_INVALIDIDENTIFIER 1009 /** Invalid device identifier */
117117
#define LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERALREADYINUSE 1010 /** Connection identifier already in use */
118118
#define LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERNOTFOUND 1011 /** Connection identifier not found */
119+
#define LIBMCDRIVER_PYLON_ERROR_INVALIDPAYLOADSIZE 1012 /** Invalid payload size */
120+
#define LIBMCDRIVER_PYLON_ERROR_IMAGENOTREADY 1013 /** Image not ready */
121+
#define LIBMCDRIVER_PYLON_ERROR_COULDNOTGRABIMAGE 1014 /** Could not grab image */
122+
#define LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABOFFSET 1015 /** Unsupported Grab Offset */
123+
#define LIBMCDRIVER_PYLON_ERROR_INVALIDGRABIMAGESIZE 1016 /** Invalid Grab Image Size */
124+
#define LIBMCDRIVER_PYLON_ERROR_IMAGEDATASIZEMISMATCH 1017 /** Image data size mismatch */
125+
#define LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABPADDING 1018 /** Unsupported Grab Padding */
119126

120127
/*************************************************************************************************************************
121128
Error strings for LibMCDriver_Pylon
@@ -144,6 +151,13 @@ inline const char * LIBMCDRIVER_PYLON_GETERRORSTRING (LibMCDriver_PylonResult nE
144151
case LIBMCDRIVER_PYLON_ERROR_INVALIDIDENTIFIER: return "Invalid device identifier";
145152
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERALREADYINUSE: return "Connection identifier already in use";
146153
case LIBMCDRIVER_PYLON_ERROR_CONNECTIONIDENTIFIERNOTFOUND: return "Connection identifier not found";
154+
case LIBMCDRIVER_PYLON_ERROR_INVALIDPAYLOADSIZE: return "Invalid payload size";
155+
case LIBMCDRIVER_PYLON_ERROR_IMAGENOTREADY: return "Image not ready";
156+
case LIBMCDRIVER_PYLON_ERROR_COULDNOTGRABIMAGE: return "Could not grab image";
157+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABOFFSET: return "Unsupported Grab Offset";
158+
case LIBMCDRIVER_PYLON_ERROR_INVALIDGRABIMAGESIZE: return "Invalid Grab Image Size";
159+
case LIBMCDRIVER_PYLON_ERROR_IMAGEDATASIZEMISMATCH: return "Image data size mismatch";
160+
case LIBMCDRIVER_PYLON_ERROR_UNSUPPORTEDGRABPADDING: return "Unsupported Grab Padding";
147161
default: return "unknown error";
148162
}
149163
}

0 commit comments

Comments
 (0)