mod common;
use common::*;
use uom::si::electric_current::ampere;
use uom::si::electric_potential::volt;
use uom::si::power::watt;
use uom::si::thermodynamic_temperature::degree_celsius;
#[test]
fn test_adc() {
let bytes_data = hex_to_bytes(EXTENDED_ADC_DATA);
let packet = RawPacket::try_from(bytes_data).unwrap();
assert!(matches!(packet.packet_type(), PacketType::PutData));
let logical_packets = packet.logical_packets().expect("Should have logical packets");
assert_eq!(logical_packets.len(), 1);
let lp = &logical_packets[0];
assert_eq!(lp.attribute, Attribute::Adc);
assert_eq!(lp.size, 44);
assert!(!lp.next);
let reserved_flag = match &packet {
RawPacket::Ctrl { header, .. } => header.reserved_flag(),
RawPacket::SimpleData { header, .. } => header.reserved_flag(),
RawPacket::Data { header, .. } => header.reserved_flag(),
};
assert!(!reserved_flag);
println!("ADC Packet: {:?}", packet);
println!("Logical packet: attr={:?}, size={}", lp.attribute, lp.size);
println!("Type: {:?}", packet.packet_type());
}
#[test]
fn test_adc_data_packet() {
let bytes_data = hex_to_bytes(EXTENDED_ADC_DATA);
let raw_packet = RawPacket::try_from(bytes_data).unwrap();
let packet = Packet::try_from(raw_packet).unwrap();
match packet {
Packet::DataResponse { payloads } => {
assert_eq!(payloads.len(), 1);
match &payloads[0] {
PayloadData::Adc(adc) => {
assert!(adc.vbus.get::<volt>() > 0.0);
assert!(adc.ibus.get::<ampere>() > 0.0);
assert!(adc.power.get::<watt>() > 0.0);
assert_eq!(adc.sample_rate, Some(SampleRate::Sps2));
println!("ADC Data: {}", adc);
}
_ => panic!("Expected ADC payload"),
}
}
_ => panic!("Expected DataResponse packet, got {:?}", packet),
}
}
#[test]
fn test_adc_request_generation() {
let packet = Packet::GetData {
attributes: AttributeSet::single(Attribute::Adc),
};
let raw_packet = packet.to_raw_packet(0).unwrap();
let header_bytes = match &raw_packet {
RawPacket::Ctrl { header, .. } => header.into_bytes(),
_ => panic!("Expected Ctrl packet"),
};
let expected_bytes = [0x0c, 0x00, 0x02, 0x00];
assert_eq!(
header_bytes, expected_bytes,
"ADC request should generate [0c, 00, 02, 00], got {:02x?}",
header_bytes
);
match raw_packet {
RawPacket::Ctrl { header, payload } => {
assert_eq!(header.packet_type(), 12); assert!(!header.reserved_flag());
assert_eq!(header.id(), 0);
assert_eq!(header.attribute(), 1); assert_eq!(payload.len(), 0);
}
_ => panic!("Expected Ctrl packet"),
}
}
#[test]
fn test_adc_response_parsing_real_data() {
let bytes = Bytes::from(REAL_ADC_RESPONSE.to_vec());
let raw_packet = RawPacket::try_from(bytes).expect("Failed to parse raw packet");
match &raw_packet {
RawPacket::Data {
header,
logical_packets,
} => {
assert_eq!(header.packet_type(), 65); assert_eq!(logical_packets.len(), 1);
let lp = &logical_packets[0];
assert_eq!(lp.attribute, Attribute::Adc);
assert_eq!(lp.size, 44);
assert_eq!(lp.payload.len(), 44);
}
_ => panic!("Expected Data packet"),
}
let packet = Packet::try_from(raw_packet).expect("Failed to parse packet");
match packet {
Packet::DataResponse { payloads } => {
assert_eq!(payloads.len(), 1);
match &payloads[0] {
PayloadData::Adc(adc_data) => {
assert!(
(adc_data.vbus.get::<volt>() - 5.054).abs() < 0.001,
"Voltage should be ~5.054V, got {}",
adc_data.vbus.get::<volt>()
);
assert!(
(adc_data.ibus.get::<ampere>() - (-0.090)).abs() < 0.001,
"Current should be ~-0.090A, got {}",
adc_data.ibus.get::<ampere>()
);
assert!(
(adc_data.power.get::<watt>() - (-0.457)).abs() < 0.001,
"Power should be ~-0.457W, got {}",
adc_data.power.get::<watt>()
);
assert!(
(adc_data.temperature.get::<degree_celsius>() - 25.5703125).abs() < 0.02,
"Temperature should be ~25.57°C, got {}",
adc_data.temperature.get::<degree_celsius>()
);
assert!(
(adc_data.current_abs().get::<ampere>() - 0.090).abs() < 0.001,
"Absolute current should be ~0.090A, got {}",
adc_data.current_abs().get::<ampere>()
);
assert!(
(adc_data.power_abs().get::<watt>() - 0.457).abs() < 0.001,
"Absolute power should be ~0.457W, got {}",
adc_data.power_abs().get::<watt>()
);
assert_eq!(
adc_data.sample_rate,
Some(SampleRate::Sps2),
"Sample rate should be 2 SPS"
);
assert!(
adc_data.vdp.get::<volt>().abs() < 0.001,
"D+ should be ~0.000V, got {}",
adc_data.vdp.get::<volt>()
);
assert!(
adc_data.vdm.get::<volt>().abs() < 0.001,
"D- should be ~0.000V, got {}",
adc_data.vdm.get::<volt>()
);
assert!(
(adc_data.cc1.get::<volt>() - 0.423).abs() < 0.001,
"CC1 should be ~0.423V, got {}",
adc_data.cc1.get::<volt>()
);
assert!(
(adc_data.cc2.get::<volt>() - 0.001).abs() < 0.001,
"CC2 should be ~0.001V, got {}",
adc_data.cc2.get::<volt>()
);
println!("Successfully parsed ADC data: {}", adc_data);
}
_ => panic!("Expected ADC payload"),
}
}
_ => panic!("Expected DataResponse packet, got {:?}", packet),
}
}
#[test]
fn test_adc_request_generation_with_new_trait() {
let packet = Packet::GetData {
attributes: AttributeSet::single(Attribute::Adc),
};
let raw_packet = packet.to_raw_packet(0).unwrap();
let bytes = Bytes::from(raw_packet.clone());
let expected_bytes = [0x0c, 0x00, 0x02, 0x00];
assert_eq!(
bytes.as_ref(),
&expected_bytes,
"ADC request should generate [0c, 00, 02, 00] using new trait, got {:02x?}",
bytes.as_ref()
);
let parsed_packet = RawPacket::try_from(bytes).expect("Failed to parse generated bytes");
assert_eq!(parsed_packet, raw_packet, "Round-trip should preserve packet structure");
}