Skip to content

Commit 3a553a4

Browse files
Merge pull request #97 from kacper-uminski/feetech-offset
Fix offset translation for STS servos.
2 parents 30eedc1 + 2404d89 commit 3a553a4

File tree

1 file changed

+56
-1
lines changed

1 file changed

+56
-1
lines changed

src/servo/feetech/sts3215.rs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ generate_servo!(
2828
reg: (ccw_dead_zone, rw, 27, u8, None),
2929
reg: (protection_current, rw, 28, u16, None),
3030
reg: (angular_resolution, rw, 30, u8, None),
31-
reg: (offset, rw, 31, i16, AnglePosition),
31+
reg: (offset, rw, 31, u16, Offset),
3232
reg: (mode, rw, 33, u8, None),
3333
reg: (protective_torque, rw, 34, u8, None),
3434
reg: (protection_time, rw, 35, u8, None),
@@ -76,3 +76,58 @@ impl Conversion for Velocity {
7676
value as u16
7777
}
7878
}
79+
80+
pub struct Offset;
81+
const MAX_MAGNITUDE: u16 = 2047;
82+
83+
impl Conversion for Offset {
84+
type RegisterType = u16;
85+
type UsiType = f64;
86+
87+
fn from_raw(raw: u16) -> f64 {
88+
use std::f64::consts::PI;
89+
let negative = (raw >> 11) == 1;
90+
let magnitude = raw % (MAX_MAGNITUDE + 1);
91+
92+
let float_magnitude = PI * f64::from(magnitude) / f64::from(MAX_MAGNITUDE);
93+
94+
if negative {
95+
-float_magnitude
96+
} else {
97+
float_magnitude
98+
}
99+
}
100+
101+
fn to_raw(value: f64) -> u16 {
102+
use std::f64::consts::PI;
103+
104+
let magnitude = (value.abs() * f64::from(MAX_MAGNITUDE) / PI) as u16;
105+
106+
if value.is_sign_negative() {
107+
magnitude | (1 << 11)
108+
} else {
109+
magnitude
110+
}
111+
}
112+
}
113+
114+
#[cfg(test)]
115+
mod tests {
116+
#[test]
117+
fn offset_conversions() {
118+
use crate::servo::{conversion::Conversion, feetech::sts3215::Offset};
119+
use std::f64::consts::{FRAC_PI_2, PI};
120+
121+
assert_eq!(Offset::to_raw(0.0), 0);
122+
assert_eq!(Offset::to_raw(PI), 2047);
123+
assert_eq!(Offset::to_raw(-PI), 4095);
124+
assert_eq!(Offset::to_raw(FRAC_PI_2), 1023);
125+
assert_eq!(Offset::to_raw(-FRAC_PI_2), 3071);
126+
127+
assert_eq!(Offset::from_raw(0), 0.0);
128+
assert_eq!(Offset::from_raw(2047), PI);
129+
assert_eq!(Offset::from_raw(4095), -PI);
130+
assert_eq!(Offset::from_raw(1023), 1.5700289617109715); // About PI/2
131+
assert_eq!(Offset::from_raw(3071), -1.5700289617109715); // About -PI/2
132+
}
133+
}

0 commit comments

Comments
 (0)