ECSS Ctors: Expect SP header by copy #82
@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
- Renamed `tc`, `tm`, `tc_unseg` and `tm_unseg` variants for `PacketId` and `SpHeader`
|
- Renamed `tc`, `tm`, `tc_unseg` and `tm_unseg` variants for `PacketId` and `SpHeader`
|
||||||
to `new_for_tc_checked`, `new_for_tm_checked`, `new_for_unseg_tc_checked` and
|
to `new_for_tc_checked`, `new_for_tm_checked`, `new_for_unseg_tc_checked` and
|
||||||
`new_for_unseg_tm_checked`.
|
`new_for_unseg_tm_checked`.
|
||||||
|
- `PusTmCreator` and `PusTcCreator` now expect a regular instance of `SpHeader` instead of
|
||||||
|
a mutable reference.
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|
||||||
|
@ -9,9 +9,11 @@
|
|||||||
//! use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
//! use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader};
|
||||||
//!
|
//!
|
||||||
//! // Create a ping telecommand with no user application data
|
//! // Create a ping telecommand with no user application data
|
||||||
//! let mut sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
//! let pus_tc = PusTcCreator::new_no_app_data(
|
||||||
//! let tc_header = PusTcSecondaryHeader::new_simple(17, 1);
|
//! SpHeader::new_from_apid(0x02),
|
||||||
//! let pus_tc = PusTcCreator::new_no_app_data(&mut sph, tc_header, true);
|
//! PusTcSecondaryHeader::new_simple(17, 1),
|
||||||
|
//! true
|
||||||
|
//! );
|
||||||
//! println!("{:?}", pus_tc);
|
//! println!("{:?}", pus_tc);
|
||||||
//! assert_eq!(pus_tc.service(), 17);
|
//! assert_eq!(pus_tc.service(), 17);
|
||||||
//! assert_eq!(pus_tc.subservice(), 1);
|
//! assert_eq!(pus_tc.subservice(), 1);
|
||||||
@ -256,7 +258,7 @@ impl<'app_data> PusTcCreator<'app_data> {
|
|||||||
/// the correct value to this field manually
|
/// the correct value to this field manually
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(
|
pub fn new(
|
||||||
sp_header: &mut SpHeader,
|
mut sp_header: SpHeader,
|
||||||
sec_header: PusTcSecondaryHeader,
|
sec_header: PusTcSecondaryHeader,
|
||||||
app_data: &'app_data [u8],
|
app_data: &'app_data [u8],
|
||||||
set_ccsds_len: bool,
|
set_ccsds_len: bool,
|
||||||
@ -264,7 +266,7 @@ impl<'app_data> PusTcCreator<'app_data> {
|
|||||||
sp_header.set_packet_type(PacketType::Tc);
|
sp_header.set_packet_type(PacketType::Tc);
|
||||||
sp_header.set_sec_header_flag();
|
sp_header.set_sec_header_flag();
|
||||||
let mut pus_tc = Self {
|
let mut pus_tc = Self {
|
||||||
sp_header: *sp_header,
|
sp_header,
|
||||||
app_data,
|
app_data,
|
||||||
sec_header,
|
sec_header,
|
||||||
};
|
};
|
||||||
@ -278,7 +280,7 @@ impl<'app_data> PusTcCreator<'app_data> {
|
|||||||
/// and subservice instead of the full PUS TC secondary header.
|
/// and subservice instead of the full PUS TC secondary header.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_simple(
|
pub fn new_simple(
|
||||||
sph: &mut SpHeader,
|
sph: SpHeader,
|
||||||
service: u8,
|
service: u8,
|
||||||
subservice: u8,
|
subservice: u8,
|
||||||
app_data: &'app_data [u8],
|
app_data: &'app_data [u8],
|
||||||
@ -294,7 +296,7 @@ impl<'app_data> PusTcCreator<'app_data> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_no_app_data(
|
pub fn new_no_app_data(
|
||||||
sp_header: &mut SpHeader,
|
sp_header: SpHeader,
|
||||||
sec_header: PusTcSecondaryHeader,
|
sec_header: PusTcSecondaryHeader,
|
||||||
set_ccsds_len: bool,
|
set_ccsds_len: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
@ -618,19 +620,19 @@ mod tests {
|
|||||||
use postcard::{from_bytes, to_allocvec};
|
use postcard::{from_bytes, to_allocvec};
|
||||||
|
|
||||||
fn base_ping_tc_full_ctor() -> PusTcCreator<'static> {
|
fn base_ping_tc_full_ctor() -> PusTcCreator<'static> {
|
||||||
let mut sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
||||||
let tc_header = PusTcSecondaryHeader::new_simple(17, 1);
|
let tc_header = PusTcSecondaryHeader::new_simple(17, 1);
|
||||||
PusTcCreator::new_no_app_data(&mut sph, tc_header, true)
|
PusTcCreator::new_no_app_data(sph, tc_header, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn base_ping_tc_simple_ctor() -> PusTcCreator<'static> {
|
fn base_ping_tc_simple_ctor() -> PusTcCreator<'static> {
|
||||||
let mut sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
||||||
PusTcCreator::new_simple(&mut sph, 17, 1, &[], true)
|
PusTcCreator::new_simple(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::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
||||||
PusTcCreator::new_simple(&mut sph, 17, 1, app_data, true)
|
PusTcCreator::new_simple(sph, 17, 1, app_data, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -686,8 +688,8 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_update_func() {
|
fn test_update_func() {
|
||||||
let mut sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tc_checked(0x02, 0x34, 0).unwrap();
|
||||||
let mut tc = PusTcCreator::new_simple(&mut sph, 17, 1, &[], false);
|
let mut tc = PusTcCreator::new_simple(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);
|
||||||
|
@ -254,7 +254,7 @@ impl<'time, 'src_data> PusTmCreator<'time, 'src_data> {
|
|||||||
/// the correct value to this field manually
|
/// the correct value to this field manually
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(
|
pub fn new(
|
||||||
sp_header: &mut SpHeader,
|
mut sp_header: SpHeader,
|
||||||
sec_header: PusTmSecondaryHeader<'time>,
|
sec_header: PusTmSecondaryHeader<'time>,
|
||||||
source_data: &'src_data [u8],
|
source_data: &'src_data [u8],
|
||||||
set_ccsds_len: bool,
|
set_ccsds_len: bool,
|
||||||
@ -262,7 +262,7 @@ impl<'time, 'src_data> PusTmCreator<'time, 'src_data> {
|
|||||||
sp_header.set_packet_type(PacketType::Tm);
|
sp_header.set_packet_type(PacketType::Tm);
|
||||||
sp_header.set_sec_header_flag();
|
sp_header.set_sec_header_flag();
|
||||||
let mut pus_tm = Self {
|
let mut pus_tm = Self {
|
||||||
sp_header: *sp_header,
|
sp_header,
|
||||||
source_data,
|
source_data,
|
||||||
sec_header,
|
sec_header,
|
||||||
calc_crc_on_serialization: true,
|
calc_crc_on_serialization: true,
|
||||||
@ -275,7 +275,7 @@ impl<'time, 'src_data> PusTmCreator<'time, 'src_data> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_simple(
|
pub fn new_simple(
|
||||||
sp_header: &mut SpHeader,
|
sp_header: SpHeader,
|
||||||
service: u8,
|
service: u8,
|
||||||
subservice: u8,
|
subservice: u8,
|
||||||
time_provider: &impl TimeWriter,
|
time_provider: &impl TimeWriter,
|
||||||
@ -291,7 +291,7 @@ impl<'time, 'src_data> PusTmCreator<'time, 'src_data> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_no_source_data(
|
pub fn new_no_source_data(
|
||||||
sp_header: &mut SpHeader,
|
sp_header: SpHeader,
|
||||||
sec_header: PusTmSecondaryHeader<'time>,
|
sec_header: PusTmSecondaryHeader<'time>,
|
||||||
set_ccsds_len: bool,
|
set_ccsds_len: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
@ -840,20 +840,20 @@ mod tests {
|
|||||||
const DUMMY_DATA: &[u8] = &[0, 1, 2];
|
const DUMMY_DATA: &[u8] = &[0, 1, 2];
|
||||||
|
|
||||||
fn base_ping_reply_full_ctor(timestamp: &[u8]) -> PusTmCreator {
|
fn base_ping_reply_full_ctor(timestamp: &[u8]) -> PusTmCreator {
|
||||||
let mut sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||||
let tm_header = PusTmSecondaryHeader::new_simple(17, 2, timestamp);
|
let tm_header = PusTmSecondaryHeader::new_simple(17, 2, timestamp);
|
||||||
PusTmCreator::new_no_source_data(&mut sph, tm_header, true)
|
PusTmCreator::new_no_source_data(sph, tm_header, true)
|
||||||
}
|
}
|
||||||
fn ping_reply_with_data(timestamp: &[u8]) -> PusTmCreator {
|
fn ping_reply_with_data(timestamp: &[u8]) -> PusTmCreator {
|
||||||
let mut sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||||
let tm_header = PusTmSecondaryHeader::new_simple(17, 2, timestamp);
|
let tm_header = PusTmSecondaryHeader::new_simple(17, 2, timestamp);
|
||||||
PusTmCreator::new(&mut sph, tm_header, DUMMY_DATA, true)
|
PusTmCreator::new(sph, tm_header, DUMMY_DATA, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn base_hk_reply<'a, 'b>(timestamp: &'a [u8], src_data: &'b [u8]) -> PusTmCreator<'a, 'b> {
|
fn base_hk_reply<'a, 'b>(timestamp: &'a [u8], src_data: &'b [u8]) -> PusTmCreator<'a, 'b> {
|
||||||
let mut sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||||
let tc_header = PusTmSecondaryHeader::new_simple(3, 5, timestamp);
|
let tc_header = PusTmSecondaryHeader::new_simple(3, 5, timestamp);
|
||||||
PusTmCreator::new(&mut sph, tc_header, src_data, true)
|
PusTmCreator::new(sph, tc_header, src_data, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dummy_timestamp() -> &'static [u8] {
|
fn dummy_timestamp() -> &'static [u8] {
|
||||||
@ -868,11 +868,11 @@ mod tests {
|
|||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_basic_simple_api() {
|
fn test_basic_simple_api() {
|
||||||
let mut sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||||
let time_provider = CdsTime::new_with_u16_days(0, 0);
|
let time_provider = CdsTime::new_with_u16_days(0, 0);
|
||||||
let mut stamp_buf: [u8; 8] = [0; 8];
|
let mut stamp_buf: [u8; 8] = [0; 8];
|
||||||
let pus_tm =
|
let pus_tm =
|
||||||
PusTmCreator::new_simple(&mut sph, 17, 2, &time_provider, &mut stamp_buf, &[], true)
|
PusTmCreator::new_simple(sph, 17, 2, &time_provider, &mut stamp_buf, &[], true)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
verify_ping_reply(&pus_tm, false, 22, &[64, 0, 0, 0, 0, 0, 0]);
|
verify_ping_reply(&pus_tm, false, 22, &[64, 0, 0, 0, 0, 0, 0]);
|
||||||
}
|
}
|
||||||
@ -969,9 +969,9 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_manual_field_update() {
|
fn test_manual_field_update() {
|
||||||
let mut sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||||
let tc_header = PusTmSecondaryHeader::new_simple(17, 2, dummy_timestamp());
|
let tc_header = PusTmSecondaryHeader::new_simple(17, 2, dummy_timestamp());
|
||||||
let mut tm = PusTmCreator::new_no_source_data(&mut sph, tc_header, false);
|
let mut tm = PusTmCreator::new_no_source_data(sph, tc_header, false);
|
||||||
tm.calc_crc_on_serialization = false;
|
tm.calc_crc_on_serialization = false;
|
||||||
assert_eq!(tm.data_len(), 0x00);
|
assert_eq!(tm.data_len(), 0x00);
|
||||||
let mut buf: [u8; 32] = [0; 32];
|
let mut buf: [u8; 32] = [0; 32];
|
||||||
@ -1259,11 +1259,11 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
fn test_serialization_creator_serde() {
|
fn test_serialization_creator_serde() {
|
||||||
let mut sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||||
let time_provider = CdsTime::new_with_u16_days(0, 0);
|
let time_provider = CdsTime::new_with_u16_days(0, 0);
|
||||||
let mut stamp_buf: [u8; 8] = [0; 8];
|
let mut stamp_buf: [u8; 8] = [0; 8];
|
||||||
let pus_tm =
|
let pus_tm =
|
||||||
PusTmCreator::new_simple(&mut sph, 17, 2, &time_provider, &mut stamp_buf, &[], true)
|
PusTmCreator::new_simple(sph, 17, 2, &time_provider, &mut stamp_buf, &[], true)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let output = to_allocvec(&pus_tm).unwrap();
|
let output = to_allocvec(&pus_tm).unwrap();
|
||||||
@ -1274,11 +1274,11 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
fn test_serialization_reader_serde() {
|
fn test_serialization_reader_serde() {
|
||||||
let mut sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||||
let time_provider = CdsTime::new_with_u16_days(0, 0);
|
let time_provider = CdsTime::new_with_u16_days(0, 0);
|
||||||
let mut stamp_buf: [u8; 8] = [0; 8];
|
let mut stamp_buf: [u8; 8] = [0; 8];
|
||||||
let pus_tm =
|
let pus_tm =
|
||||||
PusTmCreator::new_simple(&mut sph, 17, 2, &time_provider, &mut stamp_buf, &[], true)
|
PusTmCreator::new_simple(sph, 17, 2, &time_provider, &mut stamp_buf, &[], true)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let pus_tm_vec = pus_tm.to_vec().unwrap();
|
let pus_tm_vec = pus_tm.to_vec().unwrap();
|
||||||
let (tm_reader, _) = PusTmReader::new(&pus_tm_vec, time_provider.len_as_bytes()).unwrap();
|
let (tm_reader, _) = PusTmReader::new(&pus_tm_vec, time_provider.len_as_bytes()).unwrap();
|
||||||
|
Loading…
Reference in New Issue
Block a user