can_motor_control/
error.rs1use std::io;
4
5use motor_codec::{CodecError, MotorTypeId};
6use thiserror::Error;
7
8use crate::bus::RouteKey;
9use crate::transport::TransportError;
10
11#[derive(Debug, Error)]
17#[non_exhaustive]
18pub enum Error {
19 #[error("transport: {0}")]
21 Transport(#[from] TransportError),
22
23 #[error("codec: {0}")]
25 Codec(#[from] CodecError),
26
27 #[error("config schema: {0}")]
29 ConfigSchema(String),
30
31 #[error("config IO: {0}")]
33 ConfigIo(#[from] io::Error),
34
35 #[error("unknown bus name: {0}")]
37 UnknownBusName(String),
38
39 #[error("unknown vendor: {0}")]
41 UnknownVendor(String),
42
43 #[error("duplicate bus name: {0}")]
45 DuplicateBusName(String),
46
47 #[error("duplicate group name: {0}")]
49 DuplicateGroupName(String),
50
51 #[error("bus '{bus_name}' codec '{vendor}' does not support motor type {motor_type:?}")]
53 MotorNotSupportedByCodec {
54 vendor: String,
56 motor_type: MotorTypeId,
58 bus_name: String,
60 },
61
62 #[error("gripper requires exactly one motor, got {got}")]
64 GripperRequiresOneMotor {
65 got: usize,
67 },
68
69 #[error("command length mismatch: expected {expected}, got {got}")]
71 CommandLengthMismatch {
72 expected: usize,
74 got: usize,
76 },
77
78 #[error("not connected; call Robot::connect() first")]
80 NotConnected,
81
82 #[error("gripper opening must be between 0.0 and 1.0, got {got}")]
84 OpeningOutOfRange {
85 got: f64,
87 },
88
89 #[error("gripper opening current must be > 0.0 and <= 1.0, got {got}")]
91 OpeningCurrentOutOfRange {
92 got: f64,
94 },
95
96 #[error("gripper opening calibration has not completed")]
98 OpeningCalibrationRequired,
99
100 #[error("gripper opening calibration failed for '{name}': {reason}")]
102 OpeningCalibrationFailed {
103 name: String,
105 reason: String,
107 },
108
109 #[error("opening-control mode verification failed for '{name}': {reason}")]
111 OpeningControlModeVerificationFailed { name: String, reason: String },
112
113 #[error("topology locked after connect()")]
115 TopologyLocked,
116
117 #[error("CAN ID collision on bus '{bus_name}': recv_id {recv_id:#x} already routed to {existing:?}, attempted {attempted:?}")]
119 CanIdCollision {
120 bus_name: String,
122 recv_id: u32,
124 existing: RouteKey,
126 attempted: RouteKey,
128 },
129
130 #[error("bus mutex poisoned")]
132 BusPoisoned,
133
134 #[error("internal error: {0}")]
136 Internal(&'static str),
137}