Radiation-resistantCamera/Vimba_6_0/VimbaCPP/Examples/LookUpTable/Source/program.cpp

639 lines
22 KiB
C++
Raw Permalink Normal View History

2025-04-30 01:26:04 +00:00
/*=============================================================================
Copyright (C) 2012 Allied Vision Technologies. All Rights Reserved.
Redistribution of this file, in original or modified form, without
prior written consent of Allied Vision Technologies is prohibited.
-------------------------------------------------------------------------------
File: program.cpp
Description: Main entry point of LookUpTable example of VimbaCPP.
-------------------------------------------------------------------------------
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF TITLE,
NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include "LookUpTable.h"
#include "Exception.h"
#include "Common/StreamSystemInfo.h"
using namespace std;
enum Mode
{
ModeUnknown = 0,
ModeSave = 1,
ModeLoad = 2,
ModeSaveCSV = 3,
ModeLoadCSV = 4,
ModeEnable = 7,
ModeIsEnabled = 8,
ModeSetValue = 9,
ModeGetValue = 10,
ModeBitIn = 11,
ModeBitOut = 12,
ModeCount = 13
};
bool StartsWith( const char *pString, const char *pStart )
{
if( NULL == pString )
{
return false;
}
if( NULL == pStart )
{
return false;
}
if( std::strlen( pString ) < std::strlen( pStart ) )
{
return false;
}
if( std::memcmp( pString, pStart, std::strlen( pStart ) ) != 0 )
{
return false;
}
return true;
}
int main( int argc, char* argv[] )
{
cout << "///////////////////////////////////////\n";
cout << "/// Vimba API Look Up Table Example ///\n";
cout << "///////////////////////////////////////\n\n";
VmbErrorType err = VmbErrorSuccess;
string cameraID;
string fileName;
string controlIndex;
bool bValue = false;
VmbInt64_t nValue = 0;
string parameter;
Mode eMode = ModeUnknown;
bool printHelp = false;
//////////////////////
//Parse command line//
//////////////////////
for( int i = 1; i < argc; i++ )
{
char *pParameter = argv[i];
if( std::strlen( pParameter ) < 0 )
{
err = VmbErrorBadParameter;
break;
}
if( pParameter[0] == '/' )
{
if( std::strcmp( pParameter, "/s" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeSave;
}
else if( std::strcmp( pParameter, "/l" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeLoad;
}
else if( std::strcmp( pParameter, "/sc" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeSaveCSV;
}
else if( StartsWith( pParameter, "/lc:" ) )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
if( parameter.empty() == false )
{
err = VmbErrorBadParameter;
break;
}
parameter = pParameter + 4;
if( parameter.size() <= 0 )
{
err = VmbErrorBadParameter;
break;
}
nValue = atoi( parameter.c_str() );
eMode = ModeLoadCSV;
}
else if( StartsWith( pParameter, "/lc" ) )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
if( parameter.empty() == false )
{
err = VmbErrorBadParameter;
break;
}
nValue = 0;
eMode = ModeLoadCSV;
}
else if( std::strcmp( pParameter, "/bi" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeBitIn;
}
else if( std::strcmp( pParameter, "/bo" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeBitOut;
}
else if( std::strcmp( pParameter, "/n" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeCount;
}
else if( StartsWith( pParameter, "/e:" ) )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
if( parameter.empty() == false )
{
err = VmbErrorBadParameter;
break;
}
parameter = pParameter + 3;
if( parameter.size() <= 0 )
{
err = VmbErrorBadParameter;
break;
}
if( std::strcmp( parameter.c_str(), "on" ) == 0 )
{
bValue = true;
}
else if( std::strcmp( parameter.c_str(), "off" ) == 0 )
{
bValue = false;
}
else
{
cout << "Could not set look up table enable. Wrong parameter!\n";
err = VmbErrorBadParameter;
break;
}
eMode = ModeEnable;
}
else if( std::strcmp( pParameter, "/e" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeIsEnabled;
}
else if( StartsWith( pParameter, "/v:" ) )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
if( parameter.empty() == false )
{
err = VmbErrorBadParameter;
break;
}
parameter = pParameter + 3;
if( parameter.size() <= 0 )
{
err = VmbErrorBadParameter;
break;
}
nValue = atoi( parameter.c_str() );
eMode = ModeSetValue;
}
else if( std::strcmp( pParameter, "/v" ) == 0 )
{
if( ModeUnknown != eMode )
{
err = VmbErrorBadParameter;
break;
}
eMode = ModeGetValue;
}
else if( StartsWith( pParameter, "/f:" ) )
{
if( (ModeUnknown != eMode) &&
(ModeSaveCSV != eMode) &&
(ModeLoadCSV != eMode) )
{
err = VmbErrorBadParameter;
break;
}
if( fileName.empty() == false )
{
err = VmbErrorBadParameter;
break;
}
fileName = pParameter + 3;
if( fileName.size() <= 0 )
{
err = VmbErrorBadParameter;
break;
}
}
else if( StartsWith( pParameter, "/i:" ) )
{
if( controlIndex.empty() == false )
{
err = VmbErrorBadParameter;
break;
}
controlIndex = pParameter + 3;
if( controlIndex.size() <= 0 )
{
err = VmbErrorBadParameter;
break;
}
}
else if( std::strcmp( pParameter, "/h" ) == 0 )
{
if( (cameraID.empty() == false)
|| (ModeUnknown != eMode)
|| (true == printHelp))
{
err = VmbErrorBadParameter;
break;
}
printHelp = true;
}
else
{
err = VmbErrorBadParameter;
break;
}
}
else
{
if( cameraID.empty() == false )
{
err = VmbErrorBadParameter;
break;
}
cameraID = pParameter;
}
}
//Write out an error if we could not parse the command line
if( VmbErrorBadParameter == err )
{
cout << "Invalid parameters!\n\n";
printHelp = true;
}
//Print out help and end program
if( true == printHelp )
{
cout << "Usage: LookUpTable [CameraID] [/i:Index] [/h] [/{s|l|sc|lc:Column|u|d|v(:Value)|e(:Enable)|bi|bo|n}] [/f:FileName]\n";
cout << "Parameters: CameraID ID of the camera to use\n";
cout << " (using first camera if not specified)\n";
cout << " /i:Index Set look up table index\n";
cout << " /h Print out help\n";
cout << " /s Save look up table to flash\n";
cout << " /l Load look up table from flash\n";
cout << " /sc Save look up table to Csv\n";
cout << " (Look up table previously downloaded)\n";
cout << " /lc:Column Load look up table from Csv using specified column\n";
cout << " (default if not specified)\n";
cout << " /e:Enable Set look up table enable [on/off]\n";
cout << " /e Get look up table enable\n";
cout << " (default if not specified)\n";
cout << " /v:Value Set look up table value\n";
cout << " /v Get look up table value\n";
cout << " /bi Get look up table bit depth in\n";
cout << " /bo Get look up table bit depth out\n";
cout << " /n Get look up table count\n";
cout << " /f:FileName File name for operation\n\n";
cout << "For example to load a look up table from the csv file C:\\lut.csv and\n"
<< "write it to the camera's flash as LUT1 call\n\n";
cout << "LookUpTable /i:0 /lc:0 /f:\"C:\\lut.csv\"\n\n";
cout << "To load the look up table LUT2 from the camera and write it\n"
<< "to the csv file C:\\lut.csv call\n\n";
cout << "LookUpTable /i:1 /sc /f:\"C:\\lut.csv\"\n\n";
return err;
}
bool bVimbaStarted = false;
AVT::VmbAPI::CameraPtr pCamera;
AVT::VmbAPI::VimbaSystem& vimbaSystem = AVT::VmbAPI::VimbaSystem::GetInstance();
try
{
// Print out version of Vimba
std::cout<<"Vimba C++ API Version "<<vimbaSystem<<"\n";
//Startup API
if( VmbErrorSuccess == err )
{
err = vimbaSystem.Startup();
if( VmbErrorSuccess != err )
{
throw AVT::VmbAPI::Examples::Exception( "Could not start system.", err );
}
bVimbaStarted = true;
}
//Open camera
if( VmbErrorSuccess == err )
{
if( cameraID.empty() )
{
//Open first available camera
//Fetch all cameras known to Vimba
AVT::VmbAPI::CameraPtrVector cameras;
err = vimbaSystem.GetCameras( cameras );
if( VmbErrorSuccess == err )
{
if( cameras.size() > 0 )
{
for( AVT::VmbAPI::CameraPtrVector::const_iterator iter = cameras.begin();
cameras.end() != iter;
++iter )
{
//Check if we can open the camera in full mode
VmbAccessModeType eAccessMode = VmbAccessModeNone;
err = (*iter)->GetPermittedAccess( eAccessMode );
if( VmbErrorSuccess == err )
{
if( (VmbAccessModeFull == (VmbAccessModeFull & eAccessMode)) ||
((cameras.end() - 1) == iter) )
{
//Now get the camera ID
err = ( *iter )->GetID( cameraID );
if( VmbErrorSuccess == err )
{
//Try to open the camera
err = ( *iter )->Open( VmbAccessModeFull );
if( VmbErrorSuccess == err )
{
pCamera = *iter;
break;
}
}
}
}
}
if( VmbErrorSuccess != err )
{
err = VmbErrorNotFound;
throw AVT::VmbAPI::Examples::Exception( "Could not open any camera.", err );
}
}
else
{
err = VmbErrorNotFound;
throw AVT::VmbAPI::Examples::Exception( "Could not open any camera.", err );
}
}
else
{
throw AVT::VmbAPI::Examples::Exception( "Could not list cameras.", err );
}
}
else
{
//Open specific camera
err = vimbaSystem.OpenCameraByID( cameraID.c_str(), VmbAccessModeFull, pCamera );
if( VmbErrorSuccess != err )
{
throw AVT::VmbAPI::Examples::Exception( "Could not open camera.", err );
}
}
}
if( VmbErrorSuccess == err )
{
cout << "Camera ID: " << cameraID << "\n\n";
if( VmbBoolTrue == AVT::VmbAPI::Examples::LookUpTableCollection::HasLookUpTable( pCamera) )
{
AVT::VmbAPI::Examples::LookUpTableCollection collection( pCamera );
VmbInt64_t nIndex;
if( controlIndex.empty() == false )
{
nIndex = atoi( controlIndex.c_str() );
}
else
{
nIndex = collection.GetActiveIndex( );
if( VmbErrorSuccess != err )
{
throw AVT::VmbAPI::Examples::Exception( "Could not get active index of look up table collection.", err );
}
}
AVT::VmbAPI::Examples::LookUpTableControl control( pCamera, nIndex );
control = collection.GetControl( nIndex );
if( VmbErrorSuccess == err )
{
switch( eMode )
{
default:
case ModeIsEnabled:
{
//Is look up table enabled
cout << "Get look up table enable was successful. Enable = " << control.IsEnabled( ) <<"\n";
}
break;
case ModeLoad:
{
//Load look up table from flash
control.LoadFromFlash();
cout << "Look up table successfully loaded from flash.\n";
}
break;
case ModeSave:
{
//Save look up table to flash
control.SaveToFlash();
cout << "Look up table successfully saved to flash.\n";
}
break;
case ModeSaveCSV:
{
//Download LUT
control.Download();
//Save look up table to file
control.SaveToCsv( fileName.c_str() );
cout << "Look up table successfully saved to CSV.\n";
}
break;
case ModeLoadCSV:
{
//Load look up table from file
control.LoadFromCsv( fileName, (int)nValue );
control.Upload();
cout << "Look up table successfully loaded from CSV.\n";
}
break;
case ModeEnable:
{
//Set look up table enable
control.Enable( bValue );
cout << "Look up table was enabled successfully.\n";
}
break;
case ModeBitIn:
{
//Get bit depth in of look up table
cout << "Get look up table 'bit depth in' was successful. BitDepthIn = " << control.GetBitDepthIn( ) <<"\n";
}
break;
case ModeBitOut:
{
//Get bit depth out of look up table
cout << "Get look up table 'bit depth out' was successful. BitDepthOut = " << control.GetBitDepthOut( ) <<"\n";
}
break;
case ModeSetValue:
{
//Set look up table value
control.SetValue( nValue );
cout << "Look up table value was set successfully." <<"\n";
}
break;
case ModeGetValue:
{
//Get look up table value
cout << "Get look up table value was successful. Value = " << control.GetValue() <<"\n";
}
break;
case ModeCount:
{
//Get look up table count
cout << "Get look up table count was successful. Count = " << collection.GetCount( ) <<"\n";
}
break;
}
}
}
else
{
cout<<"Camera does not support LookUp Table Feature\n";
}
}
}
catch( AVT::VmbAPI::Examples::Exception& ex )
{
cout << ex.GetMessageStr() << " VimbaException: " << ex.GetError() << " = " << ex.ErrorCodeToMessage( ex.GetError() ) <<"\n";
}
//Close camera
if( NULL != pCamera )
{
pCamera->Close();
}
//Shutdown API
if( true == bVimbaStarted )
{
vimbaSystem.Shutdown();
}
return err;
}