omnitiles/motors/
tilt_motor.rs1use crate::drivers::Gim6010;
10
11pub struct TiltMotor<const DEV_ADDR: u16> {
16 motor: Gim6010<DEV_ADDR>,
17 gear_ratio: f32,
18}
19
20impl<const DEV_ADDR: u16> TiltMotor<DEV_ADDR> {
21 pub fn new(motor: Gim6010<DEV_ADDR>, gear_ratio: f32) -> Self {
23 Self { motor, gear_ratio }
24 }
25
26 #[inline]
28 pub fn inner_motor(&mut self) -> &mut Gim6010<DEV_ADDR> {
29 &mut self.motor
30 }
31
32 #[inline]
34 pub fn shaft_angle_rad_from_raw(&self, raw: u16) -> f32 {
35 Gim6010::<DEV_ADDR>::raw_angle_to_rad(raw)
36 }
37
38 #[inline]
40 pub fn shaft_angle_deg_from_raw(&self, raw: u16) -> f32 {
41 Gim6010::<DEV_ADDR>::raw_angle_to_deg(raw)
42 }
43
44 #[inline]
46 pub fn raw_for_shaft_angle_rad(&self, angle_rad: f32) -> u16 {
47 Gim6010::<DEV_ADDR>::angle_rad_to_raw(angle_rad)
48 }
49
50 #[inline]
52 pub fn raw_for_shaft_angle_deg(&self, angle_deg: f32) -> u16 {
53 Gim6010::<DEV_ADDR>::angle_deg_to_raw(angle_deg)
54 }
55
56 #[inline]
58 pub fn tile_angle_rad_from_raw(&self, raw: u16) -> f32 {
59 let shaft = self.shaft_angle_rad_from_raw(raw);
60 shaft / self.gear_ratio
61 }
62
63 #[inline]
65 pub fn tile_angle_deg_from_raw(&self, raw: u16) -> f32 {
66 let shaft_deg = self.shaft_angle_deg_from_raw(raw);
67 shaft_deg / self.gear_ratio
68 }
69
70 #[inline]
72 pub fn raw_for_tile_angle_rad(&self, tile_angle_rad: f32) -> u16 {
73 let shaft = tile_angle_rad * self.gear_ratio;
74 self.raw_for_shaft_angle_rad(shaft)
75 }
76
77 #[inline]
79 pub fn raw_for_tile_angle_deg(&self, tile_angle_deg: f32) -> u16 {
80 let shaft_deg = tile_angle_deg * self.gear_ratio;
81 self.raw_for_shaft_angle_deg(shaft_deg)
82 }
83}