add fake-wheel
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
# Fake Gaming Wheel Emulator
|
||||
|
||||
Virtual USB gaming wheel device emulator for Linux. Creates a fake Logitech G29 Racing Wheel for testing purposes.
|
||||
|
||||
## Quick Start (Recommended)
|
||||
|
||||
**Use the uinput version** - it's more reliable:
|
||||
|
||||
```bash
|
||||
sudo python3 fake_wheel_uinput.py
|
||||
```
|
||||
|
||||
## Files
|
||||
|
||||
- **fake_wheel_uinput.py** - Uses `/dev/uinput` (RECOMMENDED)
|
||||
- **fake_wheel.py** - Uses `/dev/uhid` (alternative, more complex)
|
||||
- **debug_uhid.py** - Debug script for uhid
|
||||
- **check_wheel.sh** - Check if device appears
|
||||
|
||||
## Features
|
||||
|
||||
The emulated wheel provides:
|
||||
- **Steering Wheel**: Full 900° rotation (±450°)
|
||||
- **Throttle Pedal**: 0-100% range
|
||||
- **Brake Pedal**: 0-100% range
|
||||
- **16 Buttons**: Standard gaming buttons
|
||||
- **USB Device ID**: Logitech (0x046d) G29 (0xc24f)
|
||||
|
||||
## Simulated Behavior
|
||||
|
||||
When running, the script automatically simulates:
|
||||
- Steering wheel rotating left/right in smooth sine wave
|
||||
- Throttle pulsing between 0-78%
|
||||
- Brake activating every 5 seconds
|
||||
- Buttons cycling through 1-16 in sequence
|
||||
|
||||
## Verification
|
||||
|
||||
Check if the device appears:
|
||||
|
||||
```bash
|
||||
# Method 1: Check by-id
|
||||
ls -l /dev/input/by-id/ | grep -i logitech
|
||||
|
||||
# Method 2: Check input devices
|
||||
cat /proc/bus/input/devices | grep -A 10 "Logitech G29"
|
||||
|
||||
# Method 3: Use evtest
|
||||
sudo evtest
|
||||
# Then select the G29 device from the list
|
||||
|
||||
# Method 4: Use jstest (for joystick interface)
|
||||
jstest /dev/input/js0
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- Linux kernel with uinput support
|
||||
- Python 3.6+
|
||||
- Root access OR user in 'input' group
|
||||
- uinput kernel module (usually loaded by default)
|
||||
|
||||
### Enable uinput module (if needed)
|
||||
|
||||
```bash
|
||||
sudo modprobe uinput
|
||||
# Make it permanent:
|
||||
echo "uinput" | sudo tee /etc/modules-load.d/uinput.conf
|
||||
```
|
||||
|
||||
### Run without sudo (optional)
|
||||
|
||||
Add udev rule to allow non-root access:
|
||||
|
||||
```bash
|
||||
echo 'KERNEL=="uinput", MODE="0666"' | sudo tee /etc/udev/rules.d/99-uinput.rules
|
||||
sudo udevadm control --reload-rules
|
||||
```
|
||||
|
||||
Or add your user to the input group:
|
||||
|
||||
```bash
|
||||
sudo usermod -a -G input $USER
|
||||
# Log out and back in for changes to take effect
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Device doesn't appear
|
||||
|
||||
1. Check if uinput module is loaded:
|
||||
```bash
|
||||
lsmod | grep uinput
|
||||
```
|
||||
|
||||
2. Check permissions:
|
||||
```bash
|
||||
ls -l /dev/uinput
|
||||
```
|
||||
|
||||
3. Check kernel messages:
|
||||
```bash
|
||||
sudo dmesg | tail -20 | grep -i input
|
||||
```
|
||||
|
||||
### Test with minimal script
|
||||
|
||||
Run the debug_uhid.py to test basic functionality:
|
||||
```bash
|
||||
sudo python3 debug_uhid.py
|
||||
```
|
||||
|
||||
## Usage in Your Testing App
|
||||
|
||||
Once the fake wheel is running, it appears as a real USB device. Your gaming wheel tester should detect it automatically as:
|
||||
|
||||
- **Device Name**: "Logitech G29 Racing Wheel"
|
||||
- **Vendor ID**: 0x046d (Logitech)
|
||||
- **Product ID**: 0xc24f (G29 Racing Wheel)
|
||||
|
||||
The device will show up in standard input device APIs:
|
||||
- `/dev/input/eventX` (evdev)
|
||||
- `/dev/input/jsX` (joystick)
|
||||
- SDL2, pygame, etc.
|
||||
|
||||
## Stopping the Emulator
|
||||
|
||||
Press `Ctrl+C` to cleanly stop and remove the virtual device.
|
||||
|
||||
## Technical Details
|
||||
|
||||
### uinput vs uhid
|
||||
|
||||
- **uinput**: Kernel interface for creating virtual input devices. Simpler API, better for basic input devices.
|
||||
- **uhid**: Kernel interface for userspace HID drivers. More complex, allows full HID descriptor control.
|
||||
|
||||
This project provides both implementations. The uinput version is recommended for most use cases.
|
||||
|
||||
### Device Specifications
|
||||
|
||||
- **Bus Type**: USB (0x03)
|
||||
- **Axes**:
|
||||
- X (Steering): -32768 to 32767
|
||||
- Y (Throttle): 0 to 255
|
||||
- Z (Brake): 0 to 255
|
||||
- **Buttons**: 16 buttons (BTN_TRIGGER + 0-15)
|
||||
- **Update Rate**: 100 Hz (10ms intervals)
|
||||
|
||||
## License
|
||||
|
||||
Free to use for testing and educational purposes.
|
||||
Reference in New Issue
Block a user