diff --git a/src/ds/d400/d400-device.cpp b/src/ds/d400/d400-device.cpp index fb0cb266c3..2898dba193 100644 --- a/src/ds/d400/d400-device.cpp +++ b/src/ds/d400/d400-device.cpp @@ -680,8 +680,12 @@ namespace librealsense std::make_shared>(raw_depth_sensor, depth_xu, DS5_EXT_TRIGGER, "Generate trigger from the camera to external device once per frame")); + auto uvc_s = std::dynamic_pointer_cast(raw_depth_sensor.shared_from_this()); + if (!uvc_s) + throw std::runtime_error("Sensor base is not uvc sensor"); + depth_sensor.register_option(RS2_OPTION_ASIC_TEMPERATURE, - std::make_shared(raw_depth_sensor, + std::make_shared(std::move(uvc_s), RS2_OPTION_ASIC_TEMPERATURE)); // D457 dev - get_xu fails for D457 - error polling id not defined @@ -1297,8 +1301,12 @@ namespace librealsense emitter_enabled, std::vector{0.f, 2.f}, 1.f)); + auto uvc_s = std::dynamic_pointer_cast(depth_ep.shared_from_this()); + if (!uvc_s) + throw std::runtime_error("Sensor base is not uvc sensor"); + depth_ep.register_option(RS2_OPTION_PROJECTOR_TEMPERATURE, - std::make_shared(depth_ep, + std::make_shared(std::move(uvc_s), RS2_OPTION_PROJECTOR_TEMPERATURE)); } } diff --git a/src/ds/ds-active-common.cpp b/src/ds/ds-active-common.cpp index 94a6707942..26517e1485 100644 --- a/src/ds/ds-active-common.cpp +++ b/src/ds/ds-active-common.cpp @@ -72,8 +72,12 @@ namespace librealsense } else { + auto uvc_s = std::dynamic_pointer_cast(_raw_depth_ep.shared_from_this()); + if (!uvc_s) + throw std::runtime_error("Sensor base is not uvc sensor"); + _depth_ep.register_option(RS2_OPTION_PROJECTOR_TEMPERATURE, - std::make_shared(_raw_depth_ep, + std::make_shared(std::move(uvc_s), RS2_OPTION_PROJECTOR_TEMPERATURE)); } } diff --git a/src/ds/ds-options.cpp b/src/ds/ds-options.cpp index d70ef6c354..39f0c6056c 100644 --- a/src/ds/ds-options.cpp +++ b/src/ds/ds-options.cpp @@ -4,6 +4,8 @@ #include "ds-options.h" #include +#include + namespace librealsense @@ -53,7 +55,11 @@ namespace librealsense }; #pragma pack(pop) - auto temperature_data = static_cast(_ep.invoke_powered( + auto strong_ep = _ep.lock(); + if (!strong_ep) + throw camera_disconnected_exception("asic and proj temperatures cannot access the sensor"); + + auto temperature_data = static_cast(strong_ep->invoke_powered( [this](platform::uvc_device& dev) { temperature temp{}; @@ -82,11 +88,11 @@ namespace librealsense is_valid_field = &temperature::is_projector_valid; break; default: - throw invalid_value_exception(rsutils::string::from() << _ep.get_option_name(_option) << " is not temperature option!"); + throw invalid_value_exception(rsutils::string::from() << strong_ep->get_option_name(_option) << " is not temperature option!"); } if (0 == temperature_data.*is_valid_field) - LOG_ERROR(_ep.get_option_name(_option) << " value is not valid!"); + LOG_ERROR(strong_ep->get_option_name(_option) << " value is not valid!"); return temperature_data.*field; } @@ -98,11 +104,19 @@ namespace librealsense bool asic_and_projector_temperature_options::is_enabled() const { - return _ep.is_streaming(); + auto strong_ep = _ep.lock(); + if (!strong_ep) + throw camera_disconnected_exception("asic and proj temperatures cannot access the sensor"); + + return strong_ep->is_streaming(); } const char* asic_and_projector_temperature_options::get_description() const { + auto strong_ep = _ep.lock(); + if (! strong_ep) + throw camera_disconnected_exception("asic and proj temperatures cannot access the sensor"); + switch (_option) { case RS2_OPTION_ASIC_TEMPERATURE: @@ -110,12 +124,12 @@ namespace librealsense case RS2_OPTION_PROJECTOR_TEMPERATURE: return "Current Projector Temperature (degree celsius)"; default: - throw invalid_value_exception(rsutils::string::from() << _ep.get_option_name(_option) << " is not temperature option!"); + throw invalid_value_exception(rsutils::string::from() << strong_ep->get_option_name(_option) << " is not temperature option!"); } } - asic_and_projector_temperature_options::asic_and_projector_temperature_options(uvc_sensor& ep, rs2_option opt) - : _option(opt), _ep(ep) + asic_and_projector_temperature_options::asic_and_projector_temperature_options(std::shared_ptr && ep, rs2_option opt) + : _option(opt), _ep(std::move(ep)) {} float motion_module_temperature_option::query() const diff --git a/src/ds/ds-options.h b/src/ds/ds-options.h index f09591203f..b599cba1ec 100644 --- a/src/ds/ds-options.h +++ b/src/ds/ds-options.h @@ -31,10 +31,10 @@ namespace librealsense const char* get_description() const override; - explicit asic_and_projector_temperature_options(uvc_sensor& ep, rs2_option opt); + explicit asic_and_projector_temperature_options(std::shared_ptr && ep, rs2_option opt); private: - uvc_sensor& _ep; + std::weak_ptr _ep; rs2_option _option; };