diff options
author | Bob Wang <ziyiw@google.com> | 2024-04-11 23:27:54 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-11 23:27:54 +0000 |
commit | 202bac0222994d9d4dec7f7883670287fb3a0b7d (patch) | |
tree | ac0d8cce9bcba2fd5cbef7170a9f1277c2cbdecb | |
parent | 30e37396e2e82c6915e94af01db2a07d011c68fa (diff) | |
parent | b82158a3042d8c049ea9ff8f36f1ad6dc7f8b8d0 (diff) | |
download | uwb-202bac0222994d9d4dec7f7883670287fb3a0b7d.tar.gz |
Merge "[uci] Parse segment metrics from ranging diag. report" into main
-rw-r--r-- | src/rust/uwb_uci_packets/src/lib.rs | 24 | ||||
-rw-r--r-- | src/rust/uwb_uci_packets/uci_packets.pdl | 21 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/rust/uwb_uci_packets/src/lib.rs b/src/rust/uwb_uci_packets/src/lib.rs index 085707f..18c50c1 100644 --- a/src/rust/uwb_uci_packets/src/lib.rs +++ b/src/rust/uwb_uci_packets/src/lib.rs @@ -766,6 +766,7 @@ pub struct ParsedFrameReport { rssi: Vec<u8>, aoa: Vec<AoaMeasurement>, cir: Vec<CirValue>, + segment_metrics: Vec<SegmentMetricsValue>, } pub fn parse_diagnostics_ntf(evt: AndroidRangeDiagnosticsNtf) -> Result<ParsedDiagnosticNtfPacket> { @@ -776,6 +777,7 @@ pub fn parse_diagnostics_ntf(evt: AndroidRangeDiagnosticsNtf) -> Result<ParsedDi let mut rssi_vec = Vec::new(); let mut aoa_vec = Vec::new(); let mut cir_vec = Vec::new(); + let mut segment_metrics_vec = Vec::new(); for tlv in &report.frame_report_tlvs { match FrameReportTlvPacket::parse( &[vec![tlv.t as u8, tlv.v.len() as u8, (tlv.v.len() >> 8) as u8], tlv.v.clone()] @@ -791,6 +793,9 @@ pub fn parse_diagnostics_ntf(evt: AndroidRangeDiagnosticsNtf) -> Result<ParsedDi FrameReportTlvPacketChild::Cir(cir) => { cir_vec.append(&mut cir.get_cir_value().clone()) } + FrameReportTlvPacketChild::SegmentMetrics(sm) => { + segment_metrics_vec.append(&mut sm.get_segment_metrics().clone()) + } _ => return Err(Error::InvalidPacketError), }, Err(e) => { @@ -806,6 +811,7 @@ pub fn parse_diagnostics_ntf(evt: AndroidRangeDiagnosticsNtf) -> Result<ParsedDi rssi: rssi_vec, aoa: aoa_vec, cir: cir_vec, + segment_metrics: segment_metrics_vec, }); } Ok(ParsedDiagnosticNtfPacket { @@ -1050,11 +1056,28 @@ mod tests { sample_window: vec![0, 1, 2, 3], }]; let cir = CirBuilder { cir_value: cir_vec.clone() }.build(); + let segment_metrics_vec = vec![SegmentMetricsValue { + receiver: 1, + rf_noise_floor: 2, + segment_rsl: 3, + first_path_index: 4, + first_path_rsl: 5, + first_path_time_ns: 6, + peak_path_index: 7, + peak_path_rsl: 8, + peak_path_time_ns: 9, + }]; + let segment_metrics = + SegmentMetricsBuilder { segment_metrics: segment_metrics_vec.clone() }.build(); let mut frame_reports = Vec::new(); let tlvs = vec![ FrameReportTlv { t: rssi.get_t(), v: rssi.get_rssi().to_vec() }, FrameReportTlv { t: aoa.get_t(), v: aoa.to_vec()[3..].to_vec() }, FrameReportTlv { t: cir.get_t(), v: cir.to_vec()[3..].to_vec() }, + FrameReportTlv { + t: segment_metrics.get_t(), + v: segment_metrics.to_vec()[3..].to_vec(), + }, ]; let frame_report = FrameReport { uwb_msg_id: 1, action: 1, antenna_set: 1, frame_report_tlvs: tlvs }; @@ -1071,6 +1094,7 @@ mod tests { assert_eq!(aoa_1, parsed_frame_report.aoa[0]); assert_eq!(aoa_2, parsed_frame_report.aoa[1]); assert_eq!(cir_vec, parsed_frame_report.cir); + assert_eq!(segment_metrics_vec, parsed_frame_report.segment_metrics); } #[test] diff --git a/src/rust/uwb_uci_packets/uci_packets.pdl b/src/rust/uwb_uci_packets/uci_packets.pdl index 0fa887d..0268145 100644 --- a/src/rust/uwb_uci_packets/uci_packets.pdl +++ b/src/rust/uwb_uci_packets/uci_packets.pdl @@ -306,6 +306,7 @@ enum FrameReportTlvType : 8 { RSSI = 0x0, AOA = 0x1, CIR = 0x2, + SEGMENT_METRICS = 0x6, } enum CapTlvType : 8 { @@ -1432,6 +1433,26 @@ test Cir { "\x02\x15\x00\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x00\x02\x04\x00\x01\x02\x03\x04", } +packet SegmentMetrics : FrameReportTlvPacket (t = SEGMENT_METRICS) { + segment_metrics: SegmentMetricsValue[], +} + +struct SegmentMetricsValue { + receiver: 8, + rf_noise_floor: 16, + segment_rsl: 16, + first_path_index: 16, + first_path_rsl: 16, + first_path_time_ns: 16, + peak_path_index: 16, + peak_path_rsl: 16, + peak_path_time_ns: 16, +} + +test SegmentMetrics { + "\x08\xB0\xFF\x04\x3C\xE1\x02\xA1\xFF\x52\xB8\xE3\x02\xC4\xFF\xC0\xB8", +} + struct FrameReport { uwb_msg_id: 8, action: 8, |