Library to interface with Gran Turismo's motion rig telemetry service.
Project description
Gran Turismo Telemetry
Python library for interfacing with Polyphony Digital's telemetry service for motion rigs in GT6/GTS/GT7 (maybe older?)
Features
- Playstation IP Address discovery
- Asynchronous callbacks
- Game event observer
- Telemetry as an object or a dictionary
Installation
Install with pip:
pip install gt-telem
Usage
Getting telemetry is fairly straightforward. Here's a simple example that runs the client on a separate thread:
from gt_telem import TurismoClient
from time import sleep
tc = TurismoClient()
tc.start()
for i in range(10):
sleep(1)
print(tc.telemetry.position)
tc.stop()
If you're working inside of an asynchronous framework, use run_async()
from gt_telem import TurismoClient
class MyAsyncClass:
def __init__(self, tc: TurismoClient):
self.tc = tc
self.cancel_tkn: asyncio.Event = None
async def start_telem(self):
await self.tc.run_async(self.cancel_tkn)
Otherwise run like this if you only care for callbacks:
import json
from gt_telem import TurismoClient
from gt_telem.models import Telemetry
async def print_telem(t: Telemetry):
print(json.dumps(t.as_dict, indent=4))
tc = TurismoClient()
tc.register_callback(print_telem)
tc.run() #blocking call
The full list of telemetry is available here.
Events
The following events are currently supported:
- gt_telem.events.GameEvents
- on_running - The game has started/is running
- on_in_game_menu - Outside of a race or track screen
- on_at_track - Player has entered a track screen
- on_in_race - Fired when the simulation starts, before player control
- on_paused - When the player pauses the race
- on_race_end - Fires when a player leaves the simulation
- gt_telem.events.RaceEvents
- on_race_start - Fired at the beginning of Lap 1
- on_race_finish - Fired when the last lap is completed (checkered flag)
- on_lap_change - Fires when the lap counter changes (including 0->1)
- on_best_lap_time - A new best lap is set
- on_last_lap_time - A new last lap time is available
- gt_telem.events.DriverEvents
- on_gear_change - A gear has changed
- on_flash_lights - High Beams have been activated
- on_handbrake - Player has utilized handbrake
- on_suggested_gear - Fires when the game suggests a gear change
- on_tcs - Traction Control System activated
- on_asm - Active Stability Management activated
- on_rev_limit - Engine revs exceed threshold
- on_brake - Player depresses brake
- on_throttle - Player depresses throttle
- on_shift_light_low - Engine revs entered lower bound for shift light
- on_shift_light_high - Engine revs exceed upper bound for shift light
Example using Events
Here's a more complex example of a telemetry recorder that hooks into race start, pause, and race end:
from gt_telem import TurismoClient
from gt_telem.events import GameEvents
from gt_telem.errors.playstation_errors import *
class MySimpleTelemetryRecorder():
def __init__(self, tc: TurismoClient):
self.tc = tc
self.storage = []
def start(self):
self.tc.register_callback(MySimpleTelemetryRecorder.receive_telem, [self])
def stop(self):
self.tc.deregister_callback(MySimpleTelemetryRecorder.receive_telem)
# save self.storage somewhere
@staticmethod
async def receive_telem(t, context):
context.storage.append(t)
print(f"{t.engine_rpm}RPM - {t.boost_pressure}kPa")
print(f"Best: {t.best_lap_time}\tLast: {t.last_lap_time}")
if __name__ == "__main__":
try:
tc = TurismoClient()
except PlayStatonOnStandbyError as e:
print("Turn the playstation on")
print(e)
exit()
except PlayStationNotFoundError as e:
print("Maybe I'm on the wrong network")
print(e)
exit()
ge = GameEvents(tc)
mstr = MySimpleTelemetryRecorder(tc)
ge.on_in_race.append(mstr.start)
ge.on_race_end.append(mstr.stop)
ge.on_paused.append(mstr.stop)
print("Listening for telemetry. CTRL+C to stop")
tc.run()
TurismoClient.run()
is a blocking call, but does shut down gracefully when a keyboard interrupt is issued. It also accepts a cancellation token.
Advanced Example
See this jupyter notebook that displays a live race view and how to properly pass a token to shut down gracefully.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.