The open source OpenXR runtime
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}