itelem 0.1.5

Parsing of iRacing .ibt telemetry file
Documentation
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
use serde::Deserialize;

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct WeekendInfo {
    pub track_name: String,
    #[serde(rename = "TrackID")]
    pub track_id: i32,
    pub track_length: String,
    pub track_length_official: String,
    pub track_display_name: String,
    pub track_display_short_name: String,
    pub track_config_name: String,
    pub track_city: String,
    pub track_country: String,
    pub track_altitude: String,
    pub track_latitude: String,
    pub track_longitude: String,
    pub track_north_offset: String,
    pub track_num_turns: i32,
    pub track_pit_speed_limit: String,
    pub track_type: String,
    pub track_direction: String,
    pub track_weather_type: String,
    pub track_skies: String,
    pub track_surface_temp: String,
    pub track_air_temp: String,
    pub track_air_pressure: String,
    pub track_wind_vel: String,
    pub track_wind_dir: String,
    pub track_relative_humidity: String,
    pub track_fog_level: String,
    pub track_cleanup: i32,
    pub track_dynamic_track: i32,
    pub track_version: String,
    #[serde(rename = "SeriesID")]
    pub series_id: i32,
    #[serde(rename = "SeasonID")]
    pub season_id: i32,
    #[serde(rename = "SessionID")]
    pub session_id: i32,
    #[serde(rename = "SubSessionID")]
    pub sub_session_id: i32,
    #[serde(rename = "LeagueID")]
    pub league_id: i32,
    pub official: i32,
    pub race_week: i32,
    pub event_type: String,
    pub category: String,
    pub sim_mode: String,
    pub team_racing: i32,
    pub min_drivers: i32,
    pub max_drivers: i32,
    #[serde(rename = "DCRuleSet")]
    pub dc_rule_set: String,
    pub qualifier_must_start_race: i32,
    pub num_car_classes: i32,
    pub num_car_types: i32,
    pub heat_racing: i32,
    pub build_type: String,
    pub build_target: String,
    pub build_version: String,
    pub weekend_options: WeekendOptions,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct WeekendOptions {
    pub num_starters: i32,
    pub starting_grid: String,
    pub qualify_scoring: String,
    pub course_cautions: String,
    pub standing_start: i32,
    pub short_parade_lap: i32,
    pub restarts: String,
    pub weather_type: String,
    pub skies: String,
    pub wind_direction: String,
    pub wind_speed: String,
    pub weather_temp: String,
    pub relative_humidity: String,
    pub fog_level: String,
    pub time_of_day: String,
    pub date: String,
    pub earth_rotation_speedup_factor: i32,
    pub unofficial: i32,
    pub commercial_mode: String,
    pub night_mode: String,
    pub is_fixed_setup: i32,
    pub strict_laps_checking: String,
    pub has_open_registration: i32,
    pub hardcore_level: i32,
    pub num_joker_laps: i32,
    pub incident_limit: String,
    pub fast_repairs_limit: String,
    pub green_white_checkered_limit: i32,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SessionInfo {
    pub weekend_info: WeekendInfo,
    pub session_info: Sessions,
    pub camera_info: CameraInfo,
    pub radio_info: RadioInfo,
    pub driver_info: DriverInfo,
    pub split_time_info: SplitTimeInfo,
    pub car_setup: CarSetup,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct CarSetup {
    pub tires: Tires,
    pub chassis: Chassis,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Chassis {
    pub front: ChassisFront,
    pub left_front: ChassisLeftFront,
    pub left_rear: ChassisLeftRear,
    pub in_car_dials: InCarDials,
    pub right_front: ChassisRightFront,
    pub right_rear: ChassisRightRear,
    pub rear: ChassisRear,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct InCarDials {
    pub dash_display_page: String,
    pub brake_pressure_bias: String,
    pub brake_pads: String,
    pub abs_setting: String,
    pub tc_setting: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ChassisRightFront {
    pub corner_weight: String,
    pub ride_height: String,
    pub spring_rate: String,
    pub spring_perch_offset: String,
    pub bump_stiffness: String,
    pub rebound_stiffness: String,
    pub camber: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ChassisRightRear {
    pub corner_weight: String,
    pub ride_height: String,
    pub spring_perch_offset: String,
    pub bump_stiffness: String,
    pub rebound_stiffness: String,
    pub camber: String,
    pub toe_in: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ChassisLeftFront {
    pub corner_weight: String,
    pub ride_height: String,
    pub spring_rate: String,
    pub spring_perch_offset: String,
    pub bump_stiffness: String,
    pub rebound_stiffness: String,
    pub camber: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ChassisLeftRear {
    pub corner_weight: String,
    pub ride_height: String,
    pub spring_perch_offset: String,
    pub bump_stiffness: String,
    pub rebound_stiffness: String,
    pub camber: String,
    pub toe_in: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ChassisFront {
    pub arb_setting: i32,
    pub toe_in: String,
    pub cross_weight: String,
    pub nose_weight: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ChassisRear {
    pub fuel_level: String,
    pub arb_setting: i32,
    pub wing_setting: i32,
    pub diff_clutches: i32,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Tires {
    pub left_front: LeftTire,
    pub left_rear: LeftTire,
    pub right_front: RightTire,
    pub right_rear: RightTire,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct LeftTire {
    pub starting_pressure: String,
    pub last_hot_pressure: String,
    #[serde(rename = "LastTempsOMI")]
    pub last_temps_omi: String,
    pub tread_remaining: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RightTire {
    pub starting_pressure: String,
    pub last_hot_pressure: String,
    #[serde(rename = "LastTempsIMO")]
    pub last_temps_imo: String,
    pub tread_remaining: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SplitTimeInfo {
    pub sectors: Vec<Sector>,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Sector {
    pub sector_num: i32,
    pub sector_start_pct: f32,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct DriverInfo {
    pub driver_car_idx: i32,
    #[serde(rename = "DriverUserID")]
    pub driver_user_id: i32,
    pub pace_car_idx: i32,
    pub driver_head_pos_x: f32,
    pub driver_head_pos_y: f32,
    pub driver_head_pos_z: f32,
    pub driver_car_is_electric: i32,
    #[serde(rename = "DriverCarIdleRPM")]
    pub driver_car_idle_rpm: f32,
    pub driver_car_red_line: f32,
    pub driver_car_eng_cylinder_count: i32,
    pub driver_car_fuel_kg_per_ltr: f32,
    pub driver_car_fuel_max_ltr: f32,
    pub driver_car_max_fuel_pct: f32,
    pub driver_car_gear_num_forward: i32,
    pub driver_car_gear_neutral: i32,
    pub driver_car_gear_reverse: i32,
    #[serde(rename = "DriverCarSLFirstRPM")]
    pub driver_car_sl_first_rpm: f32,
    #[serde(rename = "DriverCarSLShiftRPM")]
    pub driver_car_sl_shift_rpm: f32,
    #[serde(rename = "DriverCarSLLastRPM")]
    pub driver_car_sl_last_rpm: f32,
    #[serde(rename = "DriverCarSLBlinkRPM")]
    pub driver_car_sl_blink_rpm: f32,
    pub driver_car_version: String,
    pub driver_pit_trk_pct: f32,
    pub driver_car_est_lap_time: f32,
    pub driver_setup_name: String,
    pub driver_setup_is_modified: f32,
    pub driver_setup_load_type_name: String,
    pub driver_setup_passed_tech: i32,
    pub driver_incident_count: i32,
    pub drivers: Vec<Driver>,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Driver {
    pub car_idx: i32,
    pub user_name: String,
    pub abbrev_name: Option<String>,
    pub initials: Option<String>,
    #[serde(rename = "UserID")]
    pub user_id: i32,
    #[serde(rename = "TeamID")]
    pub team_id: i32,
    pub team_name: String,
    pub car_number: String,
    pub car_number_raw: i32,
    pub car_path: String,
    #[serde(rename = "CarClassID")]
    pub car_class_id: i32,
    #[serde(rename = "CarID")]
    pub car_id: i32,
    pub car_is_pace_car: i32,
    #[serde(rename = "CarIsAI")]
    pub car_is_ai: i32,
    pub car_is_electric: i32,
    pub car_screen_name: String,
    pub car_screen_name_short: String,
    pub car_class_short_name: Option<String>,
    pub car_class_rel_speed: i32,
    pub car_class_license_level: i32,
    pub car_class_max_fuel_pct: String,
    pub car_class_weight_penalty: String,
    pub car_class_power_adjust: String,
    pub car_class_dry_tire_set_limit: String,
    pub car_class_color: i32,
    pub car_class_est_lap_time: f32,
    #[serde(rename = "IRating")]
    pub i_rating: i32,
    pub lic_level: i32,
    pub lic_sub_level: i32,
    pub lic_string: String,
    pub lic_color: String,
    pub is_spectator: i32,
    pub car_design_str: String,
    pub helmet_design_str: String,
    pub suit_design_str: String,
    pub car_number_design_str: String,
    #[serde(rename = "CarSponsor_1")]
    pub car_sponsor_1: i32,
    #[serde(rename = "CarSponsor_2")]
    pub car_sponsor_2: i32,
    pub cur_driver_incident_count: i32,
    pub team_incident_count: i32,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RadioInfo {
    pub selected_radio_num: i32,
    pub radios: Vec<Radio>,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Radio {
    pub radio_num: i32,
    pub hop_count: i32,
    pub num_frequencies: i32,
    pub tuned_to_frequency_num: i32,
    pub scanning_is_on: i32,
    pub frequencies: Vec<RadioFrequency>,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RadioFrequency {
    pub frequency_num: i32,
    pub frequency_name: String,
    pub priority: i32,
    pub car_idx: i32,
    pub entry_idx: i32,
    #[serde(rename = "ClubID")]
    pub club_id: i32,
    pub can_scan: i32,
    pub can_squawk: i32,
    pub muted: i32,
    pub is_mutable: i32,
    pub is_deletable: i32,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct CameraInfo {
    pub groups: Vec<CameraGroup>,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct CameraGroup {
    pub group_num: i32,
    pub group_name: String,
    pub cameras: Vec<Camera>,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Camera {
    pub camera_num: i32,
    pub camera_name: String,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Sessions {
    pub sessions: Vec<Session>,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Session {
    pub session_num: i32,
    pub session_laps: String,
    pub session_time: String,
    pub session_num_laps_to_avg: i32,
    pub session_type: String,
    pub session_track_rubber_state: String,
    pub session_name: String,
    pub session_sub_type: Option<String>,
    pub session_skipped: i32,
    pub session_run_groups_used: i32,
    pub session_enforce_tire_compound_change: i32,
    pub results_fastest_lap: Vec<FastestLap>,
    pub results_average_lap_time: f32,
    pub results_num_caution_flags: i32,
    pub results_num_caution_laps: i32,
    pub results_num_lead_changes: i32,
    pub results_laps_complete: i32,
    pub results_official: i32,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct FastestLap {
    #[serde(rename = "CarIdx")]
    pub car_idx: i32,
    pub fastes_lap: Option<i32>,
    pub fastest_time: f32,
}