1#![allow(unused)]
2use autocxx::{prelude::*, subclass::CppSubclassSelfOwnedDefault};
3use std::pin::Pin;
4
5macro_rules! pin {
7 ($value:expr $(,)?) => {
8 std::pin::Pin::new(&mut $value)
9 };
10}
11
12include_cpp! {
13 #include "GamepadMotion.hpp"
14 generate!("GamepadMotion")
15 generate!("GamepadMotionSettings")
16 generate!("GamepadMotionHelpers::GyroCalibration")
17 generate!("GamepadMotionHelpers::AutoCalibration")
18 generate!("GamepadMotionHelpers::Motion")
19 safety!(unsafe_ffi)
20}
21
22type CalibrationMode = ffi::GamepadMotionHelpers::CalibrationMode;
23
24pub struct GamepadMotion(UniquePtr<ffi::GamepadMotion>);
25
26impl GamepadMotion {
27 #[inline]
28 pub fn new() -> Self {
29 Self(ffi::GamepadMotion::new().within_unique_ptr())
30 }
31
32 #[inline]
33 pub fn gyro_player_space(&mut self, yaw_relax_factor: Option<f32>) -> [f32; 2] {
34 let (mut x, mut y) = (0f32, 0f32);
35 self.0
36 .pin_mut()
37 .GetPlayerSpaceGyro(pin!(x), pin!(y), yaw_relax_factor.unwrap_or(1.41));
38 [x, y]
39 }
40
41 #[inline]
42 pub fn gyro_calibrated(&mut self) -> [f32; 3] {
43 let (mut x, mut y, mut z) = (0f32, 0f32, 0f32);
44 self.0
45 .pin_mut()
46 .GetCalibratedGyro(pin!(x), pin!(y), pin!(z));
47 [x, y, z]
48 }
49
50 #[inline]
51 pub fn gyro_world_space(&mut self, side_reduc_thresh: Option<f32>) -> [f32; 2] {
52 let (mut x, mut y) = (0f32, 0f32);
53 self.0
54 .pin_mut()
55 .GetWorldSpaceGyro(pin!(x), pin!(y), side_reduc_thresh.unwrap_or(0.125));
56 [x, y]
57 }
58
59 #[inline]
60 pub fn process(&mut self, g: [f32; 3], a: [f32; 3], dt: &f32) -> &mut Self {
61 self.0
62 .pin_mut()
63 .ProcessMotion(g[0], g[1], g[2], a[0], a[1], a[2], *dt);
64 self
65 }
66
67 #[inline]
68 pub fn calib_mode_set(&mut self, c: CalibrationMode) {
69 self.0.pin_mut().SetCalibrationMode(c);
70 }
71
72 #[inline]
73 pub fn calib_mode(&mut self) -> CalibrationMode {
74 self.0.pin_mut().GetCalibrationMode()
75 }
76
77 #[inline]
78 pub fn calib_offset_set(&mut self, xyz: [f32; 3], w: i32) {
79 self.0
80 .pin_mut()
81 .SetCalibrationOffset(xyz[0], xyz[1], xyz[2], w.into());
82 }
83
84 #[inline]
85 pub fn calib_offset(&mut self) -> [f32; 3] {
86 let (mut x, mut y, mut z) = (0f32, 0f32, 0f32);
87 self.0
88 .pin_mut()
89 .GetCalibrationOffset(pin!(x), pin!(y), pin!(z));
90 [x, y, z]
91 }
92
93 #[inline]
94 pub fn orientation(&mut self) -> [f32; 4] {
95 let (mut x, mut y, mut z, mut w) = (0f32, 0f32, 0f32, 0f32);
96 self.0
97 .pin_mut()
98 .GetOrientation(pin!(w), pin!(x), pin!(y), pin!(z));
99 [x, y, z, w]
100 }
101
102 #[inline]
103 pub fn gravity(&mut self) -> [f32; 3] {
104 let (mut x, mut y, mut z) = (0f32, 0f32, 0f32);
105 self.0.pin_mut().GetGravity(pin!(x), pin!(y), pin!(z));
106 [x, y, z]
107 }
108
109 #[inline]
110 pub fn accel_processed(&mut self) -> [f32; 3] {
111 let (mut x, mut y, mut z) = (0f32, 0f32, 0f32);
112 self.0
113 .pin_mut()
114 .GetProcessedAcceleration(pin!(x), pin!(y), pin!(z));
115 [x, y, z]
116 }
117
118 #[inline]
119 pub fn calib_cont_start(&mut self) {
120 self.0.pin_mut().StartContinuousCalibration();
121 }
122
123 #[inline]
124 pub fn calib_cont_pause(&mut self) {
125 self.0.pin_mut().PauseContinuousCalibration();
126 }
127
128 #[inline]
129 pub fn calib_cont_reset(&mut self) {
130 self.0.pin_mut().ResetContinuousCalibration();
131 }
132
133 #[inline]
134 pub fn calib_auto_steady(&mut self) -> bool {
135 self.0.pin_mut().GetAutoCalibrationIsSteady()
136 }
137
138 #[inline]
139 pub fn calib_auto_confid(&mut self) -> f32 {
140 self.0.pin_mut().GetAutoCalibrationConfidence()
141 }
142
143 #[inline]
144 pub fn calib_auto_confid_set(&mut self, confid: f32) {
145 self.0.pin_mut().SetAutoCalibrationConfidence(confid);
146 }
147
148 #[inline]
149 pub fn reset(&mut self) {
150 self.0.pin_mut().Reset();
151 }
152
153 #[inline]
154 pub fn reset_motion(&mut self) {
155 self.0.pin_mut().ResetMotion();
156 }
157}
158
159struct Settings(UniquePtr<ffi::GamepadMotionSettings>);
160
161impl Settings {
162 #[inline]
163 pub fn new() -> Self {
164 Self(ffi::GamepadMotionSettings::new().within_unique_ptr())
165 }
166}
167
168struct AutoCalibration(UniquePtr<ffi::GamepadMotionHelpers::AutoCalibration>);
169
170impl AutoCalibration {
171 #[inline]
172 pub fn new() -> Self {
173 Self(ffi::GamepadMotionHelpers::AutoCalibration::new().within_unique_ptr())
174 }
175
176 #[inline]
177 pub fn steady(&mut self) -> bool {
178 self.0.pin_mut().IsSteady()
179 }
180
181 #[inline]
182 pub fn reset(&mut self) {
183 self.0.pin_mut().Reset();
184 }
185}
186
187struct GyroCalibration(UniquePtr<ffi::GamepadMotionHelpers::GyroCalibration>);
188
189struct Motion(UniquePtr<ffi::GamepadMotionHelpers::Motion>);
190
191struct Vec(UniquePtr<ffi::GamepadMotionHelpers::Vec>);
192
193#[cfg(test)]
194mod tests {
195 use super::*;
196}