dji_log_parser/record/
home.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(little, import { version: u8 })]
13#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
14pub struct Home {
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: 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}