diff --git a/src/module/device_control.hpp b/src/module/device_control.hpp index d00813b..37f48a8 100644 --- a/src/module/device_control.hpp +++ b/src/module/device_control.hpp @@ -225,7 +225,7 @@ viam::sdk::ProtoStruct setDeviceProperty(std::shared_ptr device, } } - return {}; + return {{"error", "property not supported: " + property_map.begin()->first}}; } // Get property list @@ -253,11 +253,13 @@ viam::sdk::ProtoStruct setDeviceProperties(std::shared_ptr device, return {{"error", "properties must be a struct"}}; } std::unordered_set writable_properties; + std::unordered_set seen_properties; auto const& properties_map = properties.template get_unchecked(); int const supportedPropertyCount = device->getSupportedPropertyCount(); for (int i = 0; i < supportedPropertyCount; i++) { OBPropertyItem property_item = device->getSupportedProperty(i); if (properties_map.count(property_item.name) > 0) { + seen_properties.insert(property_item.name); if (property_item.permission == OB_PERMISSION_DENY || property_item.permission == OB_PERMISSION_READ) { std::stringstream error_ss; error_ss << "Property " << property_item.name << " is not writable, skipping."; @@ -299,6 +301,11 @@ viam::sdk::ProtoStruct setDeviceProperties(std::shared_ptr device, } } } + for (auto const& [name, _] : properties_map) { + if (seen_properties.count(name) == 0) { + return {{"error", "property not supported: " + name}}; + } + } return getDeviceProperties(device, command, writable_properties); } diff --git a/src/module/orbbec.cpp b/src/module/orbbec.cpp index b32952e..3698703 100644 --- a/src/module/orbbec.cpp +++ b/src/module/orbbec.cpp @@ -1471,6 +1471,9 @@ vsdk::Camera::image_collection Orbbec::get_images(std::vector filte } vsdk::ProtoStruct Orbbec::do_command(const vsdk::ProtoStruct& command) { + if (command.empty()) { + return vsdk::ProtoStruct{{"error", std::string("empty command")}}; + } bool call_get_properties = false; try { constexpr char firmware_key[] = "update_firmware"; @@ -1484,7 +1487,8 @@ vsdk::ProtoStruct Orbbec::do_command(const vsdk::ProtoStruct& command) { const std::lock_guard lock(devices_by_serial_mu()); auto search = devices_by_serial().find(serial_number); if (search == devices_by_serial().end()) { - throw std::invalid_argument("device is not connected"); + VIAM_RESOURCE_LOG(error) << "[do_command] device is not connected"; + return vsdk::ProtoStruct{{"error", std::string("device is not connected")}}; } std::unique_ptr& dev = search->second; @@ -1573,6 +1577,9 @@ vsdk::ProtoStruct Orbbec::do_command(const vsdk::ProtoStruct& command) { return device_control::createModuleConfig(dev); } else if (key == "call_get_properties") { call_get_properties = true; + } else { + VIAM_RESOURCE_LOG(error) << "[do_command] unknown command: " << key; + return vsdk::ProtoStruct{{"error", "unknown command: " + key}}; } } } // unlock devices_by_serial_mu_ @@ -1601,6 +1608,7 @@ vsdk::ProtoStruct Orbbec::do_command(const vsdk::ProtoStruct& command) { } } catch (const std::exception& e) { VIAM_RESOURCE_LOG(error) << service_name << ": exception caught: " << e.what(); + return vsdk::ProtoStruct{{"error", std::string(e.what())}}; } return vsdk::ProtoStruct{}; }