Impact Acquire SDK C++
DeviceManager Class Reference

Grants access to devices that can be operated by this software interface. More...

#include <mvIMPACT_acquire.h>

Public Member Functions

unsigned int changedCount (void) const
 Returns the current changed counter for the device list.
 
unsigned int deviceCount (void) const
 Returns the number of devices currently present in the system.
 
 DeviceManager (const DeviceManager &src)
 Constructs a new mvIMPACT::acquire::DeviceManager object from an existing one.
 
 DeviceManager (void)
 Constructs a new mvIMPACT::acquire::DeviceManager object.
 
DevicegetDevice (unsigned int index) const
 Returns a pointer to a mvIMPACT::acquire::Device object.
 
DevicegetDeviceByFamily (const std::string &family="", unsigned int devNr=0, char wildcard=' *') const
 Tries to locate a device via the family name.
 
DevicegetDeviceByProduct (const std::string &product="", unsigned int devNr=0, char wildcard=' *') const
 Tries to locate a device via the product name.
 
DevicegetDeviceByProductAndID (const std::string &product, const std::string &devID, char wildcard=' *') const
 Tries to locate a device via the product name and the device ID.
 
DevicegetDeviceByProductAndID (const std::string &product="", unsigned int devID=0, char wildcard=' *') const
 Tries to locate a device via the product name and the device ID.
 
DevicegetDeviceBySerial (const std::string &serial="", unsigned int devNr=0, char wildcard=' *') const
 Tries to locate a device via the serial number.
 
DeviceManageroperator= (const DeviceManager &rhs)
 Allows assignments of mvIMPACT::acquire::DeviceManager objects.
 
Deviceoperator[] (unsigned int index) const
 Returns a pointer to a mvIMPACT::acquire::Device object.
 
void updateDeviceList (void) const
 Updates the internal device list.
 
virtual ~DeviceManager (void)
 Class destructor.
 

Static Public Member Functions

static std::string getVersionAsString (TLibraryQuery libraryQuery)
 Returns a string containing the version number of the specified library.
 

Detailed Description

Grants access to devices that can be operated by this software interface.

This class will grant access to any device installed on/in the current system. Whenever somewhere in the code a mvIMPACT::acquire::DeviceManager instance is created it can be used to access any device currently supported and available.

This is the only class which is allowed to create instances of the class mvIMPACT::acquire::Device, which are needed to access a certain device.

Note
There always has to be at least one instance of the mvIMPACT::acquire::DeviceManager when the user still works with mvIMPACT::acquire::Device objects! When the last instance to this object is destroyed all remaining mvIMPACT::acquire::Device objects will be closed automatically and every device driver will be unloaded from the current process memory!

If a device is installed in the system but an appropriate driver has not been installed, this class will NOT list these devices.

As a result of this every program written by the use of this interface will create an instance of mvIMPACT::acquire::DeviceManager before performing any other operations which uses objects or functions from this interface.

During the construction of a mvIMPACT::acquire::DeviceManager object the system will be scanned for supported devices and once the instance has been created the object will provide an up to date list of devices whenever the user asks for it. Some devices when plugged into the system after the device manager has been created might require an explicit update of the device list. This can be triggered by an application by calling mvIMPACT::acquire::DeviceManager::updateDeviceList(). When there is currently no mvIMPACT::acquire::DeviceManager instance within the process creating the first one will result in all supported driver stacks to be loaded dynamically. See remarks below for consequences that result from this.

This class also provides various functions to find a particular device in the system. Devices can e.g. be found by family or by serial number.

Attention
NEVER try to explicitly delete an instance of mvIMPACT::acquire::Device! You did not allocate it and the result will be a crash! The mvIMPACT::acquire::DeviceManager will take care of all resources for you.
Note
A mvIMPACT::acquire::DeviceManager object will initially return pointers to mvIMPACT::acquire::Device objects, which all seem to be closed. However one or more of the devices might have been opened by another instance of the device manager running in a different process. In that case the attempt to open a device, which seems to be closed will raise an exception with the error code mvIMPACT::acquire::DMR_DRV_ALREADY_IN_USE, which MUST be handled by the user.
Attention
NEVER declare a global instance of this class within a dynamic library(*.dll, *.so, *.ocx, ...), as creating this instance will result in other shared libraries to be loaded dynamically by the framework. If you do, applications using your library might lock up because global objects might be constructed from (Windows) the DllMain context and loading other libraries from within DllMain is discouraged (see DllMain Best Practices in MSDN for example). Instead either attach your instance of the device manager to a singleton, declare a global pointer that gets initialised/destroyed by custom library init/close functions or use any other approach that suits your needs.

EXAMPLE CODE:

//-----------------------------------------------------------------------------
void obtainDevicePointers( void )
//-----------------------------------------------------------------------------
{
// Create an instance of the device manager to get access
// to supported devices.
DeviceManager devMgr;
// show all devices
for( unsigned int i=0; i<devMgr.deviceCount(); i++ )
{
cout << "Dev " << i << ": " << *(devMgr[i]) << endl;
}
// try to find a device using a special criteria
// ( some of these calls will fail!!! )
// will fail as the string is not complete and does
// NOT terminate with a wildcard.
Device* pDev = devMgr.getDeviceBySerial( "SD0*0" );
// might work if there are at least two devices with
// a matching serial number in the system.
pDev = devMgr.getDeviceByFamily( "SD0*0*", 1 );
// might work if there is at least one device whose type
// specifying string starts with 'SampleDevi'.
pDev = devMgr.getDeviceByProduct( "SampleDevi*" );
// will fail as the string is not complete and does NOT
// terminate with the user defined wildcard.
pDev = devMgr.getDeviceByProduct( "SampleD*", 0, '$' );
// will work if there is a device whose product name
// starts with 'SamplePro' and which has
// been assigned the specified device ID.
pDev = devMgr.getDeviceByProductAndID( "SamplePro*", 66, '*' );
// will work if there is a device whose product name
// starts with 'SamplePro' and which has
// been assigned the specified string device ID.
pDev = devMgr.getDeviceByProductAndID( "SamplePro*","sampleID", '*' );
// will work if there is at least one device with a serial
// number starting with 'SD00' in the system.
pDev = devMgr.getDeviceBySerial( "SD00*" );
// will return a pointer to the first device detected thus
// this call will work if there is at least one device in the
// current system that is supported by this interface
pDev = devMgr.getDeviceBySerial( "*" );
if( !pDev )
{
cout << "Error! No valid device found" << endl;
return 0;
}
// from here it will be save to work with the pointer returned
// by device manager.
// THE NEXT LINE WILL TRY TO OPEN THE DEVICE! This can fail if the device
// is already running in a different process!
try
{
FunctionInterface func(pDev);
// do some work
}
catch( const ImpactAcquireException& e )
{
// failed to open the device...
}
}
//-----------------------------------------------------------------------------
void showDeviceManagerOperation( void )
//-----------------------------------------------------------------------------
{
Device* pDev = 0;
{
DeviceManager devMgr1;
// will return a pointer to the first device detected thus
// this call will work if there is at least one device in the
// current system that is supported by this interface
pDev = devMgr.getDeviceBySerial( "*" );
if( !pDev )
{
cout << "Error! No valid device found" << endl;
return;
}
// from here it will be save to work with the pointer returned
// by device manager.
// THE NEXT LINE WILL TRY TO OPEN THE DEVICE! This can fail if the device
// is already running in a different process!
try
{
FunctionInterface func( pDev );
// do some work
}
catch( const ImpactAcquireException& e )
{
// failed to open the device...
}
{
DeviceManager devMgr2;
// This will return the same device as pDev
Device* pDev2 = devMgr2.getDeviceBySerial( "*" );
} // here the device manager devMgr2 will be destroyed, but it will NOT close pDev2, as devMgr1 holds a reference to it
Statistics s( pDev ); // this will still work
} // here the last device manager will be destroyed, thus from here onwards pDev will be invalid!
Info i( pDev ); // this will crash
DeviceManager devMgr3;
Info i2( devMgr3.getDevice( 0 ) ); // this will work again
}
Grants access to devices that can be operated by this software interface.
Definition mvIMPACT_acquire.h:7171
DeviceManager(void)
Constructs a new mvIMPACT::acquire::DeviceManager object.
Definition mvIMPACT_acquire.h:7278
unsigned int deviceCount(void) const
Returns the number of devices currently present in the system.
Definition mvIMPACT_acquire.h:7400
Device * getDeviceByProduct(const std::string &product="", unsigned int devNr=0, char wildcard=' *') const
Tries to locate a device via the product name.
Definition mvIMPACT_acquire.h:7663
Device * getDeviceByProductAndID(const std::string &product="", unsigned int devID=0, char wildcard=' *') const
Tries to locate a device via the product name and the device ID.
Definition mvIMPACT_acquire.h:7736
Device * getDeviceBySerial(const std::string &serial="", unsigned int devNr=0, char wildcard=' *') const
Tries to locate a device via the serial number.
Definition mvIMPACT_acquire.h:7524
Device * getDeviceByFamily(const std::string &family="", unsigned int devNr=0, char wildcard=' *') const
Tries to locate a device via the family name.
Definition mvIMPACT_acquire.h:7591
This class and its functions represent an actual device detected by this interface in the current sys...
Definition mvIMPACT_acquire.h:6118
Examples
Callback.cpp, CaptureToMegaBuffer.cpp, CaptureToOpenGLMemory.cpp, CaptureToUserMemory.cpp, CaptureToUserMemory.legacy.cpp, ContinuousCapture.cpp, ContinuousCapture.linux.cpp, ContinuousCapture.win32.cpp, ContinuousCaptureAllDevices.cpp, ContinuousCaptureAllDevices.linux.cpp, ContinuousCaptureAllDevices.win32.cpp, ContinuousCaptureAllFormats.cpp, ContinuousCaptureAllFormats.win32.cpp, ContinuousCaptureDirectX.cpp, ContinuousCaptureFFmpeg.cpp, ContinuousCaptureGenDC.cpp, ContinuousCaptureMultiPart.cpp, ContinuousCaptureMultiPart.legacy.cpp, ContinuousCaptureOnlyProcessLatest.cpp, ContinuousCaptureOnlyProcessLatest.legacy.cpp, ContinuousCaptureToAVIFile.cpp, ContinuousCapture_BVS-3D-RV0.cpp, ContinuousCapture_BVS-3D-RV1.cpp, DigitalIOs.cpp, DigitalIOs.legacy.cpp, FirmwareUpdate.cpp, GenICamCallbackOnEvent.cpp, GenICamCommonSettingsUsage.cpp, GenICamCommonSettingsUsage.legacy.cpp, GenICamI2cUsage.cpp, GenICamInterfaceLayout.cpp, GenICamInterfaceLayout.legacy.cpp, GenICamSequencerParameterChangeAtRuntime.cpp, GenICamSequencerUsage.cpp, GenICamSequencerUsage.legacy.cpp, GenICamSequencerUsageWithPaths.cpp, GenICamSequencerUsageWithPaths.legacy.cpp, GenICamSmartFrameRecallUsage.cpp, GenICamSmartFrameRecallUsage.legacy.cpp, GenericInterfaceLayout.cpp, GenericInterfaceLayout.legacy.cpp, GigEVisionActionFeatures.cpp, Properties.cpp, Properties.legacy.cpp, SequenceCapture.cpp, SequenceCapture.win32.cpp, SingleCapture.cpp, SingleCaptureMasterSlave.cpp, SingleCaptureMasterSlave.legacy.cpp, SingleCaptureStorage.cpp, TimestampFeatures.cpp, and exampleHelper.h.

Constructor & Destructor Documentation

◆ DeviceManager() [1/2]

DeviceManager ( void )
inlineexplicit

Constructs a new mvIMPACT::acquire::DeviceManager object.

If the construction of this object fails for some reason this constructor might throw an exception of type mvIMPACT::acquire::ImpactAcquireException or a type derived from this class.

◆ DeviceManager() [2/2]

DeviceManager ( const DeviceManager & src)
inline

Constructs a new mvIMPACT::acquire::DeviceManager object from an existing one.

If the construction of this object fails for some reason this constructor might throw an exception of type mvIMPACT::acquire::ImpactAcquireException or a type derived from this class.

◆ ~DeviceManager()

virtual ~DeviceManager ( void )
inlinevirtual

Class destructor.

There always has to be at least one instance of the DeviceManager when the user still works with mvIMPACT::acquire::Device objects, as when the last instance to this object is destroyed all remaining mvIMPACT::acquire::Device objects will be closed automatically!

Member Function Documentation

◆ changedCount()

unsigned int changedCount ( void ) const
inline

Returns the current changed counter for the device list.

This is a useful function to find out if the device list has been changed in any way. Such a change might be the appearance of a new USB device or a state change of any other device (e.g. when a USB device has been unplugged). Thus this function can be called periodically in order to maintain lists in GUI application for example. To find out the actual number of devices call mvIMPACT::acquire::DeviceManager::deviceCount.

Returns
The current changed counter for the device list.

◆ deviceCount()

unsigned int deviceCount ( void ) const
inline

Returns the number of devices currently present in the system.

This function returns the number of devices currently detected in the system. A device once connected to the system while the device manager was running will remain in its list even if it's unplugged (then only its state will change). To detect changes in the mvIMPACT::acquire::DeviceManager objects list call the function mvIMPACT::acquire::DeviceManager::changedCount.

Returns
The number of devices detected in the current system.
Examples
ContinuousCaptureAllDevices.cpp, ContinuousCaptureAllDevices.linux.cpp, ContinuousCaptureAllDevices.win32.cpp, and exampleHelper.h.

◆ getDevice()

Device * getDevice ( unsigned int index) const
inline

Returns a pointer to a mvIMPACT::acquire::Device object.

Returns a pointer to a mvIMPACT::acquire::Device object specifying the device found at the given index in the device managers internal list. If the index is either equal or higher than the number of devices detected an STL out_of_range exception will be thrown.

See also
mvIMPACT::acquire::DeviceManager::deviceCount,
mvIMPACT::acquire::DeviceManager::getDeviceBySerial,
mvIMPACT::acquire::DeviceManager::getDeviceByFamily,
mvIMPACT::acquire::DeviceManager::getDeviceByProduct
Returns
  • A pointer to the device if index specifies a valid value.
  • an exception will be raised otherwise.
Parameters
[in]indexThe index of the device to be returned.

◆ getDeviceByFamily()

Device * getDeviceByFamily ( const std::string & family = "",
unsigned int devNr = 0,
char wildcard = '*' ) const
inline

Tries to locate a device via the family name.

This function tries to find a device by its family (or parts of this family name). The user can specify only parts of the family name and a wildcard. The mvIMPACT::acquire::DeviceManager object will then try to find the device that matches these parameters in its current list. The family is the most general method of searching for a device apart from 'any device'. E.g. for a device the family name might be 'SampleDevice'

// this will return a pointer to the second 'SampleDevice'
// device found or 0 if there are no 2 'SampleDevice'
// devices in the system
devMgr.getDeviceByFamily( "SampleD*", 1, '*' );
// will return a pointer to the first device belonging
// to the 'SampleDevice' family if present or 0.
devMgr.getDeviceByFamily( "SampleDevice" );
// will return the first recognized device in the system
devMgr.getDeviceByFamily( "*", 0, '*' );
See also
mvIMPACT::acquire::DeviceManager::getDeviceBySerial,
mvIMPACT::acquire::DeviceManager::getDeviceByProduct,
mvIMPACT::acquire::DeviceManager::getDeviceByProductAndID
Returns
  • A pointer to the device if found.
  • an invalid pointer or reference otherwise.
Parameters
[in]familyThe full family name of the requested device or known parts of it and wildcard characters.
[in]devNrThe number of the device to return (if there is more than one candidate).
[in]wildcardThe character to ignore in family.

◆ getDeviceByProduct()

Device * getDeviceByProduct ( const std::string & product = "",
unsigned int devNr = 0,
char wildcard = '*' ) const
inline

Tries to locate a device via the product name.

This function tries to find a device by its product name (or parts of it). The user can specify only parts of the name and a wildcard. The mvIMPACT::acquire::DeviceManager object will then try to find the device that matches these parameters in its current list. The product name is a bit more specific than the family name, but less specific than the serial. For the 'SampleDevice' for example there might be different product names for different device types. This might e.g. be 'SampleDevice-G' for a grey version of the sample device and 'SampleDevice-C' for the color version of the sample device.

// this will return a pointer to the second sample
// device of type 'G' found or 0 if there aren't
// two devices of this type in the system
devMgr.getDeviceByProduct( "SampleDevice-G", 1 );
// will return a pointer to the first device whose
// product string starts with 'SampleDev' or 0 if
// no such device can be found.
devMgr.getDeviceByProduct( "SampleDev*", 0, '*' );
// will return the first recognized device in the system
devMgr.getDeviceByProduct( "*", 0, '*' );
See also
mvIMPACT::acquire::DeviceManager::getDeviceBySerial,
mvIMPACT::acquire::DeviceManager::getDeviceByFamily,
mvIMPACT::acquire::DeviceManager::getDeviceByProductAndID
Returns
  • A pointer to the device if found.
  • an invalid pointer or reference otherwise.
Parameters
[in]productThe full product name of the requested device or known parts of it and wildcard characters.
[in]devNrThe number of the device to return (if there is more than one candidate).
[in]wildcardThe character to ignore in product.

◆ getDeviceByProductAndID() [1/2]

Device * getDeviceByProductAndID ( const std::string & product,
const std::string & devID,
char wildcard = '*' ) const
inline

Tries to locate a device via the product name and the device ID.

This function can be used to locate devices with a certain string identifier that has previously been written into a devices non-volatile memory. E.g. GenICam devices may support the DeviceUserID feature to assign a certain user defined name. A user defined name might be useful e.g. to access a device with a certain function without the need to worry about which device is it. You could e.g. have a barcodeReadingDevice and a monitorCamera. This function behaves like mvIMPACT::acquire::DeviceManager::getDeviceByProduct except that the second parameter now is interpreted as the device ID.

// this will return a pointer to the sample device of
// type 'G' which has been assigned a device ID of 'abc'
// or 0 if there is no sample device with this ID in the system.
devMgr.getDeviceByProductAndID( "SampleDevice-G", "abc" );
// will return a pointer to the device whose product string
// starts with 'SampleDev' and whose device ID has been set
// to 'def' or 0 if no such device can be found.
devMgr.getDeviceByProductAndID( "SampleDev*", "def", '*' );
// will return the first recognized device with an assigned
// device ID of 'anyString' in the system.
devMgr.getDeviceByProductAndID( "*", "anyString" );
See also
mvIMPACT::acquire::Device::deviceID,
mvIMPACT::acquire::DeviceManager::getDeviceByFamily,
mvIMPACT::acquire::DeviceManager::getDeviceByProduct,
mvIMPACT::acquire::DeviceManager::getDeviceBySerial,
mvIMPACT::acquire::Device::setID
Returns
  • A pointer to the device if found.
  • an invalid pointer or reference otherwise.
Parameters
[in]productThe full product name of the requested device or known parts of it and wildcard characters.
[in]devIDThe device ID associated with this device.
[in]wildcardThe character to ignore in product.

◆ getDeviceByProductAndID() [2/2]

Device * getDeviceByProductAndID ( const std::string & product = "",
unsigned int devID = 0,
char wildcard = '*' ) const
inline

Tries to locate a device via the product name and the device ID.

This function behaves like mvIMPACT::acquire::DeviceManager::getDeviceByProduct except that the second parameter now is interpreted as the device ID.

// this will return a pointer to the sample device of
// type 'G' which has been assigned a device ID of '1'
// or 0 if there is no sample device with this ID in the system.
devMgr.getDeviceByProductAndID( "SampleDevice-G", 1 );
// will return a pointer to the device whose product string
// starts with 'SampleDev' and whose device ID has been set
// to '0' or 0 if no such device can be found.
devMgr.getDeviceByProductAndID( "SampleDev*", 0, '*' );
// will return the first recognized device with an assigned
// device ID of '0' in the system.
devMgr.getDeviceByProductAndID( "*", 0 );
See also
mvIMPACT::acquire::Device::deviceID,
mvIMPACT::acquire::DeviceManager::getDeviceByFamily,
mvIMPACT::acquire::DeviceManager::getDeviceByProduct,
mvIMPACT::acquire::DeviceManager::getDeviceBySerial,
mvIMPACT::acquire::Device::setID
Returns
  • A pointer to the device if found.
  • an invalid pointer or reference otherwise.
Parameters
[in]productThe full product name of the requested device or known parts of it and wildcard characters.
[in]devIDThe ID associated with this device.
[in]wildcardThe character to ignore in product.

◆ getDeviceBySerial()

Device * getDeviceBySerial ( const std::string & serial = "",
unsigned int devNr = 0,
char wildcard = '*' ) const
inline

Tries to locate a device via the serial number.

This function tries to find a device by its serial number (or parts of this number). The user can specify only parts of the serial number and a wildcard. The mvIMPACT::acquire::DeviceManager object will then try to find that matches these parameters in its current list.

// this will return a pointer to the second device with
// a serial number starting with 'SD' device found or 0
// if there are no 2 sample devices in the system
devMgr.getDeviceBySerial( "SD*******", 1, '*' );
// will return a pointer to the device with the serial
// number SD000001 if present or 0
devMgr.getDeviceBySerial( "SD0000001" );
// will return a pointer to the first device in the system
devMgr.getDeviceBySerial( "*", 0, '*' );
See also
mvIMPACT::acquire::DeviceManager::getDeviceByFamily,
mvIMPACT::acquire::DeviceManager::getDeviceByProduct,
mvIMPACT::acquire::DeviceManager::getDeviceByProductAndID
Returns
  • A pointer to the device if found.
  • an invalid pointer or reference otherwise.
Parameters
[in]serialThe full serial number or the known parts of the serial number and wildcard characters.
[in]devNrThe number of the device to return (if there is more than one candidate).
[in]wildcardThe character to ignore in serial.
Examples
CaptureToMegaBuffer.cpp, ContinuousCapture.linux.cpp, ContinuousCaptureFFmpeg.cpp, ContinuousCaptureGenDC.cpp, FirmwareUpdate.cpp, GenICamSmartFrameRecallUsage.cpp, GenICamSmartFrameRecallUsage.legacy.cpp, Properties.cpp, and Properties.legacy.cpp.

◆ getVersionAsString()

static std::string getVersionAsString ( TLibraryQuery libraryQuery)
inlinestatic

Returns a string containing the version number of the specified library.

This function returns a string containing the version number of the specified library.

The format of the string will be MAJOR.MINOR.RELEASE.BUILD.

Since
2.1.2
Returns
A pointer to an internal version string.
Parameters
[in]libraryQuerySpecifies the library to query information from.

◆ operator=()

DeviceManager & operator= ( const DeviceManager & rhs)
inline

Allows assignments of mvIMPACT::acquire::DeviceManager objects.

◆ operator[]()

Device * operator[] ( unsigned int index) const
inline

Returns a pointer to a mvIMPACT::acquire::Device object.

Returns a pointer to a mvIMPACT::acquire::Device object specifying the device found at the given index in the device managers internal list. If the index is either equal or higher than the number of devices detected
an STL out_of_range exception is thrown.

See also
mvIMPACT::acquire::DeviceManager::deviceCount,
mvIMPACT::acquire::DeviceManager::getDeviceBySerial,
mvIMPACT::acquire::DeviceManager::getDeviceByFamily,
mvIMPACT::acquire::DeviceManager::getDeviceByProduct
Returns
  • A pointer to the device if found.
  • an invalid pointer or reference otherwise.
Parameters
[in]indexThe index of the device to be returned.

◆ updateDeviceList()

void updateDeviceList ( void ) const
inline

Updates the internal device list.

Most devices can't appear out of nowhere. For example a PCI device is either connected to the current system when the device manager is initialized or not but it will never appear at runtime after this instance of mvIMPACT::acquire::DeviceManager has been created.

However certain device classes (e.g. network devices) might be connected to the system AFTER the device manager has been initialized. Some will announce themselves like e.g. USB devices, which will send a message to every application interested while others like e.g. network devices wont. In order not to pollute the network or bus with constant rescan messages no polling is done inside the driver. the user should call this function instead when looking for new devices. This can either be done in reasonable intervals or after it is known that a new device has been connected to the system.

If new devices have been detected a subsequent call to mvIMPACT::acquire::DeviceManager::deviceCount will result in a higher value when compared to a previous call and mvIMPACT::acquire::DeviceManager::changedCount will contain a different value as well then (however this could also happen because a certain device related property did change its state).

Note
As long as a certain instance of a device manager is active, the devices once detected will NOT disappear from the list of devices even if they have been unplugged from the system. So the list of devices can only grow, but never gets shorter again until either the process terminates or the last instance of this class went out of scope. If a device has been unplugged, its mvIMPACT::acquire::Device::state property will change. If the application is interested in getting an instant notification when a device has been disconnected a callback can be registered on this property. How to do this is explained here: Callback.cpp
Examples
FirmwareUpdate.cpp.