# Structure

## Dépendances

La librairie fait appel à de nombreuses librairies :

- M5Unified : bibliothèque standard utilisée pour contrôler et interagir avec les M5
- M5GFX : bibliothèque graphique (normalement standard) permettant d'utiliser des fonctions d'affichage avancées afin de créer une UI
- UNIT\_RFID\_UHF : bibliothèque officielle de M5Stack afin de gérer le module RFID UHF
- MFRC522\_I2C : bibliothèque officielle de M5Stack fin de gérer le module RFID (attention, il existe plusieurs versions de cette bilbiothèque et seule celle disponible sur le GitHub de M5Stack fonctionne)
- Wifi : bibliothèque standard permettant de contrôler la connexion WLAN du M5
- HTTPClient : bibliothèque permettant de faire des requêtes HTTP, notamment à l'API TimeTonic
- ArduinoJson : parseur JSON optimisé pour les ESP32, permet de manipulé les objets JSON retourné par l'API de TimeTonic
- Wire : bibliothèque standard permettant d'initialiser et de contrôler la connexion I2C du M5

## Structure de code

La bibliothèque **M5lib** est conçue pour uniformiser le comportement de plusieurs dispositifs **M5Stack Core2** dans l'environnement du FabLab, chacun jouant un rôle défini (accueil, servante, machine, etc.). Elle repose sur une architecture orientée objet claire et modulaire, facilitant l’évolution, la maintenance et l'intégration au back-end (TimeTonic).

## Structure de la Bibliothèque **M5lib**

#### 1. **Classe de base abstraite : `M5lib`**

<div class="relative" id="bkmrk-repr%C3%A9sente-l%E2%80%99interfa"><div class="prose text-pretty dark:prose-invert inline leading-normal break-words min-w-0 [word-break:break-word]">- Représente l’**interface** commune à tous les types de M5.
- Contient les méthodes de base utilisées par tous les modules : lecture de carte RFID (`scancard`), scan UHF (`scanuhf`), interaction utilisateur (`showchoice`, `getuser`), etc.
- Déclare des **méthodes virtuelles pures** (polymorphisme) à implémenter dans les classes dérivées : `uploadlog()` et `changestatus()`.

</div></div><div class="relative" id="bkmrk-"></div>#### 2. **Classes dérivées spécialisées**

Chaque type de M5 (défini dans `M5type`) possède une classe dédiée, dérivée de `M5lib` :

<div class="relative" id="bkmrk-classe-h%C3%A9rite-de-sp%C3%A9"><div class="prose text-pretty dark:prose-invert inline leading-normal break-words min-w-0 [word-break:break-word]"><div class="group relative"><div class="w-full overflow-x-auto md:max-w-[90vw] border-borderMain/50 ring-borderMain/50 divide-borderMain/50 dark:divide-borderMainDark/50 dark:ring-borderMainDark/50 dark:border-borderMainDark/50 bg-transparent"><table class="border-borderMain my-[1em] w-full table-auto border"><thead class="bg-offset"><tr><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Classe</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Hérite de</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Spécificités</th></tr></thead><tbody><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`accueil`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`M5lib`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Méthodes supplémentaires : `entree()`, `sortie()`, `regcard()`.  
Menu de motifs de visite.</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`servante`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`M5lib`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Gère la traçabilité des servantes utilisées.</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`machine`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`M5lib`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Pour l'enregistrement d’utilisation de machines.</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`ordinateur`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`M5lib`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Associe cartes/scans à une session ordinateur précise.</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`materiel`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`M5lib`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Permet le prêt/retour d’outils ou matériels via `borrow()`.</td></tr></tbody></table>

</div></div></div></div>Chaque classe surcharge au moins :

<div class="relative" id="bkmrk-uploadlog%3A-envoie-le"><div class="prose text-pretty dark:prose-invert inline leading-normal break-words min-w-0 [word-break:break-word]">- `uploadlog`: envoie les journaux d’usage à l’API TimeTonic avec une structure propre (identifiants de champs différents selon le type).
- `changestatus`: placeholder actuel (pour la plupart renvoie `200`) servant potentiellement à signaler un changement d’état matériel (ex : verrouillage machine, etc.).

</div></div>#### 3. **Composants globaux manipulés**

<div class="relative" id="bkmrk-p%C3%A9riph%C3%A9riques-%3A-mfrc"><div class="prose text-pretty dark:prose-invert inline leading-normal break-words min-w-0 [word-break:break-word]">- **Périphériques** :
    
    
    - `MFRC522 mfrc522` : pour la lecture RFID classique (Mifare).
    - `Unit_UHF_RFID uhf` : pour les lectures UHF/EPC.
- **API &amp; Données** :
    
    
    - `HTTPClient http` : communication HTTP avec TimeTonic.
    - `JsonDocument doc` : stockage de la réponse JSON.
- **Accès réseau** :
    
    
    - Configuration du Wi-Fi intégrée dans `setupstd()`.

</div></div><div class="relative" id="bkmrk--1"></div>## Résumé Visuel Simplifié

```txt
        +---------------------------+
        |           M5lib          |  <--- classe abstraite
        +---------------------------+
    /        |        |       |         \
   /         |        |       |          \
accueil   servante  machine ordinateur  materiel  <--- classes concrètes

Toutes implémentent :
    + uploadlog()
    + changestatus()

Chaque classe possède des méthodes propres, par exemple :
accueil fournit aussi :
    + entree()
    + sortie()
    + regcard()

```

<div class="relative" id="bkmrk--2"><div class="prose text-pretty dark:prose-invert inline leading-normal break-words min-w-0 [word-break:break-word]"><div class="w-full md:max-w-[90vw]"><div class="codeWrapper text-textMainDark selection:text-super selection:bg-super/10 bg-offset my-md relative flex flex-col rounded font-mono text-sm font-thin"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl sticky top-0 flex h-0 items-start justify-end"><div class="flex items-center min-w-0 font-medium gap-1.5 justify-center"></div></div></div></div></div></div>Une **évolution fluide** : il suffit d’ajouter une nouvelle classe dérivée et d’enrichir la factory pour intégrer un nouveau comportement ou un nouveau rôle matériel dans le système du FabLab.