Skip to content

Commit 526b16a

Browse files
RSDK-12571 Improve error handling when realsense SDK fails to get device info (viam-modules#98)
* error handling * fix log * Update src/module/device_impl.hpp Co-authored-by: Sebastian Munoz <sebastian.munoz@viam.com> --------- Co-authored-by: Sebastian Munoz <sebastian.munoz@viam.com>
1 parent c866ca0 commit 526b16a

3 files changed

Lines changed: 221 additions & 139 deletions

File tree

src/module/device_impl.hpp

Lines changed: 69 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -43,70 +43,76 @@ std::optional<std::string> getCameraModel(std::shared_ptr<DeviceT> dev) {
4343

4444
template <typename DeviceT>
4545
void printDeviceInfo(DeviceT const &dev, viam::sdk::LogSource &logger) {
46-
std::stringstream info;
47-
if (dev.supports(RS2_CAMERA_INFO_NAME)) {
48-
info << "DeviceInfo:\n"
49-
<< " Name: "
50-
<< dev.get_info(RS2_CAMERA_INFO_NAME) << std::endl;
51-
}
52-
if (dev.supports(RS2_CAMERA_INFO_SERIAL_NUMBER)) {
53-
info << " Serial Number: "
54-
<< dev.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER) << std::endl;
55-
}
56-
if (dev.supports(RS2_CAMERA_INFO_PRODUCT_LINE)) {
57-
info << " Product Line: "
58-
<< dev.get_info(RS2_CAMERA_INFO_PRODUCT_LINE) << std::endl;
59-
}
60-
if (dev.supports(RS2_CAMERA_INFO_PRODUCT_ID)) {
61-
info << " Product ID: "
62-
<< dev.get_info(RS2_CAMERA_INFO_PRODUCT_ID) << std::endl;
63-
}
64-
if (dev.supports(RS2_CAMERA_INFO_USB_TYPE_DESCRIPTOR)) {
65-
info << " USB Type Descriptor: "
66-
<< dev.get_info(RS2_CAMERA_INFO_USB_TYPE_DESCRIPTOR) << std::endl;
67-
}
68-
if (dev.supports(RS2_CAMERA_INFO_FIRMWARE_VERSION)) {
69-
info << " Firmware Version: "
70-
<< dev.get_info(RS2_CAMERA_INFO_FIRMWARE_VERSION) << std::endl;
71-
}
72-
if (dev.supports(RS2_CAMERA_INFO_RECOMMENDED_FIRMWARE_VERSION)) {
73-
info << " Recommended Firmware Version: "
74-
<< dev.get_info(RS2_CAMERA_INFO_RECOMMENDED_FIRMWARE_VERSION)
75-
<< std::endl;
76-
}
77-
if (dev.supports(RS2_CAMERA_INFO_FIRMWARE_UPDATE_ID)) {
78-
info << " Firmware Update ID: "
79-
<< dev.get_info(RS2_CAMERA_INFO_FIRMWARE_UPDATE_ID) << std::endl;
80-
}
81-
if (dev.supports(RS2_CAMERA_INFO_PHYSICAL_PORT)) {
82-
info << " Physical Port: " << dev.get_info(RS2_CAMERA_INFO_PHYSICAL_PORT)
83-
<< std::endl;
84-
}
85-
if (dev.supports(RS2_CAMERA_INFO_DEBUG_OP_CODE)) {
86-
info << " Debug OP Code: " << dev.get_info(RS2_CAMERA_INFO_DEBUG_OP_CODE)
87-
<< std::endl;
88-
}
89-
if (dev.supports(RS2_CAMERA_INFO_ADVANCED_MODE)) {
90-
info << " Advanced Mode: " << dev.get_info(RS2_CAMERA_INFO_ADVANCED_MODE)
91-
<< std::endl;
92-
}
93-
if (dev.supports(RS2_CAMERA_INFO_CAMERA_LOCKED)) {
94-
info << " Camera Locked: " << dev.get_info(RS2_CAMERA_INFO_CAMERA_LOCKED)
95-
<< std::endl;
96-
}
97-
if (dev.supports(RS2_CAMERA_INFO_ASIC_SERIAL_NUMBER)) {
98-
info << " ASIC Serial Number: "
99-
<< dev.get_info(RS2_CAMERA_INFO_ASIC_SERIAL_NUMBER) << std::endl;
100-
}
101-
if (dev.supports(RS2_CAMERA_INFO_DFU_DEVICE_PATH)) {
102-
info << " DFU Device Path: "
103-
<< dev.get_info(RS2_CAMERA_INFO_DFU_DEVICE_PATH) << std::endl;
104-
}
105-
if (dev.supports(RS2_CAMERA_INFO_IP_ADDRESS)) {
106-
info << " IP Address: "
107-
<< dev.get_info(RS2_CAMERA_INFO_IP_ADDRESS) << std::endl;
46+
try {
47+
std::stringstream info;
48+
if (dev.supports(RS2_CAMERA_INFO_NAME)) {
49+
info << "DeviceInfo:\n"
50+
<< " Name: "
51+
<< dev.get_info(RS2_CAMERA_INFO_NAME) << std::endl;
52+
}
53+
if (dev.supports(RS2_CAMERA_INFO_SERIAL_NUMBER)) {
54+
info << " Serial Number: "
55+
<< dev.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER) << std::endl;
56+
}
57+
if (dev.supports(RS2_CAMERA_INFO_PRODUCT_LINE)) {
58+
info << " Product Line: "
59+
<< dev.get_info(RS2_CAMERA_INFO_PRODUCT_LINE) << std::endl;
60+
}
61+
if (dev.supports(RS2_CAMERA_INFO_PRODUCT_ID)) {
62+
info << " Product ID: "
63+
<< dev.get_info(RS2_CAMERA_INFO_PRODUCT_ID) << std::endl;
64+
}
65+
if (dev.supports(RS2_CAMERA_INFO_USB_TYPE_DESCRIPTOR)) {
66+
info << " USB Type Descriptor: "
67+
<< dev.get_info(RS2_CAMERA_INFO_USB_TYPE_DESCRIPTOR) << std::endl;
68+
}
69+
if (dev.supports(RS2_CAMERA_INFO_FIRMWARE_VERSION)) {
70+
info << " Firmware Version: "
71+
<< dev.get_info(RS2_CAMERA_INFO_FIRMWARE_VERSION) << std::endl;
72+
}
73+
if (dev.supports(RS2_CAMERA_INFO_RECOMMENDED_FIRMWARE_VERSION)) {
74+
info << " Recommended Firmware Version: "
75+
<< dev.get_info(RS2_CAMERA_INFO_RECOMMENDED_FIRMWARE_VERSION)
76+
<< std::endl;
77+
}
78+
if (dev.supports(RS2_CAMERA_INFO_FIRMWARE_UPDATE_ID)) {
79+
info << " Firmware Update ID: "
80+
<< dev.get_info(RS2_CAMERA_INFO_FIRMWARE_UPDATE_ID) << std::endl;
81+
}
82+
if (dev.supports(RS2_CAMERA_INFO_PHYSICAL_PORT)) {
83+
info << " Physical Port: " << dev.get_info(RS2_CAMERA_INFO_PHYSICAL_PORT)
84+
<< std::endl;
85+
}
86+
if (dev.supports(RS2_CAMERA_INFO_DEBUG_OP_CODE)) {
87+
info << " Debug OP Code: " << dev.get_info(RS2_CAMERA_INFO_DEBUG_OP_CODE)
88+
<< std::endl;
89+
}
90+
if (dev.supports(RS2_CAMERA_INFO_ADVANCED_MODE)) {
91+
info << " Advanced Mode: " << dev.get_info(RS2_CAMERA_INFO_ADVANCED_MODE)
92+
<< std::endl;
93+
}
94+
if (dev.supports(RS2_CAMERA_INFO_CAMERA_LOCKED)) {
95+
info << " Camera Locked: " << dev.get_info(RS2_CAMERA_INFO_CAMERA_LOCKED)
96+
<< std::endl;
97+
}
98+
if (dev.supports(RS2_CAMERA_INFO_ASIC_SERIAL_NUMBER)) {
99+
info << " ASIC Serial Number: "
100+
<< dev.get_info(RS2_CAMERA_INFO_ASIC_SERIAL_NUMBER) << std::endl;
101+
}
102+
if (dev.supports(RS2_CAMERA_INFO_DFU_DEVICE_PATH)) {
103+
info << " DFU Device Path: "
104+
<< dev.get_info(RS2_CAMERA_INFO_DFU_DEVICE_PATH) << std::endl;
105+
}
106+
if (dev.supports(RS2_CAMERA_INFO_IP_ADDRESS)) {
107+
info << " IP Address: "
108+
<< dev.get_info(RS2_CAMERA_INFO_IP_ADDRESS) << std::endl;
109+
}
110+
VIAM_DEVICE_LOG(logger, info) << info.str();
111+
} catch (const std::exception &e) {
112+
VIAM_DEVICE_LOG(logger, error)
113+
<< "[printDeviceInfo] Failed to retrieve device info with error: " << e.what()
114+
<< ". Device may be in an invalid state or have firmware compatibility issues.";
108115
}
109-
VIAM_DEVICE_LOG(logger, info) << info.str();
110116
}
111117

112118
/********************** CALLBACKS ************************/

src/module/discovery.hpp

Lines changed: 94 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
#include "realsense.hpp"
44

5+
#include <chrono>
56
#include <memory>
7+
#include <thread>
68

79
#include <viam/sdk/config/resource.hpp>
810
#include <viam/sdk/resource/reconfigurable.hpp>
@@ -28,41 +30,106 @@ class RealsenseDiscovery : public viam::sdk::Discovery {
2830
discover_resources(const viam::sdk::ProtoStruct &extra) override {
2931
std::vector<viam::sdk::ResourceConfig> configs;
3032

31-
auto deviceList = rs_ctx_->query_devices();
32-
int devCount = deviceList.size();
33+
try {
34+
VIAM_SDK_LOG(info) << "[discover_resources] Starting device discovery";
3335

34-
if (devCount == 0) {
35-
VIAM_SDK_LOG(warn)
36-
<< "[discover_resources] No Realsense devices found during discovery";
37-
return {};
38-
}
39-
40-
VIAM_SDK_LOG(info) << "[discover_resources] Discovered " << devCount
41-
<< " devices";
36+
auto deviceList = rs_ctx_->query_devices();
37+
int devCount = deviceList.size();
4238

43-
for (auto const &dev : deviceList) {
44-
if (dev.supports(RS2_CAMERA_INFO_SERIAL_NUMBER)) {
45-
std::string serial_number = dev.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);
39+
VIAM_SDK_LOG(info) << "[discover_resources] query_devices returned "
40+
<< devCount << " devices";
4641

47-
viam::sdk::ProtoStruct attributes;
48-
attributes["serial_number"] = serial_number;
42+
if (devCount == 0) {
43+
VIAM_SDK_LOG(warn) << "[discover_resources] No Realsense devices found "
44+
"during discovery";
45+
return {};
46+
}
4947

50-
viam::sdk::ProtoList sensors;
51-
sensors.push_back("color");
52-
sensors.push_back("depth");
53-
attributes["sensors"] = sensors;
48+
std::vector<std::string> device_errors;
49+
for (int i = 0; i < devCount; i++) {
50+
try {
51+
VIAM_SDK_LOG(debug)
52+
<< "[discover_resources] Attempting to access device at index "
53+
<< i;
54+
auto dev = deviceList[i];
55+
VIAM_SDK_LOG(debug)
56+
<< "[discover_resources] Successfully accessed device at index "
57+
<< i;
58+
59+
if (dev.supports(RS2_CAMERA_INFO_SERIAL_NUMBER)) {
60+
61+
std::string serial_number =
62+
dev.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);
63+
64+
viam::sdk::ProtoStruct attributes;
65+
attributes["serial_number"] = serial_number;
66+
67+
viam::sdk::ProtoList sensors;
68+
sensors.push_back("color");
69+
sensors.push_back("depth");
70+
attributes["sensors"] = sensors;
71+
72+
std::ostringstream name;
73+
name << "realsense-" << serial_number;
74+
75+
viam::sdk::ResourceConfig config(
76+
"camera", std::move(name.str()), "viam", attributes,
77+
"rdk:component:camera", realsense::Realsense<ContextT>::model,
78+
viam::sdk::LinkConfig{}, viam::sdk::log_level::info);
79+
configs.push_back(config);
80+
} else {
81+
VIAM_SDK_LOG(warn) << "[discover_resources] Device at index " << i
82+
<< " does not support serial number";
83+
}
84+
} catch (const std::exception &e) {
85+
VIAM_SDK_LOG(error)
86+
<< "[discover_resources] Failed to access device at index " << i
87+
<< ": " << e.what() << "Device may be in an invalid state or have firmware compatibility issues." ;
88+
std::ostringstream error_msg;
89+
error_msg << "Device " << i << ": " << e.what();
90+
device_errors.push_back(error_msg.str());
91+
// Continue to try other devices
92+
continue;
93+
}
94+
}
5495

55-
std::ostringstream name;
56-
name << "realsense-" << serial_number;
96+
// If we found at least one valid device, return those configs
97+
if (!configs.empty()) {
98+
if (!device_errors.empty()) {
99+
VIAM_SDK_LOG(warn) << "[discover_resources] Successfully discovered "
100+
<< configs.size() << " device(s), but "
101+
<< device_errors.size() << " device(s) failed";
102+
for (const auto &err : device_errors) {
103+
VIAM_SDK_LOG(error)
104+
<< "[discover_resources] Failed device: " << err;
105+
}
106+
}
107+
VIAM_SDK_LOG(info) << "[discover_resources] Successfully created "
108+
<< configs.size() << " configs";
109+
return configs;
110+
}
57111

58-
viam::sdk::ResourceConfig config(
59-
"camera", std::move(name.str()), "viam", attributes,
60-
"rdk:component:camera", realsense::Realsense<ContextT>::model,
61-
viam::sdk::LinkConfig{}, viam::sdk::log_level::info);
62-
configs.push_back(config);
112+
// If all devices failed, throw an error with details
113+
if (!device_errors.empty()) {
114+
std::ostringstream error_msg;
115+
error_msg << "RealSense device(s) detected but inaccessible. "
116+
<< "Errors: ";
117+
for (size_t i = 0; i < device_errors.size(); i++) {
118+
if (i > 0)
119+
error_msg << "; ";
120+
error_msg << device_errors[i];
121+
}
122+
error_msg << ". Device(s) may be in an invalid state or have firmware compatibility issues.";
123+
throw std::runtime_error(error_msg.str());
63124
}
125+
return configs;
126+
127+
} catch (const std::exception &e) {
128+
std::ostringstream err;
129+
err << "[discover_resources]: " << e.what();
130+
VIAM_SDK_LOG(error) << err.str();
131+
throw std::runtime_error(err.str());
64132
}
65-
return configs;
66133
}
67134

68135
viam::sdk::ProtoStruct

0 commit comments

Comments
 (0)