f1_game_library_models_25/
lib.rs1pub mod endian;
48pub mod enums;
49pub mod macros;
50pub mod packet_id;
51pub mod packets;
52pub mod parse;
53pub mod wheel_data;
54
55#[cfg(feature = "client")]
56pub mod client;
57
58pub use endian::FixEndianness;
59pub use parse::parse;
60pub use wheel_data::WheelData;
61
62use std::mem::size_of;
63
64use crate::constants::PACKET_HEADER_SIZE;
65use macros::{wire_field_accessors, wire_index_accessors};
66
67#[derive(Debug, Clone, Copy)]
72#[repr(C, packed)]
73pub struct PacketHeader {
74 packet_format: u16,
75 game_year: u8,
76 game_major_version: u8,
77 game_minor_version: u8,
78 packet_version: u8,
79 packet_id: u8,
81 session_uid: u64,
82 session_time: f32,
83 frame_identifier: u32,
84 overall_frame_identifier: u32,
85 player_car_index: u8,
86 secondary_player_car_index: u8,
88}
89
90const _: () = assert!(size_of::<PacketHeader>() == PACKET_HEADER_SIZE);
91
92#[derive(Debug, Clone, Copy)]
97#[repr(C, packed)]
98pub struct Packet<T> {
99 pub header: PacketHeader,
100 pub payload: T,
101}
102
103impl PacketHeader {
104 pub fn packet_id(self) -> Result<packet_id::PacketId, u8> {
108 packet_id::PacketId::try_from(self.packet_id).map_err(|e| e.number)
109 }
110
111 wire_index_accessors!(player_car_index, secondary_player_car_index);
112
113 wire_field_accessors!(
114 packet_format: u16,
115 game_year: u8,
116 game_major_version: u8,
117 game_minor_version: u8,
118 packet_version: u8,
119 session_uid: u64,
120 session_time: f32,
121 frame_identifier: u32,
122 overall_frame_identifier: u32,
123 );
124}
125
126impl FixEndianness for PacketHeader {
127 fn fix_endianness(self) -> Self {
128 Self {
129 packet_format: self.packet_format.fix_endianness(),
130 session_uid: self.session_uid.fix_endianness(),
131 session_time: self.session_time.fix_endianness(),
132 frame_identifier: self.frame_identifier.fix_endianness(),
133 overall_frame_identifier: self.overall_frame_identifier.fix_endianness(),
134 ..self
135 }
136 }
137}
138
139impl<T: Copy + FixEndianness> FixEndianness for Packet<T> {
140 fn fix_endianness(self) -> Self {
141 Self {
142 header: self.header.fix_endianness(),
143 payload: self.payload.fix_endianness(),
144 }
145 }
146}
147
148pub mod constants {
149 pub const MAX_CARS_IN_SESSION: usize = 22;
150 pub const MAX_TYRE_SETS: usize = 20; pub const PACKET_HEADER_SIZE: usize = 29;
152 pub const PARTICIPANT_PACKET_SIZE: usize = 1284;
153 pub const CAR_SETUP_PACKET_SIZE: usize = 1133;
154 pub const CAR_STATUS_PACKET_SIZE: usize = 1239;
155 pub const LAP_DATA_PACKET_SIZE: usize = 1285;
156 pub const MOTION_DATA_PACKET_SIZE: usize = 1349;
157 pub const EXTENDED_MOTION_DATA_PACKET_SIZE: usize = 273;
158 pub const TELEMETRY_DATA_PACKET_SIZE: usize = 1352;
159 pub const CLASSIFICATION_DATA_PACKET_SIZE: usize = 1042;
160 pub const CAR_DAMAGE_DATA_PACKET_SIZE: usize = 1041;
161 pub const SESSION_DATA_PACKET_SIZE: usize = 753;
162 pub const SESSION_HISTORY_DATA_PACKET_SIZE: usize = 1460;
163 pub const EVENT_DATA_PACKET_SIZE: usize = 45;
164 pub const LOBBY_INFO_DATA_PACKET_SIZE: usize = 954;
165 pub const TYRE_SETS_DATA_PACKET_SIZE: usize = 231;
166 pub const TIME_TRIAL_DATA_PACKET_SIZE: usize = 101;
167 pub const LAP_POSITIONS_DATA_PACKET_SIZE: usize = 1131;
168}