dji_log_parser/keychain/
feature_point.rs

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            // OSDFlightRecordDataType
33            1 => FeaturePoint::BaseFeature,
34            // OSDHomeFlightRecordDataType
35            2 => FeaturePoint::BaseFeature,
36            // GimbalFlightRecordDataType
37            3 => {
38                if version == 13 {
39                    FeaturePoint::BaseFeature
40                } else {
41                    FeaturePoint::GimbalFeature
42                }
43            }
44            // RCFlightRecordDataType
45            4 => {
46                if version == 13 {
47                    FeaturePoint::BaseFeature
48                } else {
49                    FeaturePoint::RCFeature
50                }
51            }
52            // CustomFlightRecordDataType
53            5 => FeaturePoint::DJIFlyCustomFeature,
54            // MCTripodStateFlightRecordDataType
55            6 => FeaturePoint::BaseFeature,
56            // CenterBatteryFlightRecordDataType
57            7 => {
58                if version == 13 {
59                    FeaturePoint::BaseFeature
60                } else {
61                    FeaturePoint::BatteryFeature
62                }
63            }
64            // PushedBatteryFlightRecordDataType
65            8 => {
66                if version == 13 {
67                    FeaturePoint::BaseFeature
68                } else {
69                    FeaturePoint::BatteryFeature
70                }
71            }
72            // ShowTipsFlightRecordDataType
73            9 => FeaturePoint::DJIFlyCustomFeature,
74            // ShowWarningFlightRecordDataType
75            10 => FeaturePoint::DJIFlyCustomFeature,
76            // RCPushGPSFlightRecordDataType
77            11 => {
78                if version == 13 {
79                    FeaturePoint::BaseFeature
80                } else {
81                    FeaturePoint::RCFeature
82                }
83            }
84            // RCDebugDataType
85            12 => FeaturePoint::AfterSalesFeature,
86            // RecoverInfoDataType
87            13 => FeaturePoint::BaseFeature,
88            // AppLocationDataType
89            14 => FeaturePoint::BaseFeature,
90            // FirmwareVersionType
91            15 => FeaturePoint::BaseFeature,
92            // OFDMDebugDataType
93            16 => FeaturePoint::AfterSalesFeature,
94            // VisionGroupDataType
95            17 => FeaturePoint::VisionFeature,
96            // VisionWaringStringDataType
97            18 => FeaturePoint::VisionFeature,
98            // MCParamDataType
99            19 => FeaturePoint::AfterSalesFeature,
100            // APPOperationDataType
101            20 => FeaturePoint::DJIFlyCustomFeature,
102            // AGOSDDataType
103            21 => FeaturePoint::AgricultureFeature,
104            // SmartBatteryGroupDataType
105            22 => {
106                if version == 13 {
107                    FeaturePoint::AfterSalesFeature
108                } else {
109                    FeaturePoint::BatteryFeature
110                }
111            }
112            // ShowSeriousWarningFlightRecordDataType
113            24 => FeaturePoint::DJIFlyCustomFeature,
114            // CameraInfoFlightRecordDataType
115            25 => {
116                if version == 13 {
117                    FeaturePoint::BaseFeature
118                } else {
119                    FeaturePoint::CameraFeature
120                }
121            }
122            // ADSBFlightDataDataType
123            26 => FeaturePoint::AfterSalesFeature,
124            // ADSBFlightOriginalDataType
125            27 => FeaturePoint::AfterSalesFeature,
126            // FlyForbidDBuuidDataType
127            28 => {
128                if version == 13 {
129                    FeaturePoint::AfterSalesFeature
130                } else {
131                    FeaturePoint::FlySafeFeature
132                }
133            }
134            // AppSpecialControlJoyStickDataType
135            29 => {
136                if version == 13 {
137                    FeaturePoint::BaseFeature
138                } else {
139                    FeaturePoint::RCFeature
140                }
141            }
142            // AppLowFreqCustomDataType
143            30 => FeaturePoint::DJIFlyCustomFeature,
144            // NavigationModeGroupedDataType
145            31 => FeaturePoint::WaypointFeature,
146            // GSMissionStatusDataType
147            32 => FeaturePoint::WaypointFeature,
148            // AppVirtualStickDataType
149            33 => {
150                if version == 13 {
151                    FeaturePoint::BaseFeature
152                } else {
153                    FeaturePoint::RCFeature
154                }
155            }
156            // GSMissionEventDataType
157            34 => FeaturePoint::WaypointFeature,
158            // WaypointMissionUploadDataType
159            35 => FeaturePoint::WaypointFeature,
160            // WaypointUploadDataType
161            36 => FeaturePoint::WaypointFeature,
162            // WaypointMissionDownloadDataType
163            38 => FeaturePoint::WaypointFeature,
164            // WaypointDownloadDataType
165            39 => FeaturePoint::WaypointFeature,
166            // ComponentSerialNumberDataType
167            40 => FeaturePoint::BaseFeature,
168            // AgricultureDisplayField
169            41 => FeaturePoint::AgricultureFeature,
170            // AgricultureRadarPush
171            43 => FeaturePoint::AgricultureFeature,
172            // AgricultureSpray
173            44 => FeaturePoint::AgricultureFeature,
174            // RTKDifferenceDataType
175            45 => FeaturePoint::AgricultureFeature,
176            // AgricultureFarmMissionInfo
177            46 => FeaturePoint::AgricultureFeature,
178            // AgricultureFarmTaskTeamDataType
179            47 => FeaturePoint::AgricultureFeature,
180            // AgricultureGroundStationPushData
181            48 => FeaturePoint::AgricultureFeature,
182            // AgricultureOFDMRadioSignalPush
183            49 => FeaturePoint::AirLinkFeature,
184            // FlightRecordRecover
185            50 => FeaturePoint::PlaintextFeature,
186            // FlySafeLimitInfoDataType
187            51 => {
188                if version == 13 {
189                    FeaturePoint::AfterSalesFeature
190                } else {
191                    FeaturePoint::FlySafeFeature
192                }
193            }
194            // FlySafeUnlockLicenseUserActionInfoDataType
195            52 => {
196                if version == 13 {
197                    FeaturePoint::AfterSalesFeature
198                } else {
199                    FeaturePoint::FlySafeFeature
200                }
201            }
202            // FlightHubInfoDataType
203            53 => {
204                if version == 13 {
205                    FeaturePoint::AfterSalesFeature
206                } else {
207                    FeaturePoint::FlightHubFeature
208                }
209            }
210            // GOBusinessDataType
211            54 => FeaturePoint::DJIFlyCustomFeature,
212            // Unknown
213            55 => FeaturePoint::SecurityFeature,
214            // KeyStorage
215            56 => FeaturePoint::PlaintextFeature,
216            // HealthGroupDataType
217            58 => FeaturePoint::BaseFeature,
218            // FCIMUInfoDataType
219            59 => FeaturePoint::BaseFeature,
220            // RemoteControllerDisplayField
221            62 => FeaturePoint::RCFeature,
222            // FlightControllerCommonOSDField
223            63 => FeaturePoint::BaseFeature,
224            // Default
225            _ => 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}