Skip to main content

pamoja_mavlink/dialect/
enums.rs

1//! The common-dialect enumerations, as named constants and as a table of names.
2//!
3//! MAVLink enum fields ride on the wire as plain integers, so the typed messages store them
4//! as integers. Each module below gives an enumeration's values their Rust names, and
5//! [`ENUMS`] carries the same values under the names the dialect writes, such as
6//! `MAV_TYPE_QUADROTOR`, so a program looks a value up by that name, or names a value it
7//! received, the same way in every language.
8//!
9//! Every enumeration a field of a typed message names is here in full, as the MAVLink
10//! `minimal.xml` and `common.xml` define it at commit
11//! `20ed9b2760cffec2ac9becb9b8287cb2456d7ee7` of `mavlink/mavlink`. A constant's name is the
12//! dialect's with the enumeration's own prefix removed, and a name that would start with a
13//! digit moves the digits to the end, so `MAV_SYS_STATUS_SENSOR_3D_GYRO` is
14//! `mav_sys_status_sensor::GYRO_3D`. A field may carry a value no entry names; it is still
15//! valid on the wire.
16
17#![allow(missing_docs)]
18
19/// One named value of a dialect enumeration.
20#[derive(Clone, Copy, Debug, PartialEq, Eq)]
21pub struct EnumEntry {
22    /// The name the dialect gives the value, such as `"MAV_STATE_STANDBY"`.
23    pub name: &'static str,
24    /// The value on the wire.
25    pub value: u64,
26}
27
28/// A dialect enumeration: its name, whether its values combine as bits, and every value it
29/// names, in the order the dialect lists them.
30#[derive(Clone, Copy, Debug, PartialEq, Eq)]
31pub struct EnumDescriptor {
32    /// The enumeration's name, such as `"MAV_STATE"`.
33    pub name: &'static str,
34    /// Whether a field of this enumeration holds several of its values at once, one per bit.
35    pub bitmask: bool,
36    /// Every value the enumeration names.
37    pub entries: &'static [EnumEntry],
38}
39
40impl EnumDescriptor {
41    /// Returns the value an entry of this enumeration names.
42    ///
43    /// # Arguments
44    ///
45    /// * `entry` - the entry's name as the dialect writes it, such as `"MAV_STATE_STANDBY"`.
46    ///
47    /// # Returns
48    ///
49    /// `Some(value)`, or `None` if no entry of this enumeration has that name.
50    ///
51    /// # Examples
52    ///
53    /// ```
54    /// use pamoja_mavlink::dialect::enum_named;
55    ///
56    /// let state = enum_named("MAV_STATE").expect("a dialect enumeration");
57    /// assert_eq!(state.value("MAV_STATE_STANDBY"), Some(3));
58    /// ```
59    pub fn value(&self, entry: &str) -> Option<u64> {
60        self.entries
61            .iter()
62            .find(|named| named.name == entry)
63            .map(|named| named.value)
64    }
65
66    /// Returns the name of the entry that stands for a value.
67    ///
68    /// # Arguments
69    ///
70    /// * `value` - the value a field carried.
71    ///
72    /// # Returns
73    ///
74    /// `Some(name)` for the first entry, in dialect order, with exactly that value, or `None`
75    /// if no entry names it. For a bitmask, see [`names`](Self::names).
76    pub fn entry(&self, value: u64) -> Option<&'static str> {
77        self.entries
78            .iter()
79            .find(|named| named.value == value)
80            .map(|named| named.name)
81    }
82
83    /// Returns the names a value is made of.
84    ///
85    /// # Arguments
86    ///
87    /// * `value` - the value a field carried.
88    ///
89    /// # Returns
90    ///
91    /// For a bitmask, each entry whose bits are all set in `value`, in dialect order, or the
92    /// entry for zero when `value` is zero. Otherwise the one entry that names `value`. Bits
93    /// or values no entry names are left out.
94    ///
95    /// # Examples
96    ///
97    /// ```
98    /// use pamoja_mavlink::dialect::{enum_named, mav_mode_flag};
99    ///
100    /// let flags = enum_named("MAV_MODE_FLAG").expect("a dialect enumeration");
101    /// let base_mode = mav_mode_flag::SAFETY_ARMED | mav_mode_flag::CUSTOM_MODE_ENABLED;
102    /// let names: Vec<&str> = flags.names(u64::from(base_mode)).collect();
103    /// assert_eq!(names, ["MAV_MODE_FLAG_SAFETY_ARMED", "MAV_MODE_FLAG_CUSTOM_MODE_ENABLED"]);
104    /// ```
105    pub fn names(&self, value: u64) -> impl Iterator<Item = &'static str> + '_ {
106        let bitmask = self.bitmask;
107        let whole = if bitmask { None } else { self.entry(value) };
108        whole.into_iter().chain(
109            self.entries
110                .iter()
111                .filter(move |named| {
112                    bitmask
113                        && if value == 0 {
114                            named.value == 0
115                        } else {
116                            named.value != 0 && value & named.value == named.value
117                        }
118                })
119                .map(|named| named.name),
120        )
121    }
122}
123
124/// Returns a dialect enumeration by name.
125///
126/// # Arguments
127///
128/// * `name` - the enumeration's name, such as `"MAV_TYPE"`.
129///
130/// # Returns
131///
132/// The enumeration, or `None` if [`ENUMS`] holds none by that name.
133pub fn enum_named(name: &str) -> Option<&'static EnumDescriptor> {
134    ENUMS.iter().find(|described| described.name == name)
135}
136
137/// Returns the value a dialect entry name stands for, whichever enumeration it belongs to.
138///
139/// Entry names are unique across the dialect, so the name alone is enough.
140///
141/// # Arguments
142///
143/// * `entry` - the entry's name, such as `"MAV_CMD_COMPONENT_ARM_DISARM"`.
144///
145/// # Returns
146///
147/// `Some(value)`, or `None` if no entry in [`ENUMS`] has that name.
148///
149/// # Examples
150///
151/// ```
152/// use pamoja_mavlink::dialect::{entry_value, mav_cmd};
153///
154/// assert_eq!(entry_value("MAV_CMD_COMPONENT_ARM_DISARM"), Some(u64::from(mav_cmd::COMPONENT_ARM_DISARM)));
155/// assert_eq!(entry_value("MAV_CMD_ARM"), None);
156/// ```
157pub fn entry_value(entry: &str) -> Option<u64> {
158    ENUMS.iter().find_map(|described| described.value(entry))
159}
160
161macro_rules! dialect_enums {
162    ($(
163        $(#[$doc:meta])*
164        $module:ident $name:literal $ty:ident $($bitmask:ident)? {
165            $($constant:ident = $value:literal $entry:literal,)*
166        }
167    )*) => {
168        $(
169            $(#[$doc])*
170            pub mod $module {
171                $(pub const $constant: $ty = $value;)*
172            }
173        )*
174
175        /// Every enumeration a field of a typed message names, complete, in the order the
176        /// dialect defines them.
177        pub const ENUMS: &[EnumDescriptor] = &[$(
178            EnumDescriptor {
179                name: $name,
180                bitmask: dialect_enums!(@bitmask $($bitmask)?),
181                entries: &[$(EnumEntry { name: $entry, value: $value }),*],
182            },
183        )*];
184    };
185    (@bitmask bitmask) => {
186        true
187    };
188    (@bitmask) => {
189        false
190    };
191}
192
193dialect_enums! {
194    /// `MAV_AUTOPILOT`: which autopilot stack a [`Heartbeat`](super::Heartbeat) comes from.
195    mav_autopilot "MAV_AUTOPILOT" u8 {
196        GENERIC = 0 "MAV_AUTOPILOT_GENERIC",
197        RESERVED = 1 "MAV_AUTOPILOT_RESERVED",
198        SLUGS = 2 "MAV_AUTOPILOT_SLUGS",
199        ARDUPILOTMEGA = 3 "MAV_AUTOPILOT_ARDUPILOTMEGA",
200        OPENPILOT = 4 "MAV_AUTOPILOT_OPENPILOT",
201        GENERIC_WAYPOINTS_ONLY = 5 "MAV_AUTOPILOT_GENERIC_WAYPOINTS_ONLY",
202        GENERIC_WAYPOINTS_AND_SIMPLE_NAVIGATION_ONLY = 6 "MAV_AUTOPILOT_GENERIC_WAYPOINTS_AND_SIMPLE_NAVIGATION_ONLY",
203        GENERIC_MISSION_FULL = 7 "MAV_AUTOPILOT_GENERIC_MISSION_FULL",
204        INVALID = 8 "MAV_AUTOPILOT_INVALID",
205        PPZ = 9 "MAV_AUTOPILOT_PPZ",
206        UDB = 10 "MAV_AUTOPILOT_UDB",
207        FP = 11 "MAV_AUTOPILOT_FP",
208        PX4 = 12 "MAV_AUTOPILOT_PX4",
209        SMACCMPILOT = 13 "MAV_AUTOPILOT_SMACCMPILOT",
210        AUTOQUAD = 14 "MAV_AUTOPILOT_AUTOQUAD",
211        ARMAZILA = 15 "MAV_AUTOPILOT_ARMAZILA",
212        AEROB = 16 "MAV_AUTOPILOT_AEROB",
213        ASLUAV = 17 "MAV_AUTOPILOT_ASLUAV",
214        SMARTAP = 18 "MAV_AUTOPILOT_SMARTAP",
215        AIRRAILS = 19 "MAV_AUTOPILOT_AIRRAILS",
216        REFLEX = 20 "MAV_AUTOPILOT_REFLEX",
217        FLIX = 21 "MAV_AUTOPILOT_FLIX",
218    }
219
220    /// `MAV_TYPE`: the kind of vehicle or component a [`Heartbeat`](super::Heartbeat) describes.
221    mav_type "MAV_TYPE" u8 {
222        GENERIC = 0 "MAV_TYPE_GENERIC",
223        FIXED_WING = 1 "MAV_TYPE_FIXED_WING",
224        QUADROTOR = 2 "MAV_TYPE_QUADROTOR",
225        COAXIAL = 3 "MAV_TYPE_COAXIAL",
226        HELICOPTER = 4 "MAV_TYPE_HELICOPTER",
227        ANTENNA_TRACKER = 5 "MAV_TYPE_ANTENNA_TRACKER",
228        GCS = 6 "MAV_TYPE_GCS",
229        AIRSHIP = 7 "MAV_TYPE_AIRSHIP",
230        FREE_BALLOON = 8 "MAV_TYPE_FREE_BALLOON",
231        ROCKET = 9 "MAV_TYPE_ROCKET",
232        GROUND_ROVER = 10 "MAV_TYPE_GROUND_ROVER",
233        SURFACE_BOAT = 11 "MAV_TYPE_SURFACE_BOAT",
234        SUBMARINE = 12 "MAV_TYPE_SUBMARINE",
235        HEXAROTOR = 13 "MAV_TYPE_HEXAROTOR",
236        OCTOROTOR = 14 "MAV_TYPE_OCTOROTOR",
237        TRICOPTER = 15 "MAV_TYPE_TRICOPTER",
238        FLAPPING_WING = 16 "MAV_TYPE_FLAPPING_WING",
239        KITE = 17 "MAV_TYPE_KITE",
240        ONBOARD_CONTROLLER = 18 "MAV_TYPE_ONBOARD_CONTROLLER",
241        VTOL_TAILSITTER_DUOROTOR = 19 "MAV_TYPE_VTOL_TAILSITTER_DUOROTOR",
242        VTOL_TAILSITTER_QUADROTOR = 20 "MAV_TYPE_VTOL_TAILSITTER_QUADROTOR",
243        VTOL_TILTROTOR = 21 "MAV_TYPE_VTOL_TILTROTOR",
244        VTOL_FIXEDROTOR = 22 "MAV_TYPE_VTOL_FIXEDROTOR",
245        VTOL_TAILSITTER = 23 "MAV_TYPE_VTOL_TAILSITTER",
246        VTOL_TILTWING = 24 "MAV_TYPE_VTOL_TILTWING",
247        VTOL_RESERVED5 = 25 "MAV_TYPE_VTOL_RESERVED5",
248        GIMBAL = 26 "MAV_TYPE_GIMBAL",
249        ADSB = 27 "MAV_TYPE_ADSB",
250        PARAFOIL = 28 "MAV_TYPE_PARAFOIL",
251        DODECAROTOR = 29 "MAV_TYPE_DODECAROTOR",
252        CAMERA = 30 "MAV_TYPE_CAMERA",
253        CHARGING_STATION = 31 "MAV_TYPE_CHARGING_STATION",
254        FLARM = 32 "MAV_TYPE_FLARM",
255        SERVO = 33 "MAV_TYPE_SERVO",
256        ODID = 34 "MAV_TYPE_ODID",
257        DECAROTOR = 35 "MAV_TYPE_DECAROTOR",
258        BATTERY = 36 "MAV_TYPE_BATTERY",
259        PARACHUTE = 37 "MAV_TYPE_PARACHUTE",
260        LOG = 38 "MAV_TYPE_LOG",
261        OSD = 39 "MAV_TYPE_OSD",
262        IMU = 40 "MAV_TYPE_IMU",
263        GPS = 41 "MAV_TYPE_GPS",
264        WINCH = 42 "MAV_TYPE_WINCH",
265        GENERIC_MULTIROTOR = 43 "MAV_TYPE_GENERIC_MULTIROTOR",
266        ILLUMINATOR = 44 "MAV_TYPE_ILLUMINATOR",
267        SPACECRAFT_ORBITER = 45 "MAV_TYPE_SPACECRAFT_ORBITER",
268        GROUND_QUADRUPED = 46 "MAV_TYPE_GROUND_QUADRUPED",
269        VTOL_GYRODYNE = 47 "MAV_TYPE_VTOL_GYRODYNE",
270        GRIPPER = 48 "MAV_TYPE_GRIPPER",
271        RADIO = 49 "MAV_TYPE_RADIO",
272    }
273
274    /// `MAV_MODE_FLAG`: bits of the base mode field of a [`Heartbeat`](super::Heartbeat).
275    mav_mode_flag "MAV_MODE_FLAG" u8 bitmask {
276        SAFETY_ARMED = 128 "MAV_MODE_FLAG_SAFETY_ARMED",
277        MANUAL_INPUT_ENABLED = 64 "MAV_MODE_FLAG_MANUAL_INPUT_ENABLED",
278        HIL_ENABLED = 32 "MAV_MODE_FLAG_HIL_ENABLED",
279        STABILIZE_ENABLED = 16 "MAV_MODE_FLAG_STABILIZE_ENABLED",
280        GUIDED_ENABLED = 8 "MAV_MODE_FLAG_GUIDED_ENABLED",
281        AUTO_ENABLED = 4 "MAV_MODE_FLAG_AUTO_ENABLED",
282        TEST_ENABLED = 2 "MAV_MODE_FLAG_TEST_ENABLED",
283        CUSTOM_MODE_ENABLED = 1 "MAV_MODE_FLAG_CUSTOM_MODE_ENABLED",
284    }
285
286    /// `MAV_STATE`: the system status carried by a [`Heartbeat`](super::Heartbeat).
287    mav_state "MAV_STATE" u8 {
288        UNINIT = 0 "MAV_STATE_UNINIT",
289        BOOT = 1 "MAV_STATE_BOOT",
290        CALIBRATING = 2 "MAV_STATE_CALIBRATING",
291        STANDBY = 3 "MAV_STATE_STANDBY",
292        ACTIVE = 4 "MAV_STATE_ACTIVE",
293        CRITICAL = 5 "MAV_STATE_CRITICAL",
294        EMERGENCY = 6 "MAV_STATE_EMERGENCY",
295        POWEROFF = 7 "MAV_STATE_POWEROFF",
296        FLIGHT_TERMINATION = 8 "MAV_STATE_FLIGHT_TERMINATION",
297    }
298
299    /// `MAV_PROTOCOL_CAPABILITY`: bits of the capabilities field of an
300    /// [`AutopilotVersion`](super::AutopilotVersion), naming the protocol features the autopilot supports.
301    mav_protocol_capability "MAV_PROTOCOL_CAPABILITY" u64 bitmask {
302        MISSION_FLOAT = 1 "MAV_PROTOCOL_CAPABILITY_MISSION_FLOAT",
303        PARAM_FLOAT = 2 "MAV_PROTOCOL_CAPABILITY_PARAM_FLOAT",
304        MISSION_INT = 4 "MAV_PROTOCOL_CAPABILITY_MISSION_INT",
305        COMMAND_INT = 8 "MAV_PROTOCOL_CAPABILITY_COMMAND_INT",
306        PARAM_ENCODE_BYTEWISE = 16 "MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_BYTEWISE",
307        FTP = 32 "MAV_PROTOCOL_CAPABILITY_FTP",
308        SET_ATTITUDE_TARGET = 64 "MAV_PROTOCOL_CAPABILITY_SET_ATTITUDE_TARGET",
309        SET_POSITION_TARGET_LOCAL_NED = 128 "MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_LOCAL_NED",
310        SET_POSITION_TARGET_GLOBAL_INT = 256 "MAV_PROTOCOL_CAPABILITY_SET_POSITION_TARGET_GLOBAL_INT",
311        TERRAIN = 512 "MAV_PROTOCOL_CAPABILITY_TERRAIN",
312        RESERVED3 = 1024 "MAV_PROTOCOL_CAPABILITY_RESERVED3",
313        FLIGHT_TERMINATION = 2048 "MAV_PROTOCOL_CAPABILITY_FLIGHT_TERMINATION",
314        COMPASS_CALIBRATION = 4096 "MAV_PROTOCOL_CAPABILITY_COMPASS_CALIBRATION",
315        MAVLINK2 = 8192 "MAV_PROTOCOL_CAPABILITY_MAVLINK2",
316        MISSION_FENCE = 16384 "MAV_PROTOCOL_CAPABILITY_MISSION_FENCE",
317        MISSION_RALLY = 32768 "MAV_PROTOCOL_CAPABILITY_MISSION_RALLY",
318        RESERVED2 = 65536 "MAV_PROTOCOL_CAPABILITY_RESERVED2",
319        PARAM_ENCODE_C_CAST = 131072 "MAV_PROTOCOL_CAPABILITY_PARAM_ENCODE_C_CAST",
320        COMPONENT_IMPLEMENTS_GIMBAL_MANAGER = 262144 "MAV_PROTOCOL_CAPABILITY_COMPONENT_IMPLEMENTS_GIMBAL_MANAGER",
321        COMPONENT_ACCEPTS_GCS_CONTROL = 524288 "MAV_PROTOCOL_CAPABILITY_COMPONENT_ACCEPTS_GCS_CONTROL",
322        GRIPPER = 1048576 "MAV_PROTOCOL_CAPABILITY_GRIPPER",
323    }
324
325    /// `MAV_SYS_STATUS_SENSOR`: bits of the three sensor fields of a [`SysStatus`](super::SysStatus),
326    /// which say what the vehicle has, what it has switched on, and what is healthy.
327    ///
328    /// `PREARM_CHECK` is the bit a ground station waits on before arming: ArduPilot and PX4 both
329    /// set it in the health field once every pre-arm check passes.
330    mav_sys_status_sensor "MAV_SYS_STATUS_SENSOR" u32 bitmask {
331        GYRO_3D = 1 "MAV_SYS_STATUS_SENSOR_3D_GYRO",
332        ACCEL_3D = 2 "MAV_SYS_STATUS_SENSOR_3D_ACCEL",
333        MAG_3D = 4 "MAV_SYS_STATUS_SENSOR_3D_MAG",
334        ABSOLUTE_PRESSURE = 8 "MAV_SYS_STATUS_SENSOR_ABSOLUTE_PRESSURE",
335        DIFFERENTIAL_PRESSURE = 16 "MAV_SYS_STATUS_SENSOR_DIFFERENTIAL_PRESSURE",
336        GPS = 32 "MAV_SYS_STATUS_SENSOR_GPS",
337        OPTICAL_FLOW = 64 "MAV_SYS_STATUS_SENSOR_OPTICAL_FLOW",
338        VISION_POSITION = 128 "MAV_SYS_STATUS_SENSOR_VISION_POSITION",
339        LASER_POSITION = 256 "MAV_SYS_STATUS_SENSOR_LASER_POSITION",
340        EXTERNAL_GROUND_TRUTH = 512 "MAV_SYS_STATUS_SENSOR_EXTERNAL_GROUND_TRUTH",
341        ANGULAR_RATE_CONTROL = 1024 "MAV_SYS_STATUS_SENSOR_ANGULAR_RATE_CONTROL",
342        ATTITUDE_STABILIZATION = 2048 "MAV_SYS_STATUS_SENSOR_ATTITUDE_STABILIZATION",
343        YAW_POSITION = 4096 "MAV_SYS_STATUS_SENSOR_YAW_POSITION",
344        Z_ALTITUDE_CONTROL = 8192 "MAV_SYS_STATUS_SENSOR_Z_ALTITUDE_CONTROL",
345        XY_POSITION_CONTROL = 16384 "MAV_SYS_STATUS_SENSOR_XY_POSITION_CONTROL",
346        MOTOR_OUTPUTS = 32768 "MAV_SYS_STATUS_SENSOR_MOTOR_OUTPUTS",
347        RC_RECEIVER = 65536 "MAV_SYS_STATUS_SENSOR_RC_RECEIVER",
348        GYRO2_3D = 131072 "MAV_SYS_STATUS_SENSOR_3D_GYRO2",
349        ACCEL2_3D = 262144 "MAV_SYS_STATUS_SENSOR_3D_ACCEL2",
350        MAG2_3D = 524288 "MAV_SYS_STATUS_SENSOR_3D_MAG2",
351        GEOFENCE = 1048576 "MAV_SYS_STATUS_GEOFENCE",
352        AHRS = 2097152 "MAV_SYS_STATUS_AHRS",
353        TERRAIN = 4194304 "MAV_SYS_STATUS_TERRAIN",
354        REVERSE_MOTOR = 8388608 "MAV_SYS_STATUS_REVERSE_MOTOR",
355        LOGGING = 16777216 "MAV_SYS_STATUS_LOGGING",
356        BATTERY = 33554432 "MAV_SYS_STATUS_SENSOR_BATTERY",
357        PROXIMITY = 67108864 "MAV_SYS_STATUS_SENSOR_PROXIMITY",
358        SATCOM = 134217728 "MAV_SYS_STATUS_SENSOR_SATCOM",
359        PREARM_CHECK = 268435456 "MAV_SYS_STATUS_PREARM_CHECK",
360        OBSTACLE_AVOIDANCE = 536870912 "MAV_SYS_STATUS_OBSTACLE_AVOIDANCE",
361        PROPULSION = 1073741824 "MAV_SYS_STATUS_SENSOR_PROPULSION",
362        EXTENSION_USED = 2147483648 "MAV_SYS_STATUS_EXTENSION_USED",
363    }
364
365    /// `MAV_SYS_STATUS_SENSOR_EXTENDED`: bits of the three extended sensor fields of a
366    /// [`SysStatus`](super::SysStatus), for the sensors the first 32 bits have no room for.
367    mav_sys_status_sensor_extended "MAV_SYS_STATUS_SENSOR_EXTENDED" u32 bitmask {
368        RECOVERY_SYSTEM = 1 "MAV_SYS_STATUS_RECOVERY_SYSTEM",
369        LEAK = 2 "MAV_SYS_STATUS_SENSOR_LEAK",
370        GYRO3_3D = 4 "MAV_SYS_STATUS_SENSOR_3D_GYRO3",
371        ACCEL3_3D = 8 "MAV_SYS_STATUS_SENSOR_3D_ACCEL3",
372        GYRO4_3D = 16 "MAV_SYS_STATUS_SENSOR_3D_GYRO4",
373        ACCEL4_3D = 32 "MAV_SYS_STATUS_SENSOR_3D_ACCEL4",
374        MAG3_3D = 64 "MAV_SYS_STATUS_SENSOR_3D_MAG3",
375        MAG4_3D = 128 "MAV_SYS_STATUS_SENSOR_3D_MAG4",
376    }
377
378    /// `MAV_FRAME`: the coordinate frame of a mission item or position target.
379    mav_frame "MAV_FRAME" u8 {
380        GLOBAL = 0 "MAV_FRAME_GLOBAL",
381        LOCAL_NED = 1 "MAV_FRAME_LOCAL_NED",
382        MISSION = 2 "MAV_FRAME_MISSION",
383        GLOBAL_RELATIVE_ALT = 3 "MAV_FRAME_GLOBAL_RELATIVE_ALT",
384        LOCAL_ENU = 4 "MAV_FRAME_LOCAL_ENU",
385        GLOBAL_INT = 5 "MAV_FRAME_GLOBAL_INT",
386        GLOBAL_RELATIVE_ALT_INT = 6 "MAV_FRAME_GLOBAL_RELATIVE_ALT_INT",
387        LOCAL_OFFSET_NED = 7 "MAV_FRAME_LOCAL_OFFSET_NED",
388        BODY_NED = 8 "MAV_FRAME_BODY_NED",
389        BODY_OFFSET_NED = 9 "MAV_FRAME_BODY_OFFSET_NED",
390        GLOBAL_TERRAIN_ALT = 10 "MAV_FRAME_GLOBAL_TERRAIN_ALT",
391        GLOBAL_TERRAIN_ALT_INT = 11 "MAV_FRAME_GLOBAL_TERRAIN_ALT_INT",
392        BODY_FRD = 12 "MAV_FRAME_BODY_FRD",
393        RESERVED_13 = 13 "MAV_FRAME_RESERVED_13",
394        RESERVED_14 = 14 "MAV_FRAME_RESERVED_14",
395        RESERVED_15 = 15 "MAV_FRAME_RESERVED_15",
396        RESERVED_16 = 16 "MAV_FRAME_RESERVED_16",
397        RESERVED_17 = 17 "MAV_FRAME_RESERVED_17",
398        RESERVED_18 = 18 "MAV_FRAME_RESERVED_18",
399        RESERVED_19 = 19 "MAV_FRAME_RESERVED_19",
400        LOCAL_FRD = 20 "MAV_FRAME_LOCAL_FRD",
401        LOCAL_FLU = 21 "MAV_FRAME_LOCAL_FLU",
402    }
403
404    /// `MAV_CMD`: command ids for [`CommandLong`](super::CommandLong), [`CommandInt`](super::CommandInt),
405    /// and the items of a mission, [`MissionItemInt`](super::MissionItemInt).
406    mav_cmd "MAV_CMD" u16 {
407        NAV_WAYPOINT = 16 "MAV_CMD_NAV_WAYPOINT",
408        NAV_LOITER_UNLIM = 17 "MAV_CMD_NAV_LOITER_UNLIM",
409        NAV_LOITER_TURNS = 18 "MAV_CMD_NAV_LOITER_TURNS",
410        NAV_LOITER_TIME = 19 "MAV_CMD_NAV_LOITER_TIME",
411        NAV_RETURN_TO_LAUNCH = 20 "MAV_CMD_NAV_RETURN_TO_LAUNCH",
412        NAV_LAND = 21 "MAV_CMD_NAV_LAND",
413        NAV_TAKEOFF = 22 "MAV_CMD_NAV_TAKEOFF",
414        NAV_LAND_LOCAL = 23 "MAV_CMD_NAV_LAND_LOCAL",
415        NAV_TAKEOFF_LOCAL = 24 "MAV_CMD_NAV_TAKEOFF_LOCAL",
416        NAV_CONTINUE_AND_CHANGE_ALT = 30 "MAV_CMD_NAV_CONTINUE_AND_CHANGE_ALT",
417        NAV_LOITER_TO_ALT = 31 "MAV_CMD_NAV_LOITER_TO_ALT",
418        DO_FOLLOW = 32 "MAV_CMD_DO_FOLLOW",
419        DO_FOLLOW_REPOSITION = 33 "MAV_CMD_DO_FOLLOW_REPOSITION",
420        DO_ORBIT = 34 "MAV_CMD_DO_ORBIT",
421        DO_FIGURE_EIGHT = 35 "MAV_CMD_DO_FIGURE_EIGHT",
422        NAV_ARC_WAYPOINT = 36 "MAV_CMD_NAV_ARC_WAYPOINT",
423        NAV_ROI = 80 "MAV_CMD_NAV_ROI",
424        NAV_PATHPLANNING = 81 "MAV_CMD_NAV_PATHPLANNING",
425        NAV_SPLINE_WAYPOINT = 82 "MAV_CMD_NAV_SPLINE_WAYPOINT",
426        NAV_VTOL_TAKEOFF = 84 "MAV_CMD_NAV_VTOL_TAKEOFF",
427        NAV_VTOL_LAND = 85 "MAV_CMD_NAV_VTOL_LAND",
428        NAV_GUIDED_ENABLE = 92 "MAV_CMD_NAV_GUIDED_ENABLE",
429        NAV_DELAY = 93 "MAV_CMD_NAV_DELAY",
430        NAV_PAYLOAD_PLACE = 94 "MAV_CMD_NAV_PAYLOAD_PLACE",
431        NAV_LAST = 95 "MAV_CMD_NAV_LAST",
432        CONDITION_DELAY = 112 "MAV_CMD_CONDITION_DELAY",
433        CONDITION_CHANGE_ALT = 113 "MAV_CMD_CONDITION_CHANGE_ALT",
434        CONDITION_DISTANCE = 114 "MAV_CMD_CONDITION_DISTANCE",
435        CONDITION_YAW = 115 "MAV_CMD_CONDITION_YAW",
436        CONDITION_LAST = 159 "MAV_CMD_CONDITION_LAST",
437        DO_SET_MODE = 176 "MAV_CMD_DO_SET_MODE",
438        DO_JUMP = 177 "MAV_CMD_DO_JUMP",
439        DO_CHANGE_SPEED = 178 "MAV_CMD_DO_CHANGE_SPEED",
440        DO_SET_HOME = 179 "MAV_CMD_DO_SET_HOME",
441        DO_SET_PARAMETER = 180 "MAV_CMD_DO_SET_PARAMETER",
442        DO_SET_RELAY = 181 "MAV_CMD_DO_SET_RELAY",
443        DO_REPEAT_RELAY = 182 "MAV_CMD_DO_REPEAT_RELAY",
444        DO_SET_SERVO = 183 "MAV_CMD_DO_SET_SERVO",
445        DO_REPEAT_SERVO = 184 "MAV_CMD_DO_REPEAT_SERVO",
446        DO_FLIGHTTERMINATION = 185 "MAV_CMD_DO_FLIGHTTERMINATION",
447        DO_CHANGE_ALTITUDE = 186 "MAV_CMD_DO_CHANGE_ALTITUDE",
448        DO_SET_ACTUATOR = 187 "MAV_CMD_DO_SET_ACTUATOR",
449        DO_RETURN_PATH_START = 188 "MAV_CMD_DO_RETURN_PATH_START",
450        DO_LAND_START = 189 "MAV_CMD_DO_LAND_START",
451        DO_RALLY_LAND = 190 "MAV_CMD_DO_RALLY_LAND",
452        DO_GO_AROUND = 191 "MAV_CMD_DO_GO_AROUND",
453        DO_REPOSITION = 192 "MAV_CMD_DO_REPOSITION",
454        DO_PAUSE_CONTINUE = 193 "MAV_CMD_DO_PAUSE_CONTINUE",
455        DO_SET_REVERSE = 194 "MAV_CMD_DO_SET_REVERSE",
456        DO_SET_ROI_LOCATION = 195 "MAV_CMD_DO_SET_ROI_LOCATION",
457        DO_SET_ROI_WPNEXT_OFFSET = 196 "MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET",
458        DO_SET_ROI_NONE = 197 "MAV_CMD_DO_SET_ROI_NONE",
459        DO_SET_ROI_SYSID = 198 "MAV_CMD_DO_SET_ROI_SYSID",
460        DO_CONTROL_VIDEO = 200 "MAV_CMD_DO_CONTROL_VIDEO",
461        DO_SET_ROI = 201 "MAV_CMD_DO_SET_ROI",
462        DO_DIGICAM_CONFIGURE = 202 "MAV_CMD_DO_DIGICAM_CONFIGURE",
463        DO_DIGICAM_CONTROL = 203 "MAV_CMD_DO_DIGICAM_CONTROL",
464        DO_MOUNT_CONFIGURE = 204 "MAV_CMD_DO_MOUNT_CONFIGURE",
465        DO_MOUNT_CONTROL = 205 "MAV_CMD_DO_MOUNT_CONTROL",
466        DO_SET_CAM_TRIGG_DIST = 206 "MAV_CMD_DO_SET_CAM_TRIGG_DIST",
467        DO_FENCE_ENABLE = 207 "MAV_CMD_DO_FENCE_ENABLE",
468        DO_PARACHUTE = 208 "MAV_CMD_DO_PARACHUTE",
469        DO_MOTOR_TEST = 209 "MAV_CMD_DO_MOTOR_TEST",
470        DO_INVERTED_FLIGHT = 210 "MAV_CMD_DO_INVERTED_FLIGHT",
471        DO_GRIPPER = 211 "MAV_CMD_DO_GRIPPER",
472        DO_AUTOTUNE_ENABLE = 212 "MAV_CMD_DO_AUTOTUNE_ENABLE",
473        NAV_SET_YAW_SPEED = 213 "MAV_CMD_NAV_SET_YAW_SPEED",
474        DO_SET_CAM_TRIGG_INTERVAL = 214 "MAV_CMD_DO_SET_CAM_TRIGG_INTERVAL",
475        DO_MOUNT_CONTROL_QUAT = 220 "MAV_CMD_DO_MOUNT_CONTROL_QUAT",
476        DO_GUIDED_MASTER = 221 "MAV_CMD_DO_GUIDED_MASTER",
477        DO_GUIDED_LIMITS = 222 "MAV_CMD_DO_GUIDED_LIMITS",
478        DO_ENGINE_CONTROL = 223 "MAV_CMD_DO_ENGINE_CONTROL",
479        DO_SET_MISSION_CURRENT = 224 "MAV_CMD_DO_SET_MISSION_CURRENT",
480        DO_LAST = 240 "MAV_CMD_DO_LAST",
481        PREFLIGHT_CALIBRATION = 241 "MAV_CMD_PREFLIGHT_CALIBRATION",
482        PREFLIGHT_SET_SENSOR_OFFSETS = 242 "MAV_CMD_PREFLIGHT_SET_SENSOR_OFFSETS",
483        PREFLIGHT_UAVCAN = 243 "MAV_CMD_PREFLIGHT_UAVCAN",
484        PREFLIGHT_STORAGE = 245 "MAV_CMD_PREFLIGHT_STORAGE",
485        PREFLIGHT_REBOOT_SHUTDOWN = 246 "MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN",
486        OVERRIDE_GOTO = 252 "MAV_CMD_OVERRIDE_GOTO",
487        OBLIQUE_SURVEY = 260 "MAV_CMD_OBLIQUE_SURVEY",
488        DO_SET_STANDARD_MODE = 262 "MAV_CMD_DO_SET_STANDARD_MODE",
489        MISSION_START = 300 "MAV_CMD_MISSION_START",
490        ACTUATOR_TEST = 310 "MAV_CMD_ACTUATOR_TEST",
491        CONFIGURE_ACTUATOR = 311 "MAV_CMD_CONFIGURE_ACTUATOR",
492        COMPONENT_ARM_DISARM = 400 "MAV_CMD_COMPONENT_ARM_DISARM",
493        RUN_PREARM_CHECKS = 401 "MAV_CMD_RUN_PREARM_CHECKS",
494        ILLUMINATOR_ON_OFF = 405 "MAV_CMD_ILLUMINATOR_ON_OFF",
495        DO_ILLUMINATOR_CONFIGURE = 406 "MAV_CMD_DO_ILLUMINATOR_CONFIGURE",
496        GET_HOME_POSITION = 410 "MAV_CMD_GET_HOME_POSITION",
497        INJECT_FAILURE = 420 "MAV_CMD_INJECT_FAILURE",
498        START_RX_PAIR = 500 "MAV_CMD_START_RX_PAIR",
499        GET_MESSAGE_INTERVAL = 510 "MAV_CMD_GET_MESSAGE_INTERVAL",
500        SET_MESSAGE_INTERVAL = 511 "MAV_CMD_SET_MESSAGE_INTERVAL",
501        REQUEST_MESSAGE = 512 "MAV_CMD_REQUEST_MESSAGE",
502        REQUEST_PROTOCOL_VERSION = 519 "MAV_CMD_REQUEST_PROTOCOL_VERSION",
503        REQUEST_AUTOPILOT_CAPABILITIES = 520 "MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES",
504        REQUEST_CAMERA_INFORMATION = 521 "MAV_CMD_REQUEST_CAMERA_INFORMATION",
505        REQUEST_CAMERA_SETTINGS = 522 "MAV_CMD_REQUEST_CAMERA_SETTINGS",
506        REQUEST_STORAGE_INFORMATION = 525 "MAV_CMD_REQUEST_STORAGE_INFORMATION",
507        STORAGE_FORMAT = 526 "MAV_CMD_STORAGE_FORMAT",
508        REQUEST_CAMERA_CAPTURE_STATUS = 527 "MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS",
509        REQUEST_FLIGHT_INFORMATION = 528 "MAV_CMD_REQUEST_FLIGHT_INFORMATION",
510        RESET_CAMERA_SETTINGS = 529 "MAV_CMD_RESET_CAMERA_SETTINGS",
511        SET_CAMERA_MODE = 530 "MAV_CMD_SET_CAMERA_MODE",
512        SET_CAMERA_ZOOM = 531 "MAV_CMD_SET_CAMERA_ZOOM",
513        SET_CAMERA_FOCUS = 532 "MAV_CMD_SET_CAMERA_FOCUS",
514        SET_STORAGE_USAGE = 533 "MAV_CMD_SET_STORAGE_USAGE",
515        SET_CAMERA_SOURCE = 534 "MAV_CMD_SET_CAMERA_SOURCE",
516        JUMP_TAG = 600 "MAV_CMD_JUMP_TAG",
517        DO_JUMP_TAG = 601 "MAV_CMD_DO_JUMP_TAG",
518        DO_SET_GLOBAL_ORIGIN = 611 "MAV_CMD_DO_SET_GLOBAL_ORIGIN",
519        DO_GIMBAL_MANAGER_PITCHYAW = 1000 "MAV_CMD_DO_GIMBAL_MANAGER_PITCHYAW",
520        DO_GIMBAL_MANAGER_CONFIGURE = 1001 "MAV_CMD_DO_GIMBAL_MANAGER_CONFIGURE",
521        IMAGE_START_CAPTURE = 2000 "MAV_CMD_IMAGE_START_CAPTURE",
522        IMAGE_STOP_CAPTURE = 2001 "MAV_CMD_IMAGE_STOP_CAPTURE",
523        REQUEST_CAMERA_IMAGE_CAPTURE = 2002 "MAV_CMD_REQUEST_CAMERA_IMAGE_CAPTURE",
524        DO_TRIGGER_CONTROL = 2003 "MAV_CMD_DO_TRIGGER_CONTROL",
525        CAMERA_TRACK_POINT = 2004 "MAV_CMD_CAMERA_TRACK_POINT",
526        CAMERA_TRACK_RECTANGLE = 2005 "MAV_CMD_CAMERA_TRACK_RECTANGLE",
527        CAMERA_STOP_TRACKING = 2010 "MAV_CMD_CAMERA_STOP_TRACKING",
528        VIDEO_START_CAPTURE = 2500 "MAV_CMD_VIDEO_START_CAPTURE",
529        VIDEO_STOP_CAPTURE = 2501 "MAV_CMD_VIDEO_STOP_CAPTURE",
530        VIDEO_START_STREAMING = 2502 "MAV_CMD_VIDEO_START_STREAMING",
531        VIDEO_STOP_STREAMING = 2503 "MAV_CMD_VIDEO_STOP_STREAMING",
532        REQUEST_VIDEO_STREAM_INFORMATION = 2504 "MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION",
533        REQUEST_VIDEO_STREAM_STATUS = 2505 "MAV_CMD_REQUEST_VIDEO_STREAM_STATUS",
534        LOGGING_START = 2510 "MAV_CMD_LOGGING_START",
535        LOGGING_STOP = 2511 "MAV_CMD_LOGGING_STOP",
536        AIRFRAME_CONFIGURATION = 2520 "MAV_CMD_AIRFRAME_CONFIGURATION",
537        CONTROL_HIGH_LATENCY = 2600 "MAV_CMD_CONTROL_HIGH_LATENCY",
538        PANORAMA_CREATE = 2800 "MAV_CMD_PANORAMA_CREATE",
539        DO_VTOL_TRANSITION = 3000 "MAV_CMD_DO_VTOL_TRANSITION",
540        ARM_AUTHORIZATION_REQUEST = 3001 "MAV_CMD_ARM_AUTHORIZATION_REQUEST",
541        SET_GUIDED_SUBMODE_STANDARD = 4000 "MAV_CMD_SET_GUIDED_SUBMODE_STANDARD",
542        SET_GUIDED_SUBMODE_CIRCLE = 4001 "MAV_CMD_SET_GUIDED_SUBMODE_CIRCLE",
543        CONDITION_GATE = 4501 "MAV_CMD_CONDITION_GATE",
544        NAV_FENCE_RETURN_POINT = 5000 "MAV_CMD_NAV_FENCE_RETURN_POINT",
545        NAV_FENCE_POLYGON_VERTEX_INCLUSION = 5001 "MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION",
546        NAV_FENCE_POLYGON_VERTEX_EXCLUSION = 5002 "MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION",
547        NAV_FENCE_CIRCLE_INCLUSION = 5003 "MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION",
548        NAV_FENCE_CIRCLE_EXCLUSION = 5004 "MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION",
549        NAV_RALLY_POINT = 5100 "MAV_CMD_NAV_RALLY_POINT",
550        UAVCAN_GET_NODE_INFO = 5200 "MAV_CMD_UAVCAN_GET_NODE_INFO",
551        DO_SET_SAFETY_SWITCH_STATE = 5300 "MAV_CMD_DO_SET_SAFETY_SWITCH_STATE",
552        DO_ADSB_OUT_IDENT = 10001 "MAV_CMD_DO_ADSB_OUT_IDENT",
553        PAYLOAD_PREPARE_DEPLOY = 30001 "MAV_CMD_PAYLOAD_PREPARE_DEPLOY",
554        PAYLOAD_CONTROL_DEPLOY = 30002 "MAV_CMD_PAYLOAD_CONTROL_DEPLOY",
555        FIXED_MAG_CAL_YAW = 42006 "MAV_CMD_FIXED_MAG_CAL_YAW",
556        DO_WINCH = 42600 "MAV_CMD_DO_WINCH",
557        GUIDED_CHANGE_SPEED = 43000 "MAV_CMD_GUIDED_CHANGE_SPEED",
558        GUIDED_CHANGE_ALTITUDE = 43001 "MAV_CMD_GUIDED_CHANGE_ALTITUDE",
559        GUIDED_CHANGE_HEADING = 43002 "MAV_CMD_GUIDED_CHANGE_HEADING",
560        EXTERNAL_POSITION_ESTIMATE = 43003 "MAV_CMD_EXTERNAL_POSITION_ESTIMATE",
561        WAYPOINT_USER_1 = 31000 "MAV_CMD_WAYPOINT_USER_1",
562        WAYPOINT_USER_2 = 31001 "MAV_CMD_WAYPOINT_USER_2",
563        WAYPOINT_USER_3 = 31002 "MAV_CMD_WAYPOINT_USER_3",
564        WAYPOINT_USER_4 = 31003 "MAV_CMD_WAYPOINT_USER_4",
565        WAYPOINT_USER_5 = 31004 "MAV_CMD_WAYPOINT_USER_5",
566        SPATIAL_USER_1 = 31005 "MAV_CMD_SPATIAL_USER_1",
567        SPATIAL_USER_2 = 31006 "MAV_CMD_SPATIAL_USER_2",
568        SPATIAL_USER_3 = 31007 "MAV_CMD_SPATIAL_USER_3",
569        SPATIAL_USER_4 = 31008 "MAV_CMD_SPATIAL_USER_4",
570        SPATIAL_USER_5 = 31009 "MAV_CMD_SPATIAL_USER_5",
571        USER_1 = 31010 "MAV_CMD_USER_1",
572        USER_2 = 31011 "MAV_CMD_USER_2",
573        USER_3 = 31012 "MAV_CMD_USER_3",
574        USER_4 = 31013 "MAV_CMD_USER_4",
575        USER_5 = 31014 "MAV_CMD_USER_5",
576        CAN_FORWARD = 32000 "MAV_CMD_CAN_FORWARD",
577    }
578
579    /// `MAV_PARAM_TYPE`: the type of a parameter's value, in a [`ParamValue`](super::ParamValue) or a
580    /// [`ParamSet`](super::ParamSet).
581    mav_param_type "MAV_PARAM_TYPE" u8 {
582        UINT8 = 1 "MAV_PARAM_TYPE_UINT8",
583        INT8 = 2 "MAV_PARAM_TYPE_INT8",
584        UINT16 = 3 "MAV_PARAM_TYPE_UINT16",
585        INT16 = 4 "MAV_PARAM_TYPE_INT16",
586        UINT32 = 5 "MAV_PARAM_TYPE_UINT32",
587        INT32 = 6 "MAV_PARAM_TYPE_INT32",
588        UINT64 = 7 "MAV_PARAM_TYPE_UINT64",
589        INT64 = 8 "MAV_PARAM_TYPE_INT64",
590        REAL32 = 9 "MAV_PARAM_TYPE_REAL32",
591        REAL64 = 10 "MAV_PARAM_TYPE_REAL64",
592    }
593
594    /// `MAV_RESULT`: the outcome a [`CommandAck`](super::CommandAck) reports.
595    mav_result "MAV_RESULT" u8 {
596        ACCEPTED = 0 "MAV_RESULT_ACCEPTED",
597        TEMPORARILY_REJECTED = 1 "MAV_RESULT_TEMPORARILY_REJECTED",
598        DENIED = 2 "MAV_RESULT_DENIED",
599        UNSUPPORTED = 3 "MAV_RESULT_UNSUPPORTED",
600        FAILED = 4 "MAV_RESULT_FAILED",
601        IN_PROGRESS = 5 "MAV_RESULT_IN_PROGRESS",
602        CANCELLED = 6 "MAV_RESULT_CANCELLED",
603        COMMAND_LONG_ONLY = 7 "MAV_RESULT_COMMAND_LONG_ONLY",
604        COMMAND_INT_ONLY = 8 "MAV_RESULT_COMMAND_INT_ONLY",
605        COMMAND_UNSUPPORTED_MAV_FRAME = 9 "MAV_RESULT_COMMAND_UNSUPPORTED_MAV_FRAME",
606        NOT_IN_CONTROL = 10 "MAV_RESULT_NOT_IN_CONTROL",
607    }
608
609    /// `MAV_MISSION_RESULT`: the outcome a [`MissionAck`](super::MissionAck) reports.
610    mav_mission_result "MAV_MISSION_RESULT" u8 {
611        ACCEPTED = 0 "MAV_MISSION_ACCEPTED",
612        ERROR = 1 "MAV_MISSION_ERROR",
613        UNSUPPORTED_FRAME = 2 "MAV_MISSION_UNSUPPORTED_FRAME",
614        UNSUPPORTED = 3 "MAV_MISSION_UNSUPPORTED",
615        NO_SPACE = 4 "MAV_MISSION_NO_SPACE",
616        INVALID = 5 "MAV_MISSION_INVALID",
617        INVALID_PARAM1 = 6 "MAV_MISSION_INVALID_PARAM1",
618        INVALID_PARAM2 = 7 "MAV_MISSION_INVALID_PARAM2",
619        INVALID_PARAM3 = 8 "MAV_MISSION_INVALID_PARAM3",
620        INVALID_PARAM4 = 9 "MAV_MISSION_INVALID_PARAM4",
621        INVALID_PARAM5_X = 10 "MAV_MISSION_INVALID_PARAM5_X",
622        INVALID_PARAM6_Y = 11 "MAV_MISSION_INVALID_PARAM6_Y",
623        INVALID_PARAM7 = 12 "MAV_MISSION_INVALID_PARAM7",
624        INVALID_SEQUENCE = 13 "MAV_MISSION_INVALID_SEQUENCE",
625        DENIED = 14 "MAV_MISSION_DENIED",
626        OPERATION_CANCELLED = 15 "MAV_MISSION_OPERATION_CANCELLED",
627    }
628
629    /// `MAV_SEVERITY`: how urgent a [`Statustext`](super::Statustext) is, from emergency down to debug.
630    mav_severity "MAV_SEVERITY" u8 {
631        EMERGENCY = 0 "MAV_SEVERITY_EMERGENCY",
632        ALERT = 1 "MAV_SEVERITY_ALERT",
633        CRITICAL = 2 "MAV_SEVERITY_CRITICAL",
634        ERROR = 3 "MAV_SEVERITY_ERROR",
635        WARNING = 4 "MAV_SEVERITY_WARNING",
636        NOTICE = 5 "MAV_SEVERITY_NOTICE",
637        INFO = 6 "MAV_SEVERITY_INFO",
638        DEBUG = 7 "MAV_SEVERITY_DEBUG",
639    }
640
641    /// `MAV_MISSION_TYPE`: which plan a mission transfer carries, in the `mission_type` field of
642    /// the MISSION_* messages.
643    mav_mission_type "MAV_MISSION_TYPE" u8 {
644        MISSION = 0 "MAV_MISSION_TYPE_MISSION",
645        FENCE = 1 "MAV_MISSION_TYPE_FENCE",
646        RALLY = 2 "MAV_MISSION_TYPE_RALLY",
647        ALL = 255 "MAV_MISSION_TYPE_ALL",
648    }
649
650    /// `MAV_BATTERY_TYPE`: the chemistry of the battery a [`BatteryStatus`](super::BatteryStatus)
651    /// describes.
652    mav_battery_type "MAV_BATTERY_TYPE" u8 {
653        UNKNOWN = 0 "MAV_BATTERY_TYPE_UNKNOWN",
654        LIPO = 1 "MAV_BATTERY_TYPE_LIPO",
655        LIFE = 2 "MAV_BATTERY_TYPE_LIFE",
656        LION = 3 "MAV_BATTERY_TYPE_LION",
657        NIMH = 4 "MAV_BATTERY_TYPE_NIMH",
658    }
659
660    /// `MAV_BATTERY_FUNCTION`: what the battery a [`BatteryStatus`](super::BatteryStatus) describes
661    /// powers.
662    mav_battery_function "MAV_BATTERY_FUNCTION" u8 {
663        UNKNOWN = 0 "MAV_BATTERY_FUNCTION_UNKNOWN",
664        ALL = 1 "MAV_BATTERY_FUNCTION_ALL",
665        PROPULSION = 2 "MAV_BATTERY_FUNCTION_PROPULSION",
666        AVIONICS = 3 "MAV_BATTERY_FUNCTION_AVIONICS",
667        PAYLOAD = 4 "MAV_BATTERY_FUNCTION_PAYLOAD",
668    }
669
670    /// `MAV_BATTERY_CHARGE_STATE`: how much charge a [`BatteryStatus`](super::BatteryStatus) says is
671    /// left, as the autopilot judges it.
672    mav_battery_charge_state "MAV_BATTERY_CHARGE_STATE" u8 {
673        UNDEFINED = 0 "MAV_BATTERY_CHARGE_STATE_UNDEFINED",
674        OK = 1 "MAV_BATTERY_CHARGE_STATE_OK",
675        LOW = 2 "MAV_BATTERY_CHARGE_STATE_LOW",
676        CRITICAL = 3 "MAV_BATTERY_CHARGE_STATE_CRITICAL",
677        EMERGENCY = 4 "MAV_BATTERY_CHARGE_STATE_EMERGENCY",
678        FAILED = 5 "MAV_BATTERY_CHARGE_STATE_FAILED",
679        UNHEALTHY = 6 "MAV_BATTERY_CHARGE_STATE_UNHEALTHY",
680        CHARGING = 7 "MAV_BATTERY_CHARGE_STATE_CHARGING",
681    }
682
683    /// `MAV_BATTERY_MODE`: whether the battery a [`BatteryStatus`](super::BatteryStatus) describes is in
684    /// normal use, discharging for storage, or being swapped.
685    mav_battery_mode "MAV_BATTERY_MODE" u8 {
686        UNKNOWN = 0 "MAV_BATTERY_MODE_UNKNOWN",
687        AUTO_DISCHARGING = 1 "MAV_BATTERY_MODE_AUTO_DISCHARGING",
688        HOT_SWAP = 2 "MAV_BATTERY_MODE_HOT_SWAP",
689    }
690
691    /// `MAV_BATTERY_FAULT`: bits of the fault field of a [`BatteryStatus`](super::BatteryStatus).
692    mav_battery_fault "MAV_BATTERY_FAULT" u32 bitmask {
693        DEEP_DISCHARGE = 1 "MAV_BATTERY_FAULT_DEEP_DISCHARGE",
694        SPIKES = 2 "MAV_BATTERY_FAULT_SPIKES",
695        CELL_FAIL = 4 "MAV_BATTERY_FAULT_CELL_FAIL",
696        OVER_CURRENT = 8 "MAV_BATTERY_FAULT_OVER_CURRENT",
697        OVER_TEMPERATURE = 16 "MAV_BATTERY_FAULT_OVER_TEMPERATURE",
698        UNDER_TEMPERATURE = 32 "MAV_BATTERY_FAULT_UNDER_TEMPERATURE",
699        INCOMPATIBLE_VOLTAGE = 64 "MAV_BATTERY_FAULT_INCOMPATIBLE_VOLTAGE",
700        INCOMPATIBLE_FIRMWARE = 128 "MAV_BATTERY_FAULT_INCOMPATIBLE_FIRMWARE",
701        BATTERY_FAULT_INCOMPATIBLE_CELLS_CONFIGURATION = 256 "BATTERY_FAULT_INCOMPATIBLE_CELLS_CONFIGURATION",
702    }
703
704    /// `MAV_VTOL_STATE`: the flight phase of a VTOL vehicle, in an
705    /// [`ExtendedSysState`](super::ExtendedSysState).
706    mav_vtol_state "MAV_VTOL_STATE" u8 {
707        UNDEFINED = 0 "MAV_VTOL_STATE_UNDEFINED",
708        TRANSITION_TO_FW = 1 "MAV_VTOL_STATE_TRANSITION_TO_FW",
709        TRANSITION_TO_MC = 2 "MAV_VTOL_STATE_TRANSITION_TO_MC",
710        MC = 3 "MAV_VTOL_STATE_MC",
711        FW = 4 "MAV_VTOL_STATE_FW",
712    }
713
714    /// `MAV_LANDED_STATE`: whether the vehicle is on the ground, taking off, flying, or landing, in an
715    /// [`ExtendedSysState`](super::ExtendedSysState).
716    mav_landed_state "MAV_LANDED_STATE" u8 {
717        UNDEFINED = 0 "MAV_LANDED_STATE_UNDEFINED",
718        ON_GROUND = 1 "MAV_LANDED_STATE_ON_GROUND",
719        IN_AIR = 2 "MAV_LANDED_STATE_IN_AIR",
720        TAKEOFF = 3 "MAV_LANDED_STATE_TAKEOFF",
721        LANDING = 4 "MAV_LANDED_STATE_LANDING",
722    }
723
724    /// `GPS_FIX_TYPE`: the kind of fix a [`GpsRawInt`](super::GpsRawInt) reports.
725    gps_fix_type "GPS_FIX_TYPE" u8 {
726        NO_GPS = 0 "GPS_FIX_TYPE_NO_GPS",
727        NO_FIX = 1 "GPS_FIX_TYPE_NO_FIX",
728        FIX_2D = 2 "GPS_FIX_TYPE_2D_FIX",
729        FIX_3D = 3 "GPS_FIX_TYPE_3D_FIX",
730        DGPS = 4 "GPS_FIX_TYPE_DGPS",
731        RTK_FLOAT = 5 "GPS_FIX_TYPE_RTK_FLOAT",
732        RTK_FIXED = 6 "GPS_FIX_TYPE_RTK_FIXED",
733        STATIC = 7 "GPS_FIX_TYPE_STATIC",
734        PPP = 8 "GPS_FIX_TYPE_PPP",
735    }
736
737    /// `POSITION_TARGET_TYPEMASK`: the bits of the `type_mask` field of
738    /// [`SetPositionTargetLocalNed`](super::SetPositionTargetLocalNed) and
739    /// [`SetPositionTargetGlobalInt`](super::SetPositionTargetGlobalInt).
740    ///
741    /// A set bit tells the vehicle to ignore that dimension of the setpoint, so a position-only
742    /// setpoint sets the velocity, acceleration, yaw, and yaw-rate ignore bits. `FORCE_SET`
743    /// reinterprets the acceleration fields as a force setpoint.
744    position_target_typemask "POSITION_TARGET_TYPEMASK" u16 bitmask {
745        X_IGNORE = 1 "POSITION_TARGET_TYPEMASK_X_IGNORE",
746        Y_IGNORE = 2 "POSITION_TARGET_TYPEMASK_Y_IGNORE",
747        Z_IGNORE = 4 "POSITION_TARGET_TYPEMASK_Z_IGNORE",
748        VX_IGNORE = 8 "POSITION_TARGET_TYPEMASK_VX_IGNORE",
749        VY_IGNORE = 16 "POSITION_TARGET_TYPEMASK_VY_IGNORE",
750        VZ_IGNORE = 32 "POSITION_TARGET_TYPEMASK_VZ_IGNORE",
751        AX_IGNORE = 64 "POSITION_TARGET_TYPEMASK_AX_IGNORE",
752        AY_IGNORE = 128 "POSITION_TARGET_TYPEMASK_AY_IGNORE",
753        AZ_IGNORE = 256 "POSITION_TARGET_TYPEMASK_AZ_IGNORE",
754        FORCE_SET = 512 "POSITION_TARGET_TYPEMASK_FORCE_SET",
755        YAW_IGNORE = 1024 "POSITION_TARGET_TYPEMASK_YAW_IGNORE",
756        YAW_RATE_IGNORE = 2048 "POSITION_TARGET_TYPEMASK_YAW_RATE_IGNORE",
757    }
758
759    /// `MISSION_STATE`: where a mission stands, in the state field of a
760    /// [`MissionCurrent`](super::MissionCurrent).
761    mission_state "MISSION_STATE" u8 {
762        UNKNOWN = 0 "MISSION_STATE_UNKNOWN",
763        NO_MISSION = 1 "MISSION_STATE_NO_MISSION",
764        NOT_STARTED = 2 "MISSION_STATE_NOT_STARTED",
765        ACTIVE = 3 "MISSION_STATE_ACTIVE",
766        PAUSED = 4 "MISSION_STATE_PAUSED",
767        COMPLETE = 5 "MISSION_STATE_COMPLETE",
768    }
769}
770
771#[cfg(test)]
772mod tests {
773    use super::*;
774
775    #[test]
776    fn an_entry_name_belongs_to_one_enumeration() {
777        let names: Vec<&str> = ENUMS
778            .iter()
779            .flat_map(|described| described.entries.iter().map(|named| named.name))
780            .collect();
781        for (index, name) in names.iter().enumerate() {
782            assert!(!names[index + 1..].contains(name), "{name} appears twice");
783        }
784    }
785
786    #[test]
787    fn the_constants_and_the_names_agree() {
788        assert_eq!(
789            entry_value("MAV_TYPE_QUADROTOR"),
790            Some(u64::from(mav_type::QUADROTOR))
791        );
792        assert_eq!(
793            entry_value("MAV_SYS_STATUS_SENSOR_3D_GYRO"),
794            Some(u64::from(mav_sys_status_sensor::GYRO_3D))
795        );
796        assert_eq!(
797            entry_value("MAV_SYS_STATUS_PREARM_CHECK"),
798            Some(u64::from(mav_sys_status_sensor::PREARM_CHECK))
799        );
800        assert_eq!(
801            entry_value("MAV_MISSION_ACCEPTED"),
802            Some(u64::from(mav_mission_result::ACCEPTED))
803        );
804        assert_eq!(
805            entry_value("MAV_RESULT_CANCELLED"),
806            Some(u64::from(mav_result::CANCELLED))
807        );
808        assert_eq!(
809            entry_value("GPS_FIX_TYPE_3D_FIX"),
810            Some(u64::from(gps_fix_type::FIX_3D))
811        );
812        assert_eq!(
813            entry_value("MAV_PROTOCOL_CAPABILITY_MAVLINK2"),
814            Some(mav_protocol_capability::MAVLINK2)
815        );
816    }
817
818    #[test]
819    fn a_value_is_named_by_its_enumeration() {
820        let state = enum_named("MAV_STATE").expect("MAV_STATE");
821        assert!(!state.bitmask);
822        assert_eq!(state.entry(3), Some("MAV_STATE_STANDBY"));
823        assert_eq!(state.names(3).collect::<Vec<_>>(), ["MAV_STATE_STANDBY"]);
824        assert_eq!(state.entry(200), None);
825        assert_eq!(state.names(200).count(), 0);
826        assert!(enum_named("MAV_STATES").is_none());
827    }
828
829    #[test]
830    fn a_bitmask_is_named_bit_by_bit() {
831        let sensors = enum_named("MAV_SYS_STATUS_SENSOR").expect("MAV_SYS_STATUS_SENSOR");
832        assert!(sensors.bitmask);
833        let health = mav_sys_status_sensor::GYRO_3D
834            | mav_sys_status_sensor::GPS
835            | mav_sys_status_sensor::PREARM_CHECK;
836        assert_eq!(
837            sensors.names(u64::from(health)).collect::<Vec<_>>(),
838            [
839                "MAV_SYS_STATUS_SENSOR_3D_GYRO",
840                "MAV_SYS_STATUS_SENSOR_GPS",
841                "MAV_SYS_STATUS_PREARM_CHECK"
842            ]
843        );
844        assert_eq!(sensors.names(0).count(), 0);
845        assert_eq!(sensors.entry(u64::from(health)), None);
846    }
847
848    #[test]
849    fn the_dialect_marks_which_enumerations_are_bitmasks() {
850        for name in [
851            "MAV_MODE_FLAG",
852            "MAV_PROTOCOL_CAPABILITY",
853            "MAV_SYS_STATUS_SENSOR",
854            "MAV_SYS_STATUS_SENSOR_EXTENDED",
855            "MAV_BATTERY_FAULT",
856            "POSITION_TARGET_TYPEMASK",
857        ] {
858            assert!(enum_named(name).expect(name).bitmask, "{name}");
859        }
860        for name in [
861            "MAV_TYPE",
862            "MAV_STATE",
863            "MAV_CMD",
864            "MAV_RESULT",
865            "MAV_FRAME",
866        ] {
867            assert!(!enum_named(name).expect(name).bitmask, "{name}");
868        }
869    }
870}