03 · Linux / abstraction matérielle

Hardware Bus Driver Simulator

Une couche C++ de driver utilisateur communiquant avec un périphérique Python simulé. Le protocole imite une liaison UART/I²C/SPI et permet de tester timeouts, CRC invalides et retries sans matériel physique.

C++20Unix socketBinary protocolCRC-32MocksPython
LHBD / DEVICE TRANSACTION
$ lhbd_cli --demo

PING                    OK
WRITE REG 0x0010        OK
READ REG 0x0010         305419896
TEMPERATURE             22.04 C
STATUS                  mode=1 flags=0

fault injection: timeout → retry → OK

Le problème

Développer un driver testable avant d’avoir le matériel

Les couches d’intégration matérielle sont souvent difficiles à tester : le périphérique n’est pas toujours disponible et les erreurs sont irrégulières. Le projet isole le transport derrière `ITransport` et fournit deux implémentations : une socket UNIX pour le chemin complet et un mock déterministe pour les tests.

L’API métier reste identique : ping, lecture/écriture de registres, lecture de capteurs, statut et reset.

Architecture

Une dépendance inversée autour du driver

CLI / API
métier
DeviceDriver
retry policy
ITransport
socket ou mock
Périphérique
Python simulé

`DeviceDriver` construit une requête avec numéro de séquence, délègue l’échange au transport puis contrôle la réponse. Les détails de socket, de poll et de délai ne contaminent pas le protocole ni l’API publique.

Décisions d’ingénierie

Reproduire les pannes, pas seulement le chemin heureux

01 / ABSTRACTION

Transport substituable

Une future liaison série ou SPI peut implémenter `ITransport` sans modifier le driver et ses tests.

02 / CORRELATION

Numéro de séquence

Chaque réponse est associée à sa requête ; une réponse retardée ou étrangère est rejetée.

03 / RECOVERY

Retry borné et observable

Timeouts et CRC invalides déclenchent une tentative contrôlée et alimentent les compteurs de diagnostic.

04 / PROTOCOL

Encodage big-endian explicite

Le format ne dépend ni de l’alignement des structures C++ ni de l’endianness de l’hôte.

Démonstration réelle

Timeout et corruption injectés dans les tests

La vidéo est issue de la suite C++ exécutée avec `MockTransport`. Elle montre le round-trip du protocole, les accès registres et les récupérations après timeout ou CRC incorrect.

Driver + protocole + fault injectionTous les tests passent, y compris les retries
python3 simulator/device_simulator.py --socket /tmp/lhbd_device.sock
./lhbd_cli --socket /tmp/lhbd_device.sock --demo

Preuves techniques

Ce que le dépôt permet de vérifier

  • Codec de trames, CRC standard, longueur bornée et validation structurelle.
  • Mock injectant réponse correcte, timeout et corruption sans dépendre du simulateur.
  • Intégration Linux par socket UNIX avec cycle de vie géré en RAII.
  • Test d’intégration Python lançant le simulateur puis la CLI C++.
Projet suivantHigh-Performance Binary Log Recorder