consistent ECSS object constructors #77
@ -28,6 +28,10 @@ to check all the API changes in the **Changed** chapter.
|
|||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
|
- `PusTcCreator::new_simple` now expects a valid slice for the source data instead of an optional
|
||||||
|
slice. For telecommands without application data, `&[]` can be passed.
|
||||||
|
- `PusTmSecondaryHeader` constructors now expects a valid slice for the time stamp instead of an
|
||||||
|
optional slice.
|
||||||
- Renamed `CcsdsTimeProvider::date_time` to `CcsdsTimeProvider::chrono_date_time`
|
- Renamed `CcsdsTimeProvider::date_time` to `CcsdsTimeProvider::chrono_date_time`
|
||||||
- Renamed `CcsdsTimeCodes` to `CcsdsTimeCode`
|
- Renamed `CcsdsTimeCodes` to `CcsdsTimeCode`
|
||||||
- Renamed `cds::TimeProvider` to `cds::CdsTime`
|
- Renamed `cds::TimeProvider` to `cds::CdsTime`
|
||||||
|
@ -67,4 +67,4 @@ defmt = ["dep:defmt"]
|
|||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
all-features = true
|
all-features = true
|
||||||
rustdoc-args = ["--cfg", "docsrs", "--generate-link-to-definition"]
|
rustdoc-args = ["--cfg", "docs_rs", "--generate-link-to-definition"]
|
||||||
|
@ -4,7 +4,7 @@ Checklist for new releases
|
|||||||
# Pre-Release
|
# Pre-Release
|
||||||
|
|
||||||
1. Make sure any new modules are documented sufficiently enough and check docs with
|
1. Make sure any new modules are documented sufficiently enough and check docs with
|
||||||
`cargo +nightly doc --all-features --config 'build.rustdocflags=["--cfg", "docsrs"]' --open`.
|
`cargo +nightly doc --all-features --config 'build.rustdocflags=["--cfg", "docs_rs"]' --open`.
|
||||||
2. Bump version specifier in `Cargo.toml`.
|
2. Bump version specifier in `Cargo.toml`.
|
||||||
3. Update `CHANGELOG.md`: Convert `unreleased` section into version section with date and add new
|
3. Update `CHANGELOG.md`: Convert `unreleased` section into version section with date and add new
|
||||||
`unreleased` section.
|
`unreleased` section.
|
||||||
|
@ -267,13 +267,13 @@ impl<'raw_data> PusTcCreator<'raw_data> {
|
|||||||
sph: &mut SpHeader,
|
sph: &mut SpHeader,
|
||||||
service: u8,
|
service: u8,
|
||||||
subservice: u8,
|
subservice: u8,
|
||||||
app_data: Option<&'raw_data [u8]>,
|
app_data: &'raw_data [u8],
|
||||||
set_ccsds_len: bool,
|
set_ccsds_len: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self::new(
|
Self::new(
|
||||||
sph,
|
sph,
|
||||||
PusTcSecondaryHeader::new(service, subservice, ACK_ALL, 0),
|
PusTcSecondaryHeader::new(service, subservice, ACK_ALL, 0),
|
||||||
app_data.unwrap_or(&[]),
|
app_data,
|
||||||
set_ccsds_len,
|
set_ccsds_len,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -575,12 +575,12 @@ mod tests {
|
|||||||
|
|
||||||
fn base_ping_tc_simple_ctor() -> PusTcCreator<'static> {
|
fn base_ping_tc_simple_ctor() -> PusTcCreator<'static> {
|
||||||
let mut sph = SpHeader::tc_unseg(0x02, 0x34, 0).unwrap();
|
let mut sph = SpHeader::tc_unseg(0x02, 0x34, 0).unwrap();
|
||||||
PusTcCreator::new_simple(&mut sph, 17, 1, None, true)
|
PusTcCreator::new_simple(&mut sph, 17, 1, &[], true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn base_ping_tc_simple_ctor_with_app_data(app_data: &'static [u8]) -> PusTcCreator<'static> {
|
fn base_ping_tc_simple_ctor_with_app_data(app_data: &'static [u8]) -> PusTcCreator<'static> {
|
||||||
let mut sph = SpHeader::tc_unseg(0x02, 0x34, 0).unwrap();
|
let mut sph = SpHeader::tc_unseg(0x02, 0x34, 0).unwrap();
|
||||||
PusTcCreator::new_simple(&mut sph, 17, 1, Some(app_data), true)
|
PusTcCreator::new_simple(&mut sph, 17, 1, app_data, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -637,7 +637,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_update_func() {
|
fn test_update_func() {
|
||||||
let mut sph = SpHeader::tc_unseg(0x02, 0x34, 0).unwrap();
|
let mut sph = SpHeader::tc_unseg(0x02, 0x34, 0).unwrap();
|
||||||
let mut tc = PusTcCreator::new_simple(&mut sph, 17, 1, None, false);
|
let mut tc = PusTcCreator::new_simple(&mut sph, 17, 1, &[], false);
|
||||||
assert_eq!(tc.data_len(), 0);
|
assert_eq!(tc.data_len(), 0);
|
||||||
tc.update_ccsds_data_len();
|
tc.update_ccsds_data_len();
|
||||||
assert_eq!(tc.data_len(), 6);
|
assert_eq!(tc.data_len(), 6);
|
||||||
|
@ -123,17 +123,17 @@ pub struct PusTmSecondaryHeader<'stamp> {
|
|||||||
pub subservice: u8,
|
pub subservice: u8,
|
||||||
pub msg_counter: u16,
|
pub msg_counter: u16,
|
||||||
pub dest_id: u16,
|
pub dest_id: u16,
|
||||||
pub timestamp: &'stamp [u8],
|
pub time_stamp: &'stamp [u8],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'stamp> PusTmSecondaryHeader<'stamp> {
|
impl<'stamp> PusTmSecondaryHeader<'stamp> {
|
||||||
pub fn new_simple(service: u8, subservice: u8, timestamp: &'stamp [u8]) -> Self {
|
pub fn new_simple(service: u8, subservice: u8, time_stamp: &'stamp [u8]) -> Self {
|
||||||
Self::new(service, subservice, 0, 0, Some(timestamp))
|
Self::new(service, subservice, 0, 0, time_stamp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Like [Self::new_simple] but without a timestamp.
|
/// Like [Self::new_simple] but without a timestamp.
|
||||||
pub fn new_simple_no_timestamp(service: u8, subservice: u8) -> Self {
|
pub fn new_simple_no_timestamp(service: u8, subservice: u8) -> Self {
|
||||||
Self::new(service, subservice, 0, 0, None)
|
Self::new(service, subservice, 0, 0, &[])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(
|
pub fn new(
|
||||||
@ -141,7 +141,7 @@ impl<'stamp> PusTmSecondaryHeader<'stamp> {
|
|||||||
subservice: u8,
|
subservice: u8,
|
||||||
msg_counter: u16,
|
msg_counter: u16,
|
||||||
dest_id: u16,
|
dest_id: u16,
|
||||||
timestamp: Option<&'stamp [u8]>,
|
time_stamp: &'stamp [u8],
|
||||||
) -> Self {
|
) -> Self {
|
||||||
PusTmSecondaryHeader {
|
PusTmSecondaryHeader {
|
||||||
pus_version: PusVersion::PusC,
|
pus_version: PusVersion::PusC,
|
||||||
@ -150,7 +150,7 @@ impl<'stamp> PusTmSecondaryHeader<'stamp> {
|
|||||||
subservice,
|
subservice,
|
||||||
msg_counter,
|
msg_counter,
|
||||||
dest_id,
|
dest_id,
|
||||||
timestamp: timestamp.unwrap_or(&[]),
|
time_stamp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -192,7 +192,7 @@ impl<'slice> TryFrom<zc::PusTmSecHeader<'slice>> for PusTmSecondaryHeader<'slice
|
|||||||
subservice: sec_header.zc_header.subservice(),
|
subservice: sec_header.zc_header.subservice(),
|
||||||
msg_counter: sec_header.zc_header.msg_counter(),
|
msg_counter: sec_header.zc_header.msg_counter(),
|
||||||
dest_id: sec_header.zc_header.dest_id(),
|
dest_id: sec_header.zc_header.dest_id(),
|
||||||
timestamp: sec_header.timestamp,
|
time_stamp: sec_header.timestamp,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -284,7 +284,7 @@ impl<'time, 'raw_data> PusTmCreator<'time, 'raw_data> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn timestamp(&self) -> &[u8] {
|
pub fn timestamp(&self) -> &[u8] {
|
||||||
self.sec_header.timestamp
|
self.sec_header.time_stamp
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn source_data(&self) -> &[u8] {
|
pub fn source_data(&self) -> &[u8] {
|
||||||
@ -323,7 +323,7 @@ impl<'time, 'raw_data> PusTmCreator<'time, 'raw_data> {
|
|||||||
digest.update(sph_zc.as_bytes());
|
digest.update(sph_zc.as_bytes());
|
||||||
let pus_tc_header = zc::PusTmSecHeaderWithoutTimestamp::try_from(self.sec_header).unwrap();
|
let pus_tc_header = zc::PusTmSecHeaderWithoutTimestamp::try_from(self.sec_header).unwrap();
|
||||||
digest.update(pus_tc_header.as_bytes());
|
digest.update(pus_tc_header.as_bytes());
|
||||||
digest.update(self.sec_header.timestamp);
|
digest.update(self.sec_header.time_stamp);
|
||||||
digest.update(self.source_data);
|
digest.update(self.source_data);
|
||||||
digest.finalize()
|
digest.finalize()
|
||||||
}
|
}
|
||||||
@ -352,9 +352,9 @@ impl<'time, 'raw_data> PusTmCreator<'time, 'raw_data> {
|
|||||||
.write_to_bytes(&mut slice[curr_idx..curr_idx + sec_header_len])
|
.write_to_bytes(&mut slice[curr_idx..curr_idx + sec_header_len])
|
||||||
.ok_or(ByteConversionError::ZeroCopyToError)?;
|
.ok_or(ByteConversionError::ZeroCopyToError)?;
|
||||||
curr_idx += sec_header_len;
|
curr_idx += sec_header_len;
|
||||||
slice[curr_idx..curr_idx + self.sec_header.timestamp.len()]
|
slice[curr_idx..curr_idx + self.sec_header.time_stamp.len()]
|
||||||
.copy_from_slice(self.sec_header.timestamp);
|
.copy_from_slice(self.sec_header.time_stamp);
|
||||||
curr_idx += self.sec_header.timestamp.len();
|
curr_idx += self.sec_header.time_stamp.len();
|
||||||
slice[curr_idx..curr_idx + self.source_data.len()].copy_from_slice(self.source_data);
|
slice[curr_idx..curr_idx + self.source_data.len()].copy_from_slice(self.source_data);
|
||||||
curr_idx += self.source_data.len();
|
curr_idx += self.source_data.len();
|
||||||
let mut digest = CRC_CCITT_FALSE.digest();
|
let mut digest = CRC_CCITT_FALSE.digest();
|
||||||
@ -368,14 +368,15 @@ impl<'time, 'raw_data> PusTmCreator<'time, 'raw_data> {
|
|||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
pub fn append_to_vec(&self, vec: &mut Vec<u8>) -> Result<usize, PusError> {
|
pub fn append_to_vec(&self, vec: &mut Vec<u8>) -> Result<usize, PusError> {
|
||||||
let sph_zc = crate::zc::SpHeader::from(self.sp_header);
|
let sph_zc = crate::zc::SpHeader::from(self.sp_header);
|
||||||
let mut appended_len = PUS_TM_MIN_LEN_WITHOUT_SOURCE_DATA + self.sec_header.timestamp.len();
|
let mut appended_len =
|
||||||
|
PUS_TM_MIN_LEN_WITHOUT_SOURCE_DATA + self.sec_header.time_stamp.len();
|
||||||
appended_len += self.source_data.len();
|
appended_len += self.source_data.len();
|
||||||
let start_idx = vec.len();
|
let start_idx = vec.len();
|
||||||
vec.extend_from_slice(sph_zc.as_bytes());
|
vec.extend_from_slice(sph_zc.as_bytes());
|
||||||
// The PUS version is hardcoded to PUS C
|
// The PUS version is hardcoded to PUS C
|
||||||
let sec_header = zc::PusTmSecHeaderWithoutTimestamp::try_from(self.sec_header).unwrap();
|
let sec_header = zc::PusTmSecHeaderWithoutTimestamp::try_from(self.sec_header).unwrap();
|
||||||
vec.extend_from_slice(sec_header.as_bytes());
|
vec.extend_from_slice(sec_header.as_bytes());
|
||||||
vec.extend_from_slice(self.sec_header.timestamp);
|
vec.extend_from_slice(self.sec_header.time_stamp);
|
||||||
vec.extend_from_slice(self.source_data);
|
vec.extend_from_slice(self.source_data);
|
||||||
let mut digest = CRC_CCITT_FALSE.digest();
|
let mut digest = CRC_CCITT_FALSE.digest();
|
||||||
digest.update(&vec[start_idx..start_idx + appended_len - 2]);
|
digest.update(&vec[start_idx..start_idx + appended_len - 2]);
|
||||||
@ -387,7 +388,7 @@ impl<'time, 'raw_data> PusTmCreator<'time, 'raw_data> {
|
|||||||
impl WritablePusPacket for PusTmCreator<'_, '_> {
|
impl WritablePusPacket for PusTmCreator<'_, '_> {
|
||||||
fn len_written(&self) -> usize {
|
fn len_written(&self) -> usize {
|
||||||
PUS_TM_MIN_LEN_WITHOUT_SOURCE_DATA
|
PUS_TM_MIN_LEN_WITHOUT_SOURCE_DATA
|
||||||
+ self.sec_header.timestamp.len()
|
+ self.sec_header.time_stamp.len()
|
||||||
+ self.source_data.len()
|
+ self.source_data.len()
|
||||||
}
|
}
|
||||||
/// Write the raw PUS byte representation to a provided buffer.
|
/// Write the raw PUS byte representation to a provided buffer.
|
||||||
@ -526,7 +527,7 @@ impl<'raw_data> PusTmReader<'raw_data> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn timestamp(&self) -> &[u8] {
|
pub fn timestamp(&self) -> &[u8] {
|
||||||
self.sec_header.timestamp
|
self.sec_header.time_stamp
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This function will return the slice [Self] was constructed from.
|
/// This function will return the slice [Self] was constructed from.
|
||||||
@ -1146,7 +1147,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_sec_header_without_stamp() {
|
fn test_sec_header_without_stamp() {
|
||||||
let sec_header = PusTmSecondaryHeader::new_simple_no_timestamp(17, 1);
|
let sec_header = PusTmSecondaryHeader::new_simple_no_timestamp(17, 1);
|
||||||
assert_eq!(sec_header.timestamp, &[]);
|
assert_eq!(sec_header.time_stamp, &[]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
//! println!("{:x?}", &ccsds_buf[0..6]);
|
//! println!("{:x?}", &ccsds_buf[0..6]);
|
||||||
//! ```
|
//! ```
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
#![cfg_attr(docs_rs, feature(doc_auto_cfg))]
|
||||||
#[cfg(feature = "alloc")]
|
#[cfg(feature = "alloc")]
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
#[cfg(any(feature = "std", test))]
|
#[cfg(any(feature = "std", test))]
|
||||||
|
Loading…
Reference in New Issue
Block a user