#include "Astra2PropertyAccessors.hpp"
#include "frameprocessor/FrameProcessor.hpp"
#include "sensor/video/DisparityBasedSensor.hpp"
#include "IDeviceComponent.hpp"
namespace libobsensor {
Astra2Disp2DepthPropertyAccessor::Astra2Disp2DepthPropertyAccessor(IDevice *owner)
: owner_(owner), hwDisparityToDepthEnabled_(true), swDisparityToDepthEnabled_(false), currentDepthUnitLevel_(0) {}
void Astra2Disp2DepthPropertyAccessor::setPropertyValue(uint32_t propertyId, const OBPropertyValue &value) {
switch(propertyId) {
case OB_PROP_SDK_DISPARITY_TO_DEPTH_BOOL: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
processor->setPropertyValue(propertyId, value);
} break;
case OB_PROP_DISPARITY_TO_DEPTH_BOOL: {
if(value.intValue == 1 && std::find(hwD2DSupportList_.cbegin(), hwD2DSupportList_.cend(), currentDepthUnitLevel_) == hwD2DSupportList_.end()) {
OBPropertyValue precisionLevel;
precisionLevel.intValue = hwD2DSupportList_.front();
setPropertyValue(OB_PROP_DEPTH_PRECISION_LEVEL_INT, precisionLevel);
}
auto propertyAccessor = owner_->getComponentT<IBasicPropertyAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
propertyAccessor->setPropertyValue(propertyId, value);
hwDisparityToDepthEnabled_ = static_cast<bool>(value.intValue);
markOutputDisparityFrame(!hwDisparityToDepthEnabled_);
} break;
case OB_PROP_DEPTH_PRECISION_LEVEL_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
OBPropertyValue swDisparityEnable;
processor->getPropertyValue(OB_PROP_SDK_DISPARITY_TO_DEPTH_BOOL, &swDisparityEnable);
if(swDisparityEnable.intValue == 1) {
processor->setPropertyValue(propertyId, value);
}
else {
auto commandPort = owner_->getComponentT<IBasicPropertyAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
commandPort->setPropertyValue(propertyId, value);
}
auto sensor = owner_->getComponentT<DisparityBasedSensor>(OB_DEV_COMPONENT_DEPTH_SENSOR, false);
if(sensor) {
auto depthUnit = utils::depthPrecisionLevelToUnit(static_cast<OBDepthPrecisionLevel>(value.intValue));
sensor->setDepthUnit(depthUnit);
}
currentDepthUnitLevel_ = value.intValue;
} break;
default: {
auto commandPort = owner_->getComponentT<IBasicPropertyAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
commandPort->setPropertyValue(propertyId, value);
} break;
}
}
void Astra2Disp2DepthPropertyAccessor::getPropertyValue(uint32_t propertyId, OBPropertyValue *value) {
switch(propertyId) {
case OB_PROP_SDK_DISPARITY_TO_DEPTH_BOOL: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
processor->getPropertyValue(propertyId, value);
} break;
case OB_PROP_DISPARITY_TO_DEPTH_BOOL: {
value->intValue = hwDisparityToDepthEnabled_;
} break;
case OB_PROP_DEPTH_PRECISION_LEVEL_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
OBPropertyValue swDisparityEnable;
processor->getPropertyValue(OB_PROP_SDK_DISPARITY_TO_DEPTH_BOOL, &swDisparityEnable);
if(swDisparityEnable.intValue == 1) {
processor->getPropertyValue(propertyId, value);
}
else {
auto commandPort = owner_->getComponentT<IBasicPropertyAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
commandPort->getPropertyValue(propertyId, value);
}
} break;
default: {
auto commandPort = owner_->getComponentT<IBasicPropertyAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
commandPort->getPropertyValue(propertyId, value);
} break;
}
}
void Astra2Disp2DepthPropertyAccessor::getPropertyRange(uint32_t propertyId, OBPropertyRange *range) {
switch(propertyId) {
case OB_PROP_SDK_DISPARITY_TO_DEPTH_BOOL: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
processor->getPropertyRange(propertyId, range);
} break;
case OB_PROP_DISPARITY_TO_DEPTH_BOOL: {
range->min.intValue = 0;
range->max.intValue = 1;
range->step.intValue = 1;
range->def.intValue = 1;
range->cur.intValue = static_cast<int32_t>(hwDisparityToDepthEnabled_);
} break;
case OB_PROP_DEPTH_PRECISION_LEVEL_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
OBPropertyValue swDisparityEnable;
processor->getPropertyValue(OB_PROP_SDK_DISPARITY_TO_DEPTH_BOOL, &swDisparityEnable);
if(swDisparityEnable.intValue == 1) {
processor->getPropertyRange(propertyId, range);
}
else {
auto commandPort = owner_->getComponentT<IBasicPropertyAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
commandPort->getPropertyRange(propertyId, range);
}
} break;
default: {
auto commandPort = owner_->getComponentT<IBasicPropertyAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
commandPort->getPropertyRange(propertyId, range);
} break;
}
}
void Astra2Disp2DepthPropertyAccessor::markOutputDisparityFrame(bool enable) {
auto sensor = owner_->getComponentT<DisparityBasedSensor>(OB_DEV_COMPONENT_DEPTH_SENSOR, false);
if(sensor) {
sensor->markOutputDisparityFrame(enable);
}
}
void Astra2Disp2DepthPropertyAccessor::setStructureData(uint32_t propertyId, const std::vector<uint8_t> &data) {
utils::unusedVar(data);
if(propertyId == OB_STRUCT_DEPTH_PRECISION_SUPPORT_LIST) {
throw invalid_value_exception("OB_STRUCT_DEPTH_PRECISION_SUPPORT_LIST is read-only");
}
throw invalid_value_exception(utils::string::to_string() << "unsupported property id:" << propertyId);
}
const std::vector<uint8_t> &Astra2Disp2DepthPropertyAccessor::getStructureData(uint32_t propertyId) {
if(propertyId == OB_STRUCT_DEPTH_PRECISION_SUPPORT_LIST) {
if(hwDisparityToDepthEnabled_) {
static std::vector<uint16_t> hwD2DSupportList = { OB_PRECISION_0MM8, OB_PRECISION_0MM4, OB_PRECISION_0MM1 };
static std::vector<uint8_t> hwD2DSupportListBytes(reinterpret_cast<uint8_t *>(hwD2DSupportList.data()),
reinterpret_cast<uint8_t *>(hwD2DSupportList.data()) + hwD2DSupportList.size() * 2);
return hwD2DSupportListBytes;
}
else {
static std::vector<uint16_t> swD2DSupportList = { OB_PRECISION_1MM, OB_PRECISION_0MM8, OB_PRECISION_0MM4, OB_PRECISION_0MM2, OB_PRECISION_0MM1 };
static std::vector<uint8_t> swD2DSupportListBytes(reinterpret_cast<uint8_t *>(swD2DSupportList.data()),
reinterpret_cast<uint8_t *>(swD2DSupportList.data()) + swD2DSupportList.size() * 2);
return swD2DSupportListBytes;
}
}
throw invalid_value_exception(utils::string::to_string() << "unsupported property id:" << propertyId);
}
Astra2TempPropertyAccessor::Astra2TempPropertyAccessor(IDevice *owner) : owner_(owner) {}
void Astra2TempPropertyAccessor::setStructureData(uint32_t propertyId, const std::vector<uint8_t> &data) {
utils::unusedVar(propertyId);
utils::unusedVar(data);
throw unsupported_operation_exception("Temperature params readonly!");
}
const std::vector<uint8_t> &Astra2TempPropertyAccessor::getStructureData(uint32_t propertyId) {
utils::unusedVar(propertyId);
tempData_.resize(sizeof(OBDeviceTemperature));
auto commandPort = owner_->getComponentT<IStructureDataAccessor>(OB_DEV_COMPONENT_MAIN_PROPERTY_ACCESSOR);
const std::vector<uint8_t> tempData = commandPort->getStructureData(OB_STRUCT_DEVICE_TEMPERATURE);
OBDeviceTemperature tempParam;
memcpy(&tempParam, tempData.data(), sizeof(OBDeviceTemperature));
tempParam.irLeftTemp = 0;
tempParam.irRightTemp = 0;
tempParam.chipBottomTemp = 0;
tempParam.chipTopTemp = 0;
memcpy(tempData_.data(), &tempParam, sizeof(OBDeviceTemperature));
return tempData_;
}
Astra2FrameTransformPropertyAccessor::Astra2FrameTransformPropertyAccessor(IDevice *owner) : owner_(owner) {}
void Astra2FrameTransformPropertyAccessor::setPropertyValue(uint32_t propertyId, const OBPropertyValue &value) {
switch(propertyId) {
case OB_PROP_DEPTH_MIRROR_BOOL:
case OB_PROP_DEPTH_FLIP_BOOL:
case OB_PROP_DEPTH_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
processor->setPropertyValue(propertyId, value);
} break;
case OB_PROP_COLOR_MIRROR_BOOL:
case OB_PROP_COLOR_FLIP_BOOL:
case OB_PROP_COLOR_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_COLOR_FRAME_PROCESSOR);
processor->setPropertyValue(propertyId, value);
} break;
case OB_PROP_IR_MIRROR_BOOL:
case OB_PROP_IR_FLIP_BOOL:
case OB_PROP_IR_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_IR_FRAME_PROCESSOR);
if(propertyId == OB_PROP_IR_MIRROR_BOOL) {
OBPropertyValue correctValue = value;
correctValue.intValue = !correctValue.intValue;
processor->setPropertyValue(propertyId, correctValue);
}
else {
processor->setPropertyValue(propertyId, value);
}
} break;
default: {
throw invalid_value_exception("Invalid property id");
}
}
}
void Astra2FrameTransformPropertyAccessor::getPropertyValue(uint32_t propertyId, OBPropertyValue *value) {
if(!value) {
LOG_DEBUG("Null value pointer, abort property access");
return;
}
memset(value, 0, sizeof(OBPropertyValue));
switch(propertyId) {
case OB_PROP_DEPTH_MIRROR_BOOL:
case OB_PROP_DEPTH_FLIP_BOOL:
case OB_PROP_DEPTH_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
processor->getPropertyValue(propertyId, value);
} break;
case OB_PROP_COLOR_MIRROR_BOOL:
case OB_PROP_COLOR_FLIP_BOOL:
case OB_PROP_COLOR_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_COLOR_FRAME_PROCESSOR);
processor->getPropertyValue(propertyId, value);
} break;
case OB_PROP_IR_MIRROR_BOOL:
case OB_PROP_IR_FLIP_BOOL:
case OB_PROP_IR_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_IR_FRAME_PROCESSOR);
processor->getPropertyValue(propertyId, value);
if(propertyId == OB_PROP_IR_MIRROR_BOOL) {
value->intValue = !value->intValue;
}
} break;
default: {
throw invalid_value_exception("Invalid property id");
}
}
}
void Astra2FrameTransformPropertyAccessor::getPropertyRange(uint32_t propertyId, OBPropertyRange *range) {
if(range == nullptr) {
LOG_DEBUG("Null range pointer, abort property access");
return;
}
memset(range, 0, sizeof(OBPropertyRange));
switch(propertyId) {
case OB_PROP_DEPTH_MIRROR_BOOL:
case OB_PROP_DEPTH_FLIP_BOOL:
case OB_PROP_DEPTH_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_DEPTH_FRAME_PROCESSOR);
processor->getPropertyRange(propertyId, range);
} break;
case OB_PROP_COLOR_MIRROR_BOOL:
case OB_PROP_COLOR_FLIP_BOOL:
case OB_PROP_COLOR_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_COLOR_FRAME_PROCESSOR);
processor->getPropertyRange(propertyId, range);
} break;
case OB_PROP_IR_MIRROR_BOOL:
case OB_PROP_IR_FLIP_BOOL:
case OB_PROP_IR_ROTATE_INT: {
auto processor = owner_->getComponentT<FrameProcessor>(OB_DEV_COMPONENT_IR_FRAME_PROCESSOR);
processor->getPropertyRange(propertyId, range);
if(propertyId == OB_PROP_IR_MIRROR_BOOL) {
range->cur.intValue = !range->cur.intValue;
}
} break;
default: {
throw invalid_value_exception("Invalid property id");
}
}
}
}