1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
//! A Rust port of the popular [`AccelStepper`][original] Arduino stepper //! library. //! //! # Basic Usage //! //! The most common way of using this crate is by driving an axis to a //! particular location. //! //! ```rust //! use accel_stepper::{Driver, SystemClock}; //! # use core::time::Duration; //! # use core::cell::RefCell; //! //! let mut axis = Driver::new(); //! // Make sure to set your device's motion parameters //! axis.set_max_speed(500.0); //! axis.set_acceleration(100.0); //! //! // The axis needs a clock for timing purposes. This could be an //! // `accel_stepper::OperatingSystemClock` when compiled with the `std` //! // feature, or your device's external oscillator //! //! #[derive(Debug, Default)] //! struct TickingClock(RefCell<Duration>); //! //! impl SystemClock for TickingClock { //! fn elapsed(&self) -> Duration { //! let mut ticks = self.0.borrow_mut(); //! *ticks = *ticks + Duration::from_millis(10); //! ticks.clone() //! } //! } //! //! let clock = TickingClock::default(); //! //! let mut forward = 0; //! let mut back = 0; //! //! { //! // for testing purposes, we'll create a Device which counts the number //! // of forward/backward steps //! let mut dev = accel_stepper::func_device(|| forward += 1, || back += 1); //! //! // set the desired location //! axis.move_to(17); //! //! // keep polling the axis until it reaches that location //! while axis.is_running() { //! axis.poll(&mut dev, &clock)?; //! } //! } //! //! // we should have arrived at our destination //! assert_eq!(17, axis.current_position()); //! //! // it takes 17 steps forward to reach position 17 //! assert_eq!(17, forward); //! assert_eq!(0, back); //! # Result::<(), Box<dyn std::error::Error>>::Ok(()) //! ``` //! //! # Cargo Features //! //! To minimise compile time and code size, this crate uses cargo features. //! //! - `std` - Enable functionality which depends on the standard library (e.g. //! the OS clock) //! - `hal` - Enable functionality which implements [`Device`] on top of traits //! from the [`embedded-hal`][hal] crate. //! //! [original]: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html //! [hal]: https://crates.io/crates/embedded-hal #![cfg_attr(not(feature = "std"), no_std)] #[cfg(all(not(feature = "std"), test))] #[macro_use] extern crate std; mod clock; mod device; mod driver; #[cfg(feature = "hal")] mod hal_devices; mod multi_driver; mod utils; pub use crate::{ clock::SystemClock, device::{fallible_func_device, func_device, Device, StepContext}, driver::Driver, multi_driver::MultiDriver, utils::CummulativeSteps, }; #[cfg(feature = "std")] pub use crate::clock::OperatingSystemClock; #[cfg(feature = "hal")] pub use crate::hal_devices::*;