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
// Copyright (c) 2021 Marco Boneberger // Licensed under the EUPL-1.2-or-later //! Contains exception and Result definitions use crate::robot::logger::Record; use thiserror::Error; /// Represents all kind of errors which correspond to the franka::Exception in the C++ version of /// this library #[derive(Error, Debug)] pub enum FrankaException { /// ControlException is thrown if an error occurs during motion generation or torque control. /// The exception holds a vector with the last received robot states. The number of recorded /// states can be configured in the Robot constructor. #[error("{error}")] ControlException { /// Vector of states and commands logged just before the exception occurred. log: Option<Vec<Record>>, /// Explanatory string. error: String, }, /// IncompatibleVersionException is thrown if the robot does not support this version of libfranka-rs. #[error("Incompatible library version: Robot has version {server_version:?} and libfranka-rs has {library_version:?}")] IncompatibleLibraryVersionError { /// Control's protocol version. server_version: u16, /// libfranka-rs protocol version. library_version: u16, }, /// NoMotionGeneratorRunningError is thrown when trying to send a motion command without an motion generator running. #[error("Trying to send motion command, but no motion generator running!")] NoMotionGeneratorRunningError, /// NoControllerRunningError is thrown when trying to send a control command without an controller running. #[error("Trying to send control command, but no controller generator running!")] NoControllerRunningError, /// PartialCommandError when trying to send a partial command. #[error("Trying to send partial command!")] PartialCommandError, /// NetworkException is thrown if a connection to the robot cannot be established, or when a timeout occurs. #[error("{message:?}")] NetworkException { message: String }, /// CommandException is thrown if an error occurs during command execution. #[error("{message:?}")] CommandException { message: String }, /// ModelException is thrown if an error occurs when loading the model library #[error("{message:?}")] ModelException { message: String }, /// RealTimeException is thrown if the real-time priority cannot be set #[error("{message:?}")] RealTimeException { message: String }, } /// creates a CommandException from a static string slice pub(crate) fn create_command_exception(message: &'static str) -> FrankaException { FrankaException::CommandException { message: message.to_string(), } } /// Result type which can have FrankaException as Error pub type FrankaResult<T> = Result<T, FrankaException>; // wait for https://github.com/rust-lang/rust/issues/43301 to be closed // impl Termination for FrankaResult<()> { // fn report(self) -> i32 { // return match self { // Ok(_) => {ExitCode::SUCCESS.report();} // Err(e) => { // eprintln!("{}",e); // ExitCode::FAILURE.report(); // } // } // } // }