Skip to content

Commit

Permalink
Merge pull request #31 from f1laps/v3.2.3
Browse files Browse the repository at this point in the history
v3.2.3
  • Loading branch information
f1laps authored Mar 16, 2023
2 parents 54d737c + fbdb62b commit 149a049
Show file tree
Hide file tree
Showing 14 changed files with 105 additions and 23 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
# Change Log


## 3.2.3 - 2023-03-16

### Changed
- Adjusted Sentry headers collection

### Added
- Collect top speed
- Collect max tyre temps (inner and surface)
- Collect number of gear changes


## 3.2.2 - 2023-02-25

### Fixed
Expand Down
Binary file modified apps/F1Laps-console.app.zip
Binary file not shown.
Binary file modified apps/F1Laps-console.exe.zip
Binary file not shown.
Binary file modified apps/F1Laps.app.zip
Binary file not shown.
Binary file modified apps/F1Laps.exe.zip
Binary file not shown.
2 changes: 1 addition & 1 deletion config.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@
- You shouldn't change these settings unless you know what they do
#################################################################"""

VERSION = "3.2.2"
VERSION = "3.2.3"
8 changes: 8 additions & 0 deletions receiver/f12022/packets/telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,13 @@ def serialize(self):
"gear": telemetry_data.gear,
"steer": telemetry_data.steer,
"drs": telemetry_data.drs,
"tyre_rear_left_temp_max_surface": telemetry_data.tyresSurfaceTemperature[0],
"tyre_rear_right_temp_max_surface": telemetry_data.tyresSurfaceTemperature[1],
"tyre_front_left_temp_max_surface": telemetry_data.tyresSurfaceTemperature[2],
"tyre_front_right_temp_max_surface": telemetry_data.tyresSurfaceTemperature[3],
"tyre_rear_left_temp_max_inner": telemetry_data.tyresInnerTemperature[0],
"tyre_rear_right_temp_max_inner": telemetry_data.tyresInnerTemperature[1],
"tyre_front_left_temp_max_inner": telemetry_data.tyresInnerTemperature[2],
"tyre_front_right_temp_max_inner": telemetry_data.tyresInnerTemperature[3],
}

11 changes: 1 addition & 10 deletions receiver/f12022/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,21 +129,12 @@ def process_lap_packet(self, packet_data):
)

def process_telemetry_packet(self, packet_data):
# Get lap object
lap = self.session.get_current_lap()
if not lap:
return
lap.update(
lap_values = {},
telemetry_values = {
"frame_identifier": packet_data.get("frame_identifier"),
"speed": packet_data.get("speed"),
"brake": packet_data.get("brake"),
"throttle": packet_data.get("throttle"),
"gear": packet_data.get("gear"),
"steer": packet_data.get("steer"),
"drs": packet_data.get("drs"),
}
telemetry_values = packet_data
)

def process_participant_data(self, packet_data):
Expand Down
10 changes: 10 additions & 0 deletions receiver/f12022/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,16 @@ def sync_lap_to_f1laps(self, lap, api):
sector_1_fuel_remaining_kg = lap.sector_1_fuel_remaining,
sector_2_fuel_remaining_kg = lap.sector_2_fuel_remaining,
sector_3_fuel_remaining_kg = lap.sector_3_fuel_remaining,
top_speed = lap.top_speed,
number_gear_changes = lap.number_gear_changes,
tyre_front_left_temp_max_surface = lap.tyre_front_left_temp_max_surface,
tyre_front_right_temp_max_surface = lap.tyre_front_right_temp_max_surface,
tyre_rear_left_temp_max_surface = lap.tyre_rear_left_temp_max_surface,
tyre_rear_right_temp_max_surface = lap.tyre_rear_right_temp_max_surface,
tyre_front_left_temp_max_inner = lap.tyre_front_left_temp_max_inner,
tyre_front_right_temp_max_inner = lap.tyre_front_right_temp_max_inner,
tyre_rear_left_temp_max_inner = lap.tyre_rear_left_temp_max_inner,
tyre_rear_right_temp_max_inner = lap.tyre_rear_right_temp_max_inner,
)
if success:
log.info("%s successfully synced to F1Laps" % lap)
Expand Down
41 changes: 41 additions & 0 deletions receiver/lap_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,19 @@ def __init__(self, lap_number, session_type, telemetry_enabled):
self.sector_2_fuel_remaining = None
self.sector_3_fuel_remaining = None

# Other lap summary data
self.top_speed = 0
self.number_gear_changes = 0
self.current_gear = None
self.tyre_front_left_temp_max_surface = 0
self.tyre_front_right_temp_max_surface = 0
self.tyre_rear_left_temp_max_surface = 0
self.tyre_rear_right_temp_max_surface = 0
self.tyre_front_left_temp_max_inner = 0
self.tyre_front_right_temp_max_inner = 0
self.tyre_rear_left_temp_max_inner = 0
self.tyre_rear_right_temp_max_inner = 0

# Telemetry
self.telemetry = None
self.telemetry_model = LapTelemetryBase
Expand Down Expand Up @@ -119,7 +132,10 @@ def update(self, lap_values=None, telemetry_values=None):
for key, value in lap_values.items():
setattr(self, key, value)
# Update linked LapTelemetry object
# as well as lap telemetry data
self.telemetry.update(telemetry_values)
if telemetry_values:
self.update_max_speed_max_temp_gear_changes(telemetry_values)
# Update tyre wear if we have it and if total_lap_time are set
# It's important that we have total_lap_time so that we first determine if this is an
# in/outlap before writing the lap_start_tyre_wear
Expand Down Expand Up @@ -272,6 +288,16 @@ def json_serialize(self):
"sector_1_fuel_remaining_kg": self.sector_1_fuel_remaining,
"sector_2_fuel_remaining_kg": self.sector_2_fuel_remaining,
"sector_3_fuel_remaining_kg": self.sector_3_fuel_remaining,
"top_speed": self.top_speed,
"number_gear_changes": self.number_gear_changes,
"tyre_front_left_temp_max_surface": self.tyre_front_left_temp_max_surface,
"tyre_front_right_temp_max_surface": self.tyre_front_right_temp_max_surface,
"tyre_rear_left_temp_max_surface": self.tyre_rear_left_temp_max_surface,
"tyre_rear_right_temp_max_surface": self.tyre_rear_right_temp_max_surface,
"tyre_front_left_temp_max_inner": self.tyre_front_left_temp_max_inner,
"tyre_front_right_temp_max_inner": self.tyre_front_right_temp_max_inner,
"tyre_rear_left_temp_max_inner": self.tyre_rear_left_temp_max_inner,
"tyre_rear_right_temp_max_inner": self.tyre_rear_right_temp_max_inner,
}
for penalty in self.penalties:
serialized_lap["penalties"].append(penalty.json_serialize())
Expand Down Expand Up @@ -342,3 +368,18 @@ def store_fuel_remaining(self, fuel_remaining):
self.lap_start_fuel_remaining = fuel_remaining
# Clear temp store
self.fuel_remaining_temp_store = None

def update_max_speed_max_temp_gear_changes(self, telemetry_values):
""" Update max speed, max tyre temp, and gear changes for this lap """
if telemetry_values.get("speed") and telemetry_values["speed"] > self.top_speed:
self.top_speed = telemetry_values["speed"]
if telemetry_values.get("gear") and telemetry_values["gear"] != self.current_gear:
self.current_gear = telemetry_values["gear"]
self.number_gear_changes += 1
# Update lap tyre temps if new value is higher than current value, for each attribute name,
tyre_attrs = ["tyre_front_left_temp_max_surface", "tyre_front_right_temp_max_surface", "tyre_rear_left_temp_max_surface", "tyre_rear_right_temp_max_surface",
"tyre_front_left_temp_max_inner", "tyre_front_right_temp_max_inner", "tyre_rear_left_temp_max_inner", "tyre_rear_right_temp_max_inner"]
for tyre_attr in tyre_attrs:
if telemetry_values.get(tyre_attr) and telemetry_values[tyre_attr] > getattr(self, tyre_attr):
setattr(self, tyre_attr, telemetry_values[tyre_attr])

11 changes: 6 additions & 5 deletions receiver/lap_telemetry_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,14 @@ def __init__(self, lap_number, session_type=None):

def update(self, telemetry_dict):
""" Update this LapTelemetry object's frame dict"""
# Pop frame_id out of the dict because we'll set all attributes later and cant set the id
frame_number = telemetry_dict.pop("frame_identifier")
frame_number = telemetry_dict["frame_identifier"]
frame = self.get_frame(frame_number)
for key, value in telemetry_dict.items():
frame_index = KEY_INDEX_MAP[key]
decimal_points = KEY_ROUND_MAP[key]
frame[frame_index] = round(value, decimal_points)
# Only update keys that are in the key index map
if key in KEY_INDEX_MAP:
frame_index = KEY_INDEX_MAP[key]
decimal_points = KEY_ROUND_MAP[key]
frame[frame_index] = round(value, decimal_points)
self.clean_frame(frame_number)

def get_frame(self, frame_number):
Expand Down
3 changes: 2 additions & 1 deletion receiver/receiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ def start_sentry(self):
sentry_sdk.init(
SENTRY_DSN,
traces_sample_rate=0,
release=config.VERSION
release=config.VERSION,
send_default_pii=True
)
sentry_sdk.set_context("machine", {
"system": platform.system(),
Expand Down
27 changes: 23 additions & 4 deletions tests/tests_f12022/test_lap.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,15 @@ def test_json_serialize_and_telemetry_enabled(self):
lap.sector_3_ms = 3
lap.telemetry = lap.telemetry_model(lap.lap_number, lap.session_type)
lap.telemetry.frame_dict = {1000: [5, 50, None, None, None, None, None, None]}
self.assertEqual(lap.json_serialize(), {'lap_number': 2, 'sector_1_time_ms': 1, 'sector_2_time_ms': 2, 'sector_3_time_ms': 3, 'pit_status': None, 'car_race_position': None, 'tyre_compound_visual': None, 'air_temperature': None, 'rain_percentage_forecast': None, 'track_temperature': None, 'weather_id': None, "lap_start_tyre_wear_front_left": None, "lap_start_tyre_wear_front_right": None, "lap_start_tyre_wear_rear_left": None, "lap_start_tyre_wear_rear_right": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_right": None, "sector_1_tyre_wear_rear_left": None, "sector_1_tyre_wear_rear_right": None, "sector_2_tyre_wear_front_left": None, "sector_2_tyre_wear_front_right": None, "sector_2_tyre_wear_rear_left": None, "sector_2_tyre_wear_rear_right": None, "sector_3_tyre_wear_front_left": None, "sector_3_tyre_wear_front_right": None, "sector_3_tyre_wear_rear_left": None, "sector_3_tyre_wear_rear_right": None, "lap_start_ers_store_kj": None,"sector_1_ers_store_kj": None,"sector_2_ers_store_kj": None,"sector_3_ers_store_kj": None, "lap_start_fuel_remaining_kg": None, "sector_1_fuel_remaining_kg": None, "sector_2_fuel_remaining_kg": None, "sector_3_fuel_remaining_kg": None, 'penalties': [], 'telemetry_data_string': '{"1000": [5, 50, null, null, null, null, null, null]}'})
self.assertEqual(lap.json_serialize(), {'lap_number': 2, 'sector_1_time_ms': 1, 'sector_2_time_ms': 2, 'sector_3_time_ms': 3, 'pit_status': None, 'car_race_position': None, 'tyre_compound_visual': None, 'air_temperature': None, 'rain_percentage_forecast': None, 'track_temperature': None, 'weather_id': None, "lap_start_tyre_wear_front_left": None, "lap_start_tyre_wear_front_right": None, "lap_start_tyre_wear_rear_left": None, "lap_start_tyre_wear_rear_right": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_right": None, "sector_1_tyre_wear_rear_left": None, "sector_1_tyre_wear_rear_right": None, "sector_2_tyre_wear_front_left": None, "sector_2_tyre_wear_front_right": None, "sector_2_tyre_wear_rear_left": None, "sector_2_tyre_wear_rear_right": None, "sector_3_tyre_wear_front_left": None, "sector_3_tyre_wear_front_right": None, "sector_3_tyre_wear_rear_left": None, "sector_3_tyre_wear_rear_right": None, "lap_start_ers_store_kj": None,"sector_1_ers_store_kj": None,"sector_2_ers_store_kj": None,"sector_3_ers_store_kj": None, "lap_start_fuel_remaining_kg": None, "sector_1_fuel_remaining_kg": None, "sector_2_fuel_remaining_kg": None, "sector_3_fuel_remaining_kg": None, "top_speed": 0, "number_gear_changes": 0, "tyre_front_left_temp_max_surface": 0, "tyre_front_right_temp_max_surface": 0, "tyre_rear_left_temp_max_surface": 0, "tyre_rear_right_temp_max_surface": 0, "tyre_front_left_temp_max_inner": 0, "tyre_front_right_temp_max_inner": 0, "tyre_rear_left_temp_max_inner": 0, "tyre_rear_right_temp_max_inner": 0, 'penalties': [], 'telemetry_data_string': '{"1000": [5, 50, null, null, null, null, null, null]}'})
# Test without telemetry
lap.telemetry_enabled = False
self.assertEqual(lap.json_serialize(), {'lap_number': 2, 'sector_1_time_ms': 1, 'sector_2_time_ms': 2, 'sector_3_time_ms': 3, 'pit_status': None, 'car_race_position': None, 'tyre_compound_visual': None, 'air_temperature': None, 'rain_percentage_forecast': None, 'track_temperature': None, 'weather_id': None, "lap_start_tyre_wear_front_left": None, "lap_start_tyre_wear_front_right": None, "lap_start_tyre_wear_rear_left": None, "lap_start_tyre_wear_rear_right": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_right": None, "sector_1_tyre_wear_rear_left": None, "sector_1_tyre_wear_rear_right": None, "sector_2_tyre_wear_front_left": None, "sector_2_tyre_wear_front_right": None, "sector_2_tyre_wear_rear_left": None, "sector_2_tyre_wear_rear_right": None, "sector_3_tyre_wear_front_left": None, "sector_3_tyre_wear_front_right": None, "sector_3_tyre_wear_rear_left": None, "sector_3_tyre_wear_rear_right": None, "lap_start_ers_store_kj": None,"sector_1_ers_store_kj": None,"sector_2_ers_store_kj": None,"sector_3_ers_store_kj": None, "lap_start_fuel_remaining_kg": None, "sector_1_fuel_remaining_kg": None, "sector_2_fuel_remaining_kg": None, "sector_3_fuel_remaining_kg": None, 'penalties': [], 'telemetry_data_string': None})
self.assertEqual(lap.json_serialize(), {'lap_number': 2, 'sector_1_time_ms': 1, 'sector_2_time_ms': 2, 'sector_3_time_ms': 3, 'pit_status': None, 'car_race_position': None, 'tyre_compound_visual': None, 'air_temperature': None, 'rain_percentage_forecast': None, 'track_temperature': None, 'weather_id': None, "lap_start_tyre_wear_front_left": None, "lap_start_tyre_wear_front_right": None, "lap_start_tyre_wear_rear_left": None, "lap_start_tyre_wear_rear_right": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_right": None, "sector_1_tyre_wear_rear_left": None, "sector_1_tyre_wear_rear_right": None, "sector_2_tyre_wear_front_left": None, "sector_2_tyre_wear_front_right": None, "sector_2_tyre_wear_rear_left": None, "sector_2_tyre_wear_rear_right": None, "sector_3_tyre_wear_front_left": None, "sector_3_tyre_wear_front_right": None, "sector_3_tyre_wear_rear_left": None, "sector_3_tyre_wear_rear_right": None, "lap_start_ers_store_kj": None,"sector_1_ers_store_kj": None,"sector_2_ers_store_kj": None,"sector_3_ers_store_kj": None, "lap_start_fuel_remaining_kg": None, "sector_1_fuel_remaining_kg": None, "sector_2_fuel_remaining_kg": None, "sector_3_fuel_remaining_kg": None, "top_speed": 0, "number_gear_changes": 0, "tyre_front_left_temp_max_surface": 0, "tyre_front_right_temp_max_surface": 0, "tyre_rear_left_temp_max_surface": 0, "tyre_rear_right_temp_max_surface": 0, "tyre_front_left_temp_max_inner": 0, "tyre_front_right_temp_max_inner": 0, "tyre_rear_left_temp_max_inner": 0, "tyre_rear_right_temp_max_inner": 0, 'penalties': [], 'telemetry_data_string': None})
# Test with penalty
penalty = F12022Penalty()
penalty.penalty_type = 1
lap.penalties = [penalty]
self.assertEqual(lap.json_serialize(), {'lap_number': 2, 'sector_1_time_ms': 1, 'sector_2_time_ms': 2, 'sector_3_time_ms': 3, 'pit_status': None, 'car_race_position': None, 'tyre_compound_visual': None, 'air_temperature': None, 'rain_percentage_forecast': None, 'track_temperature': None, 'weather_id': None, "lap_start_tyre_wear_front_left": None, "lap_start_tyre_wear_front_right": None, "lap_start_tyre_wear_rear_left": None, "lap_start_tyre_wear_rear_right": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_right": None, "sector_1_tyre_wear_rear_left": None, "sector_1_tyre_wear_rear_right": None, "sector_2_tyre_wear_front_left": None, "sector_2_tyre_wear_front_right": None, "sector_2_tyre_wear_rear_left": None, "sector_2_tyre_wear_rear_right": None, "sector_3_tyre_wear_front_left": None, "sector_3_tyre_wear_front_right": None, "sector_3_tyre_wear_rear_left": None, "sector_3_tyre_wear_rear_right": None,"lap_start_ers_store_kj": None,"sector_1_ers_store_kj": None,"sector_2_ers_store_kj": None,"sector_3_ers_store_kj": None, "lap_start_fuel_remaining_kg": None, "sector_1_fuel_remaining_kg": None, "sector_2_fuel_remaining_kg": None, "sector_3_fuel_remaining_kg": None, 'penalties': [{'frame_id': penalty.frame_id, 'infringement_type': None, 'lap_number': None, 'other_vehicle_index': None, 'penalty_type': 1, 'places_gained': None, 'time_spent_gained': None, 'vehicle_index': None}], 'telemetry_data_string': None})
self.assertEqual(lap.json_serialize(), {'lap_number': 2, 'sector_1_time_ms': 1, 'sector_2_time_ms': 2, 'sector_3_time_ms': 3, 'pit_status': None, 'car_race_position': None, 'tyre_compound_visual': None, 'air_temperature': None, 'rain_percentage_forecast': None, 'track_temperature': None, 'weather_id': None, "lap_start_tyre_wear_front_left": None, "lap_start_tyre_wear_front_right": None, "lap_start_tyre_wear_rear_left": None, "lap_start_tyre_wear_rear_right": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_left": None, "sector_1_tyre_wear_front_right": None, "sector_1_tyre_wear_rear_left": None, "sector_1_tyre_wear_rear_right": None, "sector_2_tyre_wear_front_left": None, "sector_2_tyre_wear_front_right": None, "sector_2_tyre_wear_rear_left": None, "sector_2_tyre_wear_rear_right": None, "sector_3_tyre_wear_front_left": None, "sector_3_tyre_wear_front_right": None, "sector_3_tyre_wear_rear_left": None, "sector_3_tyre_wear_rear_right": None,"lap_start_ers_store_kj": None,"sector_1_ers_store_kj": None,"sector_2_ers_store_kj": None,"sector_3_ers_store_kj": None, "lap_start_fuel_remaining_kg": None, "sector_1_fuel_remaining_kg": None, "sector_2_fuel_remaining_kg": None, "sector_3_fuel_remaining_kg": None, "top_speed": 0, "number_gear_changes": 0, "tyre_front_left_temp_max_surface": 0, "tyre_front_right_temp_max_surface": 0, "tyre_rear_left_temp_max_surface": 0, "tyre_rear_right_temp_max_surface": 0, "tyre_front_left_temp_max_inner": 0, "tyre_front_right_temp_max_inner": 0, "tyre_rear_left_temp_max_inner": 0, "tyre_rear_right_temp_max_inner": 0, 'penalties': [{'frame_id': penalty.frame_id, 'infringement_type': None, 'lap_number': None, 'other_vehicle_index': None, 'penalty_type': 1, 'places_gained': None, 'time_spent_gained': None, 'vehicle_index': None}], 'telemetry_data_string': None})

def test_process_flashback_event_removes_penalties(self):
lap = F12022Lap(lap_number=2, session_type=13, telemetry_enabled=True)
Expand Down Expand Up @@ -177,7 +177,26 @@ def test_store_tyre_wear(self):
self.assertEqual(lap.sector_1_tyre_wear_front_right, 2)
self.assertEqual(lap.sector_2_tyre_wear_front_right, 4)
self.assertEqual(lap.sector_3_tyre_wear_front_right, 8)


def test_store_top_speed_gear_max_tyre_wear(self):
lap = F12022Lap(lap_number=2, session_type=13, telemetry_enabled=True)
lap.update_max_speed_max_temp_gear_changes({'speed': 50, "gear": 2, "tyre_front_right_temp_max_surface": 50, "tyre_rear_left_temp_max_inner": 10})
self.assertEqual(lap.top_speed, 50)
self.assertEqual(lap.number_gear_changes, 1)
self.assertEqual(lap.tyre_front_right_temp_max_surface, 50)
self.assertEqual(lap.tyre_rear_left_temp_max_inner, 10)
# Lower values
lap.update_max_speed_max_temp_gear_changes({'speed': 30, "gear": 1, "tyre_front_right_temp_max_surface": 40, "tyre_rear_left_temp_max_inner": 9})
self.assertEqual(lap.top_speed, 50)
self.assertEqual(lap.number_gear_changes, 2)
self.assertEqual(lap.tyre_front_right_temp_max_surface, 50)
self.assertEqual(lap.tyre_rear_left_temp_max_inner, 10)
# Higher values
lap.update_max_speed_max_temp_gear_changes({'speed': 60, "gear": 1, "tyre_front_right_temp_max_surface": 60, "tyre_rear_left_temp_max_inner": 11})
self.assertEqual(lap.top_speed, 60)
self.assertEqual(lap.number_gear_changes, 2)
self.assertEqual(lap.tyre_front_right_temp_max_surface, 60)
self.assertEqual(lap.tyre_rear_left_temp_max_inner, 11)


if __name__ == '__main__':
Expand Down
Loading

0 comments on commit 149a049

Please sign in to comment.