use builder::{HerkulexMessage, MessageBuilder};
use message::{JogColor, JogMode};
use addr::*;
use core::cmp::min;
#[derive(Copy, Clone, Debug)]
pub struct Servo {
id: u8,
}
impl Default for Servo {
fn default() -> Self {
Servo { id: 0xFD }
}
}
impl Servo {
pub fn new(id: u8) -> Servo {
Servo { id }
}
pub fn set_id(&mut self, id: u8) {
self.id = id;
}
pub fn id(&self) -> u8 {
self.id
}
pub fn reboot(&self) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id).reboot().build()
}
pub fn set_position(&self, position: u16) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id)
.s_jog(
60,
JogMode::Normal {
position: min(position, 1023),
},
JogColor::Blue,
self.id,
)
.build()
}
pub fn set_speed(&self, speed: u16) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id)
.s_jog(
60,
JogMode::Continuous {
speed: min(speed, 1023),
},
JogColor::Blue,
self.id,
)
.build()
}
pub fn stat(&self) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id).stat().build()
}
pub fn ram_write(&self, addr: WritableRamAddr) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id).write_ram(addr).build()
}
pub fn eep_write(&self, addr: WritableEEPAddr) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id).write_eep(addr).build()
}
pub fn ram_request(&self, addr: ReadableRamAddr) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id)
.read_ram(addr, addr.bytes())
.build()
}
pub fn eep_request(&self, addr: ReadableEEPAddr) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id)
.read_eep(addr, addr.bytes())
.build()
}
pub fn enable_torque(&self) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id)
.write_ram(WritableRamAddr::TorqueControl(0x60))
.build()
}
pub fn disable_torque(&self) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id)
.write_ram(WritableRamAddr::TorqueControl(0))
.build()
}
pub fn clear_errors(&self) -> HerkulexMessage {
MessageBuilder::new_with_id(self.id)
.write_ram(WritableRamAddr::StatusError(0))
.build()
}
}