# Structure détaillées

## 1. **Classe Abstraite : `M5lib`**

Classe de base commune à tous les types de M5. Elle définit les fonctionnalités fondamentales.

#### Fonctions membres

<div class="relative" id="bkmrk-fonction-r%C3%B4le-setups"><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" style="width: 100%; height: 535px;"><thead class="bg-offset"><tr style="height: 29.7969px;"><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top" style="width: 28.8034%; height: 29.7969px;">Fonction</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top" style="width: 71.1966%; height: 29.7969px;">Rôle</th></tr></thead><tbody><tr style="height: 46.5938px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 46.5938px;">`setupstd()`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 46.5938px;">Effectue l'initialisation matérielle commune : écran, Wi-Fi, RFID, UHF. Attention : la fonction est lboquante tant que le M5 n'est pas connecté au réseau prédéfinit.</td></tr><tr style="height: 63.3906px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 63.3906px;">`reducejson(String json)`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 63.3906px;">Réduit et structure le JSON de réponse de l’API TimeTonic pour simplifier l’accès aux champs utiles. Ne garde que le contenu de "fields" (endroit où est stocké entre autres les données demandées) et "rowInfos" (qui contient notamment le rowId des informations demandées)</td></tr><tr style="height: 46.5938px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 46.5938px;">`scancard()`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 46.5938px;">Scanne une carte RFID classique, retourne l’UID du tag sous forme de String. Contient une UI intégrée. Attention : la fonction est bloquante tant qu'elle n'a pas lu une carte.</td></tr><tr style="height: 63.3906px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 63.3906px;">`scanuhf(String* urfid)`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 63.3906px;">Scanne les tags RFID UHF via le module UHF externe, remplit le tableau passé en paramètre avec les EPC lues (max 200 EPC, ce qui est le max supporté par le module RFID UHF). Fonction actuellement inutilisée dans le code.</td></tr><tr style="height: 63.3906px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 63.3906px;">`showchoice(String choices[])`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 63.3906px;">Affiche sur l’écran un menu de sélection contenant les String du tableau passé en paramètre : l’utilisateur peut naviguer puis valider un choix(jusqu’à 9 options), qui est retourné sous forme de String.</td></tr><tr style="height: 81.4375px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 81.4375px;">`virtual int uploadlog(String card, String action, String other) = 0`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 81.4375px;">Méthode virtuelle pure pour uploader un log dans la table correspondante au type de M5. Prend en paramètre une carte lue, l'action effectuée par l'utilisateur et un agument optionnel (au choix, le motif de la visite, l'ordinateur ou l'outil emprunté).</td></tr><tr style="height: 47.2188px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 47.2188px;">`virtual int changestatus() = 0`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 47.2188px;">Méthode virtuelle pure pour changer le statut d'emprunt/de présence (obsolète pour le moment car remplacé par automatisation TimeTonic).</td></tr><tr style="height: 46.5938px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 46.5938px;">`getuser(String* user)`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 46.5938px;">Lance un scan RFID (avec scancard() ), puis interroge l’API TimeTonic pour récupérer le nom, prénom, et rowId de l'utilisateur scanné. Peuple ensuite le tableau passé en paramètre : \[nom, prénom, tag RFID, rowId\].</td></tr><tr style="height: 46.5938px;"><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 28.8034%; height: 46.5938px;">`borrow()`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border" style="width: 71.1966%; height: 46.5938px;">Gère tout le cycle d’emprunt et retour d’un matériel/machine/ordinateur : identification (avec un appel getuser() ), log (avec un appel uploadlog() ), et contrôle utilisateur (gestion par l'utilisateur de la durée de son emprunt, avec à nouveau un scan de carte et un upload de log à la fin de l'emprunt. Boucles if/else à chaque étape du cycle pour gérer chaque type d'erreur (API, utilisateur inconnu, etc...).</td></tr></tbody></table>

</div></div></div></div>##### Attributs

- `user[4]` : tableau de String contenant toutes les informations d'un utilisateur : \[nom, prénom, tag RFID, rowId\].
- `urfid[200]` : tableau de String pouvant contenir jusqu'à 200 EPC.
- `sesskey` : permet de modifier simplement et directement la clé d'API pour toutes les requêtes de la bibliothèques (en cas d'expiration par exemple)

## 2. **Classes Dérivées**

Chaque classe dérivée apporte des fonctionnalités propres à chaque typologie de M5 dans le FabLab.

#### a. **Classe : `accueil`**

Ajoute des méthodes spécifiques à la gestion d’accueil.

<div class="relative" id="bkmrk-fonction-r%C3%B4le-int-up"><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">Fonction</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Rôle</th></tr></thead><tbody><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`int uploadlog(...) override`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Upload des logs d’accueil à l’API avec les bons id (table, champs...).</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`int changestatus() override`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Change le statut d’accueil (placeholder : actuellement valeur fixe pour compatibilité).</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`void entree()`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Gère la procédure d’entrée : identification (avec getuser), choix du motif de visite (avec showchoice), upload du log d’arrivée (avec uploadlog)</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`void sortie()`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Gère la sortie d’un utilisateur (avec getuser) et log cet évènement (avec uploadlog).</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`void regcard()`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Enregistre une nouvelle carte RFID (avec un scancard puis une requete d'API spécifique) pour un utilisateur après inscription sur Timetonic (liaison rangée TimeTonic &lt;-&gt; badge RFID). La requête d'API récupère la dernière rangée créée avec une vue filtrée (vue chronologique dans TimeTonic), il faut donc faire l'association de carte immédiatement après l'inscription.</td></tr></tbody></table>

</div></div></div></div>##### Attributs spécifiques

`String motifs[9]`: Liste des motifs de visite disponibles à la sélection (préremplie pour plus de simplicité).`String name` : nom du M5, permet de définir l'action d'accueil effectuée : entrée, sortie ou 1ère inscription.

#### b. **Classe : `servante`**

Pour la traçabilité de l’usage des servantes.

<div class="relative" id="bkmrk-fonction-r%C3%B4le-int-up-1"><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">Fonction</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Rôle</th></tr></thead><tbody><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`int uploadlog(...) override`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Upload des logs liés à l’utilisation d’une servante (carte, action, ""). L'argument other ne sert pas pour les servantes.</td></tr><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`int changestatus() override`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Change le statut de la servante (obsolète, pour compatibilité).</td></tr></tbody></table>

</div></div></div></div>##### Attributs spécifiques

- `String rowid`: id de la rangée de cette servante dans la table Servantes du book Inventaire dans TimeTonic (unique à chaque servante, et donc chaque appareil, voir table d'équivalence dans la doc privée).
- `String name` : nom du M5, permet de définir la servante concernée dans les logs.

#### c. **Classe : `machine`**

Gère l’utilisation des machines/outils fixes.

<div class="relative" id="bkmrk-fonction-r%C3%B4le-int-up-2"><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">Fonction</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Rôle</th></tr></thead><tbody><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`int uploadlog(...) override`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Upload logs liés à l’utilisation d’une machine (carte utilisateur, action).</td></tr></tbody></table>

</div></div></div></div>##### Attributs spécifiques

- `String rowid`: id de la rangée de cette machine dans la table Machines du book Inventaire dans TimeTonic (unique à chaque machinr, et donc chaque appareil, voir table d'équivalence dans la doc privée).
- `String name` : nom du M5, permet de définir la machine concernée dans les logs.

#### d. **Classe : `ordinateur`**

Gère le suivi de l'emprunt des ordinateurs portables.

<div class="relative" id="bkmrk-fonction-r%C3%B4le-int-up-3"><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">Fonction</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Rôle</th></tr></thead><tbody><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`int uploadlog(...) override`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Upload logs spécifiques à l’usage d’un ordinateur (par exemple : session ouverte/fermée).</td></tr></tbody></table>

</div></div></div></div>##### Attributs spécifiques

- <span style="font-family: Lucida Console, DejaVu Sans Mono, Ubuntu Mono, Monaco, monospace;"><span style="font-size: 11.76px; white-space-collapse: preserve; background-color: rgb(180, 215, 255);">WIP</span></span>

#### e. **Classe : `materiel`**

Gère les cycles d’emprunt et de retour d’outillage ou matériel divers.

<div class="relative" id="bkmrk-fonction-r%C3%B4le-int-up-4"><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">Fonction</th><th class="border-borderMain px-sm py-sm dark:border-borderMainDark break-normal border text-left align-top">Rôle</th></tr></thead><tbody><tr><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">`int uploadlog(...) override`</td><td class="border-borderMain px-sm dark:border-borderMainDark min-w-[48px] break-normal border">Upload logs liés à l’utilisation (emprunt/retour) de matériels.</td></tr></tbody></table>

</div></div></div></div>##### Attributs spécifiques

- <span style="font-family: Lucida Console, DejaVu Sans Mono, Ubuntu Mono, Monaco, monospace;"><span style="font-size: 11.76px; white-space-collapse: preserve; background-color: rgb(180, 215, 255);">WIP</span></span>

## 3. **Utilisation de méthodes virtual / override**

Les méthodes `uploadlog` et `changestatus` sont définies comme `virtual` dans la base, et nécessaires à la personnalisation du comportement selon chaque situation FabLab : chaque classe dérivée implémente les appels API avec les bons identifiants et formats de données.

Avec cette structure, chaque fonction de **M5lib** remplit un rôle précis dans la gestion, la traçabilité, l’ajout de dispositifs et l’intégration back-end dans l’écosystème du FabLab.