1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use deku::prelude::*;
use crate::aircraft_identification_read;
#[derive(Debug, PartialEq, DekuRead, Clone)]
#[deku(type = "u8", bits = "8")]
pub enum BDS {
#[deku(id = "0x00")]
Empty([u8; 6]),
#[deku(id = "0x10")]
DataLinkCapability(DataLinkCapability),
#[deku(id = "0x20")]
AircraftIdentification(#[deku(reader = "aircraft_identification_read(deku::rest)")] String),
#[deku(id_pat = "_")]
Unknown([u8; 6]),
}
impl std::fmt::Display for BDS {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Empty(_) => {
writeln!(f, "Comm-B format: empty response")?;
},
Self::AircraftIdentification(s) => {
writeln!(f, "Comm-B format: BDS2,0 Aircraft identification")?;
writeln!(f, " Ident: {}", s)?;
},
Self::DataLinkCapability(_) => {
writeln!(f, "Comm-B format: BDS1,0 Datalink capabilities")?;
},
Self::Unknown(_) => {
writeln!(f, "Comm-B format: unknown format")?;
},
}
Ok(())
}
}
#[derive(Debug, PartialEq, DekuRead, Clone)]
pub struct DataLinkCapability {
#[deku(bits = "1")]
pub continuation_flag: bool,
#[deku(bits = "5")]
pub reserved0: u8,
#[deku(bits = "1")]
pub overlay_command_capability: bool,
#[deku(bits = "1")]
pub acas: bool,
#[deku(bits = "7")]
pub mode_s_subnetwork_version_number: u8,
#[deku(bits = "1")]
pub transponder_enhanced_protocol_indicator: bool,
#[deku(bits = "1")]
pub mode_s_specific_services_capability: bool,
#[deku(bits = "3")]
pub uplink_elm_average_throughput_capability: u8,
#[deku(bits = "4")]
pub downlink_elm: u8,
#[deku(bits = "1")]
pub aircraft_identification_capability: bool,
#[deku(bits = "1")]
pub squitter_capability_subfield: bool,
#[deku(bits = "1")]
pub surveillance_identifier_code: bool,
#[deku(bits = "1")]
pub common_usage_gicb_capability_report: bool,
#[deku(bits = "4")]
pub reserved_acas: u8,
pub bit_array: u16,
}