Skip to content

Commit 7fbb61d

Browse files
committed
allow unknown bits for forward compatibility
Fixes #484 Signed-off-by: Onur Özkan <work@onurozkan.dev>
1 parent 9f20e11 commit 7fbb61d

File tree

3 files changed

+34
-44
lines changed

3 files changed

+34
-44
lines changed

mavlink-bindgen/src/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,8 +1220,8 @@ impl MavField {
12201220
let enum_name_ident = format_ident!("{}", enum_name);
12211221
quote! {
12221222
#tmp
1223-
#name = #enum_name_ident::from_bits(tmp as <#enum_name_ident as Flags>::Bits)
1224-
.ok_or(::mavlink_core::error::ParserError::InvalidFlag { flag_type: #enum_name, value: tmp as u64 })?;
1223+
// Keep unknown MAVLink bitmask bits for forward compatibility.
1224+
#name = #enum_name_ident::from_bits_retain(tmp as <#enum_name_ident as Flags>::Bits);
12251225
}
12261226
} else {
12271227
panic!("Display option not implemented");

mavlink-bindgen/tests/snapshots/e2e_snapshots__mav_bool.xml@mav_bool.rs.snap

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,9 @@ impl MessageData for BOOL_TEST_MESSAGE_DATA {
9090
};
9191
let mut __struct = Self::default();
9292
let tmp = buf.get_u8()?;
93-
__struct.bool_uint8 = MavBool::from_bits(tmp as <MavBool as Flags>::Bits).ok_or(
94-
::mavlink_core::error::ParserError::InvalidFlag {
95-
flag_type: "MavBool",
96-
value: tmp as u64,
97-
},
98-
)?;
93+
__struct.bool_uint8 = MavBool::from_bits_retain(tmp as <MavBool as Flags>::Bits);
9994
let tmp = buf.get_i8()?;
100-
__struct.bool_int8 = MavBool::from_bits(tmp as <MavBool as Flags>::Bits).ok_or(
101-
::mavlink_core::error::ParserError::InvalidFlag {
102-
flag_type: "MavBool",
103-
value: tmp as u64,
104-
},
105-
)?;
95+
__struct.bool_int8 = MavBool::from_bits_retain(tmp as <MavBool as Flags>::Bits);
10696
Ok(__struct)
10797
}
10898
fn ser(&self, version: MavlinkVersion, bytes: &mut [u8]) -> usize {

mavlink/tests/invalid_value_test.rs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ mod test_shared;
33
#[cfg(feature = "dialect-common")]
44
mod helper_tests {
55
use mavlink::{
6-
MavlinkVersion, MessageData, calculate_crc,
6+
MessageData, calculate_crc,
77
dialects::common::MavMessage,
88
error::{MessageReadError, ParserError},
99
peek_reader::PeekReader,
@@ -38,36 +38,36 @@ mod helper_tests {
3838
}
3939

4040
#[test]
41-
fn test_invalid_bitflag() {
42-
use mavlink::dialects::common::HIL_ACTUATOR_CONTROLS_DATA;
41+
fn test_unknown_bitflag_bits_are_preserved() {
42+
use mavlink::dialects::common::{
43+
MavFrame, PositionTargetTypemask, SET_POSITION_TARGET_GLOBAL_INT_DATA,
44+
};
4345

44-
let msg = HIL_ACTUATOR_CONTROLS_DATA::DEFAULT;
45-
let mut invalid_flag_buf = [0; 1 + 9 + HIL_ACTUATOR_CONTROLS_DATA::ENCODED_LEN + 2];
46-
let len = msg.ser(
47-
MavlinkVersion::V2,
48-
&mut invalid_flag_buf[10..10 + HIL_ACTUATOR_CONTROLS_DATA::ENCODED_LEN],
49-
);
50-
invalid_flag_buf[0] = mavlink::MAV_STX_V2;
51-
invalid_flag_buf[1] = len as u8;
52-
invalid_flag_buf[7] = HIL_ACTUATOR_CONTROLS_DATA::ID as u8;
53-
// set flags to an invalid HilActuatorControlsFlags value
54-
invalid_flag_buf[1 + 9 + 8..1 + 9 + 16].copy_from_slice(&u64::MAX.to_le_bytes());
55-
// update crc
56-
let crc = calculate_crc(
57-
&invalid_flag_buf[1..1 + 9 + len],
58-
HIL_ACTUATOR_CONTROLS_DATA::EXTRA_CRC,
59-
);
60-
invalid_flag_buf[1 + 9 + len..1 + 9 + len + 2].copy_from_slice(&crc.to_le_bytes());
46+
let send_msg = SET_POSITION_TARGET_GLOBAL_INT_DATA {
47+
coordinate_frame: MavFrame::MAV_FRAME_GLOBAL,
48+
// Regression test for https://github.com/mavlink/rust-mavlink/issues/484
49+
type_mask: PositionTargetTypemask::from_bits_retain(65016),
50+
..SET_POSITION_TARGET_GLOBAL_INT_DATA::DEFAULT
51+
};
6152

62-
let result = mavlink::read_v2_msg::<MavMessage, _>(&mut PeekReader::new(
63-
invalid_flag_buf.as_slice(),
64-
));
65-
assert!(matches!(
66-
result,
67-
Err(MessageReadError::Parse(ParserError::InvalidFlag {
68-
flag_type: "HilActuatorControlsFlags",
69-
value: u64::MAX
70-
}))
71-
));
53+
let mut buffer = [0u8; 280];
54+
let mut writer: &mut [u8] = &mut buffer;
55+
56+
mavlink::write_v2_msg(
57+
&mut writer,
58+
crate::test_shared::COMMON_MSG_HEADER,
59+
&MavMessage::SET_POSITION_TARGET_GLOBAL_INT(send_msg),
60+
)
61+
.expect("failed to serialize SET_POSITION_TARGET_GLOBAL_INT");
62+
63+
let mut reader = PeekReader::new(buffer.as_slice());
64+
let (_header, recv_msg) = mavlink::read_v2_msg::<MavMessage, _>(&mut reader)
65+
.expect("failed to parse SET_POSITION_TARGET_GLOBAL_INT with unknown bitmask bits");
66+
67+
let MavMessage::SET_POSITION_TARGET_GLOBAL_INT(recv_msg) = recv_msg else {
68+
panic!("decoded wrong message type");
69+
};
70+
71+
assert_eq!(recv_msg.type_mask.bits(), 65016);
7272
}
7373
}

0 commit comments

Comments
 (0)