1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
use super::serde_utils;
use crate::{
    serializable::{Token, VisibilityToken},
    utils::WithToken,
};
use chrono::naive::{NaiveDate, NaiveDateTime};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Attribute {
    pub token: Token,
    pub description: String,
    pub name: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalibratedSensor {
    pub token: Token,
    pub sensor_token: Token,
    pub rotation: [f64; 4],
    #[serde(with = "serde_utils::camera_intrinsic")]
    pub camera_intrinsic: Option<[[f64; 3]; 3]>,
    pub translation: [f64; 3],
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Category {
    pub token: Token,
    pub description: String,
    pub name: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EgoPose {
    pub token: Token,
    #[serde(with = "serde_utils::timestamp")]
    pub timestamp: NaiveDateTime,
    pub rotation: [f64; 4],
    pub translation: [f64; 3],
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Instance {
    pub token: Token,
    pub nbr_annotations: usize,
    pub category_token: Token,
    pub first_annotation_token: Token,
    pub last_annotation_token: Token,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Log {
    pub token: Token,
    pub date_captured: NaiveDate,
    pub location: String,
    pub vehicle: String,
    #[serde(with = "serde_utils::logfile")]
    pub logfile: Option<PathBuf>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Map {
    pub token: Token,
    pub log_tokens: Vec<Token>,
    pub filename: PathBuf,
    pub category: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Sample {
    pub token: Token,
    #[serde(with = "serde_utils::opt_token")]
    pub next: Option<Token>,
    #[serde(with = "serde_utils::opt_token")]
    pub prev: Option<Token>,
    pub scene_token: Token,
    #[serde(with = "serde_utils::timestamp")]
    pub timestamp: NaiveDateTime,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SampleAnnotation {
    pub token: Token,
    pub num_lidar_pts: isize,
    pub num_radar_pts: isize,
    pub size: [f64; 3],
    pub rotation: [f64; 4],
    pub translation: [f64; 3],
    pub sample_token: Token,
    pub instance_token: Token,
    pub attribute_tokens: Vec<Token>,
    pub visibility_token: Option<VisibilityToken>,
    #[serde(with = "serde_utils::opt_token")]
    pub prev: Option<Token>,
    #[serde(with = "serde_utils::opt_token")]
    pub next: Option<Token>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SampleData {
    pub token: Token,
    pub fileformat: FileFormat,
    pub is_key_frame: bool,
    pub filename: PathBuf,
    #[serde(with = "serde_utils::timestamp")]
    pub timestamp: NaiveDateTime,
    pub sample_token: Token,
    pub ego_pose_token: Token,
    pub calibrated_sensor_token: Token,
    #[serde(with = "serde_utils::opt_token")]
    pub prev: Option<Token>,
    #[serde(with = "serde_utils::opt_token")]
    pub next: Option<Token>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Scene {
    pub token: Token,
    pub name: String,
    pub description: String,
    pub log_token: Token,
    pub nbr_samples: usize,
    pub first_sample_token: Token,
    pub last_sample_token: Token,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Sensor {
    pub token: Token,
    pub modality: Modality,
    pub channel: Channel,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Visibility {
    pub token: VisibilityToken,
    pub level: VisibilityLevel,
    pub description: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum Modality {
    Camera,
    Lidar,
    Radar,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum FileFormat {
    Pcd,
    Jpg,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "kebab-case")]
pub enum VisibilityLevel {
    V0_40,
    V40_60,
    V60_80,
    V80_100,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum Channel {
    CamBack,
    CamBackLeft,
    CamBackRight,
    CamFront,
    CamFrontLeft,
    CamFrontRight,
    CamFrontZoomed,
    LidarTop,
    RadarFront,
    RadarFrontLeft,
    RadarFrontRight,
    RadarBackLeft,
    RadarBackRight,
}

macro_rules! impl_with_token {
    ($name:path) => {
        impl WithToken for $name {
            fn token(&self) -> Token {
                self.token
            }
        }
    };
}

impl_with_token!(Attribute);
impl_with_token!(CalibratedSensor);
impl_with_token!(Category);
impl_with_token!(EgoPose);
impl_with_token!(Instance);
impl_with_token!(Log);
impl_with_token!(Map);
impl_with_token!(Sample);
impl_with_token!(SampleAnnotation);
impl_with_token!(SampleData);
impl_with_token!(Scene);
impl_with_token!(Sensor);