39 #include <glog/logging.h>
56 LOG(
INFO) <<
"Looking for USB connected sensors";
60 hr = CoInitializeEx(
NULL, COINIT_MULTITHREADED);
64 ICreateDevEnum *DevEnum =
NULL;
66 hr = CoCreateInstance(CLSID_SystemDeviceEnum,
NULL, CLSCTX_INPROC_SERVER,
67 IID_PPV_ARGS(&DevEnum));
69 LOG(
ERROR) <<
"Create Device Enumeration Failed" << std::endl;
73 IEnumMoniker *EnumMoniker =
NULL;
74 hr = DevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
79 LOG(
ERROR) <<
"Device Enumeration Error" << std::endl;
83 IMoniker *Moniker =
NULL;
85 while (EnumMoniker->Next(1, &Moniker, &cFetched) == S_OK) {
86 IPropertyBag *PropBag;
87 hr = Moniker->BindToStorage(0, 0, IID_PPV_ARGS(&PropBag));
91 VariantInit(&varName);
92 hr = PropBag->Read(L
"FriendlyName", &varName, 0);
96 if (
str.find(devName) != std::string::npos) {
98 sInfo.driverPath =
str;
104 IBaseFilter *pVideoInputFilter;
107 Moniker->BindToObject(
nullptr,
nullptr, IID_IBaseFilter,
108 (
void **)&pVideoInputFilter);
109 if (!SUCCEEDED(hr)) {
110 LOG(
WARNING) <<
"Failed to bind video input filter";
117 usb_payload::ClientRequest requestMsg;
118 requestMsg.set_func_name(
119 usb_payload::FunctionName::SEARCH_SENSORS);
120 requestMsg.add_func_int32_param(
124 requestMsg.SerializeToString(&requestStr);
126 pVideoInputFilter, requestStr);
128 LOG(
ERROR) <<
"Request to search for sensors failed";
135 pVideoInputFilter, responseStr);
137 LOG(
ERROR) <<
"Request to search for sensors failed";
140 usb_payload::ServerResponse responseMsg;
141 bool parsed = responseMsg.ParseFromString(responseStr);
143 LOG(
ERROR) <<
"Failed to deserialize string containing "
144 "UVC gadget response";
148 DLOG(
INFO) <<
"Received the following message with "
149 "available sensors from target: "
150 << responseMsg.DebugString();
153 LOG(
ERROR) <<
"Search for sensors operation failed on "
156 responseMsg.status());
160 m_sensorsInfo.emplace_back(sInfo);
163 responseMsg.sensors_info().image_sensors().name();
166 responseMsg.card_image_version().kernelversion();
167 m_sdVersion = responseMsg.card_image_version().sdversion();
169 responseMsg.card_image_version().ubootversion();
172 VariantClear(&varName);
181 EnumMoniker->Release();
188 std::vector<std::shared_ptr<DepthSensorInterface>> &depthSensors) {
190 depthSensors.clear();
192 for (
const auto &sInfo : m_sensorsInfo) {
194 std::make_shared<UsbDepthSensor>(m_sensorName, sInfo.driverPath);
195 depthSensors.emplace_back(sensor);
203 uBootVersion = m_uBootVersion;
209 kernelVersion = m_kernelVersion;
215 sdkVersion = m_sdVersion;