dji_log_parser/record/
smart_battery.rs

1use binrw::binread;
2use serde::Serialize;
3#[cfg(target_arch = "wasm32")]
4use tsify_next::Tsify;
5
6use crate::utils::sub_byte_field;
7
8#[binread]
9#[derive(Serialize, Debug)]
10#[serde(rename_all = "camelCase")]
11#[br(little)]
12#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
13pub struct SmartBattery {
14    pub useful_time: u16,
15    pub go_home_time: u16,
16    pub land_time: u16,
17    pub go_home_battery: u16,
18    pub land_battery: u16,
19    pub safe_fly_radius: f32,
20    pub volume_consume: f32,
21    pub status: u32,
22    #[br(map = |x: u8| BatteryGoHomeStatus::from(x))]
23    pub go_home_status: BatteryGoHomeStatus,
24    pub go_home_countdown: u8,
25    /// volts
26    #[br(map = |x: u16| x as f32 / 1000.0)]
27    pub voltage: f32,
28    pub percent: u8,
29
30    #[br(temp)]
31    _bitpack1: u8,
32    #[br(calc(sub_byte_field(_bitpack1, 0x7F)))]
33    pub low_warning: u8,
34    #[br(calc(sub_byte_field(_bitpack1, 0x80)))]
35    pub low_warning_go_home: u8,
36
37    #[br(temp)]
38    _bitpack2: u8,
39    #[br(calc(sub_byte_field(_bitpack2, 0x7F)))]
40    pub serious_low_warning: u8,
41    #[br(calc(sub_byte_field(_bitpack2, 0x80)))]
42    pub serious_low_warning_landing: u8,
43
44    pub reserve: u8,
45}
46
47#[derive(Serialize, Debug)]
48#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
49pub enum BatteryGoHomeStatus {
50    NonGoHome,
51    GoHome,
52    GoHomeAlready,
53    #[serde(untagged)]
54    Unknown(u8),
55}
56
57impl From<u8> for BatteryGoHomeStatus {
58    fn from(value: u8) -> Self {
59        match value {
60            0 => BatteryGoHomeStatus::NonGoHome,
61            1 => BatteryGoHomeStatus::GoHome,
62            2 => BatteryGoHomeStatus::GoHomeAlready,
63            _ => BatteryGoHomeStatus::Unknown(value),
64        }
65    }
66}