dji_log_parser/record/
osd.rs

1use binrw::binread;
2use serde::Serialize;
3use std::f64::consts::PI;
4#[cfg(target_arch = "wasm32")]
5use tsify_next::Tsify;
6
7use crate::utils::sub_byte_field;
8
9#[binread]
10#[derive(Serialize, Debug)]
11#[serde(rename_all = "camelCase")]
12#[br( import { version: u8 }, little)]
13#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
14pub struct OSD {
15    /// degrees
16    #[br(map = |x: f64| (x * 180.0) / PI)]
17    pub longitude: f64,
18    /// degrees
19    #[br(map = |x: f64| (x * 180.0) / PI)]
20    pub latitude: f64,
21    /// meters
22    #[br(map = |x: i16| (x as f32 / 10.0))]
23    pub altitude: f32,
24    /// meters / sec
25    #[br(map = |x: i16| (x as f32 / 10.0))]
26    pub speed_x: f32,
27    /// meters / sec
28    #[br(map = |x: i16| (x as f32 / 10.0))]
29    pub speed_y: f32,
30    /// meters / sec
31    #[br(map = |x: i16| (x as f32 / 10.0))]
32    pub speed_z: f32,
33    /// degrees
34    #[br(map = |x: i16| (x as f32 / 10.0))]
35    pub pitch: f32,
36    /// degrees
37    #[br(map = |x: i16| (x as f32 / 10.0))]
38    pub roll: f32,
39    /// degrees
40    #[br(map = |x: i16| (x as f32 / 10.0))]
41    pub yaw: f32,
42
43    #[br(temp)]
44    _bitpack1: u8,
45    #[br(calc(FlightMode::from(sub_byte_field(_bitpack1, 0x7F))))]
46    pub flight_mode: FlightMode,
47    #[br(calc(sub_byte_field(_bitpack1, 0x80) == 1))]
48    pub rc_outcontrol: bool,
49
50    #[br(map = |x: u8| AppCommand::from(x))]
51    pub app_command: AppCommand,
52
53    #[br(temp)]
54    _bitpack2: u8,
55    #[br(calc(sub_byte_field(_bitpack2, 0x01) == 1))]
56    pub can_ioc_work: bool,
57    #[br(calc(GroundOrSky::from(sub_byte_field(_bitpack2, 0x06))))]
58    pub ground_or_sky: GroundOrSky,
59    #[br(calc(sub_byte_field(_bitpack2, 0x08) == 1))]
60    pub is_motor_up: bool,
61    #[br(calc(sub_byte_field(_bitpack2, 0x10) == 1))]
62    pub is_swave_work: bool,
63    #[br(calc(GoHomeStatus::from(sub_byte_field(_bitpack2, 0xE0))))]
64    pub go_home_status: GoHomeStatus,
65
66    #[br(temp)]
67    _bitpack3: u8,
68    #[br(calc(sub_byte_field(_bitpack3, 0x01) == 1))]
69    pub is_vision_used: bool,
70    #[br(calc(sub_byte_field(_bitpack3, 0x06)))]
71    pub voltage_warning: u8,
72    #[br(calc(sub_byte_field(_bitpack3, 0x10) == 1))]
73    pub is_imu_preheated: bool,
74    #[br(calc(sub_byte_field(_bitpack3, 0x60)))]
75    pub mode_channel: u8,
76    #[br(calc(sub_byte_field(_bitpack3, 0x80) == 1))]
77    pub is_gps_valid: bool,
78
79    #[br(temp)]
80    _bitpack4: u8,
81    #[br(calc(sub_byte_field(_bitpack4, 0x01) == 1))]
82    pub is_compass_error: bool,
83    #[br(calc(sub_byte_field(_bitpack4, 0x02) == 1))]
84    pub wave_error: bool,
85    #[br(calc(sub_byte_field(_bitpack4, 0x3C)))]
86    pub gps_level: u8,
87    #[br(calc(BatteryType::from(sub_byte_field(_bitpack4, 0xC0))))]
88    pub battery_type: BatteryType,
89
90    #[br(temp)]
91    _bitpack5: u8,
92    #[br(calc(sub_byte_field(_bitpack5, 0x01) == 1))]
93    pub is_out_of_limit: bool,
94    #[br(calc(sub_byte_field(_bitpack5, 0x02) == 1))]
95    pub is_go_home_height_modified: bool,
96    #[br(calc(sub_byte_field(_bitpack5, 0x04) == 1))]
97    pub is_propeller_catapult: bool,
98    #[br(calc(sub_byte_field(_bitpack5, 0x08) == 1))]
99    pub is_motor_blocked: bool,
100    #[br(calc(sub_byte_field(_bitpack5, 0x10) == 1))]
101    pub is_not_enough_force: bool,
102    #[br(calc(sub_byte_field(_bitpack5, 0x20) == 1))]
103    pub is_barometer_dead_in_air: bool,
104    #[br(calc(sub_byte_field(_bitpack5, 0x40) == 1))]
105    pub is_vibrating: bool,
106    #[br(calc(sub_byte_field(_bitpack5, 0x80) == 1))]
107    pub is_acceletor_over_range: bool,
108
109    pub gps_num: u8,
110    #[br(map = |x: u8| FlightAction::from(x))]
111    pub flight_action: FlightAction,
112    #[br(map = |x: u8| MotorStartFailedCause::from(x))]
113    pub motor_start_failed_cause: MotorStartFailedCause,
114
115    #[br(temp)]
116    _bitpack6: u8,
117    #[br(calc(NonGPSCause::from(sub_byte_field(_bitpack6, 0x0F))))]
118    pub non_gps_cause: NonGPSCause,
119    #[br(calc(sub_byte_field(_bitpack6, 0x10) == 1))]
120    pub waypoint_limit_mode: bool,
121
122    pub battery: u8,
123    /// meters
124    #[br(map = |x: u8| (x as f32 / 10.0))]
125    pub s_wave_height: f32,
126    /// second
127    #[br(map = |x: u16| (x as f32 / 10.0))]
128    pub fly_time: f32,
129    pub motor_revolution: u8,
130    #[br(temp)]
131    _unknown: u16,
132    pub version_c: u8,
133    #[br(if(version >=2), map = |x: u8| DroneType::from(x))]
134    pub drone_type: DroneType,
135    #[br(if(version >=3), map = |x: u8| ImuInitFailReason::from(x))]
136    pub imu_init_fail_reason: ImuInitFailReason,
137}
138
139#[derive(Serialize, Debug, Default, Clone, Copy)]
140#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
141pub enum DroneType {
142    #[default]
143    None,
144    Inspire1,
145    Phantom3Advanced,
146    Phantom3Pro,
147    Phantom3Standard,
148    OpenFrame,
149    AceOne,
150    WKM,
151    Naza,
152    A2,
153    A3,
154    Phantom4,
155    Matrice600,
156    Phantom34K,
157    MavicPro,
158    Inspire2,
159    Phantom4Pro,
160    N3,
161    Spark,
162    Matrice600Pro,
163    MavicAir,
164    Matrice200,
165    Phantom4Advanced,
166    Matrice210,
167    Phantom3SE,
168    Matrice210RTK,
169    Phantom4ProV2,
170    Mavic2,
171    Mavic2Enterprise,
172    MavicAir2,
173    Matrice300RTK,
174    Mini2,
175    Mavic3Enterprise,
176    Mavic3Pro,
177    Matrice350RTK,
178    Mini4Pro,
179    Avata2,
180    #[serde(untagged)]
181    Unknown(u8),
182}
183
184impl From<u8> for DroneType {
185    fn from(value: u8) -> Self {
186        match value {
187            0 => DroneType::None,
188            1 => DroneType::Inspire1,
189            2 => DroneType::Phantom3Advanced,
190            3 => DroneType::Phantom3Pro,
191            4 => DroneType::Phantom3Standard,
192            5 => DroneType::OpenFrame,
193            6 => DroneType::AceOne,
194            7 => DroneType::WKM,
195            8 => DroneType::Naza,
196            9 => DroneType::A2,
197            10 => DroneType::A3,
198            11 => DroneType::Phantom4,
199            14 => DroneType::Matrice600,
200            15 => DroneType::Phantom34K,
201            16 => DroneType::MavicPro,
202            17 => DroneType::Inspire2,
203            18 => DroneType::Phantom4Pro,
204            20 => DroneType::N3,
205            21 => DroneType::Spark,
206            23 => DroneType::Matrice600Pro,
207            24 => DroneType::MavicAir,
208            25 => DroneType::Matrice200,
209            27 => DroneType::Phantom4Advanced,
210            28 => DroneType::Matrice210,
211            29 => DroneType::Phantom3SE,
212            30 => DroneType::Matrice210RTK,
213            36 => DroneType::Phantom4ProV2,
214            41 => DroneType::Mavic2,
215            51 => DroneType::Mavic2Enterprise,
216            58 => DroneType::MavicAir2,
217            60 => DroneType::Matrice300RTK,
218            63 => DroneType::Mini2,
219            77 => DroneType::Mavic3Enterprise,
220            84 => DroneType::Mavic3Pro,
221            89 => DroneType::Matrice350RTK,
222            93 => DroneType::Mini4Pro,
223            94 => DroneType::Avata2,
224            _ => DroneType::Unknown(value),
225        }
226    }
227}
228
229#[derive(Serialize, Debug, Copy, Clone, PartialEq, Eq)]
230#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
231pub enum FlightMode {
232    /// Manual mode. Shown as Manual in DJI app.
233    Manual,
234    /// Attitude mode. Shown as Atti in DJI app.
235    Atti,
236    /// Attitude course lock mode. Shown as Atti in DJI app.
237    AttiCourseLock,
238    /// Attitude hover mode. Shown as Atti in DJI app.
239    AttiHover,
240    /// Hover mode. Shown as P-GPS in DJI app.
241    Hover,
242    /// GPS blake mode. Shown as P-GPS in DJI app.
243    GPSBlake,
244    /// GPS Attitude mode. Shown as P-GPS in DJI app.
245    GPSAtti,
246    /// GPS course lock mode. Shown as CL/P-CL/F-CL in DJI app.
247    GPSCourseLock,
248    /// GPS Home mode. Shown as HL/P-HL/F-HL in DJI app.
249    GPSHomeLock,
250    /// GPS hotpoint mode. Show as POI/F-POI in DJI app.
251    GPSHotPoint,
252    /// Assisted takeoff mode. Shown as TakeOff in DJI app.
253    AssistedTakeoff,
254    /// Auto takeoff mode. Shown as TakeOff in DJI app.
255    AutoTakeoff,
256    /// Auto landing mode. Shown as Landing in DJI app.
257    AutoLanding,
258    /// Attitude landing mode. Shown as Landing in DJI app.
259    AttiLanding,
260    /// GPS waypoint mode. Shown as WP/F-WP in DJI app.
261    GPSWaypoint,
262    /// Go home mode. Shown as Gohome in DJI app.
263    GoHome,
264    ClickGo,
265    /// Joystick mode. hown as Joystick in DJI app.
266    Joystick,
267    GPSAttiWristband,
268    Cinematic,
269    /// Attitude limited mode. Shown as Atti in DJI app.
270    AttiLimited,
271    /// Draw mode. Shown as Draw in DJI app.
272    Draw,
273    /// GPS follow me mode. Shown as FM/F-FM in DJI app.
274    GPSFollowMe,
275    /// ActiveTrack mode. Shown as ActiveTrack in DJI app.
276    ActiveTrack,
277    /// TapFly mode. Shown as TapFly in DJI app.
278    TapFly,
279    Pano,
280    Farming,
281    FPV,
282    /// Sport mode. Shown as Sport in DJI app.
283    GPSSport,
284    GPSNovice,
285    /// Confirm landing mode. Shown as Landing in DJI app.
286    ConfirmLanding,
287    /// The aircraft should move following the terrain. Shown as TerrainTracking in DJI app.
288    TerrainTracking,
289    NaviAdvGoHome,
290    NaviAdvLanding,
291    /// Tripod mode. Shown as Tripod in DJI app.
292    Tripod,
293    /// Active track mode, corresponds to Spotlight active track mode. Shown as QuickShot/ActiveTrack in DJI app.
294    TrackHeadlock,
295    /// The motors are just started. Shown as TakeOff in DJI app.
296    EngineStart,
297    GPSGentle,
298    #[serde(untagged)]
299    Unknown(u8),
300}
301
302impl From<u8> for FlightMode {
303    fn from(value: u8) -> Self {
304        match value {
305            0 => FlightMode::Manual,
306            1 => FlightMode::Atti,
307            2 => FlightMode::AttiCourseLock,
308            3 => FlightMode::AttiHover,
309            4 => FlightMode::Hover,
310            5 => FlightMode::GPSBlake,
311            6 => FlightMode::GPSAtti,
312            7 => FlightMode::GPSCourseLock,
313            8 => FlightMode::GPSHomeLock,
314            9 => FlightMode::GPSHotPoint,
315            10 => FlightMode::AssistedTakeoff,
316            11 => FlightMode::AutoTakeoff,
317            12 => FlightMode::AutoLanding,
318            13 => FlightMode::AttiLanding,
319            14 => FlightMode::GPSWaypoint,
320            15 => FlightMode::GoHome,
321            16 => FlightMode::ClickGo,
322            17 => FlightMode::Joystick,
323            18 => FlightMode::GPSAttiWristband,
324            19 => FlightMode::Cinematic,
325            23 => FlightMode::AttiLimited,
326            24 => FlightMode::Draw,
327            25 => FlightMode::GPSFollowMe,
328            26 => FlightMode::ActiveTrack,
329            27 => FlightMode::TapFly,
330            28 => FlightMode::Pano,
331            29 => FlightMode::Farming,
332            30 => FlightMode::FPV,
333            31 => FlightMode::GPSSport,
334            32 => FlightMode::GPSNovice,
335            33 => FlightMode::ConfirmLanding,
336            35 => FlightMode::TerrainTracking,
337            36 => FlightMode::NaviAdvGoHome,
338            37 => FlightMode::NaviAdvLanding,
339            38 => FlightMode::Tripod,
340            39 => FlightMode::TrackHeadlock,
341            41 => FlightMode::EngineStart,
342            43 => FlightMode::GPSGentle,
343            _ => FlightMode::Unknown(value),
344        }
345    }
346}
347
348#[derive(Serialize, Debug, Clone, Copy)]
349#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
350pub enum AppCommand {
351    AutoFly,
352    AutoLanding,
353    HomePointNow,
354    HomePointHot,
355    HomePointLock,
356    GoHome,
357    StartMotor,
358    StopMotor,
359    Calibration,
360    DeformProtecClose,
361    DeformProtecOpen,
362    DropGoHome,
363    DropTakeOff,
364    DropLanding,
365    DynamicHomePointOpen,
366    DynamicHomePointClose,
367    FollowFunctionOpen,
368    FollowFunctionClose,
369    IOCOpen,
370    IOCClose,
371    DropCalibration,
372    PackMode,
373    UnPackMode,
374    EnterManualMode,
375    StopDeform,
376    DownDeform,
377    UpDeform,
378    ForceLanding,
379    ForceLanding2,
380    #[serde(untagged)]
381    Unknown(u8),
382}
383
384impl From<u8> for AppCommand {
385    fn from(value: u8) -> Self {
386        match value {
387            1 => AppCommand::AutoFly,
388            2 => AppCommand::AutoLanding,
389            3 => AppCommand::HomePointNow,
390            4 => AppCommand::HomePointHot,
391            5 => AppCommand::HomePointLock,
392            6 => AppCommand::GoHome,
393            7 => AppCommand::StartMotor,
394            8 => AppCommand::StopMotor,
395            9 => AppCommand::Calibration,
396            10 => AppCommand::DeformProtecClose,
397            11 => AppCommand::DeformProtecOpen,
398            12 => AppCommand::DropGoHome,
399            13 => AppCommand::DropTakeOff,
400            14 => AppCommand::DropLanding,
401            15 => AppCommand::DynamicHomePointOpen,
402            16 => AppCommand::DynamicHomePointClose,
403            17 => AppCommand::FollowFunctionOpen,
404            18 => AppCommand::FollowFunctionClose,
405            19 => AppCommand::IOCOpen,
406            20 => AppCommand::IOCClose,
407            21 => AppCommand::DropCalibration,
408            22 => AppCommand::PackMode,
409            23 => AppCommand::UnPackMode,
410            24 => AppCommand::EnterManualMode,
411            25 => AppCommand::StopDeform,
412            28 => AppCommand::DownDeform,
413            29 => AppCommand::UpDeform,
414            30 => AppCommand::ForceLanding,
415            31 => AppCommand::ForceLanding2,
416            _ => AppCommand::Unknown(value),
417        }
418    }
419}
420
421#[derive(PartialEq, Serialize, Debug, Clone, Copy)]
422#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
423pub enum GroundOrSky {
424    Ground,
425    Sky,
426    #[serde(untagged)]
427    Unknown(u8),
428}
429
430impl From<u8> for GroundOrSky {
431    fn from(value: u8) -> Self {
432        match value {
433            0 | 1 => GroundOrSky::Ground,
434            2 | 3 => GroundOrSky::Sky,
435            _ => GroundOrSky::Unknown(value),
436        }
437    }
438}
439
440#[derive(Serialize, Debug, Clone, Copy)]
441#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
442pub enum GoHomeStatus {
443    Standby,
444    Preascending,
445    Align,
446    Ascending,
447    Cruise,
448    Braking,
449    Bypassing,
450    #[serde(untagged)]
451    Unknown(u8),
452}
453
454impl From<u8> for GoHomeStatus {
455    fn from(value: u8) -> Self {
456        match value {
457            0 => GoHomeStatus::Standby,
458            1 => GoHomeStatus::Preascending,
459            2 => GoHomeStatus::Align,
460            3 => GoHomeStatus::Ascending,
461            4 => GoHomeStatus::Cruise,
462            5 => GoHomeStatus::Braking,
463            6 => GoHomeStatus::Bypassing,
464            _ => GoHomeStatus::Unknown(value),
465        }
466    }
467}
468
469#[derive(Serialize, Debug, Clone, Copy)]
470#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
471pub enum BatteryType {
472    NonSmart,
473    Smart,
474    #[serde(untagged)]
475    Unknown(u8),
476}
477
478impl From<u8> for BatteryType {
479    fn from(value: u8) -> Self {
480        match value {
481            1 => BatteryType::NonSmart,
482            2 => BatteryType::Smart,
483            _ => BatteryType::Unknown(value),
484        }
485    }
486}
487
488#[derive(Serialize, Debug, Clone, Copy)]
489#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
490pub enum FlightAction {
491    None,
492    WarningPowerGoHome,
493    WarningPowerLanding,
494    SmartPowerGoHome,
495    SmartPowerLanding,
496    LowVoltageLanding,
497    LowVoltageGoHome,
498    SeriousLowVoltageLanding,
499    RCOnekeyGoHome,
500    RCAssistantTakeoff,
501    RCAutoTakeoff,
502    RCAutoLanding,
503    AppAutoGoHome,
504    AppAutoLanding,
505    AppAutoTakeoff,
506    OutOfControlGoHome,
507    ApiAutoTakeoff,
508    ApiAutoLanding,
509    ApiAutoGoHome,
510    AvoidGroundLanding,
511    AirportAvoidLanding,
512    TooCloseGoHomeLanding,
513    TooFarGoHomeLanding,
514    AppWPMission,
515    WPAutoTakeoff,
516    GoHomeAvoid,
517    PGoHomeFinish,
518    VertLowLimitLanding,
519    BatteryForceLanding,
520    MCProtectGoHome,
521    MotorblockLanding,
522    AppRequestForceLanding,
523    FakeBatteryLanding,
524    RTHComingObstacleLanding,
525    IMUErrorRTH,
526    #[serde(untagged)]
527    Unknown(u8),
528}
529
530impl From<u8> for FlightAction {
531    fn from(value: u8) -> Self {
532        match value {
533            0 => FlightAction::None,
534            1 => FlightAction::WarningPowerGoHome,
535            2 => FlightAction::WarningPowerLanding,
536            3 => FlightAction::SmartPowerGoHome,
537            4 => FlightAction::SmartPowerLanding,
538            5 => FlightAction::LowVoltageLanding,
539            6 => FlightAction::LowVoltageGoHome,
540            7 => FlightAction::SeriousLowVoltageLanding,
541            8 => FlightAction::RCOnekeyGoHome,
542            9 => FlightAction::RCAssistantTakeoff,
543            10 => FlightAction::RCAutoTakeoff,
544            11 => FlightAction::RCAutoLanding,
545            12 => FlightAction::AppAutoGoHome,
546            13 => FlightAction::AppAutoLanding,
547            14 => FlightAction::AppAutoTakeoff,
548            15 => FlightAction::OutOfControlGoHome,
549            16 => FlightAction::ApiAutoTakeoff,
550            17 => FlightAction::ApiAutoLanding,
551            18 => FlightAction::ApiAutoGoHome,
552            19 => FlightAction::AvoidGroundLanding,
553            20 => FlightAction::AirportAvoidLanding,
554            21 => FlightAction::TooCloseGoHomeLanding,
555            22 => FlightAction::TooFarGoHomeLanding,
556            23 => FlightAction::AppWPMission,
557            24 => FlightAction::WPAutoTakeoff,
558            25 => FlightAction::GoHomeAvoid,
559            26 => FlightAction::PGoHomeFinish,
560            27 => FlightAction::VertLowLimitLanding,
561            28 => FlightAction::BatteryForceLanding,
562            29 => FlightAction::MCProtectGoHome,
563            30 => FlightAction::MotorblockLanding,
564            31 => FlightAction::AppRequestForceLanding,
565            32 => FlightAction::FakeBatteryLanding,
566            33 => FlightAction::RTHComingObstacleLanding,
567            34 => FlightAction::IMUErrorRTH,
568            _ => FlightAction::Unknown(value),
569        }
570    }
571}
572
573#[derive(Serialize, Debug, Clone, Copy)]
574#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
575pub enum MotorStartFailedCause {
576    None,
577    CompassError,
578    AssistantProtected,
579    DeviceLocked,
580    DistanceLimit,
581    IMUNeedCalibration,
582    IMUSNError,
583    IMUWarning,
584    CompassCalibrating,
585    AttiError,
586    NoviceProtected,
587    BatteryCellError,
588    BatteryCommuniteError,
589    SeriousLowVoltage,
590    SeriousLowPower,
591    LowVoltage,
592    TempureVolLow,
593    SmartLowToLand,
594    BatteryNotReady,
595    SimulatorMode,
596    PackMode,
597    AttitudeAbnormal,
598    UnActive,
599    FlyForbiddenError,
600    BiasError,
601    EscError,
602    ImuInitError,
603    SystemUpgrade,
604    SimulatorStarted,
605    ImuingError,
606    AttiAngleOver,
607    GyroscopeError,
608    AcceleratorError,
609    CompassFailed,
610    BarometerError,
611    BarometerNegative,
612    CompassBig,
613    GyroscopeBiasBig,
614    AcceleratorBiasBig,
615    CompassNoiseBig,
616    BarometerNoiseBig,
617    InvalidSn,
618    FlashOperating,
619    GPSdisconnect,
620    SDCardException,
621    IMUNoconnection,
622    RCCalibration,
623    RCCalibrationException,
624    RCCalibrationUnfinished,
625    RCCalibrationException2,
626    RCCalibrationException3,
627    AircraftTypeMismatch,
628    FoundUnfinishedModule,
629    CyroAbnormal,
630    BaroAbnormal,
631    CompassAbnormal,
632    GPSAbnormal,
633    NSAbnormal,
634    TopologyAbnormal,
635    RCNeedCali,
636    InvalidFloat,
637    M600BatTooLittle,
638    M600BatAuthErr,
639    M600BatCommErr,
640    M600BatDifVoltLarge1,
641    M600BatDifVoltLarge2,
642    InvalidVersion,
643    GimbalGyroAbnormal,
644    GimbalESCPitchNonData,
645    GimbalESCRollNonData,
646    GimbalESCYawNonData,
647    GimbalFirmwIsUpdating,
648    GimbalDisorder,
649    GimbalPitchShock,
650    GimbalRollShock,
651    GimbalYawShock,
652    IMUcCalibrationFinished,
653    BattVersionError,
654    RTKBadSignal,
655    RTKDeviationError,
656    ESCCalibrating,
657    GPSSignInvalid,
658    GimbalIsCalibrating,
659    LockByApp,
660    StartFlyHeightError,
661    ESCVersionNotMatch,
662    IMUOriNotMatch,
663    StopByApp,
664    CompassIMUOriNotMatch,
665    BatteryOverTemperature,
666    BatteryInstallError,
667    BeImpact,
668    #[serde(untagged)]
669    Unknown(u8),
670}
671
672impl From<u8> for MotorStartFailedCause {
673    fn from(value: u8) -> Self {
674        match value {
675            0 => MotorStartFailedCause::None,
676            1 => MotorStartFailedCause::CompassError,
677            2 => MotorStartFailedCause::AssistantProtected,
678            3 => MotorStartFailedCause::DeviceLocked,
679            4 => MotorStartFailedCause::DistanceLimit,
680            5 => MotorStartFailedCause::IMUNeedCalibration,
681            6 => MotorStartFailedCause::IMUSNError,
682            7 => MotorStartFailedCause::IMUWarning,
683            8 => MotorStartFailedCause::CompassCalibrating,
684            9 => MotorStartFailedCause::AttiError,
685            10 => MotorStartFailedCause::NoviceProtected,
686            11 => MotorStartFailedCause::BatteryCellError,
687            12 => MotorStartFailedCause::BatteryCommuniteError,
688            13 => MotorStartFailedCause::SeriousLowVoltage,
689            14 => MotorStartFailedCause::SeriousLowPower,
690            15 => MotorStartFailedCause::LowVoltage,
691            16 => MotorStartFailedCause::TempureVolLow,
692            17 => MotorStartFailedCause::SmartLowToLand,
693            18 => MotorStartFailedCause::BatteryNotReady,
694            19 => MotorStartFailedCause::SimulatorMode,
695            20 => MotorStartFailedCause::PackMode,
696            21 => MotorStartFailedCause::AttitudeAbnormal,
697            22 => MotorStartFailedCause::UnActive,
698            23 => MotorStartFailedCause::FlyForbiddenError,
699            24 => MotorStartFailedCause::BiasError,
700            25 => MotorStartFailedCause::EscError,
701            26 => MotorStartFailedCause::ImuInitError,
702            27 => MotorStartFailedCause::SystemUpgrade,
703            28 => MotorStartFailedCause::SimulatorStarted,
704            29 => MotorStartFailedCause::ImuingError,
705            30 => MotorStartFailedCause::AttiAngleOver,
706            31 => MotorStartFailedCause::GyroscopeError,
707            32 => MotorStartFailedCause::AcceleratorError,
708            33 => MotorStartFailedCause::CompassFailed,
709            34 => MotorStartFailedCause::BarometerError,
710            35 => MotorStartFailedCause::BarometerNegative,
711            36 => MotorStartFailedCause::CompassBig,
712            37 => MotorStartFailedCause::GyroscopeBiasBig,
713            38 => MotorStartFailedCause::AcceleratorBiasBig,
714            39 => MotorStartFailedCause::CompassNoiseBig,
715            40 => MotorStartFailedCause::BarometerNoiseBig,
716            41 => MotorStartFailedCause::InvalidSn,
717            44 => MotorStartFailedCause::FlashOperating,
718            45 => MotorStartFailedCause::GPSdisconnect,
719            47 => MotorStartFailedCause::SDCardException,
720            61 => MotorStartFailedCause::IMUNoconnection,
721            62 => MotorStartFailedCause::RCCalibration,
722            63 => MotorStartFailedCause::RCCalibrationException,
723            64 => MotorStartFailedCause::RCCalibrationUnfinished,
724            65 => MotorStartFailedCause::RCCalibrationException2,
725            66 => MotorStartFailedCause::RCCalibrationException3,
726            67 => MotorStartFailedCause::AircraftTypeMismatch,
727            68 => MotorStartFailedCause::FoundUnfinishedModule,
728            70 => MotorStartFailedCause::CyroAbnormal,
729            71 => MotorStartFailedCause::BaroAbnormal,
730            72 => MotorStartFailedCause::CompassAbnormal,
731            73 => MotorStartFailedCause::GPSAbnormal,
732            74 => MotorStartFailedCause::NSAbnormal,
733            75 => MotorStartFailedCause::TopologyAbnormal,
734            76 => MotorStartFailedCause::RCNeedCali,
735            77 => MotorStartFailedCause::InvalidFloat,
736            78 => MotorStartFailedCause::M600BatTooLittle,
737            79 => MotorStartFailedCause::M600BatAuthErr,
738            80 => MotorStartFailedCause::M600BatCommErr,
739            81 => MotorStartFailedCause::M600BatDifVoltLarge1,
740            82 => MotorStartFailedCause::M600BatDifVoltLarge2,
741            83 => MotorStartFailedCause::InvalidVersion,
742            84 => MotorStartFailedCause::GimbalGyroAbnormal,
743            85 => MotorStartFailedCause::GimbalESCPitchNonData,
744            86 => MotorStartFailedCause::GimbalESCRollNonData,
745            87 => MotorStartFailedCause::GimbalESCYawNonData,
746            88 => MotorStartFailedCause::GimbalFirmwIsUpdating,
747            89 => MotorStartFailedCause::GimbalDisorder,
748            90 => MotorStartFailedCause::GimbalPitchShock,
749            91 => MotorStartFailedCause::GimbalRollShock,
750            92 => MotorStartFailedCause::GimbalYawShock,
751            93 => MotorStartFailedCause::IMUcCalibrationFinished,
752            101 => MotorStartFailedCause::BattVersionError,
753            102 => MotorStartFailedCause::RTKBadSignal,
754            103 => MotorStartFailedCause::RTKDeviationError,
755            112 => MotorStartFailedCause::ESCCalibrating,
756            113 => MotorStartFailedCause::GPSSignInvalid,
757            114 => MotorStartFailedCause::GimbalIsCalibrating,
758            115 => MotorStartFailedCause::LockByApp,
759            116 => MotorStartFailedCause::StartFlyHeightError,
760            117 => MotorStartFailedCause::ESCVersionNotMatch,
761            118 => MotorStartFailedCause::IMUOriNotMatch,
762            119 => MotorStartFailedCause::StopByApp,
763            120 => MotorStartFailedCause::CompassIMUOriNotMatch,
764            122 => MotorStartFailedCause::CompassIMUOriNotMatch,
765            123 => MotorStartFailedCause::BatteryOverTemperature,
766            124 => MotorStartFailedCause::BatteryInstallError,
767            125 => MotorStartFailedCause::BeImpact,
768            _ => MotorStartFailedCause::Unknown(value),
769        }
770    }
771}
772
773#[derive(Serialize, Debug, Clone, Copy)]
774#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
775pub enum NonGPSCause {
776    Already,
777    Forbid,
778    GpsNumNonEnough,
779    GpsHdopLarge,
780    GpsPositionNonMatch,
781    SpeedErrorLarge,
782    YawErrorLarge,
783    CompassErrorLarge,
784    #[serde(untagged)]
785    Unknown(u8),
786}
787
788impl From<u8> for NonGPSCause {
789    fn from(value: u8) -> Self {
790        match value {
791            0 => NonGPSCause::Already,
792            1 => NonGPSCause::Forbid,
793            2 => NonGPSCause::GpsNumNonEnough,
794            3 => NonGPSCause::GpsHdopLarge,
795            4 => NonGPSCause::GpsPositionNonMatch,
796            5 => NonGPSCause::SpeedErrorLarge,
797            6 => NonGPSCause::YawErrorLarge,
798            7 => NonGPSCause::CompassErrorLarge,
799            _ => NonGPSCause::Unknown(value),
800        }
801    }
802}
803
804#[derive(Serialize, Debug, Default, Clone, Copy)]
805#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
806pub enum ImuInitFailReason {
807    #[default]
808    MonitorError,
809    CollectingData,
810    AcceDead,
811    CompassDead,
812    BarometerDead,
813    BarometerNegative,
814    CompassModTooLarge,
815    GyroBiasTooLarge,
816    AcceBiasTooLarge,
817    CompassNoiseTooLarge,
818    BarometerNoiseTooLarge,
819    WaitingMcStationary,
820    AcceMoveTooLarge,
821    McHeaderMoved,
822    McVibrated,
823    #[serde(untagged)]
824    Unknown(u8),
825}
826
827impl From<u8> for ImuInitFailReason {
828    fn from(value: u8) -> Self {
829        match value {
830            0 => ImuInitFailReason::MonitorError,
831            1 => ImuInitFailReason::CollectingData,
832            3 => ImuInitFailReason::AcceDead,
833            4 => ImuInitFailReason::CompassDead,
834            5 => ImuInitFailReason::BarometerDead,
835            6 => ImuInitFailReason::BarometerNegative,
836            7 => ImuInitFailReason::CompassModTooLarge,
837            8 => ImuInitFailReason::GyroBiasTooLarge,
838            9 => ImuInitFailReason::AcceBiasTooLarge,
839            10 => ImuInitFailReason::CompassNoiseTooLarge,
840            11 => ImuInitFailReason::BarometerNoiseTooLarge,
841            12 => ImuInitFailReason::WaitingMcStationary,
842            13 => ImuInitFailReason::AcceMoveTooLarge,
843            14 => ImuInitFailReason::McHeaderMoved,
844            15 => ImuInitFailReason::McVibrated,
845            _ => ImuInitFailReason::Unknown(value),
846        }
847    }
848}