dji_log_parser/record/
camera.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 Camera {
14    #[br(temp)]
15    _bitpack1: u8,
16    #[br(calc(sub_byte_field(_bitpack1, 0x01) == 1))]
17    pub is_connect: bool,
18    #[br(calc(sub_byte_field(_bitpack1, 0x02) == 1))]
19    pub is_usb_connect: bool,
20    #[br(calc(sub_byte_field(_bitpack1, 0x04)))]
21    pub timer_sync_state: u8,
22    #[br(calc(sub_byte_field(_bitpack1, 0x38) == 1))]
23    pub is_shooting_single_photo: bool,
24    #[br(calc(sub_byte_field(_bitpack1, 0xC0) != 0))]
25    pub is_recording: bool,
26
27    #[br(temp)]
28    _bitpack2: u8,
29    #[br(calc(sub_byte_field(_bitpack2, 0x02) == 1))]
30    pub has_sd_card: bool,
31    #[br(calc(SDCardState::from(sub_byte_field(_bitpack2, 0x3C))))]
32    pub sd_card_state: SDCardState,
33    #[br(calc(sub_byte_field(_bitpack2, 0x40)))]
34    pub is_upgrading: u8,
35
36    #[br(temp)]
37    _bitpack3: u8,
38    #[br(calc(sub_byte_field(_bitpack3, 0x02) == 1))]
39    pub is_heat: bool,
40    #[br(calc(sub_byte_field(_bitpack3, 0x04) == 1))]
41    pub is_capture_disable: bool,
42    #[br(calc(sub_byte_field(_bitpack3, 0x08) == 1))]
43    pub is_ddr_storing: bool,
44    #[br(calc(sub_byte_field(_bitpack3, 0x10) == 1))]
45    pub conti_capture: bool,
46    #[br(calc(sub_byte_field(_bitpack3, 0x20) == 1))]
47    pub hdmi_output_status: bool,
48    #[br(calc(sub_byte_field(_bitpack3, 0xC0)))]
49    pub encrypt_status: u8,
50
51    #[br(temp)]
52    _bitpack4: u8,
53    #[br(calc(sub_byte_field(_bitpack4, 0x01) == 1))]
54    pub file_syn_state: bool,
55    #[br(calc(sub_byte_field(_bitpack4, 0x02) == 1))]
56    pub rc_btn_forbid_state: bool,
57    #[br(calc(sub_byte_field(_bitpack4, 0x04) == 1))]
58    pub get_focus_state: bool,
59    #[br(calc(sub_byte_field(_bitpack4, 0x08) == 1))]
60    pub pano_timelapse_gimbal_state: bool,
61    #[br(calc(sub_byte_field(_bitpack4, 0x10) == 1))]
62    pub is_enable_tracking_mode: bool,
63
64    #[br(map = |x: u8| CameraWorkMode::from(x))]
65    pub work_mode: CameraWorkMode,
66    /// MB
67    pub sd_card_total_capacity: u32,
68    /// MB
69    pub sd_card_remain_capacity: u32,
70    pub remain_photo_num: u32,
71    /// seconds
72    pub remain_video_timer: u32,
73    /// seconds
74    pub record_time: u16,
75    pub camera_type: u8,
76}
77
78#[derive(Serialize, Debug, Clone, Copy)]
79#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
80pub enum SDCardState {
81    Normal,
82    NoCard,
83    InvalidCard,
84    WriteProtected,
85    Unformatted,
86    Formatting,
87    IllegalFileSys,
88    Busy,
89    Full,
90    LowSpeed,
91    IndexMax,
92    Initialize,
93    SuggestFormat,
94    Repairing,
95    #[serde(untagged)]
96    Unknown(u8),
97}
98
99impl From<u8> for SDCardState {
100    fn from(value: u8) -> Self {
101        match value {
102            0 => SDCardState::Normal,
103            1 => SDCardState::NoCard,
104            2 => SDCardState::InvalidCard,
105            3 => SDCardState::WriteProtected,
106            4 => SDCardState::Unformatted,
107            5 => SDCardState::Formatting,
108            6 => SDCardState::IllegalFileSys,
109            8 => SDCardState::Full,
110            9 => SDCardState::LowSpeed,
111            11 => SDCardState::IndexMax,
112            12 => SDCardState::Initialize,
113            13 => SDCardState::SuggestFormat,
114            14 => SDCardState::Repairing,
115            _ => SDCardState::Unknown(value),
116        }
117    }
118}
119
120#[derive(Serialize, Debug)]
121#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
122pub enum CameraWorkMode {
123    Capture,
124    Recording,
125    Playback,
126    Transcode,
127    Tuning,
128    PowerSave,
129    Download,
130    XcodePlayback,
131    Broadcast,
132    #[serde(untagged)]
133    Unknown(u8),
134}
135
136impl From<u8> for CameraWorkMode {
137    fn from(value: u8) -> Self {
138        match value {
139            0 => CameraWorkMode::Capture,
140            1 => CameraWorkMode::Recording,
141            2 => CameraWorkMode::Playback,
142            3 => CameraWorkMode::Transcode,
143            4 => CameraWorkMode::Tuning,
144            5 => CameraWorkMode::PowerSave,
145            6 => CameraWorkMode::Download,
146            7 => CameraWorkMode::XcodePlayback,
147            8 => CameraWorkMode::Broadcast,
148            _ => CameraWorkMode::Unknown(value),
149        }
150    }
151}