A production-grade diagnostic GUI tool for BMW E92 M3 using SocketCAN. Provides ISTA-style guided workflows for vehicle diagnostics on Linux.
- ISTA-Style Guided Workflows: Step-by-step wizards for diagnostics
- Quick Test (Module Scan): Discover and probe all ECU modules
- Fault Memory Management: Read, display, search, and clear DTCs
- Service Functions: Battery registration, ECU reset
- Session Export: Export diagnostic sessions as ZIP/JSON
- Vehicle Info Display: Shows VIN, series, and engine info when connected
HARD BLOCKED - These features are explicitly prohibited:
- Immobilizer/key programming
- Security bypass mechanisms
- VIN tampering or modification
- Odometer/mileage changes
- ECU flashing, tuning, or coding that can brick modules
- Any theft-adjacent workflows
These restrictions are enforced at multiple layers and cannot be circumvented. All blocked attempts are logged.
| Item | Description | Approx. Cost |
|---|---|---|
| Innomaker USB2CAN | USB to CAN adapter (SocketCAN compatible) | ~$33 |
| DB9 to OBD2 Cable | Connects USB2CAN to vehicle's OBD2 port | ~$18 |
Total: ~$51
Search Amazon for:
Innomaker USB2CAN- Get the basic USB2CAN version ($32.99)Innomaker DB9 to OBD2 cable- The one that says "fits USB to CAN Module of Innomaker" ($17.99)
- K+DCAN cables - These don't work reliably on Linux (serial-based, not SocketCAN)
- ELM327 adapters - Wrong protocol entirely
- USB to RS485 adapters - Different protocol, won't work
- Linux: Ubuntu 22.04+, Fedora 38+, Debian 12+, or any distro with SocketCAN support
- Python 3.11+
- Kernel: Linux 3.2+ (for gs_usb driver support)
# Clone the repository
git clone https://github.com/Reese-afk/E92-Pulse.git
cd E92-Pulse
# Create virtual environment
python3.11 -m venv venv
source venv/bin/activate
# Install in development mode
pip install -e .Core dependencies are installed automatically:
- PyQt6 (GUI framework)
- python-can (CAN bus support)
- can-isotp (ISO-TP protocol)
- pyyaml (configuration)
- platformdirs (platform paths)
[Laptop] --USB--> [Innomaker USB2CAN] --DB9 Cable--> [OBD2 Port on BMW]
When you plug in the USB2CAN, it should be detected automatically:
# Check if the adapter is recognized
dmesg | tail -10
# You should see something like:
# usb 1-1: new full-speed USB device
# gs_usb 1-1:1.0: registered CAN device can0# Set up the CAN interface (500kbps for BMW)
sudo ip link set can0 up type can bitrate 500000
# Verify it's up
ip link show can0Create a systemd service or add to /etc/network/interfaces:
# /etc/network/interfaces.d/can0
auto can0
iface can0 can static
bitrate 500000Or create udev rule /etc/udev/rules.d/99-can.rules:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="can*", RUN+="/sbin/ip link set %k up type can bitrate 500000"
# Make sure you're in the project directory with venv activated
source venv/bin/activate
# Run using module
python -m e92_pulse
# Or using console script (after pip install)
e92-pulse
# With debug logging
e92-pulse --debugusage: e92-pulse [-h] [--debug] [--log-dir LOG_DIR] [--config CONFIG] [--version]
E92 Pulse - BMW E92 M3 Diagnostic Tool
options:
-h, --help show this help message and exit
--debug, -d Enable debug logging
--log-dir LOG_DIR Custom log directory (default: ./logs)
--config CONFIG Path to configuration file
--version, -v show program's version number and exit
- Connect USB2CAN to laptop
- Connect DB9-to-OBD2 cable to USB2CAN and vehicle
- Turn ignition ON (engine OFF recommended)
- Set up CAN interface:
sudo ip link set can0 up type can bitrate 500000 - Launch E92 Pulse:
python -m e92_pulse - The app will detect
can0- click "Connect" - Vehicle info (VIN, series, engine) will display in the sidebar
- Navigate to "Quick Test"
- Click "Start Scan"
- View the results showing all modules and their status:
- OK: Module responding, no faults
- FAULT: Module responding with DTCs
- NO RESPONSE: Module not responding
- Navigate to "Fault Memory"
- Click "Read DTCs" to retrieve all fault codes
- Use filters to search and organize
- Select DTCs to view details
- Clear DTCs with confirmation dialogs
Battery Registration:
- Navigate to "Service Functions"
- Select "Battery Registration"
- Enter battery capacity and type
- Confirm all preconditions
- Execute the registration
ECU Reset:
- Select "ECU Reset"
- Choose the target module
- Select reset type (Soft/Key Off-On)
- Confirm and execute
- Navigate to "Export Session"
- Select what to include
- Export as ZIP or JSON
- Share with technicians or for records
- Check if adapter is plugged in:
lsusb | grep -i can - Check kernel messages:
dmesg | tail -20 - Make sure interface is up:
ip link show can0 - Bring it up if needed:
sudo ip link set can0 up type can bitrate 500000
- Check permissions - you may need sudo or udev rules
- Verify bitrate is correct (500000 for BMW)
- Check if another program is using the interface
- Check physical connection to vehicle
- Ensure ignition is ON
- Verify OBD2 cable is fully seated
- Try disconnecting and reconnecting
- Verify you have the correct cable (CAN, not K-line)
- Check that vehicle ignition is ON
- Some modules need engine running
Configuration is stored in ~/.config/e92_pulse/config.yaml:
datapacks_dir: ~/.config/e92_pulse/datapacks
connection:
timeout: 1.0
ui:
theme: dark
confirm_dtc_clear: true
logging:
log_level: INFO
log_dir: ./logsAdditional module definitions can be loaded from user datapacks.
Place datapack files in ~/.config/e92_pulse/datapacks/.
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=e92_pulse --cov-report=html# Format code
black src tests
# Lint
ruff check src tests
# Type checking
mypy srcAll diagnostic actions are logged to ./logs/ in JSONL format for audit purposes:
{"timestamp": "2024-01-15T10:30:00", "level": "INFO", "action": "clear_dtc", "module_id": "DME", "success": true}This tool is designed with safety as a priority:
- Safety Manager: All operations are checked against blocked lists
- Two-Step Confirmations: Destructive actions require confirmation
- Audit Logging: Every action is logged with timestamps
- No Security Bypass: Security Access service is blocked
- No ECU Flashing: Upload/Download services are blocked
Contributions are welcome! Please ensure:
- All tests pass
- Code is formatted with black
- No security-sensitive features are added
- Safety blocks are not circumvented
MIT License - See LICENSE for details.
This software is provided as-is for educational and diagnostic purposes. Users are responsible for ensuring proper use. The authors are not liable for any damage resulting from use of this software.
Always follow proper diagnostic procedures and safety precautions when working with vehicle electronics.