#ifndef _LIVOX_GEN1_PCLOUD_AMBIENCE_QUALE_IFACE_API_H #define _LIVOX_GEN1_PCLOUD_AMBIENCE_QUALE_IFACE_API_H #include #include #include #include #include #include namespace smo { namespace stim_buff { enum ParamComparatorOp { OP_CMP_GT, OP_CMP_LT, }; struct ParamComparator { ParamComparatorOp op; uint32_t value; bool operator()(float passbandMetricVal) const { switch (op) { case OP_CMP_GT: return passbandMetricVal > static_cast(value); case OP_CMP_LT: return passbandMetricVal < static_cast(value); } throw std::runtime_error("Unsupported ParamComparatorOp"); } }; struct PcloudAmbiencePassbandComparators { std::optional lt; std::optional gt; }; /* Both `passband-count-lt-val` and `passband-count-gt-val` are permitted * simultaneously on a pcloudAmbience qualeIfaceApi: the lt comparator * typically feeds a postrin(...) segment (triggering on unusually low * counts), and the gt comparator typically feeds a negtrin(...) segment * (triggering on unusually high counts). */ inline PcloudAmbiencePassbandComparators parsePcloudAmbiencePassbandComparators( const std::shared_ptr& deviceAttachmentSpec) { const auto& params = deviceAttachmentSpec->qualeIfaceApiParams; constexpr int kParamNotSpecified = -1; const int gtVal = device::DeviceAttachmentSpec::parseOptionalParamAsInt( params, "passband-count-gt-val", kParamNotSpecified); const int ltVal = device::DeviceAttachmentSpec::parseOptionalParamAsInt( params, "passband-count-lt-val", kParamNotSpecified); PcloudAmbiencePassbandComparators out; if (gtVal != kParamNotSpecified) { out.gt = ParamComparator{ .op = OP_CMP_GT, .value = static_cast(gtVal), }; } if (ltVal != kParamNotSpecified) { out.lt = ParamComparator{ .op = OP_CMP_LT, .value = static_cast(ltVal), }; } return out; } } // namespace stim_buff } // namespace smo #endif // _LIVOX_GEN1_PCLOUD_AMBIENCE_QUALE_IFACE_API_H