05 · Périphérique embarqué

Embedded Device Driver Simulator

Une API C++ typée pour piloter une unité embarquée simulée : température, batterie, IMU, GPS et radio. Le projet relie le protocole bas niveau à des types métier sans cacher les erreurs de transport ou de device.

C++20RAIIstd::optionalstd::variantUnix socketFault injection
EDDS / SENSOR BUS
device  EDDS-SIM
temperature     21.8 C
battery         87 %
imu             x=0.01 y=-0.03 z=1.00
gps             fix acquired
radio           RSSI=-68 dBm

timeout         retry 1/2
response        OK

Le problème

Passer d’octets bruts à une API sûre

Le protocole transporte des payloads hétérogènes : nombre flottant, structure IMU, position GPS optionnelle, état radio. Le driver doit valider le type de réponse, son numéro de séquence et sa longueur avant de construire un objet métier utilisable.

Les erreurs sont séparées en transport, protocole et périphérique. L’appelant sait ainsi si une opération peut être retentée, si les octets sont invalides ou si le device a explicitement refusé la commande.

Architecture

Une API publique découplée du simulateur

API typée
DeviceDriver
Codec + helpers
binary payload
Transport RAII
ou mock
Firmware Python
simulé

Le simulateur supporte délai artificiel, réponse perdue, statut `BUSY` et corruption. Cela permet d’exercer les politiques de récupération sans modifier la couche C++ ni rendre les tests probabilistes.

Décisions d’ingénierie

Utiliser le type system comme garde-fou

01 / MODEL

Types dédiés par capteur

`ImuReading`, `GpsFix`, `RadioStatus` et `BatteryReading` rendent l’API explicite.

02 / NULLABILITY

GPS avec `std::optional`

L’absence de fix est un état métier normal, distinct d’une erreur de transport.

03 / GENERIC DATA

`std::variant` pour les lectures

Une collection hétérogène reste type-safe sans cast ni union manuelle.

04 / ERRORS

Hiérarchie d’exceptions contrôlée

Transport, protocole et statut device sont distingués pour une réaction appropriée.

Démonstration réelle

Onze scénarios du codec au driver

La suite exécutée couvre le vecteur CRC standard, les round-trips, les payloads, le décodage capteur, les retries après timeout ou `BUSY`, les statuts d’erreur et le rejet d’une séquence inattendue.

Protocol + driver mock tests11/11 tests réussis
./simulator/device_simulator.py --socket /tmp/edds_device.sock --verbose
./edds_cli --socket /tmp/edds_device.sock --command all

Preuves techniques

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

  • Round-trip du codec et détection des magic/CRC invalides.
  • Décodage de température, batterie, IMU, GPS et radio en types C++ dédiés.
  • Retries après timeout et statut `BUSY`, puis propagation d’un vrai statut d’erreur.
  • Documentation séparée du protocole, du simulateur, des tests et de l’architecture.
Projet suivantScanGUI - application C++/GTK