
LB-100
avlyubimov/svc-platform
Status: EVT-LAYOUT-AUTHORIZED; connectivity routing complete; fab review open

Safety-first embedded remote-control architecture for BMW E9x
BMW E9x KCAN RXOnly is an open-source printed circuit board by Synaro, from the Synaro/BMW-E9x-Remote-Control repository on GitHub, published under the MIT licence. It is a 2-layer board of 120 × 80 mm with 50 parts on 24 nets, routed with 289 tracks and 29 vias.
It is built around the CLVC1G125QDBVRQ1 and TJA1055T/3/2Z. Its parts include 15 resistors, 6 capacitors, 3 ICs, 2 connectors and 1 diode. It belongs with the ESP32 boards of this library.
Contrôleur embarqué expérimental pour orchestrer des fonctions distantes sur BMW Série E9x à partir d'un cœur logiciel déterministe, testable et indépendant du matériel.
[!WARNING] Ce dépôt n'est pas un produit prêt à installer dans un véhicule. Le firmware fourni reste interdit de connexion au véhicule : l'acquisition TWAI passive est désactivée par défaut et réservée à un bus de banc qualifié. Aucun GPIO d'actionneur réel n'est configuré. Toute intégration physique exige une analyse de risques, des interverrouillages matériels, des essais sur banc et l'intervention d'une personne qualifiée. Le projet ne doit pas servir à contourner un antidémarrage, un système antivol ou une réglementation applicable.
TWAI_MODE_LISTEN_ONLY, désactivée par défaut ;Ces validations sont logicielles et hors véhicule. Elles ne qualifient ni le montage électrique K-CAN, ni une fonction de démarrage réel.
KCAN_RX_ONLY_P3F gelé et approvisionnement audité ;R_LINK_TX physiquement DNP : aucune pièce, aucun cavalier et aucune
continuité TX autorisés ;Les sources normatives sont volontairement séparées :
BOM.csv décrit ce qui est utilisé ;procurement.csv décrit ce qui doit
être acheté, avec les SKU, quantités économiques et snapshots datés ;netlist.csv décrit les connexions ;wiring.md décrit l'assemblage et les
contrôles. En cas de divergence, aucun résumé du README ne remplace ces
fichiers.La conception PCB est actuellement bloquée avant schéma et routage : le
rail 5 V provenant du VBUS USB du DevKit, après sa diode Schottky et F_5V, ne
peut pas garantir les 4,75 V minimum requis par le TJA1055. Aucun fichier KiCad
ou de fabrication n'a été produit et aucune correction électrique n'a été
choisie sans revue humaine. Le calcul, les sources constructeurs et les options
à arbitrer sont consignés dans
docs/phase3g-pcb-feasibility-audit.md.
L'adaptateur BMW réel de verrouillage, les actionneurs, les commandes CAS/DDE/KL50, le remote-start actif et tout chemin TX véhicule restent absents. Les observations communautaires ou diagnostiques ne deviennent jamais une commande. Aucun essai BMW, rejeu ou contournement CAS/EWS/antidémarrage n'est autorisé par l'état actuel du dépôt.
Le moteur de rejeu accepte des tableaux bornés et des fichiers de trace
canoniques. Aucun identifiant BMW n'est supposé : le profil de référence reste
au niveau Discovery et toutes ses sources de signaux restent Candidate.
Commande / véhicule / timers
|
v
Runtime embarqué ------> Ports d'infrastructure
| (bus, E/S, notifications)
v
Controller
|
+------> SafetyPolicy
|
v
Decision + actions bornéesLes dépendances vont vers les abstractions : la couche application connaît le modèle du véhicule, mais ne connaît ni Arduino, ni ESP32, ni CAN, ni GPIO.
La machine d'état utilise les états suivants : Idle, Authorizing,
Preparing, Cranking, Running, AwaitingTakeover, DriverControl,
Stopping et Fault. Une donnée nécessaire absente ou périmée provoque un
refus ou un passage en défaut selon le contexte.
La description détaillée se trouve dans docs/architecture.md et les invariants dans docs/safety.md. Le système de variantes est décrit dans docs/vehicle-profiles.md. Le déclenchement par trois verrouillages et le cycle de reprise sont spécifiés dans docs/remote-session.md. La frontière de confiance et les limites anti-rejeu des commandes sont décrites dans docs/lock-command-security.md. Le contrat du futur décodeur CAN de verrouillage est défini dans docs/can-lock-command-adapter.md. Les préférences, leurs limites et leur future persistance sont décrites dans docs/user-configuration.md. Le catalogue des fonctions actuellement implémentées est décrit dans docs/feature-framework.md. Les idées non livrées sont isolées dans docs/backlog/features.md. Le premier moteur de télémétrie et ses alertes sont décrits dans docs/telemetry-alerts.md. Le journal binaire redondant est spécifié dans docs/settings-persistence.md. Le socle ESP-IDF, ses garde-fous et sa procédure de banc sont documentés dans docs/esp32s3-safe-foundation.md. L'acquisition passive de Phase 3 et le format Capture V2 sont décrits dans docs/twai-listen-only-acquisition.md et docs/capture-format-v2.md. Le choix du transceiver, le schéma de banc et la qualification électrique de Phase 3B sont figés dans docs/phase3b-can-bench-hardware.md. Les contrats d'intégration des futurs relevés ISTA/TestO, la provenance et la checklist de Phase 3C sont décrits dans docs/phase3c-vehicle-data-intake.md. La qualification des premières preuves réelles et les inconnues restantes sont décrites dans docs/phase3d-real-evidence-qualification.md. La préparation K-CAN passive et le design RX-only gelé sont documentés dans docs/phase3e-kcan-passive-acquisition.md et docs/phase3f-kcan-rxonly-design-freeze.md. L'arrêt de conception PCB Phase 3G est motivé dans docs/phase3g-pcb-feasibility-audit.md. Le configurateur PC est décrit dans docs/configurator.md. Le protocole entre configurateur et boîtier est spécifié dans docs/settings-protocol.md. Le journal sémantique borné est décrit dans docs/diagnostic-journal.md. La cible matérielle de banc, les achats autorisés et les limites avant connexion au véhicule sont détaillés dans docs/hardware-v1-reference.md. La barrière logicielle placée devant le futur pilote de sorties est spécifiée dans docs/actuator-safety-supervisor.md. Le protocole local du bac à sable graphique est documenté dans docs/sandbox-protocol.md.
Prérequis : un compilateur C++17. Sous Windows avec g++.exe disponible :
./scripts/test.ps1Les tests de l'importeur Python n'installent aucune dépendance externe :
python -m unittest discover -s tools -p 'test_*.py' -vCompilation du firmware natif avec PlatformIO :
pio run -e nativeLa cible exacte du prototype ESP32-S3 peut être vérifiée avec :
pio run -e esp32s3devCette carte est la cible du prototype de banc, pas celle de l'installation
automobile définitive. Le firmware dessert le protocole local de configuration
sur USB. L'acquisition TWAI n'est activable que par une configuration locale
BENCH_ONLY et ne possède aucun chemin d'émission ; aucune sortie véhicule
n'est activée.
Avec CMake :
cmake -S . -B build
cmake --build build
ctest --test-dir build --output-on-failureinclude/bmw_remote/domain/ Modèle métier du véhicule
include/bmw_remote/application/ Sécurité, événements, décisions, contrôleur
include/bmw_remote/infrastructure/ Contrats des adaptateurs et runtime
include/bmw_remote/simulation/ Protocole synthétique hors véhicule
libs/can-core/ Modèle et réception CAN génériques, sans BMW
src/ Implémentations et firmware ESP32-S3
tests/ Scénarios hôte
tools/ Simulateur et importeur de traces PC
vehicle-data/ Profils, observations, preuves et imports versionnés
scenarios/ Traces synthétiques partageables
docs/ Architecture, sécurité et intégrationLe fichier personnel peut être créé ou modifié sans éditer de texte à la main :
.\scripts\configure.ps1L'assistant conserve une valeur lorsque l'utilisateur appuie simplement sur
Entrée, valide toutes les limites de sûreté puis écrit
config/user-settings.conf. Le contrôle du capot peut notamment être placé sur
disabled pour une E9x qui ne possède pas ce capteur.
La configuration produite peut être contrôlée puis exécutée immédiatement dans le simulateur :
.\scripts\configure.ps1 -Check
.\scripts\simulate.ps1 -ConfigPath .\config\user-settings.confL'exécutable généré se trouve dans build/bmw_remote_configurator.exe. Le codec
et le service communiquent avec le prototype par son port série USB. Pour lister
les ports puis lire ou écrire le boîtier :
.\scripts\configure.ps1 -ListDevices
.\scripts\configure.ps1 -ProbeDevice COM3
.\scripts\configure.ps1 -ReadDevice COM3
.\scripts\configure.ps1 -WriteDevice COM3Une écriture n'est déclarée réussie qu'après relecture et comparaison complète. Voir docs/configurator.md.
Le premier essai avec une carte neuve est automatisé et utilise une configuration de banc où le démarrage distant reste désactivé :
.\scripts\first-usb-test.ps1 -Port COM3Sous Windows, le moyen le plus simple est l'interface graphique :
.\scripts\simulator-gui.ps1Le fichier scripts/start-simulator-gui.cmd peut aussi être ouvert par double
clic. L'interface compile le simulateur uniquement lorsque ses sources sont
plus récentes, permet de choisir un scénario, un fichier de configuration ou
une trace, puis affiche et copie le rapport. Le bouton Ouvrir le bac à sable
garde une session vivante : l'utilisateur peut modifier les portes, le capot,
le frein, le rapport et le régime moteur, déclencher les timers et observer en
direct l'état, les sorties simulées et les défauts. Les températures moteur et
boîte, la régénération FAP et leurs trois fonctions V1 peuvent également être
injectées ou désactivées séparément. Elle reste entièrement
locale et ne se connecte à aucun véhicule.
Sous Windows, l'exécutable interactif peut être construit avec :
.\scripts\build-simulator.ps1
.\build\bmw_remote_simulator.exeLe catalogue des fonctions actuellement implémentées est affichable sans lancer de scénario :
.\build\bmw_remote_simulator.exe --list-featuresQuinze scénarios permettent de tester le parcours nominal, le capot obligatoire ou facultatif, la reprise conducteur, la perte, le retard et la corruption des données, un profil utilisateur, la récupération du stockage et la liaison de configuration, la garde anti-rejeu et l'adaptateur CAN qualifié sur un vecteur fictif, le watchdog et les retours d'actionneurs simulés, ainsi que leur propagation complète dans le runtime. Un scénario précis peut aussi être compilé et exécuté avec :
.\scripts\simulate.ps1 -Scenario hood-optional
.\scripts\simulate.ps1 -Scenario takeover-timeout
.\scripts\simulate.ps1 -Scenario takeover-confirmed
.\scripts\simulate.ps1 -Scenario signal-loss
.\scripts\simulate.ps1 -Scenario signal-delay
.\scripts\simulate.ps1 -Scenario frame-corruption
.\scripts\simulate.ps1 -ConfigPath .\config\user-settings.example.conf
.\scripts\simulate.ps1 -Scenario settings-recovery
.\scripts\simulate.ps1 -Scenario settings-link
.\scripts\simulate.ps1 -Scenario lock-replay-guard
.\scripts\simulate.ps1 -Scenario qualified-lock-adapter
.\scripts\simulate.ps1 -Scenario actuator-supervisor
.\scripts\simulate.ps1 -Scenario supervised-runtimeChaque parcours affiche aussi le journal chronologique des commandes,
transitions, refus et défauts. Le résultat attendu est affiché sous la forme
scenario_result: PASS et le code de sortie reste non nul si le comportement
diverge.
Voir docs/simulator.md pour la CLI et docs/can-replay.md pour le contrat du moteur de rejeu.
Le simulateur accepte aussi une trace canonique externe :
./scripts/simulate.ps1 ./scenarios/synthetic_idle.cantrace.csvPour convertir une capture reconnue par python-can, voir
docs/trace-import.md. Les captures privées restent hors
du dépôt via captures/private/.
Une comparaison synthétique capot fermé / ouvert peut être lancée avec :
./scripts/analyze-trace-change.ps1 `
./scenarios/synthetic_idle.cantrace.csv `
./scenarios/synthetic_hood_open.cantrace.csvLe protocole destiné aux premières observations réelles est décrit dans docs/read-only-discovery.md.
Une session privée d'inventaire K+DCAN peut être préparée sans enregistrer le VIN :
.\scripts\new-diagnostic-session.ps1 -SessionName e90-reference-01Voir docs/diagnostic-inventory.md avant d'ouvrir une fonction dans ISTA, INPA ou Tool32.
Pour VS Code, PlatformIO génère localement .vscode/c_cpp_properties.json avec
les paramètres de l'environnement actif ; ce fichier reste hors Git car il
contient des chemins propres à la machine. compile_flags.txt configure le mode
de repli de clangd. Si d'anciens diagnostics restent affichés après une mise à
jour, exécuter PlatformIO: Rebuild IntelliSense Index, puis
C/C++: Reset IntelliSense Database et recharger la fenêtre.
Un outil PC peut produire directement une trace canonique depuis une interface
python-can dont le mode silencieux a été intégré explicitement :
.\scripts\capture-can-trace.ps1 `
-Interface pcan `
-Channel PCAN_USBBUS1 `
-Bitrate 500000 `
-Duration 10 `
-OutputPath .\captures\private\session-01\baseline.cantrace.csvLe débit ci-dessus est uniquement un exemple et doit être confirmé avant la connexion. L'outil ne contient aucun appel d'émission et refuse les pilotes non qualifiés. Le câble K+DCAN reste réservé au diagnostic : il n'est pas supposé fournir une capture CAN brute. Voir docs/capture-qualification.md.
Toute évolution doit conserver la séparation entre métier et matériel, échouer de manière sûre, rester déterministe et ajouter des tests aux nouvelles transitions. Voir CONTRIBUTING.md.
Le concept général est inspiré du dépôt AlbertoMarziali/bmw_remote_start. Ce projet est une implémentation indépendante : aucun code du dépôt de référence n'a été copié. L'objectif est une architecture plus modulaire, explicite et adaptée à une validation progressive.
Distribué sous licence MIT. Voir LICENSE.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | M3 | MountingHole_3.2mm_M3 | MH1, MH2, MH3, MH4 |
| 1 | 3V3 | TestPoint_Pad_D1.5mm | TP3 |
| 1 | 5V | TestPoint_Pad_D1.5mm | TP2 |
| 1 | BAT | TestPoint_Pad_D1.5mm | TP1 |
| 1 | CANH | TestPoint_Pad_D1.5mm | TP13 |
| 1 | CANL | TestPoint_Pad_D1.5mm | TP14 |
| 1 | CLVC1G125QDBVRQ1 | SOT-23-5 | U2 |
| 1 | C_BAT 10n 50V | C_0805_2012Metric | C5 |
| 1 | C_REG_IN 100n 50V | C_0805_2012Metric | C1 |
| 1 | C_REG_OUT 2.2u 25V | C_0805_2012Metric | C2 |
| 1 | C_U2 100n | C_0805_2012Metric | C6 |
| 1 | C_VCC 100n | C_0805_2012Metric | C3 |
| 1 | C_VCC 22u 10V | C_1206_3216Metric | C4 |
| 1 | D_BAT SS16 | D_SMA | D1 |
| 1 | EN | TestPoint_Pad_D1.5mm | TP10 |
| 1 | ERR | TestPoint_Pad_D1.5mm | TP12 |
| 1 | ESP32-S3 DEVKIT J1 | PinSocket_1x22_P2.54mm_Vertical | H1 |
| 1 | ESP32-S3 DEVKIT J3 | PinSocket_1x22_P2.54mm_Vertical | H2 |
| 1 | F_BAT MINISMDC010F-2 | Fuse_1812_4532Metric_Pad1.30x3.40mm_Reviewed | F1 |
| 1 | GATE_Y | TestPoint_Pad_D1.5mm | TP5 |
| 1 | GND | TestPoint_Pad_D1.5mm | TP15 |
| 1 | J_BAT 10..18V BENCH | JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical | J1 |
| 1 | J_KCAN H L GND | JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J2 |
| 1 | OE | TestPoint_Pad_D1.5mm | TP4 |
| 1 | RESET | TestPoint_Pad_D1.5mm | TP8 |
| 1 | RX MODE REMOVE AT BOOT | PinHeader_1x02_P2.54mm_Vertical | JP1 |
| 1 | RXD | TestPoint_Pad_D1.5mm | TP11 |
| 1 | R_A 100k | R_0805_2012Metric | R4 |
| 1 | R_BAT 1k | R_1206_3216Metric | R1 |
| 1 | R_EN_PD 10k | R_0805_2012Metric | R13 |
| 1 | R_EN_SER 1k | R_0805_2012Metric | R12 |
| 1 | R_ERR_PULL 3.3k | R_0805_2012Metric | R8 |
| 1 | R_ERR_SER 1k | R_0805_2012Metric | R9 |
| 1 | R_OE 10k | R_0805_2012Metric | R3 |
| 1 | R_RTH 5.62k | R_0805_2012Metric | R14 |
| 1 | R_RTL 5.62k | R_0805_2012Metric | R15 |
| 1 | R_RX_PULL 3.3k | R_0805_2012Metric | R6 |
| 1 | R_RX_SER 1k | R_0805_2012Metric | R7 |
| 1 | R_STB_PD 10k | R_0805_2012Metric | R11 |
| 1 | R_STB_SER 1k | R_0805_2012Metric | R10 |
| 1 | R_TXD 10k | R_0805_2012Metric | R2 |
| 1 | R_TX_SER 1k | R_0805_2012Metric | R5 |
| 1 | STB | TestPoint_Pad_D1.5mm | TP9 |
| 1 | TJA1055T/3/2Z | SO-14_3.9x8.65mm_P1.27mm | U1 |
| 1 | TLS715B0EJV50XUMA1 | Infineon_PG-DSO-8-52_3.9x4.9mm_EP2.65x3mm_ThermalVias | U3 |
| 1 | TWAI_TX | TestPoint_Pad_D1.5mm | TP7 |
| 1 | TXD | TestPoint_Pad_D1.5mm | TP6 |
It measures 120 × 80 mm and has 2 copper layers, 1.6 mm thick.
50 parts, built around the CLVC1G125QDBVRQ1 and TJA1055T/3/2Z. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Synaro/BMW-E9x-Remote-Control repository on GitHub, at the commit this page was made from: the board is hardware/kcan-rxonly-pcb/kicad/BMW-E9x-KCAN-RXOnly.kicad_pcb and its schematic hardware/kcan-rxonly-pcb/kicad/BMW-E9x-KCAN-RXOnly.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

avlyubimov/svc-platform
Status: EVT-LAYOUT-AUTHORIZED; connectivity routing complete; fab review open




hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

dmcke5/NucDeck
The Open Source DIY Handheld Gaming PC!

