@@ -213,40 +213,22 @@ Result<void, DxlError> Motor::changeID(uint8_t new_id)
213213 return result;
214214}
215215
216- Result<void , DxlError> Motor::setPositionControlMode ( )
216+ Result<void , DxlError> Motor::setOperatingMode (OperatingMode mode )
217217{
218218 Result<ControlTableItem, DxlError> item_result = getControlTableItem (" Operating Mode" );
219219 if (!item_result.isSuccess ()) {
220220 return item_result.error ();
221221 }
222222 const ControlTableItem & item = item_result.value ();
223- Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , 3 );
224- return result;
225- }
226-
227- Result<void , DxlError> Motor::setVelocityControlMode ()
228- {
229- Result<ControlTableItem, DxlError> item_result = getControlTableItem (" Operating Mode" );
230- if (!item_result.isSuccess ()) {
231- return item_result.error ();
232- }
233- const ControlTableItem & item = item_result.value ();
234- Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , 1 );
235- return result;
236- }
237-
238- Result<void , DxlError> Motor::setCurrentControlMode ()
239- {
240- Result<ControlTableItem, DxlError> item_result = getControlTableItem (" Operating Mode" );
241- if (!item_result.isSuccess ()) {
242- return item_result.error ();
223+ uint8_t mode_value = static_cast <uint8_t >(mode);
224+ Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , mode_value);
225+ if (!result.isSuccess ()) {
226+ return result.error ();
243227 }
244- const ControlTableItem & item = item_result.value ();
245- Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , 0 );
246228 return result;
247229}
248230
249- Result<void , DxlError> Motor::setTimeBasedProfile ( )
231+ Result<void , DxlError> Motor::setProfileConfiguration (ProfileConfiguration config )
250232{
251233 Result<ControlTableItem, DxlError> item_result = getControlTableItem (" Drive Mode" );
252234 if (!item_result.isSuccess ()) {
@@ -257,47 +239,20 @@ Result<void, DxlError> Motor::setTimeBasedProfile()
257239 if (!read_result.isSuccess ()) {
258240 return read_result.error ();
259241 }
260- uint8_t drive_mode = read_result.value ();
261- drive_mode |= 0b00000100 ;
262- Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , drive_mode);
263- return result;
264- }
265242
266- Result<void , DxlError> Motor::setVelocityBasedProfile ()
267- {
268- Result<ControlTableItem, DxlError> item_result = getControlTableItem (" Drive Mode" );
269- if (!item_result.isSuccess ()) {
270- return item_result.error ();
271- }
272- const ControlTableItem & item = item_result.value ();
273- auto read_result = connector_->read1ByteData (id_, item.address );
274- if (!read_result.isSuccess ()) {
275- return read_result.error ();
276- }
277243 uint8_t drive_mode = read_result.value ();
278- drive_mode &= 0b11111011 ;
279- Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , drive_mode);
280- return result;
281- }
244+ const uint8_t PROFILE_BIT_MASK = 0b00000100 ;
282245
283- Result<void , DxlError> Motor::setNormalDirection ()
284- {
285- Result<ControlTableItem, DxlError> item_result = getControlTableItem (" Drive Mode" );
286- if (!item_result.isSuccess ()) {
287- return item_result.error ();
288- }
289- const ControlTableItem & item = item_result.value ();
290- auto read_result = connector_->read1ByteData (id_, item.address );
291- if (!read_result.isSuccess ()) {
292- return read_result.error ();
246+ if (config == ProfileConfiguration::TIME_BASED) {
247+ drive_mode |= PROFILE_BIT_MASK;
248+ } else if (config == ProfileConfiguration::VELOCITY_BASED) {
249+ drive_mode &= ~PROFILE_BIT_MASK;
293250 }
294- uint8_t drive_mode = read_result.value ();
295- drive_mode &= 0b11111110 ;
296251 Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , drive_mode);
297252 return result;
298253}
299254
300- Result<void , DxlError> Motor::setReverseDirection ( )
255+ Result<void , DxlError> Motor::setDirection (Direction direction )
301256{
302257 Result<ControlTableItem, DxlError> item_result = getControlTableItem (" Drive Mode" );
303258 if (!item_result.isSuccess ()) {
@@ -309,7 +264,12 @@ Result<void, DxlError> Motor::setReverseDirection()
309264 return read_result.error ();
310265 }
311266 uint8_t drive_mode = read_result.value ();
312- drive_mode |= 0b00000001 ;
267+ const uint8_t DIRECTION_BIT_MASK = 0b00000001 ;
268+ if (direction == Direction::NORMAL) {
269+ drive_mode &= ~DIRECTION_BIT_MASK;
270+ } else if (direction == Direction::REVERSE) {
271+ drive_mode |= DIRECTION_BIT_MASK;
272+ }
313273 Result<void , DxlError> result = connector_->write1ByteData (id_, item.address , drive_mode);
314274 return result;
315275}
0 commit comments