diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d682d8..3a86827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## Changed - `serde` support is now optional and behind the `serde` feature. -- `PusTcSecondaryHeaderT` trait renamed to `GenericPusTcSecondaryHeader` +- `PusTcSecondaryHeaderT` trait renamed to `GenericPusTcSecondaryHeader`. - `PusTmSecondaryHeaderT` trait renamed to `GenericPusTmSecondaryHeader`. - `SpHeader`: Former `tc` and `tm` methods now named `tc_unseg` and `tm_unseg`. Former `new` method now called `new_from_single_fields`. @@ -20,6 +20,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## Added +- Added `std::error::Error` implementation for all error enumerations if the `std` feature + is enabled. +- ACII timestamps as specified in CCSDS 301.0-B-4. - Added MSRV in `Cargo.toml` with the `rust-version` field set to Rust 1.60. - ACII timestamps as specified in CCSDS 301.0-B-4 - `serde` `Serialize` and `Deserialize` added to all types. diff --git a/src/ecss.rs b/src/ecss.rs index 06e40f4..f06b4c7 100644 --- a/src/ecss.rs +++ b/src/ecss.rs @@ -1,11 +1,13 @@ //! Common definitions and helpers required to create PUS TMTC packets according to //! [ECSS-E-ST-70-41C](https://ecss.nl/standard/ecss-e-st-70-41c-space-engineering-telemetry-and-telecommand-packet-utilization-15-april-2016/) use crate::{ByteConversionError, CcsdsPacket, SizeMissmatch}; -use core::fmt::Debug; +use core::fmt::{Debug, Display, Formatter}; use core::mem::size_of; use crc::{Crc, CRC_16_IBM_3740}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "std")] +use std::error::Error; pub type CrcType = u16; @@ -65,6 +67,45 @@ pub enum PusError { ByteConversionError(ByteConversionError), } +impl Display for PusError { + fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { + match self { + PusError::VersionNotSupported(v) => { + write!(f, "PUS version {:?} not supported", v) + } + PusError::IncorrectCrc(crc) => { + write!(f, "crc16 {:#04x} is incorrect", crc) + } + PusError::RawDataTooShort(size) => { + write!( + f, + "deserialization error, provided raw data with size {} too short", + size + ) + } + PusError::NoRawData => { + write!(f, "no raw data provided") + } + PusError::CrcCalculationMissing => { + write!(f, "crc16 was not calculated") + } + PusError::ByteConversionError(e) => { + write!(f, "low level byte conversion error: {}", e) + } + } + } +} + +#[cfg(feature = "std")] +impl Error for PusError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + if let PusError::ByteConversionError(e) = self { + return Some(e); + } + None + } +} + impl From for PusError { fn from(e: ByteConversionError) -> Self { PusError::ByteConversionError(e) diff --git a/src/lib.rs b/src/lib.rs index b0dcfe8..6faec44 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,7 +55,10 @@ extern crate alloc; extern crate std; use crate::ecss::CCSDS_HEADER_LEN; +use core::fmt::{Display, Formatter}; use delegate::delegate; +#[cfg(feature = "std")] +use std::error::Error; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -87,6 +90,36 @@ pub enum ByteConversionError { ZeroCopyFromError, } +impl Display for ByteConversionError { + fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { + match self { + ByteConversionError::ToSliceTooSmall(missmatch) => { + write!( + f, + "target slice with size {} is too small, expected size of at least {}", + missmatch.found, missmatch.expected + ) + } + ByteConversionError::FromSliceTooSmall(missmatch) => { + write!( + f, + "source slice with size {} too small, expected at least {} bytes", + missmatch.found, missmatch.expected + ) + } + ByteConversionError::ZeroCopyToError => { + write!(f, "zerocopy serialization error") + } + ByteConversionError::ZeroCopyFromError => { + write!(f, "zerocopy deserialization error") + } + } + } +} + +#[cfg(feature = "std")] +impl Error for ByteConversionError {} + #[derive(Debug, PartialEq, Eq, Copy, Clone)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum PacketType {