Skip to content

Commit

Permalink
PR IntelRealSense#12484 from Tamir91: Make uvc sensor weak pointer
Browse files Browse the repository at this point in the history
  • Loading branch information
Nir-Az authored Dec 10, 2023
2 parents 47b2da9 + 6f3169e commit 59ffb92
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 12 deletions.
12 changes: 10 additions & 2 deletions src/ds/d400/d400-device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -680,8 +680,12 @@ namespace librealsense
std::make_shared<uvc_xu_option<uint8_t>>(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<uvc_sensor>(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<asic_and_projector_temperature_options>(raw_depth_sensor,
std::make_shared<asic_and_projector_temperature_options>(std::move(uvc_s),
RS2_OPTION_ASIC_TEMPERATURE));

// D457 dev - get_xu fails for D457 - error polling id not defined
Expand Down Expand Up @@ -1297,8 +1301,12 @@ namespace librealsense
emitter_enabled,
std::vector<float>{0.f, 2.f}, 1.f));

auto uvc_s = std::dynamic_pointer_cast<uvc_sensor>(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<asic_and_projector_temperature_options>(depth_ep,
std::make_shared<asic_and_projector_temperature_options>(std::move(uvc_s),
RS2_OPTION_PROJECTOR_TEMPERATURE));
}
}
Expand Down
6 changes: 5 additions & 1 deletion src/ds/ds-active-common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,12 @@ namespace librealsense
}
else
{
auto uvc_s = std::dynamic_pointer_cast<uvc_sensor>(_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<asic_and_projector_temperature_options>(_raw_depth_ep,
std::make_shared<asic_and_projector_temperature_options>(std::move(uvc_s),
RS2_OPTION_PROJECTOR_TEMPERATURE));
}
}
Expand Down
28 changes: 21 additions & 7 deletions src/ds/ds-options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

#include "ds-options.h"
#include <src/hid-sensor.h>
#include <memory>



namespace librealsense
Expand Down Expand Up @@ -53,7 +55,11 @@ namespace librealsense
};
#pragma pack(pop)

auto temperature_data = static_cast<temperature>(_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<temperature>(strong_ep->invoke_powered(
[this](platform::uvc_device& dev)
{
temperature temp{};
Expand Down Expand Up @@ -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;
}
Expand All @@ -98,24 +104,32 @@ 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:
return "Current Asic Temperature (degree celsius)";
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<uvc_sensor> && ep, rs2_option opt)
: _option(opt), _ep(std::move(ep))
{}

float motion_module_temperature_option::query() const
Expand Down
4 changes: 2 additions & 2 deletions src/ds/ds-options.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <uvc_sensor> && ep, rs2_option opt);

private:
uvc_sensor& _ep;
std::weak_ptr<uvc_sensor> _ep;
rs2_option _option;
};

Expand Down

0 comments on commit 59ffb92

Please sign in to comment.