embedded_aim_motor/motor/
parameters.rs1use super::Motor;
2use crate::{AlarmCode, Direction, Error, Result};
3use embassy_time::Duration;
4
5impl<I: embedded_io_async::Read + embedded_io_async::Write> Motor<I> {
6 pub async fn modbus_enabled(&mut self) -> Result<bool> {
7 self.read_one_word_parameter(0x00, |v| match v {
8 0 => Ok(false),
9 1 => Ok(true),
10 _ => Err(Error::UnexpectedResponseData),
11 })
12 .await
13 }
14
15 pub async fn set_modbus_enabled(&mut self, value: bool) -> Result<()> {
16 self.write_one_word_parameter(0x00, value, |v| match v {
17 false => Ok(0),
18 true => Ok(1),
19 })
20 .await
21 }
22
23 pub async fn drive_enabled(&mut self) -> Result<bool> {
24 self.read_one_word_parameter(0x01, |v| match v {
25 0 => Ok(false),
26 1 => Ok(true),
27 _ => Err(Error::UnexpectedResponseData),
28 })
29 .await
30 }
31
32 pub async fn set_drive_enabled(&mut self, value: bool) -> Result<()> {
33 self.write_one_word_parameter(0x01, value, |v| match v {
34 false => Ok(0),
35 true => Ok(1),
36 })
37 .await
38 }
39
40 pub async fn target_rpm(&mut self) -> Result<u16> {
45 self.read_one_word_parameter(0x02, Ok).await
46 }
47
48 pub async fn set_target_rpm(&mut self, value: u16) -> Result<()> {
54 self.write_one_word_parameter(0x02, value, Ok).await
55 }
56
57 pub async fn acceleration(&mut self) -> Result<u16> {
58 self.read_one_word_parameter(0x03, Ok).await
59 }
60
61 pub async fn set_acceleration(&mut self, value: u16) -> Result<()> {
62 self.write_one_word_parameter(0x03, value, Ok).await
63 }
64
65 pub async fn weak_magnetic_angle(&mut self) -> Result<u16> {
66 self.read_one_word_parameter(0x04, Ok).await
67 }
68
69 pub async fn set_weak_magnetic_angle(&mut self, value: u16) -> Result<()> {
70 self.write_one_word_parameter(0x04, value, Ok).await
71 }
72
73 pub async fn speed_kp(&mut self) -> Result<u16> {
74 self.read_one_word_parameter(0x05, Ok).await
75 }
76
77 pub async fn set_speed_kp(&mut self, value: u16) -> Result<()> {
78 self.write_one_word_parameter(0x05, value, Ok).await
79 }
80
81 pub async fn speed_i_time(&mut self) -> Result<Duration> {
82 self.read_one_word_parameter(0x06, |v| Ok(Duration::from_millis(v.into())))
83 .await
84 }
85
86 pub async fn set_speed_i_time(&mut self, value: Duration) -> Result<()> {
87 self.write_one_word_parameter(0x06, value, |v| Ok(v.as_millis() as u16))
88 .await
89 }
90
91 pub async fn position_kp(&mut self) -> Result<u16> {
92 self.read_one_word_parameter(0x07, Ok).await
93 }
94
95 pub async fn set_position_kp(&mut self, value: u16) -> Result<()> {
96 self.write_one_word_parameter(0x07, value, Ok).await
97 }
98
99 pub async fn speed_feed(&mut self) -> Result<f32> {
100 self.read_one_word_parameter(0x08, |v| Ok(v as f32 / 327.))
101 .await
102 }
103
104 pub async fn set_speed_feed(&mut self, value: f32) -> Result<()> {
105 self.write_one_word_parameter(0x08, value, |v| Ok((v * 327.) as u16))
106 .await
107 }
108
109 pub async fn dir_polarity(&mut self) -> Result<Direction> {
110 self.read_one_word_parameter(0x09, |v| match v {
111 0 => Ok(Direction::CounterClockwise),
112 1 => Ok(Direction::Clockwise),
113 _ => Err(Error::UnexpectedResponseData),
114 })
115 .await
116 }
117
118 pub async fn set_dir_polarity(&mut self, value: Direction) -> Result<()> {
119 self.write_one_word_parameter(0x09, value, |v| match v {
120 Direction::CounterClockwise => Ok(0),
121 Direction::Clockwise => Ok(1),
122 })
123 .await
124 }
125
126 pub async fn electronic_gear_numerator(&mut self) -> Result<u16> {
127 self.read_one_word_parameter(0x0A, Ok).await
128 }
129
130 pub async fn set_electronic_gear_numerator(&mut self, value: u16) -> Result<()> {
135 self.write_one_word_parameter(0x0A, value, Ok).await
136 }
137
138 pub async fn electronic_gear_denominator(&mut self) -> Result<u16> {
139 self.read_one_word_parameter(0x0B, Ok).await
140 }
141
142 pub async fn set_electronic_gear_denominator(&mut self, value: u16) -> Result<()> {
146 self.write_one_word_parameter(0x0B, value, Ok).await
147 }
148
149 pub async fn target_position(&mut self) -> Result<u32> {
150 self.read_two_word_parameter(0x0C, |msb, lsb| {
151 let msb = msb.to_be_bytes();
152 let lsb = lsb.to_be_bytes();
153 Ok(u32::from_be_bytes([lsb[0], lsb[1], msb[0], msb[1]]))
154 })
155 .await
156 }
157
158 pub async fn set_target_position(&mut self, value: u32) -> Result<()> {
159 self.write_two_word_parameter(0x0C, value, |v| {
160 let data = v.to_be_bytes();
161 let msb = u16::from_be_bytes([data[0], data[1]]);
162 let lsb = u16::from_be_bytes([data[2], data[3]]);
163 Ok([lsb, msb])
164 })
165 .await
166 }
167
168 pub async fn alarm_code(&mut self) -> Result<Option<AlarmCode>> {
169 self.read_one_word_parameter(0x0E, |v| match v {
170 0 => Ok(None),
171 0x10 => Ok(Some(AlarmCode::PowerFailure)),
172 0x12 => Ok(Some(AlarmCode::Overflow)),
173 0x14 => Ok(Some(AlarmCode::Block)),
174 0x15 => Ok(Some(AlarmCode::Overpressure)),
175 _ => Err(Error::UnexpectedResponseData),
176 })
177 .await
178 }
179
180 pub async fn current(&mut self) -> Result<f32> {
181 self.read_one_word_parameter(0x0F, |v| Ok(v as f32 / 2000.))
182 .await
183 }
184
185 pub async fn speed(&mut self) -> Result<f32> {
186 self.read_one_word_parameter(0x10, |v| Ok(v as f32 / 10.))
187 .await
188 }
189
190 pub async fn voltage(&mut self) -> Result<f32> {
191 self.read_one_word_parameter(0x11, |v| Ok(v as f32 / 327.))
192 .await
193 }
194
195 pub async fn temperature(&mut self) -> Result<u16> {
196 self.read_one_word_parameter(0x12, Ok).await
197 }
198
199 pub async fn pwm(&mut self) -> Result<u16> {
200 self.read_one_word_parameter(0x13, Ok).await
201 }
202
203 pub async fn parameter_save_flag(&mut self) -> Result<bool> {
204 self.read_one_word_parameter(0x14, |v| match v {
205 0 => Ok(false),
206 1 => Ok(true),
207 _ => Err(Error::UnexpectedResponseData),
208 })
209 .await
210 }
211
212 pub async fn set_parameter_save_flag(&mut self, value: bool) -> Result<()> {
213 self.write_one_word_parameter(0x14, value, |v| match v {
214 false => Ok(0),
215 true => Ok(1),
216 })
217 .await
218 }
219
220 pub async fn device_address(&mut self) -> Result<u16> {
221 self.read_one_word_parameter(0x15, Ok).await
222 }
223
224 pub async fn absolute_position(&mut self) -> Result<u32> {
225 self.read_two_word_parameter(0x16, |msb, lsb| {
226 let msb = msb.to_be_bytes();
227 let lsb = lsb.to_be_bytes();
228 Ok(u32::from_be_bytes([lsb[0], lsb[1], msb[0], msb[1]]))
229 })
230 .await
231 }
232
233 pub async fn set_absolute_position(&mut self, value: u32) -> Result<()> {
234 self.write_two_word_parameter(0x16, value, |v| {
235 let data = v.to_be_bytes();
236 let msb = u16::from_be_bytes([data[0], data[1]]);
237 let lsb = u16::from_be_bytes([data[2], data[3]]);
238 Ok([lsb, msb])
239 })
240 .await
241 }
242
243 pub async fn still_maximum_allowed_current(&mut self) -> Result<u16> {
244 self.read_one_word_parameter(0x18, Ok).await
245 }
246
247 pub async fn set_still_maximum_allowed_current(&mut self, value: u16) -> Result<()> {
248 self.write_one_word_parameter(0x18, value, Ok).await
249 }
250
251 pub async fn specific_function(&mut self) -> Result<u16> {
252 self.read_one_word_parameter(0x19, Ok).await
253 }
254
255 pub async fn set_specific_function(&mut self, value: u16) -> Result<()> {
256 self.write_one_word_parameter(0x19, value, Ok).await
257 }
258}