Skip to main content

Robot

Struct Robot 

Source
pub struct Robot { /* private fields */ }
Expand description

A two-motor differential-drive robot controller.

The robot smoothly ramps motor speeds from the current value to the target in a background task. Call drive to set target speeds and stop to decelerate to zero.

§Shutdown

Await shutdown to close command admission, join the adjustment task and finish the final stop attempt. Stop failures are logged and retained in status. Dropping the last public handle requests best-effort asynchronous cleanup while the Tokio runtime remains alive; it does not wait for motor I/O.

Implementations§

Source§

impl Robot

Source

pub fn new( motor_board: Arc<Mutex<dyn MotorDriver>>, config: RobotConfig, ) -> Result<Arc<Self>, RobotError>

Create a new robot with the given motor driver and configuration.

Spawns an adjustment task and its cleanup task. They share internal state without retaining the public handle. Shutdown or last-handle drop requests cancellation; cleanup joins adjustment before attempting to stop all motors.

§Errors

Returns RobotError::Motor wrapping MotorError::Init if the configuration is invalid. No controller task or driver writes are started on validation failure; constructing the driver itself may access hardware.

Source

pub async fn drive(&self, left: f32, right: f32) -> Result<(), RobotError>

Set target motor speeds.

Finite values are clamped to [-1.0, 1.0], multiplied by the motor factors from RobotConfig, then clamped again to the supported output range. A non-finite input rejects the entire command without changing targets. Both targets are accepted atomically; success means target acceptance, not hardware application. The task ramps each motor independently and writes the motors sequentially from one paired target snapshot.

§Errors

Returns RobotError::Shutdown if admission closed without a fault. A latched failure returns RobotError::Motor wrapping MotorError::Pwm with the retained diagnostic; it takes precedence over shutdown. Returns RobotError::Motor wrapping MotorError::Pwm for a non-finite input, retaining the existing error API.

Source

pub async fn stop(&self) -> Result<(), RobotError>

Atomically set both target speeds to zero (motors ramp down independently).

§Errors

Returns RobotError::Shutdown after normal admission closure, or RobotError::Motor wrapping MotorError::Pwm with a latched failure.

Source

pub async fn status(&self) -> RobotStatus

Read a consistent snapshot of lifecycle, output certainty and failures.

Does not perform I/O. A successful drive accepts targets only; it does not confirm hardware application. A fault stays visible after cleanup and explicit shutdown, even when the final stop succeeds.

Source

pub async fn shutdown(&self)

Close command admission, join adjustment, then finish the final stop attempt.

Repeated/concurrent calls wait for the same cleanup. Once admission closes, dropping a shutdown future does not cancel cleanup. No adjustment writes occur after this method returns. It does not ramp down before stopping.

Driver failures are logged and retained in status; the legacy () return value does not confirm electrical stopping or mechanical standstill. An in-flight driver operation must finish before cleanup can proceed; blocked I/O can delay shutdown indefinitely. The Tokio runtime must remain alive for cleanup.

Trait Implementations§

Source§

impl Drop for Robot

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

§

impl !Freeze for Robot

§

impl !RefUnwindSafe for Robot

§

impl !UnwindSafe for Robot

§

impl Forget for Robot

§

impl Move for Robot

§

impl Send for Robot

§

impl Sync for Robot

§

impl Unpin for Robot

§

impl UnsafeUnpin for Robot

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more