Skip to main content

python driver for g29 wheel/pedals

Project description

g29py

python driver for logitech g29 wheel/pedals

Install

pip install g29py

g29py depends on the PyPI hidapi package, which provides prebuilt wheels on common platforms.

If a wheel is not available for your platform and pip falls back to a source build on Linux, you may still need system HID dependencies such as:

sudo apt install libusb-1.0-0-dev libudev-dev

Use

import time

from g29py import G29


g29 = G29()

try:
    g29.set_range(500)
    g29.set_friction(0.5)
    g29.listen()

    while True:
        state = g29.get_state()
        events = g29.get_events()
        print(state["steering"], state["accelerator"], state["brake"])
        if events:
            print(events)
        time.sleep(0.01)
except KeyboardInterrupt:
    pass
finally:
    g29.force_off()
    g29.stop()

Read

State vs Events

The driver exposes two read models:

  • get_state()
    • latest snapshot
    • use for steering, pedals, and held buttons
  • get_events()
    • buffered transient input events
    • use for button edges and dial pulses

Rule of thumb:

  • if you want to know what is true now, use state
  • if you want to know what happened since the last poll, use events

Pedals/Steering

Pedal Value Range Neutral Position
steering Float: -1 to 1 0 (Centered)
accelerator Float: -1 to 1 -1 (Not pressed)
clutch Float: -1 to 1 -1 (Not pressed)
brake Float: -1 to 1 -1 (Not pressed)

Buttons

Button Value
up 0/1
down 0/1
left 0/1
right 0/1
X 0/1
O 0/1
S 0/1
T 0/1
R2 0/1
R3 0/1
L2 0/1
L3 0/1
right_paddle 0/1
left_paddle 0/1
Share 0/1
Options 0/1
+ 0/1
- 0/1
back 0/1
PS 0/1

State is returned in a flattened shape:

state = {
    "steering": 0.0,
    "accelerator": -1.0,
    "clutch": -1.0,
    "brake": -1.0,
    "buttons": {
        "up": 0,
        "down": 0,
        "left": 0,
        "right": 0,
        "X": 0,
        "O": 0,
        "S": 0,
        "T": 0,
        "R2": 0,
        "R3": 0,
        "L2": 0,
        "L3": 0,
        "right_paddle": 0,
        "left_paddle": 0,
        "Share": 0,
        "Options": 0,
        "+": 0,
        "-": 0,
        "back": 0,
        "PS": 0,
    },
}

Events

Transient inputs are exposed through get_events().

events = g29.get_events()

Current event shapes:

{"type": "button_down", "control": "X"}
{"type": "button_up", "control": "X"}
{"type": "dial", "delta": 1}
{"type": "dial", "delta": -1}

get_events() clears the buffered event queue on read.

Write

Method Name Default Parameters Parameter Types
reset wait_seconds=5.0 wait_seconds: float
force_constant val=0.0 val: float (-1 to 1)
set_friction val=0.5 val: float
set_range val=400 val: int (400-900)
set_autocenter ccw_proportion=0.5, cw_proportion=0.5, force=0.5 ccw_proportion: float (0-1), cw_proportion: float (0-1), force: float (0-1)
set_anticenter slot=1, cw_position=0.5, ccw_position=0.5, cw_proportion=0.5, ccw_proportion=0.5, cw_reverse=False, ccw_reverse=False, force=0.5 slot: int (1-4), cw_position: float (0-1), ccw_position: float (0-1), cw_proportion: float (0-1), ccw_proportion: float (0-1), cw_reverse: bool, ccw_reverse: bool, force: float (0-1)
autocenter_off None None
force_off slot=0xf3 slot: int off-mask / slot command (0xf3 clears active force effects)

Development

Use Python 3.9+

Setup:

poetry install

Useful commands:

make test
make build
make twine-check
make release-test

Examples:

poetry run python -u examples/dial_events.py
poetry run python scripts/test_effects.py set_friction --val 0.5 --hold 5

Support

Only Logitech G29 Driving Force Racing Wheels & Pedals kit supported on linux in ps3 mode.

On linux, remove sudo requirements by adding udev rule.

echo 'KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c24f", MODE="0664", GROUP="plugdev"' \
    | sudo tee /etc/udev/rules.d/99-g29py.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

Sources

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

g29py-0.0.15.tar.gz (6.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

g29py-0.0.15-py3-none-any.whl (7.9 kB view details)

Uploaded Python 3

File details

Details for the file g29py-0.0.15.tar.gz.

File metadata

  • Download URL: g29py-0.0.15.tar.gz
  • Upload date:
  • Size: 6.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.12.3 Linux/6.17.0-22-generic

File hashes

Hashes for g29py-0.0.15.tar.gz
Algorithm Hash digest
SHA256 920f030a7b4386c0962695c570f644d87631dd820d7fd87354d0f85ddc23b9cd
MD5 e5cf74a624f24e83b6fa6f806952b555
BLAKE2b-256 00655587c1a865731fd89290ab99f80040304ea589c5e5c2f0aef322e11fdea6

See more details on using hashes here.

File details

Details for the file g29py-0.0.15-py3-none-any.whl.

File metadata

  • Download URL: g29py-0.0.15-py3-none-any.whl
  • Upload date:
  • Size: 7.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.12.3 Linux/6.17.0-22-generic

File hashes

Hashes for g29py-0.0.15-py3-none-any.whl
Algorithm Hash digest
SHA256 f1246ba390be1e425755efe5cea7c12fde2ec8f0fa2197103df12f0e172d49a4
MD5 e138917ca2237271fbab4646393bc7b2
BLAKE2b-256 db714ceb347cfab417d75bd23d0009bc720a12f0f8210888960df7947ea36b86

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page