Skip to content

Commit e2bdf1e

Browse files
Merge pull request #356 from rsadsb/update-deku
Update deku to 0.20.2
2 parents 3731b98 + cf4184b commit e2bdf1e

File tree

8 files changed

+672
-383
lines changed

8 files changed

+672
-383
lines changed

Cargo.lock

Lines changed: 621 additions & 358 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/src/radar/radar.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use crate::airplanes::build_tab_airplanes;
5555

5656
/// Amount of zoom out from your original lat/long position
5757
const MAX_PLOT_HIGH: f64 = 400.0;
58-
const MAX_PLOT_LOW: f64 = MAX_PLOT_HIGH * -1.0;
58+
const MAX_PLOT_LOW: f64 = -MAX_PLOT_HIGH;
5959

6060
mod scale {
6161
/// Diff between scale changes
@@ -168,7 +168,7 @@ impl Settings {
168168
let (local_x, local_y) = self.local_lat_lon();
169169
let (x, y) = self.to_mercator(latitude, longitude);
170170
let (x, y) = (x - local_x, y - local_y);
171-
(x, y * -1.0)
171+
(x, -y)
172172
}
173173

174174
/// Calculate mercator for local lat/long

libadsb_deku/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ std = ["deku/std", "alloc"]
1717
alloc = ["deku/alloc"]
1818

1919
[dependencies]
20-
deku = { version = "0.19.0", default-features = false, features = ["bits"] }
20+
deku = { version = "0.20.2", default-features = false, features = ["bits"] }
2121
serde = { version = "1.0", features = ["derive"], optional = true }
2222
libm = "0.2.8"
2323

libadsb_deku/src/adsb.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//! [`DF::TisB`]: crate::DF::TisB
55
66
#[cfg(feature = "alloc")]
7-
use alloc::{fmt, format, string::String, vec};
7+
use alloc::{fmt, format, string::String};
88
#[cfg(feature = "alloc")]
99
use core::{
1010
clone::Clone,
@@ -57,6 +57,7 @@ impl ADSB {
5757
/// reference: ICAO 9871 (A.2.3.1)
5858
#[derive(Debug, PartialEq, DekuRead, Clone)]
5959
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
60+
#[repr(u8)]
6061
#[deku(id_type = "u8", bits = "5")]
6162
pub enum ME {
6263
#[deku(id_pat = "9..=18")]
@@ -322,6 +323,7 @@ pub struct AirspeedDecoding {
322323
/// Aircraft Operational Status Subtype
323324
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
324325
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
326+
#[repr(u8)]
325327
#[deku(id_type = "u8", bits = "3")]
326328
pub enum OperationStatus {
327329
#[deku(id = "0")]
@@ -603,6 +605,7 @@ impl fmt::Display for OperationalMode {
603605
/// reference: ICAO 9871 (5.3.2.3)
604606
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
605607
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
608+
#[repr(u8)]
606609
#[deku(id_type = "u8", bits = "3")]
607610
pub enum ADSBVersion {
608611
#[deku(id = "0")]
@@ -644,6 +647,7 @@ impl fmt::Display for ControlField {
644647

645648
#[derive(Debug, PartialEq, Eq, DekuRead, Clone)]
646649
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
650+
#[repr(u8)]
647651
#[deku(id_type = "u8", bits = "3")]
648652
#[allow(non_camel_case_types)]
649653
pub enum ControlFieldType {
@@ -710,6 +714,7 @@ pub struct AircraftStatus {
710714

711715
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
712716
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
717+
#[repr(u8)]
713718
#[deku(id_type = "u8", bits = "3")]
714719
pub enum AircraftStatusType {
715720
#[deku(id = "0")]
@@ -724,6 +729,7 @@ pub enum AircraftStatusType {
724729

725730
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
726731
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
732+
#[repr(u8)]
727733
#[deku(id_type = "u8", bits = "3")]
728734
pub enum EmergencyState {
729735
None = 0,
@@ -784,6 +790,7 @@ pub struct Identification {
784790

785791
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
786792
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
793+
#[repr(u8)]
787794
#[deku(id_type = "u8", bits = "8")]
788795
pub enum TypeCoding {
789796
D = 1,
@@ -937,6 +944,7 @@ pub enum AirborneVelocitySubType {
937944

938945
#[derive(Copy, Clone, Debug, PartialEq, Eq, DekuRead)]
939946
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
947+
#[repr(u8)]
940948
#[deku(id_type = "u8", bits = "3")]
941949
pub enum AirborneVelocityType {
942950
Subsonic = 1,
@@ -975,6 +983,7 @@ impl AirborneVelocitySubFields {
975983

976984
#[derive(Copy, Clone, Debug, PartialEq, Eq, DekuRead)]
977985
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
986+
#[repr(u8)]
978987
#[deku(id_type = "u8", bits = "1")]
979988
pub enum DirectionEW {
980989
WestToEast = 0,
@@ -983,6 +992,7 @@ pub enum DirectionEW {
983992

984993
#[derive(Copy, Clone, Debug, PartialEq, Eq, DekuRead)]
985994
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
995+
#[repr(u8)]
986996
#[deku(id_type = "u8", bits = "1")]
987997
pub enum DirectionNS {
988998
SouthToNorth = 0,
@@ -991,6 +1001,7 @@ pub enum DirectionNS {
9911001

9921002
#[derive(Copy, Clone, Debug, PartialEq, Eq, DekuRead)]
9931003
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1004+
#[repr(u8)]
9941005
#[deku(id_type = "u8", bits = "1")]
9951006
pub enum SourceBitVerticalRate {
9961007
GNSS = 0,
@@ -999,6 +1010,7 @@ pub enum SourceBitVerticalRate {
9991010

10001011
#[derive(Copy, Clone, Debug, PartialEq, Eq, DekuRead)]
10011012
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1013+
#[repr(u8)]
10021014
#[deku(id_type = "u8", bits = "1")]
10031015
pub enum SignBitVerticalRate {
10041016
Up = 0,
@@ -1007,6 +1019,7 @@ pub enum SignBitVerticalRate {
10071019

10081020
#[derive(Copy, Clone, Debug, PartialEq, Eq, DekuRead)]
10091021
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1022+
#[repr(u8)]
10101023
#[deku(id_type = "u8", bits = "1")]
10111024
pub enum SignBitGNSSBaroAltitudesDiff {
10121025
Above = 0,
@@ -1015,6 +1028,7 @@ pub enum SignBitGNSSBaroAltitudesDiff {
10151028

10161029
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
10171030
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1031+
#[repr(u8)]
10181032
#[deku(id_type = "u8", bits = "1")]
10191033
pub enum VerticalRateSource {
10201034
BarometricPressureAltitude = 0,
@@ -1053,6 +1067,7 @@ pub struct SurfacePosition {
10531067

10541068
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
10551069
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1070+
#[repr(u8)]
10561071
#[deku(id_type = "u8", bits = "1")]
10571072
pub enum StatusForGroundTrack {
10581073
Invalid = 0,

libadsb_deku/src/bds.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
//! B-Definition Subfield for Comm-B Messages
22
3-
use alloc::format;
43
use alloc::string::String;
54
#[cfg(feature = "alloc")]
6-
use alloc::vec;
7-
#[cfg(feature = "alloc")]
85
use core::{
96
clone::Clone, cmp::PartialEq, fmt, fmt::Debug, prelude::rust_2021::derive, result::Result::Ok,
107
writeln,

libadsb_deku/src/lib.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,19 @@ impl<R: Read + Seek> Read for ReaderCrc<R> {
176176

177177
impl<R: Read + Seek> Seek for ReaderCrc<R> {
178178
fn seek(&mut self, pos: deku::no_std_io::SeekFrom) -> deku::no_std_io::Result<u64> {
179+
// When seeking forward, we need to read and cache the skipped bytes
180+
// for the CRC calculation to work correctly
181+
if let deku::no_std_io::SeekFrom::Current(offset) = pos {
182+
if offset > 0 {
183+
// Read and cache the bytes we're seeking over
184+
let mut buf = vec![0u8; offset as usize];
185+
let n = self.reader.read(&mut buf)?;
186+
self.cache.extend_from_slice(&buf[..n]);
187+
// Get current position after read
188+
return self.reader.stream_position();
189+
}
190+
}
191+
179192
self.just_seeked = true;
180193
self.reader.seek(pos)
181194
}
@@ -322,6 +335,7 @@ impl fmt::Display for Frame {
322335
/// Starting with 5 bits, decode the rest of the message as the correct data packets
323336
#[derive(Debug, PartialEq, DekuRead, Clone)]
324337
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
338+
#[repr(u8)]
325339
#[deku(id_type = "u8", bits = "5")]
326340
pub enum DF {
327341
/// 17: Extended Squitter, Downlink Format 17 (3.1.2.8.6)
@@ -573,37 +587,29 @@ impl Altitude {
573587
}
574588

575589
/// SPI Condition
576-
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
590+
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone, Default)]
577591
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
592+
#[repr(u8)]
578593
#[deku(id_type = "u8", bits = "2")]
579594
pub enum SurveillanceStatus {
595+
#[default]
580596
NoCondition = 0,
581597
PermanentAlert = 1,
582598
TemporaryAlert = 2,
583599
SPICondition = 3,
584600
}
585601

586-
impl Default for SurveillanceStatus {
587-
fn default() -> Self {
588-
Self::NoCondition
589-
}
590-
}
591-
592602
/// Even / Odd
593-
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
603+
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone, Default)]
594604
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
605+
#[repr(u8)]
595606
#[deku(id_type = "u8", bits = "1")]
596607
pub enum CPRFormat {
608+
#[default]
597609
Even = 0,
598610
Odd = 1,
599611
}
600612

601-
impl Default for CPRFormat {
602-
fn default() -> Self {
603-
Self::Even
604-
}
605-
}
606-
607613
impl fmt::Display for CPRFormat {
608614
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
609615
write!(
@@ -620,6 +626,7 @@ impl fmt::Display for CPRFormat {
620626
/// Positive / Negative
621627
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
622628
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
629+
#[repr(u8)]
623630
#[deku(id_type = "u8", bits = "1")]
624631
pub enum Sign {
625632
Positive = 0,
@@ -709,6 +716,7 @@ impl core::str::FromStr for ICAO {
709716
/// Type of `DownlinkRequest`
710717
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
711718
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
719+
#[repr(u8)]
712720
#[deku(id_type = "u8", bits = "5")]
713721
pub enum DownlinkRequest {
714722
#[deku(id = 0b00000)]
@@ -730,6 +738,7 @@ pub enum DownlinkRequest {
730738
/// Uplink / Downlink
731739
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
732740
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
741+
#[repr(u8)]
733742
#[deku(id_type = "u8", bits = "1")]
734743
pub enum KE {
735744
DownlinkELMTx = 0,
@@ -747,6 +756,7 @@ pub struct UtilityMessage {
747756
/// Message Type
748757
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
749758
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
759+
#[repr(u8)]
750760
#[deku(id_type = "u8", bits = "2")]
751761
pub enum UtilityMessageType {
752762
NoInformation = 0b00,
@@ -758,6 +768,7 @@ pub enum UtilityMessageType {
758768
/// Airborne / Ground and SPI
759769
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
760770
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
771+
#[repr(u8)]
761772
#[deku(id_type = "u8", bits = "3")]
762773
pub enum FlightStatus {
763774
NoAlertNoSPIAirborne = 0b000,
@@ -832,6 +843,7 @@ impl AC13Field {
832843
/// Transponder level and additional information (3.1.2.5.2.2.1)
833844
#[derive(Debug, PartialEq, Eq, DekuRead, Copy, Clone)]
834845
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
846+
#[repr(u8)]
835847
#[deku(id_type = "u8", bits = "3")]
836848
#[allow(non_camel_case_types)]
837849
pub enum Capability {

libadsb_deku/tests/file.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ const TEST_STR: &str = include_str!("../tests/lax-messages.txt");
66
#[test]
77
fn lax_messages() {
88
// Read from test file and assert display implemented and non panic decode
9-
for line in TEST_STR.lines() {
9+
for (line_num, line) in TEST_STR.lines().enumerate() {
1010
let len = line.chars().count();
1111
let hex = &mut line.to_string()[1..len - 1].to_string();
1212
let bytes = hex::decode(&hex).unwrap();
1313
// test non panic decode
14-
println!("{:02x?}", bytes);
15-
let frame = Frame::from_bytes(&bytes).unwrap();
14+
println!("Line {}: {:02x?}", line_num + 1, bytes);
15+
let frame = Frame::from_bytes(&bytes).unwrap_or_else(|e| {
16+
panic!("Line {} (hex: {}) failed: {:?}", line_num + 1, hex, e);
17+
});
1618
// test fmt::Display implemented
1719
assert_ne!("{}", format!("{frame}"));
1820
}

libadsb_deku/tests/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ fn testing01() {
1010
let bytes = hex!("8D40621D58C382D690C8AC2863A7");
1111
let frame = Frame::from_bytes(&bytes);
1212
if let DF::ADSB(adsb) = frame.unwrap().df {
13-
if let ME::AirbornePositionBaroAltitude { id, altitude } = adsb.me {
13+
if let ME::AirbornePositionBaroAltitude { id: _, altitude } = adsb.me {
1414
assert_eq!(altitude.alt, Some(38000));
1515
assert_eq!(altitude.lat_cpr, 93000);
1616
assert_eq!(altitude.lon_cpr, 51372);

0 commit comments

Comments
 (0)