You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
3.3 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2022 Intel Corporation. All Rights Reserved.
#include <algorithm>
#include <iostream>
#include "lrs-device-watcher.h"
using namespace tools;
lrs_device_watcher::lrs_device_watcher( rs2::context &ctx )
: _rs_device_list( std::make_shared< std::vector< rs2::device > >() )
, _ctx( ctx )
{
}
lrs_device_watcher::~lrs_device_watcher()
{
}
void lrs_device_watcher::run( std::function< void( rs2::device ) > add_device_cb,
std::function< void( rs2::device ) > remove_device_cb )
{
notify_connected_devices_on_wake_up( add_device_cb );
// Register to LRS device change callback.
// For each device added, call callback and store it in a list
// For each device removed, call callback and remove it from the list
std::weak_ptr< std::vector< rs2::device > > weak_rs_device_list ( _rs_device_list );
_ctx.set_devices_changed_callback(
[this, add_device_cb, remove_device_cb, weak_rs_device_list]( rs2::event_information & info ) {
auto strong_rs_device_list = weak_rs_device_list.lock();
if( strong_rs_device_list )
{
std::vector<rs2::device> devices_to_remove;
for( auto && rs_device : *strong_rs_device_list )
{
if( info.was_removed( rs_device ) )
{
devices_to_remove.push_back(rs_device);
}
}
for( auto & device_to_remove : devices_to_remove )
{
try
{
remove_device_cb( device_to_remove );
std::cout << device_to_remove.get_description() << " - removed" << std::endl;
auto it = std::find_if(
strong_rs_device_list->begin(),
strong_rs_device_list->end(),
[&]( const rs2::device & dev )
{
return strcmp( dev.get_info( RS2_CAMERA_INFO_FIRMWARE_UPDATE_ID ),
device_to_remove.get_info( RS2_CAMERA_INFO_FIRMWARE_UPDATE_ID ) )
== 0;
} );
strong_rs_device_list->erase( it );
}
catch( std::exception e )
{
std::cout << "Exception during remove_device_cb: " << e.what() << std::endl;
}
}
for( auto && rs_device : info.get_new_devices() )
{
std::cout << rs_device.get_description() << " - detected" << std::endl;
add_device_cb( rs_device );
strong_rs_device_list->push_back(rs_device);
}
}
} );
}
void lrs_device_watcher::notify_connected_devices_on_wake_up( std::function< void( rs2::device ) > add_device_cb )
{
auto connected_dev_list = _ctx.query_devices();
for( auto connected_dev : connected_dev_list )
{
std::cout << connected_dev.get_description() << " - detected" << std::endl;
add_device_cb( connected_dev );
_rs_device_list->push_back(connected_dev);
}
}