1use geo::Geometry;
2use serde::{Deserialize, Serialize};
3
4use super::shared::FeedInfo;
5
6#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
7pub struct DeviceFeed {
8 pub r#type: String,
9 pub feed_info: FeedInfo,
10 pub features: Vec<FieldDeviceFeature>,
11 pub bbox: Option<Vec<f64>>
12}
13
14#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
15pub struct FieldDeviceFeature {
16 pub id: String,
17 pub r#type: String,
18 pub properties: Properties,
19 #[serde(deserialize_with = "geojson::de::deserialize_geometry")]
20 pub geometry: Geometry,
21 pub bbox: Option<Vec<f64>>
22}
23
24#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
25pub struct Properties {
26 pub core_details: FieldDeviceCoreDetails,
27 #[serde(flatten)]
28 pub arrow_board: Option<ArrowBoard>,
29 #[serde(flatten)]
30 pub camera: Option<Camera>,
31 #[serde(flatten)]
32 pub dynamic_message_sign: Option<DynamicMessageSign>,
33 #[serde(flatten)]
34 pub flashing_becon: Option<FlashingBeacon>,
35 #[serde(flatten)]
36 pub hybrid_sign: Option<HybridSign>,
37 #[serde(flatten)]
38 pub location_marker: Option<LocationMarker>,
39 #[serde(flatten)]
40 pub traffic_sensor: Option<TrafficSensor>,
41 #[serde(flatten)]
42 pub traffic_signal: Option<TrafficSignal>
43}
44
45#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
46pub struct FieldDeviceCoreDetails {
47 pub device_type: String,
48 pub data_source_id: String,
49 pub device_status: String,
50 pub update_date: String,
51 pub has_automatic_location: bool,
52 pub road_direction: Option<String>,
53 pub road_names: Option<Vec<String>>,
54 pub name: Option<String>,
55 pub description: Option<String>,
56 pub status_message: Option<Vec<String>>,
57 pub is_moving: Option<bool>,
58 pub road_event_ids: Option<Vec<String>>,
59 pub milepost: Option<f64>,
60 pub make: Option<String>,
61 pub model: Option<String>,
62 pub serial_number: Option<String>,
63 pub firmware_version: Option<String>,
64 pub velocity_kph: Option<f64>
65}
66
67#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
68pub struct ArrowBoard {
69 pub pattern: String,
70 #[deprecated]
71 pub is_moving: Option<bool>,
72 pub is_in_transport_position: Option<bool>
73}
74
75#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
76pub struct Camera {
77 pub image_url: Option<String>,
78 pub image_timestamp: Option<String>
79}
80
81#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
82pub struct DynamicMessageSign {
83 pub message_multi_string: String
84}
85
86#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
87pub struct FlashingBeacon {
88 pub function: String,
89 pub is_flashing: Option<bool>,
90 pub sign_text: Option<String>
91}
92
93#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
94pub struct HybridSign {
95 pub dynamic_message_function: String,
96 pub dynamic_message_text: Option<String>,
97 pub static_sign_text: Option<String>
98}
99
100#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
101pub struct LocationMarker {
102 pub marked_locations: Vec<MarkedLocationType>
103}
104
105#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
106pub struct MarkedLocationType {
107 pub r#type: String,
108 pub road_event_id: Option<String>
109}
110
111#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
112pub struct TrafficSensor {
113 pub collection_interval_start_date: String,
114 pub collection_interval_end_date: String,
115 pub average_speed_kph: Option<f64>,
116 pub volume_vph: Option<f64>,
117 pub occupancy_percent: Option<f64>,
118 pub lane_data: Option<Vec<TrafficSensorLaneData>>
119}
120
121#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
122pub struct TrafficSensorLaneData {
123 pub lane_order: u64,
124 pub road_event_id: Option<String>,
125 pub average_speed_kph: Option<f64>,
126 pub volume_vph: Option<f64>,
127 pub occupancy_percent: Option<f64>
128}
129
130#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
131pub struct TrafficSignal {
132 pub mode: String
133}