@@ -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