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 pub sd_card_total_capacity: u32,
68 pub sd_card_remain_capacity: u32,
70 pub remain_photo_num: u32,
71 pub remain_video_timer: u32,
73 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}