Files

237 lines
6.9 KiB
C++
Raw Permalink Normal View History

2026-01-09 13:59:10 +08:00
// Copyright (c) Orbbec Inc. All Rights Reserved.
// Licensed under the MIT License.
/**
* @file Sensor.hpp
* @brief Defines types related to sensors, which are used to obtain stream configurations, open and close streams, and set and get sensor properties.
*/
#pragma once
#include "Types.hpp"
#include "libobsensor/hpp/Filter.hpp"
#include "libobsensor/h/Sensor.h"
#include "libobsensor/h/Filter.h"
#include "Error.hpp"
#include "StreamProfile.hpp"
#include "Device.hpp"
#include "Frame.hpp"
#include <functional>
#include <memory>
#include <vector>
namespace ob {
class Sensor {
public:
/**
* @brief Callback function for frame data.
*
* @param frame The frame data.
*/
typedef std::function<void(std::shared_ptr<Frame> frame)> FrameCallback;
protected:
ob_sensor_t *impl_;
FrameCallback callback_;
public:
explicit Sensor(ob_sensor_t *impl) : impl_(impl) {}
Sensor(Sensor &&sensor) noexcept : impl_(sensor.impl_) {
sensor.impl_ = nullptr;
}
Sensor &operator=(Sensor &&sensor) noexcept {
if(this != &sensor) {
ob_error *error = nullptr;
ob_delete_sensor(impl_, &error);
Error::handle(&error);
impl_ = sensor.impl_;
sensor.impl_ = nullptr;
}
return *this;
}
Sensor(const Sensor &sensor) = delete;
Sensor &operator=(const Sensor &sensor) = delete;
virtual ~Sensor() noexcept {
ob_error *error = nullptr;
ob_delete_sensor(impl_, &error);
Error::handle(&error, false);
}
/**
* @brief Get the sensor type.
*
* @return OBSensorType The sensor type.
*/
OBSensorType getType() const {
ob_error *error = nullptr;
auto type = ob_sensor_get_type(impl_, &error);
Error::handle(&error);
return type;
}
/**
* @brief Get the list of stream profiles.
*
* @return std::shared_ptr<StreamProfileList> The stream profile list.
*/
std::shared_ptr<StreamProfileList> getStreamProfileList() const {
ob_error *error = nullptr;
auto list = ob_sensor_get_stream_profile_list(impl_, &error);
Error::handle(&error);
return std::make_shared<StreamProfileList>(list);
}
/**
* @brief Create a list of recommended filters for the sensor.
*
* @return OBFilterList list of frame processing block
*/
std::vector<std::shared_ptr<Filter>> createRecommendedFilters() const {
ob_error *error = nullptr;
auto list = ob_sensor_create_recommended_filter_list(impl_, &error);
Error::handle(&error);
auto filter_count = ob_filter_list_get_count(list, &error);
std::vector<std::shared_ptr<Filter>> filters;
for(uint32_t i = 0; i < filter_count; i++) {
auto filterImpl = ob_filter_list_get_filter(list, i, &error);
Error::handle(&error);
filters.push_back(std::make_shared<Filter>(filterImpl));
}
ob_delete_filter_list(list, &error);
Error::handle(&error, false);
return filters;
}
/**
* @brief Open a frame data stream and set up a callback.
*
* @param streamProfile The stream configuration.
* @param callback The callback to set when frame data arrives.
*/
void start(std::shared_ptr<StreamProfile> streamProfile, FrameCallback callback) {
ob_error *error = nullptr;
callback_ = std::move(callback);
ob_sensor_start(impl_, const_cast<ob_stream_profile_t *>(streamProfile->getImpl()), &Sensor::frameCallback, this, &error);
Error::handle(&error);
}
/**
* @brief Stop the stream.
*/
void stop() const {
ob_error *error = nullptr;
ob_sensor_stop(impl_, &error);
Error::handle(&error);
}
/**
* @brief Dynamically switch resolutions.
*
* @param streamProfile The resolution to switch to.
*/
void switchProfile(std::shared_ptr<StreamProfile> streamProfile) {
ob_error *error = nullptr;
ob_sensor_switch_profile(impl_, const_cast<ob_stream_profile_t *>(streamProfile->getImpl()), &error);
Error::handle(&error);
}
private:
static void frameCallback(ob_frame *frame, void *userData) {
auto sensor = static_cast<Sensor *>(userData);
sensor->callback_(std::make_shared<Frame>(frame));
}
public:
// The following interfaces are deprecated and are retained here for compatibility purposes.
OBSensorType type() const {
return getType();
}
std::vector<std::shared_ptr<Filter>> getRecommendedFilters() const {
return createRecommendedFilters();
}
};
class SensorList {
private:
ob_sensor_list_t *impl_ = nullptr;
public:
explicit SensorList(ob_sensor_list_t *impl) : impl_(impl) {}
~SensorList() noexcept {
ob_error *error = nullptr;
ob_delete_sensor_list(impl_, &error);
Error::handle(&error, false);
}
/**
* @brief Get the number of sensors.
*
* @return uint32_t The number of sensors.
*/
uint32_t getCount() const {
ob_error *error = nullptr;
auto count = ob_sensor_list_get_count(impl_, &error);
Error::handle(&error);
return count;
}
/**
* @brief Get the type of the specified sensor.
*
* @param index The sensor index.
* @return OBSensorType The sensor type.
*/
OBSensorType getSensorType(uint32_t index) const {
ob_error *error = nullptr;
auto type = ob_sensor_list_get_sensor_type(impl_, index, &error);
Error::handle(&error);
return type;
}
/**
* @brief Get a sensor by index number.
*
* @param index The sensor index. The range is [0, count-1]. If the index exceeds the range, an exception will be thrown.
* @return std::shared_ptr<Sensor> The sensor object.
*/
std::shared_ptr<Sensor> getSensor(uint32_t index) const {
ob_error *error = nullptr;
auto sensor = ob_sensor_list_get_sensor(impl_, index, &error);
Error::handle(&error);
return std::make_shared<Sensor>(sensor);
}
/**
* @brief Get a sensor by sensor type.
*
* @param sensorType The sensor type to obtain.
* @return std::shared_ptr<Sensor> A sensor object. If the specified sensor type does not exist, it will return empty.
*/
std::shared_ptr<Sensor> getSensor(OBSensorType sensorType) const {
ob_error *error = nullptr;
auto sensor = ob_sensor_list_get_sensor_by_type(impl_, sensorType, &error);
Error::handle(&error);
return std::make_shared<Sensor>(sensor);
}
public:
// The following interfaces are deprecated and are retained here for compatibility purposes.
uint32_t count() const {
return getCount();
}
OBSensorType type(uint32_t index) const {
return getSensorType(index);
}
};
} // namespace ob