The open source OpenXR runtime
at prediction-2 101 lines 2.7 kB view raw
1// Copyright 2022, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3/*! 4 * @file 5 * @brief Wrap float filters for C 6 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 7 * @ingroup aux_math 8 */ 9 10#include "m_lowpass_float.h" 11#include "m_lowpass_float.hpp" 12 13#include "util/u_logging.h" 14 15#include <memory> 16 17using xrt::auxiliary::math::LowPassIIRFilter; 18 19struct m_lowpass_float 20{ 21 m_lowpass_float(float cutoff_hz) : filter(cutoff_hz) {} 22 23 LowPassIIRFilter<float> filter; 24}; 25 26#define DEFAULT_CATCH(...) \ 27 catch (std::exception const &e) \ 28 { \ 29 U_LOG_E("Caught exception: %s", e.what()); \ 30 return __VA_ARGS__; \ 31 } \ 32 catch (...) \ 33 { \ 34 U_LOG_E("Caught exception"); \ 35 return __VA_ARGS__; \ 36 } 37 38struct m_lowpass_float * 39m_lowpass_float_create(float cutoff_hz) 40{ 41 try { 42 auto ret = std::make_unique<m_lowpass_float>(cutoff_hz); 43 return ret.release(); 44 } 45 DEFAULT_CATCH(nullptr) 46} 47 48void 49m_lowpass_float_add_sample(struct m_lowpass_float *mlf, float sample, timepoint_ns timestamp_ns) 50{ 51 try { 52 mlf->filter.addSample(sample, timestamp_ns); 53 } 54 DEFAULT_CATCH() 55} 56 57float 58m_lowpass_float_get_state(const struct m_lowpass_float *mlf) 59{ 60 61 try { 62 return mlf->filter.getState(); 63 } 64 DEFAULT_CATCH(0) 65} 66 67timepoint_ns 68m_lowpass_float_get_timestamp_ns(const struct m_lowpass_float *mlf) 69{ 70 try { 71 return mlf->filter.getTimestampNs(); 72 } 73 DEFAULT_CATCH(0) 74} 75 76bool 77m_lowpass_float_is_initialized(const struct m_lowpass_float *mlf) 78{ 79 80 try { 81 return mlf->filter.isInitialized(); 82 } 83 DEFAULT_CATCH(false) 84} 85 86void 87m_lowpass_float_destroy(struct m_lowpass_float **ptr_to_mlf) 88{ 89 try { 90 if (ptr_to_mlf == nullptr) { 91 return; 92 } 93 struct m_lowpass_float *mlf = *ptr_to_mlf; 94 if (mlf == nullptr) { 95 return; 96 } 97 delete mlf; 98 *ptr_to_mlf = nullptr; 99 } 100 DEFAULT_CATCH() 101}