dji_log_parser/record/
home.rs1use 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(little, import { version: u8 })]
13#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
14pub struct Home {
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: f32| (x / 10.0))]
23 pub altitude: f32,
24
25 #[br(temp)]
26 _bitpack1: u8,
27 #[br(calc(sub_byte_field(_bitpack1, 0x01) == 1))]
28 pub is_home_record: bool,
29 #[br(calc(GoHomeMode::from(sub_byte_field(_bitpack1, 0x02) == 1)))]
30 pub go_home_mode: GoHomeMode,
31 #[br(calc(sub_byte_field(_bitpack1, 0x04)))]
32 pub aircraft_head_direction: u8,
33 #[br(calc(sub_byte_field(_bitpack1, 0x08) == 1))]
34 pub is_dynamic_home_point_enabled: bool,
35 #[br(calc(sub_byte_field(_bitpack1, 0x10) == 1))]
36 pub is_near_distance_limit: bool,
37 #[br(calc(sub_byte_field(_bitpack1, 0x20) == 1))]
38 pub is_near_height_limit: bool,
39 #[br(calc(sub_byte_field(_bitpack1, 0x40) == 1))]
40 pub is_multiple_mode_open: bool,
41 #[br(calc(sub_byte_field(_bitpack1, 0x80) == 1))]
42 pub has_go_home: bool,
43
44 #[br(temp)]
45 _bitpack2: u8,
46 #[br(calc(CompassCalibrationState::from(sub_byte_field(_bitpack2, 0x03))))]
47 pub compass_state: CompassCalibrationState,
48 #[br(calc(sub_byte_field(_bitpack2, 0x04) == 1))]
49 pub is_compass_adjust: bool,
50 #[br(calc(sub_byte_field(_bitpack2, 0x08) == 1))]
51 pub is_beginner_mode: bool,
52 #[br(calc(sub_byte_field(_bitpack2, 0x10) == 1))]
53 pub is_ioc_open: bool,
54 #[br(calc(IOCMode::from(sub_byte_field(_bitpack2, 0xE0))))]
55 pub ioc_mode: IOCMode,
56
57 pub go_home_height: u16,
58 pub ioc_course_lock_angle: i16,
59 pub flight_record_sd_state: u8,
60 pub record_sd_capacity_percent: u8,
61 pub record_sd_left_time: u16,
62 pub current_flight_record_index: u16,
63 #[br(if(version >= 8), temp)]
64 _unknown: [u8; 5],
65 #[br(if(version >= 8))]
66 pub max_allowed_height: f32,
67}
68
69#[derive(Serialize, Debug, Clone, Copy)]
70#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
71pub enum IOCMode {
72 CourseLock,
73 HomeLock,
74 HotspotSurround,
75 #[serde(untagged)]
76 Unknown(u8),
77}
78
79impl From<u8> for IOCMode {
80 fn from(value: u8) -> Self {
81 match value {
82 1 => IOCMode::CourseLock,
83 2 => IOCMode::HomeLock,
84 3 => IOCMode::HotspotSurround,
85 _ => IOCMode::Unknown(value),
86 }
87 }
88}
89
90#[derive(Serialize, Debug, Clone, Copy)]
91#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
92pub enum GoHomeMode {
93 Normal,
94 FixedHeight,
95}
96
97impl From<bool> for GoHomeMode {
98 fn from(value: bool) -> Self {
99 match value {
100 false => GoHomeMode::Normal,
101 true => GoHomeMode::FixedHeight,
102 }
103 }
104}
105
106#[derive(Serialize, Debug, Clone, Copy)]
107#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
108pub enum CompassCalibrationState {
109 NotCalibrating,
110 Horizontal,
111 Vertical,
112 Successful,
113 Failed,
114 Unnown(u8),
115}
116
117impl From<u8> for CompassCalibrationState {
118 fn from(value: u8) -> Self {
119 match value {
120 0 => CompassCalibrationState::NotCalibrating,
121 1 => CompassCalibrationState::Horizontal,
122 2 => CompassCalibrationState::Vertical,
123 3 => CompassCalibrationState::Successful,
124 4 => CompassCalibrationState::Failed,
125 _ => CompassCalibrationState::Unnown(value),
126 }
127 }
128}