#![deny(unsafe_code)]
#![no_std]
#[cfg(feature = "std")]
extern crate std;
mod base;
mod backends {
#[cfg(feature = "i2c")]
pub mod i2c;
#[cfg(feature = "serial")]
pub mod serial;
#[cfg(feature = "usb")]
pub mod usb;
}
#[macro_use]
extern crate num_derive;
#[doc(inline)]
#[cfg(feature = "i2c")]
pub use backends::i2c::TicI2C;
#[doc(inline)]
#[cfg(feature = "serial")]
pub use backends::serial::TicSerial;
#[doc(inline)]
#[cfg(feature = "usb")]
pub use backends::usb::TicUsb;
#[doc(inline)]
#[cfg(feature = "usb")]
pub use backends::usb;
#[doc(inline)]
pub use base::TicBase;
const TIC_03A_CURRENT_TABLE: [u16; 33] = [
0, 1, 174, 343, 495, 634, 762, 880, 990, 1092, 1189, 1281, 1368, 1452, 1532, 1611, 1687, 1762,
1835, 1909, 1982, 2056, 2131, 2207, 2285, 2366, 2451, 2540, 2634, 2734, 2843, 2962, 3093,
];
#[derive(FromPrimitive, ToPrimitive, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum TicProduct {
Unknown = 0,
T825 = 1,
T834 = 2,
T500 = 3,
N825 = 4,
T249 = 5,
Tic36v4 = 6,
}
const TIC_CURRENT_UNITS: u8 = 32;
const TIC_T249_CURRENT_UNITS: u8 = 40;
#[derive(FromPrimitive, ToPrimitive, Debug)]
pub enum TicError {
IntentionallyDeenergized = 0,
MotorDriverError = 1,
LowVin = 2,
KillSwitch = 3,
RequiredInputInvalid = 4,
SerialError = 5,
CommandTimeout = 6,
SafeStartViolation = 7,
ErrLineHigh = 8,
SerialFraming = 16,
RxOverrun = 17,
Format = 18,
Crc = 19,
EncoderSkip = 20,
}
#[derive(thiserror::Error, Debug)]
#[non_exhaustive]
pub enum TicHandlerError {
#[error("the driver experienced an internal error")]
InternalError(TicError),
#[cfg(feature = "i2c")]
#[error("the i2c communication experienced an error")]
I2cError(embedded_hal::i2c::ErrorKind),
#[cfg(feature = "serial")]
#[error("the serial communication experienced an error")]
StreamError(embedded_io::ErrorKind),
#[cfg(feature = "usb")]
#[error("internal nusb error")]
NusbError(nusb::Error),
#[cfg(feature = "usb")]
#[error("the USB communication experienced a transfer error")]
UsbTransferError(nusb::transfer::TransferError),
#[cfg(feature = "usb")]
#[error("the target USB device is invalid")]
UsbInvalidDevice(u16),
#[error("the device is not yet initalized")]
NotInitalized,
#[error("the value could not be parsed")]
ParseError,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq, Clone, Copy)]
pub enum TicCommand {
SetTargetPosition = 0xE0,
SetTargetVelocity = 0xE3,
HaltAndSetPosition = 0xEC,
HaltAndHold = 0x89,
GoHome = 0x97,
ResetCommandTimeout = 0x8C,
Deenergize = 0x86,
Energize = 0x85,
ExitSafeStart = 0x83,
EnterSafeStart = 0x8F,
Reset = 0xB0,
ClearDriverError = 0x8A,
SetSpeedMax = 0xE6,
SetStartingSpeed = 0xE5,
SetAccelMax = 0xEA,
SetDecelMax = 0xE9,
SetStepMode = 0x94,
SetCurrentLimit = 0x91,
SetDecayMode = 0x92,
SetAgcOption = 0x98,
GetVariable = 0xA1,
GetVariableAndClearErrorsOccurred = 0xA2,
GetSetting = 0xA8,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicOperationState {
Reset = 0,
Deenergized = 2,
SoftError = 4,
WaitingForErrLine = 6,
StartingUp = 8,
Normal = 10,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicPlanningMode {
Off = 0,
TargetPosition = 1,
TargetVelocity = 2,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicReset {
PowerUp = 0,
Brownout = 1,
ResetLine = 2,
Watchdog = 4,
Software = 8,
StackOverflow = 16,
StackUnderflow = 32,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicDecayMode {
Mixed = 0,
Slow = 1,
Fast = 2,
Mixed25 = 3,
Mixed75 = 4,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicStepMode {
Full = 0,
Half = 1,
Microstep4 = 2,
Microstep8 = 3,
Microstep16 = 4,
Microstep32 = 5,
Microstep2_100p = 6,
Microstep64 = 7,
Microstep128 = 8,
Microstep256 = 9,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicAgcMode {
Off = 0,
On = 1,
ActiveOff = 2,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicAgcBottomCurrentLimit {
P45 = 0,
P50 = 1,
P55 = 2,
P60 = 3,
P65 = 4,
P70 = 5,
P75 = 6,
P80 = 7,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicAgcCurrentBoostSteps {
S5 = 0,
S7 = 1,
S9 = 2,
S11 = 3,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicAgcFrequencyLimit {
Off = 0,
F225Hz = 1,
F450Hz = 2,
F675Hz = 3,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicPin {
SCL = 0,
SDA = 1,
TX = 2,
RX = 3,
RC = 4,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicPinState {
HighImpedance = 0,
InputPullUp = 1,
OutputLow = 2,
OutputHigh = 3,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicInputState {
NotReady = 0,
Invalid = 1,
Halt = 2,
Position = 3,
Velocity = 4,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicMiscFlags1 {
Energized = 0,
PositionUncertain = 1,
ForwardLimitActive = 2,
ReverseLimitActive = 3,
HomingActive = 4,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicMotorDriverError {
None = 0,
OverCurrent = 1,
OverTemperature = 2,
}
#[derive(FromPrimitive, ToPrimitive, Debug, PartialEq, Eq)]
pub enum TicHpDriverError {
OverTemperature = 0,
OverCurrentA = 1,
OverCurrentB = 2,
PreDriverFaultA = 3,
PreDriverFaultB = 4,
UnderVoltage = 5,
Verify = 7,
}