dji_log_parser/record/
smart_battery.rs1use 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 #[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}