Compare commits
11 Commits
9d23ac5b9b
...
v0.13.1
Author | SHA1 | Date | |
---|---|---|---|
b08c3329f4 | |||
08e0d39154
|
|||
ab97607024 | |||
60d1f77844 | |||
5a112b7f39 | |||
e774dd69d4 | |||
a03d26a49c | |||
026173514f | |||
2d7ccc0909 | |||
05d3bac927
|
|||
d58df5fee2 |
17
CHANGELOG.md
17
CHANGELOG.md
@ -8,10 +8,23 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
# [unreleased]
|
||||
|
||||
# [v0.13.1] 2025-03-21
|
||||
|
||||
- Bugfix due to operator precendence for `PusTcSecondaryHeader::pus_version`,
|
||||
`PusTcSecondaryHeaderWithoutTimestamp::pus_version`, `CdsTime::from_bytes_with_u16_days` and
|
||||
`CdsTime::from_bytes_with_u24_days`
|
||||
|
||||
# [v0.13.0] 2024-11-08
|
||||
|
||||
- Bumped MSRV to 1.81.0
|
||||
- Bump `zerocopy` to v0.8.0
|
||||
- Bump `thiserror` to v2.0.0
|
||||
|
||||
## Changed
|
||||
|
||||
- Migrated all Error implementations to thiserror, improved some naming and error handling in
|
||||
general
|
||||
|
||||
# [v0.12.0] 2024-09-10
|
||||
|
||||
- Bumped MSRV to 1.70.0
|
||||
@ -554,3 +567,7 @@ The timestamp of `PusTm` is now optional. See Added and Changed section for deta
|
||||
|
||||
Initial release with CCSDS Space Packet Primary Header implementation and basic PUS TC and TM
|
||||
implementations.
|
||||
|
||||
[v0.13.1]: https://egit.irs.uni-stuttgart.de/rust/spacepackets/compare/v0.13.0...v0.13.1
|
||||
[v0.13.0]: https://egit.irs.uni-stuttgart.de/rust/spacepackets/compare/v0.12.0...v0.13.0
|
||||
[v0.12.0]: https://egit.irs.uni-stuttgart.de/rust/spacepackets/compare/v0.11.2...v0.12.0
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "spacepackets"
|
||||
version = "0.12.0"
|
||||
version = "0.13.1"
|
||||
edition = "2021"
|
||||
rust-version = "1.81.0"
|
||||
authors = ["Robin Mueller <muellerr@irs.uni-stuttgart.de>"]
|
||||
|
1
FUNDING.yml
Normal file
1
FUNDING.yml
Normal file
@ -0,0 +1 @@
|
||||
github: robamu
|
@ -42,7 +42,9 @@ pub enum PduError {
|
||||
/// Invalid length for the entity ID detected. Only the values 1, 2, 4 and 8 are supported.
|
||||
#[error("invalid transaction ID length {0}")]
|
||||
InvalidTransactionSeqNumLen(u8),
|
||||
#[error("missmatch of PDU source ID length {src_id_len} and destination ID length {dest_id_len}")]
|
||||
#[error(
|
||||
"missmatch of PDU source ID length {src_id_len} and destination ID length {dest_id_len}"
|
||||
)]
|
||||
SourceDestIdLenMissmatch {
|
||||
src_id_len: usize,
|
||||
dest_id_len: usize,
|
||||
|
@ -61,7 +61,7 @@ impl<'seg_reqs> NakPduCreator<'seg_reqs> {
|
||||
start_of_scope: u32,
|
||||
end_of_scope: u32,
|
||||
segment_requests: &'seg_reqs [(u32, u32)],
|
||||
) -> Result<NakPduCreator, PduError> {
|
||||
) -> Result<NakPduCreator<'seg_reqs>, PduError> {
|
||||
let mut passed_segment_requests = None;
|
||||
if !segment_requests.is_empty() {
|
||||
passed_segment_requests = Some(SegmentRequests::U32Pairs(segment_requests));
|
||||
@ -79,7 +79,7 @@ impl<'seg_reqs> NakPduCreator<'seg_reqs> {
|
||||
start_of_scope: u64,
|
||||
end_of_scope: u64,
|
||||
segment_requests: &'seg_reqs [(u64, u64)],
|
||||
) -> Result<NakPduCreator, PduError> {
|
||||
) -> Result<NakPduCreator<'seg_reqs>, PduError> {
|
||||
let mut passed_segment_requests = None;
|
||||
if !segment_requests.is_empty() {
|
||||
passed_segment_requests = Some(SegmentRequests::U64Pairs(segment_requests));
|
||||
@ -97,7 +97,7 @@ impl<'seg_reqs> NakPduCreator<'seg_reqs> {
|
||||
start_of_scope: u64,
|
||||
end_of_scope: u64,
|
||||
segment_requests: Option<SegmentRequests<'seg_reqs>>,
|
||||
) -> Result<NakPduCreator, PduError> {
|
||||
) -> Result<NakPduCreator<'seg_reqs>, PduError> {
|
||||
// Force correct direction flag.
|
||||
pdu_header.pdu_conf.direction = Direction::TowardsSender;
|
||||
if let Some(ref segment_requests) = segment_requests {
|
||||
@ -269,7 +269,7 @@ impl SegReqFromBytes for u64 {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> Iterator for SegmentRequestIter<'a, T>
|
||||
impl<T> Iterator for SegmentRequestIter<'_, T>
|
||||
where
|
||||
T: SegReqFromBytes,
|
||||
{
|
||||
@ -282,8 +282,8 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> PartialEq<SegmentRequests<'a>> for SegmentRequestIter<'b, u32> {
|
||||
fn eq(&self, other: &SegmentRequests) -> bool {
|
||||
impl<'a> PartialEq<SegmentRequests<'a>> for SegmentRequestIter<'_, u32> {
|
||||
fn eq(&self, other: &SegmentRequests<'a>) -> bool {
|
||||
match other {
|
||||
SegmentRequests::U32Pairs(pairs) => self.compare_pairs(pairs),
|
||||
SegmentRequests::U64Pairs(pairs) => {
|
||||
@ -296,8 +296,8 @@ impl<'a, 'b> PartialEq<SegmentRequests<'a>> for SegmentRequestIter<'b, u32> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> PartialEq<SegmentRequests<'a>> for SegmentRequestIter<'b, u64> {
|
||||
fn eq(&self, other: &SegmentRequests) -> bool {
|
||||
impl<'a> PartialEq<SegmentRequests<'a>> for SegmentRequestIter<'_, u64> {
|
||||
fn eq(&self, other: &SegmentRequests<'a>) -> bool {
|
||||
match other {
|
||||
SegmentRequests::U32Pairs(pairs) => {
|
||||
if pairs.is_empty() && self.seq_req_raw.is_empty() {
|
||||
@ -310,7 +310,7 @@ impl<'a, 'b> PartialEq<SegmentRequests<'a>> for SegmentRequestIter<'b, u64> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> SegmentRequestIter<'a, T>
|
||||
impl<T> SegmentRequestIter<'_, T>
|
||||
where
|
||||
T: SegReqFromBytes + PartialEq,
|
||||
{
|
||||
@ -374,11 +374,11 @@ impl CfdpPdu for NakPduReader<'_> {
|
||||
}
|
||||
|
||||
impl<'seg_reqs> NakPduReader<'seg_reqs> {
|
||||
pub fn new(buf: &'seg_reqs [u8]) -> Result<NakPduReader, PduError> {
|
||||
pub fn new(buf: &'seg_reqs [u8]) -> Result<NakPduReader<'seg_reqs>, PduError> {
|
||||
Self::from_bytes(buf)
|
||||
}
|
||||
|
||||
pub fn from_bytes(buf: &'seg_reqs [u8]) -> Result<NakPduReader, PduError> {
|
||||
pub fn from_bytes(buf: &'seg_reqs [u8]) -> Result<NakPduReader<'seg_reqs>, PduError> {
|
||||
let (pdu_header, mut current_idx) = PduHeader::from_bytes(buf)?;
|
||||
let full_len_without_crc = pdu_header.verify_length_and_checksum(buf)?;
|
||||
// Minimum length of 9: 1 byte directive field and start and end of scope for normal file
|
||||
@ -474,7 +474,7 @@ impl<'seg_reqs> NakPduReader<'seg_reqs> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> PartialEq<NakPduCreator<'a>> for NakPduReader<'b> {
|
||||
impl<'a> PartialEq<NakPduCreator<'a>> for NakPduReader<'_> {
|
||||
fn eq(&self, other: &NakPduCreator<'a>) -> bool {
|
||||
if self.pdu_header() != other.pdu_header()
|
||||
|| self.end_of_scope() != other.end_of_scope()
|
||||
|
@ -273,6 +273,15 @@ pub mod alloc_mod {
|
||||
data: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn as_tlv(&self) -> Tlv<'_> {
|
||||
Tlv {
|
||||
tlv_type_field: self.tlv_type_field,
|
||||
// The API should ensure that the data length is never to large, so the unwrap for the
|
||||
// LV creation should never be an issue.
|
||||
lv: Lv::new(&self.data).expect("lv creation failed unexpectedly"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ReadableTlv for TlvOwned {
|
||||
@ -389,7 +398,7 @@ impl GenericTlv for EntityIdTlv {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'data> TryFrom<Tlv<'data>> for EntityIdTlv {
|
||||
impl TryFrom<Tlv<'_>> for EntityIdTlv {
|
||||
type Error = TlvLvError;
|
||||
|
||||
fn try_from(value: Tlv) -> Result<Self, TlvLvError> {
|
||||
|
@ -2,7 +2,10 @@
|
||||
#[cfg(feature = "alloc")]
|
||||
use super::TlvOwned;
|
||||
use super::{GenericTlv, ReadableTlv, Tlv, TlvLvError, TlvType, TlvTypeField, WritableTlv};
|
||||
use crate::{cfdp::{InvalidTlvTypeFieldError, TlvLvDataTooLargeError}, ByteConversionError};
|
||||
use crate::{
|
||||
cfdp::{InvalidTlvTypeFieldError, TlvLvDataTooLargeError},
|
||||
ByteConversionError,
|
||||
};
|
||||
use delegate::delegate;
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
@ -65,14 +68,16 @@ impl<'data> MsgToUserTlv<'data> {
|
||||
return Err(InvalidTlvTypeFieldError {
|
||||
found: tlv_type as u8,
|
||||
expected: Some(TlvType::MsgToUser as u8),
|
||||
}.into());
|
||||
}
|
||||
.into());
|
||||
}
|
||||
}
|
||||
TlvTypeField::Custom(raw) => {
|
||||
return Err(InvalidTlvTypeFieldError {
|
||||
found: raw,
|
||||
expected: Some(TlvType::MsgToUser as u8),
|
||||
}.into());
|
||||
}
|
||||
.into());
|
||||
}
|
||||
}
|
||||
Ok(msg_to_user)
|
||||
|
@ -115,7 +115,7 @@ pub mod zc {
|
||||
impl GenericPusTcSecondaryHeader for PusTcSecondaryHeader {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion {
|
||||
PusVersion::try_from(self.version_ack >> 4 & 0b1111).unwrap_or(PusVersion::Invalid)
|
||||
PusVersion::try_from((self.version_ack >> 4) & 0b1111).unwrap_or(PusVersion::Invalid)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -120,7 +120,7 @@ pub mod zc {
|
||||
impl GenericPusTmSecondaryHeader for PusTmSecHeaderWithoutTimestamp {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion {
|
||||
PusVersion::try_from(self.pus_version_and_sc_time_ref_status >> 4 & 0b1111)
|
||||
PusVersion::try_from((self.pus_version_and_sc_time_ref_status >> 4) & 0b1111)
|
||||
.unwrap_or(PusVersion::Invalid)
|
||||
}
|
||||
|
||||
@ -1111,7 +1111,7 @@ mod tests {
|
||||
}
|
||||
|
||||
fn verify_ping_reply_generic(
|
||||
tm: &(impl CcsdsPacket + GenericPusTmSecondaryHeader + PusPacket),
|
||||
tm: &(impl GenericPusTmSecondaryHeader + PusPacket),
|
||||
has_user_data: bool,
|
||||
exp_full_len: usize,
|
||||
) {
|
||||
|
@ -569,7 +569,7 @@ impl<ProvidesDaysLen: ProvidesDaysLength> CdsTime<ProvidesDaysLen> {
|
||||
));
|
||||
}
|
||||
let pfield = buf[0];
|
||||
match CcsdsTimeCode::try_from(pfield >> 4 & 0b111) {
|
||||
match CcsdsTimeCode::try_from((pfield >> 4) & 0b111) {
|
||||
Ok(cds_type) => match cds_type {
|
||||
CcsdsTimeCode::Cds => (),
|
||||
_ => {
|
||||
@ -582,7 +582,7 @@ impl<ProvidesDaysLen: ProvidesDaysLength> CdsTime<ProvidesDaysLen> {
|
||||
_ => {
|
||||
return Err(TimestampError::InvalidTimeCode {
|
||||
expected: CcsdsTimeCode::Cds,
|
||||
found: pfield >> 4 & 0b111,
|
||||
found: (pfield >> 4) & 0b111,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
Reference in New Issue
Block a user