1use binrw::binread;
2#[cfg(target_arch = "wasm32")]
3use tsify_next::Tsify;
4
5use serde::{Deserialize, Serialize, Serializer};
6
7#[binread]
8#[derive(Hash, Eq, PartialEq, Debug, Clone, Copy)]
9#[br(repr(u16))]
10#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
11pub enum FeaturePoint {
12 BaseFeature = 1,
13 VisionFeature,
14 WaypointFeature,
15 AgricultureFeature,
16 AirLinkFeature,
17 AfterSalesFeature,
18 DJIFlyCustomFeature,
19 PlaintextFeature,
20 FlightHubFeature,
21 GimbalFeature,
22 RCFeature,
23 CameraFeature,
24 BatteryFeature,
25 FlySafeFeature,
26 SecurityFeature,
27}
28
29impl FeaturePoint {
30 pub fn from_record_type(record_type: u8, version: u8) -> Self {
31 match record_type {
32 1 => FeaturePoint::BaseFeature,
34 2 => FeaturePoint::BaseFeature,
36 3 => {
38 if version == 13 {
39 FeaturePoint::BaseFeature
40 } else {
41 FeaturePoint::GimbalFeature
42 }
43 }
44 4 => {
46 if version == 13 {
47 FeaturePoint::BaseFeature
48 } else {
49 FeaturePoint::RCFeature
50 }
51 }
52 5 => FeaturePoint::DJIFlyCustomFeature,
54 6 => FeaturePoint::BaseFeature,
56 7 => {
58 if version == 13 {
59 FeaturePoint::BaseFeature
60 } else {
61 FeaturePoint::BatteryFeature
62 }
63 }
64 8 => {
66 if version == 13 {
67 FeaturePoint::BaseFeature
68 } else {
69 FeaturePoint::BatteryFeature
70 }
71 }
72 9 => FeaturePoint::DJIFlyCustomFeature,
74 10 => FeaturePoint::DJIFlyCustomFeature,
76 11 => {
78 if version == 13 {
79 FeaturePoint::BaseFeature
80 } else {
81 FeaturePoint::RCFeature
82 }
83 }
84 12 => FeaturePoint::AfterSalesFeature,
86 13 => FeaturePoint::BaseFeature,
88 14 => FeaturePoint::BaseFeature,
90 15 => FeaturePoint::BaseFeature,
92 16 => FeaturePoint::AfterSalesFeature,
94 17 => FeaturePoint::VisionFeature,
96 18 => FeaturePoint::VisionFeature,
98 19 => FeaturePoint::AfterSalesFeature,
100 20 => FeaturePoint::DJIFlyCustomFeature,
102 21 => FeaturePoint::AgricultureFeature,
104 22 => {
106 if version == 13 {
107 FeaturePoint::AfterSalesFeature
108 } else {
109 FeaturePoint::BatteryFeature
110 }
111 }
112 24 => FeaturePoint::DJIFlyCustomFeature,
114 25 => {
116 if version == 13 {
117 FeaturePoint::BaseFeature
118 } else {
119 FeaturePoint::CameraFeature
120 }
121 }
122 26 => FeaturePoint::AfterSalesFeature,
124 27 => FeaturePoint::AfterSalesFeature,
126 28 => {
128 if version == 13 {
129 FeaturePoint::AfterSalesFeature
130 } else {
131 FeaturePoint::FlySafeFeature
132 }
133 }
134 29 => {
136 if version == 13 {
137 FeaturePoint::BaseFeature
138 } else {
139 FeaturePoint::RCFeature
140 }
141 }
142 30 => FeaturePoint::DJIFlyCustomFeature,
144 31 => FeaturePoint::WaypointFeature,
146 32 => FeaturePoint::WaypointFeature,
148 33 => {
150 if version == 13 {
151 FeaturePoint::BaseFeature
152 } else {
153 FeaturePoint::RCFeature
154 }
155 }
156 34 => FeaturePoint::WaypointFeature,
158 35 => FeaturePoint::WaypointFeature,
160 36 => FeaturePoint::WaypointFeature,
162 38 => FeaturePoint::WaypointFeature,
164 39 => FeaturePoint::WaypointFeature,
166 40 => FeaturePoint::BaseFeature,
168 41 => FeaturePoint::AgricultureFeature,
170 43 => FeaturePoint::AgricultureFeature,
172 44 => FeaturePoint::AgricultureFeature,
174 45 => FeaturePoint::AgricultureFeature,
176 46 => FeaturePoint::AgricultureFeature,
178 47 => FeaturePoint::AgricultureFeature,
180 48 => FeaturePoint::AgricultureFeature,
182 49 => FeaturePoint::AirLinkFeature,
184 50 => FeaturePoint::PlaintextFeature,
186 51 => {
188 if version == 13 {
189 FeaturePoint::AfterSalesFeature
190 } else {
191 FeaturePoint::FlySafeFeature
192 }
193 }
194 52 => {
196 if version == 13 {
197 FeaturePoint::AfterSalesFeature
198 } else {
199 FeaturePoint::FlySafeFeature
200 }
201 }
202 53 => {
204 if version == 13 {
205 FeaturePoint::AfterSalesFeature
206 } else {
207 FeaturePoint::FlightHubFeature
208 }
209 }
210 54 => FeaturePoint::DJIFlyCustomFeature,
212 55 => FeaturePoint::SecurityFeature,
214 56 => FeaturePoint::PlaintextFeature,
216 58 => FeaturePoint::BaseFeature,
218 59 => FeaturePoint::BaseFeature,
220 62 => FeaturePoint::RCFeature,
222 63 => FeaturePoint::BaseFeature,
224 _ => FeaturePoint::PlaintextFeature,
226 }
227 }
228}
229
230impl Serialize for FeaturePoint {
231 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
232 where
233 S: Serializer,
234 {
235 let feature_point_string = match self {
236 FeaturePoint::BaseFeature => "FR_Standardization_Feature_Base_1",
237 FeaturePoint::VisionFeature => "FR_Standardization_Feature_Vision_2",
238 FeaturePoint::WaypointFeature => "FR_Standardization_Feature_Waypoint_3",
239 FeaturePoint::AgricultureFeature => "FR_Standardization_Feature_Agriculture_4",
240 FeaturePoint::AirLinkFeature => "FR_Standardization_Feature_AirLink_5",
241 FeaturePoint::AfterSalesFeature => "FR_Standardization_Feature_AfterSales_6",
242 FeaturePoint::DJIFlyCustomFeature => "FR_Standardization_Feature_DJIFlyCustom_7",
243 FeaturePoint::PlaintextFeature => "FR_Standardization_Feature_Plaintext_8",
244 FeaturePoint::FlightHubFeature => "FR_Standardization_Feature_FlightHub_9",
245 FeaturePoint::GimbalFeature => "FR_Standardization_Feature_Gimbal_10",
246 FeaturePoint::RCFeature => "FR_Standardization_Feature_RC_11",
247 FeaturePoint::CameraFeature => "FR_Standardization_Feature_Camera_12",
248 FeaturePoint::BatteryFeature => "FR_Standardization_Feature_Battery_13",
249 FeaturePoint::FlySafeFeature => "FR_Standardization_Feature_FlySafe_14",
250 FeaturePoint::SecurityFeature => "FR_Standardization_Feature_Security_15",
251 };
252 serializer.serialize_str(feature_point_string)
253 }
254}
255
256impl<'de> Deserialize<'de> for FeaturePoint {
257 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
258 where
259 D: serde::Deserializer<'de>,
260 {
261 let s = String::deserialize(deserializer)?;
262 match s.as_str() {
263 "FR_Standardization_Feature_Base_1" => Ok(FeaturePoint::BaseFeature),
264 "FR_Standardization_Feature_Vision_2" => Ok(FeaturePoint::VisionFeature),
265 "FR_Standardization_Feature_Waypoint_3" => Ok(FeaturePoint::WaypointFeature),
266 "FR_Standardization_Feature_Agriculture_4" => Ok(FeaturePoint::AgricultureFeature),
267 "FR_Standardization_Feature_AirLink_5" => Ok(FeaturePoint::AirLinkFeature),
268 "FR_Standardization_Feature_AfterSales_6" => Ok(FeaturePoint::AfterSalesFeature),
269 "FR_Standardization_Feature_DJIFlyCustom_7" => Ok(FeaturePoint::DJIFlyCustomFeature),
270 "FR_Standardization_Feature_Plaintext_8" => Ok(FeaturePoint::PlaintextFeature),
271 "FR_Standardization_Feature_FlightHub_9" => Ok(FeaturePoint::FlightHubFeature),
272 "FR_Standardization_Feature_Gimbal_10" => Ok(FeaturePoint::GimbalFeature),
273 "FR_Standardization_Feature_RC_11" => Ok(FeaturePoint::RCFeature),
274 "FR_Standardization_Feature_Camera_12" => Ok(FeaturePoint::CameraFeature),
275 "FR_Standardization_Feature_Battery_13" => Ok(FeaturePoint::BatteryFeature),
276 "FR_Standardization_Feature_FlySafe_14" => Ok(FeaturePoint::FlySafeFeature),
277 "FR_Standardization_Feature_Security_15" => Ok(FeaturePoint::SecurityFeature),
278 _ => Err(serde::de::Error::custom(format!(
279 "Invalid feature point: {}",
280 s
281 ))),
282 }
283 }
284}