Buffer handling determines the ordering in which images are retrieved, and what occurs when an image is transmitted while the buffer is full. There are four different buffer handling modes available; NewestFirst, NewestOnly, OldestFirst and OldestFirstOverwrite.
This example explores retrieving images in a set pattern; triggering the camera while not retrieving an image (letting the buffer fill up), and retrieving images while not triggering. We cycle through the different buffer handling modes to see which images are retrieved, confirming their identities via their Frame ID values.
#include <iostream>
#include <sstream>
#define numBuffers 3
#define z_numTriggers 6
#define k_numLoops 9
using namespace Spinnaker;
using namespace Spinnaker::GenApi;
using namespace Spinnaker::GenICam;
using namespace std;
{
#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
Sleep(milliseconds);
#else
usleep(1000 * milliseconds);
#endif
}
{
int result = 0;
cout << endl << endl << "*** CONFIGURING TRIGGER ***" << endl << endl;
try
{
{
cout << "Unable to enable trigger mode (node retrieval). Aborting..." << endl;
return -1;
}
CEnumEntryPtr ptrTriggerModeOn = ptrTriggerMode->GetEntryByName(
"On");
{
cout << "Unable to enable trigger mode (enum entry retrieval). Aborting..." << endl;
return -1;
}
ptrTriggerMode->SetIntValue(ptrTriggerModeOn->GetValue());
cout << endl << "Trigger mode enabled..." << endl;
{
cout << "Unable to get or set trigger mode (node retrieval). Aborting..." << endl;
return -1;
}
CEnumEntryPtr ptrTriggerSourceSoftware = ptrTriggerSource->GetEntryByName(
"Software");
{
cout << "Unable to set trigger mode (enum entry retrieval). Aborting..." << endl;
return -1;
}
ptrTriggerSource->SetIntValue(ptrTriggerSourceSoftware->GetValue());
cout << "Trigger source set to software..." << endl;
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
try
{
CCommandPtr ptrSoftwareTriggerCommand = nodeMap.GetNode(
"TriggerSoftware");
{
cout << "Unable to execute trigger. Aborting..." << endl;
return -1;
}
ptrSoftwareTriggerCommand->Execute();
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
try
{
{
cout << "Unable to disable trigger mode (node retrieval). Non-fatal error..." << endl;
return -1;
}
CEnumEntryPtr ptrTriggerModeOff = ptrTriggerMode->GetEntryByName(
"Off");
{
cout << "Unable to disable trigger mode (enum entry retrieval). Non-fatal error..." << endl;
return -1;
}
ptrTriggerMode->SetIntValue(ptrTriggerModeOff->GetValue());
cout << endl << endl << "Trigger mode disabled..." << endl << endl;
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
cout << endl << "*** DEVICE INFORMATION ***" << endl << endl;
try
{
CCategoryPtr category = nodeMap.GetNode(
"DeviceInformation");
{
FeatureList_t features;
category->GetFeatures(features);
for (FeatureList_t::const_iterator it = features.begin(); it != features.end(); ++it)
{
cout << pfeatureNode->GetName() << " : ";
cout << (
IsReadable(pValue) ? pValue->ToString() :
"Node not readable");
cout << endl;
}
}
else
{
cout << "Device control information not readable." << endl;
}
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
cout << endl << "*** IMAGE ACQUISITION ***" << endl << endl;
try
{
{
cout << "Unable to set acquisition mode to continuous (node retrieval). Aborting..." << endl << endl;
return -1;
}
CEnumEntryPtr ptrAcquisitionModeContinuous = ptrAcquisitionMode->GetEntryByName(
"Continuous");
{
cout << "Unable to set acquisition mode to continuous (entry 'continuous' retrieval). Aborting..." << endl
<< endl;
return -1;
}
ptrAcquisitionMode->SetIntValue(ptrAcquisitionModeContinuous->GetValue());
cout << "Acquisition mode set to continuous..." << endl;
CStringPtr ptrStringSerial = nodeMapTLDevice.GetNode(
"DeviceSerialNumber");
{
deviceSerialNumber = ptrStringSerial->GetValue();
cout << "Device serial number retrieved as " << deviceSerialNumber << "..." << endl;
}
CEnumerationPtr ptrHandlingMode = sNodeMap.GetNode(
"StreamBufferHandlingMode");
{
cout << "Unable to set Buffer Handling mode (node retrieval). Aborting..." << endl << endl;
return -1;
}
CEnumEntryPtr ptrHandlingModeEntry = ptrHandlingMode->GetCurrentEntry();
{
cout << "Unable to get Buffer Handling mode (Entry retrieval). Aborting..." << endl << endl;
return -1;
}
CEnumerationPtr ptrStreamBufferCountMode = sNodeMap.GetNode(
"StreamBufferCountMode");
{
cout << "Unable to get or set Buffer Count Mode (node retrieval). Aborting..." << endl << endl;
return -1;
}
CEnumEntryPtr ptrStreamBufferCountModeManual = ptrStreamBufferCountMode->GetEntryByName(
"Manual");
{
cout << "Unable to get Buffer Count Mode entry (Entry retrieval). Aborting..." << endl << endl;
return -1;
}
ptrStreamBufferCountMode->SetIntValue(ptrStreamBufferCountModeManual->GetValue());
cout << "Stream Buffer Count Mode set to manual..." << endl;
CIntegerPtr ptrBufferCount = sNodeMap.GetNode(
"StreamBufferCountManual");
{
cout << "Unable to get or set Buffer Count (Integer node retrieval). Aborting..." << endl << endl;
return -1;
}
cout << endl << "Default Buffer Handling Mode: " << ptrHandlingModeEntry->GetDisplayName() << endl;
cout << "Default Buffer Count: " << ptrBufferCount->GetValue() << endl;
cout << "Maximum Buffer Count: " << ptrBufferCount->GetMax() << endl;
cout << "Buffer count now set to: " << ptrBufferCount->GetValue() << endl;
cout << endl
<< " images will be retrieved" << endl;
for (int i = 0; i < 4; i++)
{
switch (i)
{
case 0:
ptrHandlingModeEntry = ptrHandlingMode->GetEntryByName("NewestFirst");
ptrHandlingMode->SetIntValue(ptrHandlingModeEntry->GetValue());
cout << endl
<< endl
<< "Buffer Handling Mode has been set to " << ptrHandlingModeEntry->GetDisplayName() << endl;
break;
case 1:
ptrHandlingModeEntry = ptrHandlingMode->GetEntryByName("NewestOnly");
ptrHandlingMode->SetIntValue(ptrHandlingModeEntry->GetValue());
cout << endl
<< endl
<< "Buffer Handling Mode has been set to " << ptrHandlingModeEntry->GetDisplayName() << endl;
break;
case 2:
ptrHandlingModeEntry = ptrHandlingMode->GetEntryByName("OldestFirst");
ptrHandlingMode->SetIntValue(ptrHandlingModeEntry->GetValue());
cout << endl
<< endl
<< "Buffer Handling Mode has been set to " << ptrHandlingModeEntry->GetDisplayName() << endl;
break;
case 3:
ptrHandlingModeEntry = ptrHandlingMode->GetEntryByName("OldestFirstOverwrite");
ptrHandlingMode->SetIntValue(ptrHandlingModeEntry->GetValue());
cout << endl
<< endl
<< "Buffer Handling Mode has been set to " << ptrHandlingModeEntry->GetDisplayName() << endl;
break;
default:
break;
}
pCam->BeginAcquisition();
if (i == 0)
{
}
try
{
for (
int loopCnt = 0; loopCnt <
k_numLoops; loopCnt++)
{
{
cout << endl << "Camera triggered. No image grabbed" << endl;
}
else
{
cout << endl <<
"No trigger. Grabbing image " << loopCnt -
z_numTriggers << endl;
pResultImage = pCam->GetNextImage(500);
if (pResultImage->IsIncomplete())
{
cout << "Image incomplete with image status " << pResultImage->GetImageStatus() << "..."
<< endl
<< endl;
}
}
{
cout << "Frame ID: " << pResultImage->GetFrameID() << endl;
ostringstream filename;
filename << ptrHandlingModeEntry->GetSymbolic() << "-";
if (!deviceSerialNumber.empty())
{
filename << deviceSerialNumber.c_str() << "-";
}
pResultImage->Save(filename.str().c_str());
cout << "Image saved at " << filename.str() << endl;
pResultImage->Release();
}
}
}
{
cout << endl <<
"Error: " << e.
what() << endl;
if (ptrHandlingModeEntry->GetSymbolic() == "NewestOnly" ||
ptrHandlingModeEntry->GetSymbolic() == "OldestFirstOverwrite")
{
cout << "Error should occur when grabbing image 1 with handling mode set to NewestOnly or OldestFirstOverwrite" << endl;
}
result = -1;
}
pCam->EndAcquisition();
}
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
int result = 0;
int err = 0;
try
{
INodeMap& nodeMapTLDevice = pCam->GetTLDeviceNodeMap();
pCam->Init();
if (err < 0)
{
return err;
}
pCam->DeInit();
}
{
cout <<
"Error: " << e.
what() << endl;
result = -1;
}
return result;
}
{
FILE* tempFile = fopen("test.txt", "w+");
if (tempFile == nullptr)
{
cout << "Failed to create file in current folder. Please check "
"permissions."
<< endl;
cout << "Press Enter to exit..." << endl;
getchar();
return -1;
}
fclose(tempFile);
remove("test.txt");
int result = 0;
cout << "Application build date: " << __DATE__ << " " << __TIME__ << endl << endl;
unsigned int numCameras = camList.
GetSize();
cout << "Number of cameras detected: " << numCameras << endl << endl;
if (numCameras == 0)
{
system->ReleaseInstance();
cout << "Not enough cameras!" << endl;
cout << "Done! Press Enter to exit..." << endl;
getchar();
return -1;
}
for (unsigned int i = 0; i < numCameras; i++)
{
cout << endl << "Running example for camera " << i << "..." << endl;
cout << "Camera " << i << " example complete..." << endl << endl;
}
system->ReleaseInstance();
cout << endl << "Done! Press Enter to exit..." << endl;
getchar();
return result;
}