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 #[br(map = |x: f64| (x * 180.0) / PI)]
17 pub longitude: f64,
18 #[br(map = |x: f64| (x * 180.0) / PI)]
20 pub latitude: f64,
21 #[br(map = |x: i16| (x as f32 / 10.0))]
23 pub altitude: f32,
24 #[br(map = |x: i16| (x as f32 / 10.0))]
26 pub speed_x: f32,
27 #[br(map = |x: i16| (x as f32 / 10.0))]
29 pub speed_y: f32,
30 #[br(map = |x: i16| (x as f32 / 10.0))]
32 pub speed_z: f32,
33 #[br(map = |x: i16| (x as f32 / 10.0))]
35 pub pitch: f32,
36 #[br(map = |x: i16| (x as f32 / 10.0))]
38 pub roll: f32,
39 #[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 #[br(map = |x: u8| (x as f32 / 10.0))]
125 pub s_wave_height: f32,
126 #[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,
234 Atti,
236 AttiCourseLock,
238 AttiHover,
240 Hover,
242 GPSBlake,
244 GPSAtti,
246 GPSCourseLock,
248 GPSHomeLock,
250 GPSHotPoint,
252 AssistedTakeoff,
254 AutoTakeoff,
256 AutoLanding,
258 AttiLanding,
260 GPSWaypoint,
262 GoHome,
264 ClickGo,
265 Joystick,
267 GPSAttiWristband,
268 Cinematic,
269 AttiLimited,
271 Draw,
273 GPSFollowMe,
275 ActiveTrack,
277 TapFly,
279 Pano,
280 Farming,
281 FPV,
282 GPSSport,
284 GPSNovice,
285 ConfirmLanding,
287 TerrainTracking,
289 NaviAdvGoHome,
290 NaviAdvLanding,
291 Tripod,
293 TrackHeadlock,
295 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}