use broadcast_common::traits::{Parse, Serialize};
use dvb_simulcrypt::{
EcmgScsMessageType, EcmgScsParameterType, Interface, MessageType, Parameter, ParameterType,
SimulcryptMessage,
};
fn main() {
let ecm_channel_id = [0x00u8, 0x2A]; let super_cas_id = [0x00u8, 0x01, 0x00, 0x02];
let msg = SimulcryptMessage::new(
Interface::EcmgScs.protocol_version(),
MessageType::EcmgScs(EcmgScsMessageType::ChannelSetup),
vec![
Parameter::new(
ParameterType::EcmgScs(EcmgScsParameterType::EcmChannelId),
&ecm_channel_id,
),
Parameter::new(
ParameterType::EcmgScs(EcmgScsParameterType::SuperCasId),
&super_cas_id,
),
],
);
let mut bytes = vec![0u8; msg.serialized_len()];
let n = msg.serialize_into(&mut bytes).unwrap();
println!("interface: {}", msg.interface());
println!(
"message_type: {} (0x{:04X})",
msg.message_type,
msg.message_type.to_u16()
);
println!("protocol_version: 0x{:02X}", msg.protocol_version);
println!("message_length (body): {}", msg.body_len());
println!("parameters: {}", msg.parameters.len());
for p in &msg.parameters {
print!(" {} (0x{:04X}) =", p.ptype, p.ptype.to_u16());
for b in p.value {
print!(" {b:02X}");
}
println!();
}
print!("wire bytes ({n}):");
for b in &bytes {
print!(" {b:02X}");
}
println!();
assert_eq!(
SimulcryptMessage::parse_on(Interface::EcmgScs, &bytes).unwrap(),
msg
);
assert_eq!(SimulcryptMessage::parse(&bytes).unwrap(), msg);
println!("round-trip: OK");
}