Skip to content

feat(dof): detection reelle, gestion cabinet.xml dans l'UI, backboard Teensy + fix libdof - #86

Merged
KarotsSugarpie merged 13 commits into
PinCabOs:mainfrom
NLygitadm:feat/dof-hardware-cabinet
Aug 31, 2026
Merged

KarotsSugarpie merged 13 commits into
PinCabOs:mainfrom
NLygitadm:feat/dof-hardware-cabinet

Conversation

@NLygitadm

Copy link
Copy Markdown
Contributor

Objectif

Faire du DOF une couche fonctionnelle et cohérente dans PinCabOS : détection
matérielle réelle, gestion du cabinet.xml depuis l'interface web, et prise en
charge du backboard adressable (Teensy) aux côtés de la Dude's Cab. Tout est
modulable : chaque cab est différent (Dude's Cab, Teensy, Wemos, KL25Z,
LedWiz, PacLed…), rien n'est imposé, la page reflète uniquement le matériel réel.

Testé de bout en bout sur cab réel (Dude's Cab + Teensy 4.0 backboard 144×16, et
une Wemos CP2104 en test).

Contenu (13 commits)

Place nette

  • Retrait de la couche « fantôme » : cartes DOF définies mais jamais rendues, et
    « Driver Pack » listant 11 binaires pincabos-*ctl inexistants (vérifié
    absent du dépôt et des cabs → affichait toujours « absent / safe mode »).
  • La couche support-par-famille (LedWiz, Pinscape KL25Z/Pico, Dude's Cab, PacLed,
    FTDI, Arduino, Serial) est conservée et rendue fonctionnelle.

Détection réelle & matériel

  • install-dof-component.sh : le script réel que /dof/install-utils lançait
    (il n'existait nulle part) → paquets/modules/règles udev par famille.
  • Famille Teensy (VID 16c0) ajoutée : totalement absente jusqu'ici alors que
    c'est le contrôleur le plus courant pour les strips adressables.
  • Détection par VID/PID udev au lieu de mots-clés lsusb (fini les
    « détecté / probable » hasardeux). Détection Wemos/ESP (CP210x, CH340, ESP32).

Page « Matériel & cabinet.xml » (/dof/hardware)

  • Inventaire matériel persistant avec activation/désactivation par
    équipement ; le cabinet.xml est généré depuis la combinaison du matériel
    actif
    (plusieurs Teensy résolus par n° de série, Wemos, ArtNet, PinOne).
  • Amorçage automatique depuis le cabinet.xml existant (continuité).
  • Le matériel AutoConfig (Dude's Cab, LedWiz, Pinscape, PacLed) est affiché
    mais n'a rien à déclarer ; les extensions Dude's Cab (MOSLight, barres MX,
    splits) renvoient vers DudesCabConfig + le DOF Config Tool.
  • Génération conforme au parseur libdof réel (AutoConfigEnabled +
    OutputControllers + Toys = LedStrip/LedWizEquivalent), avec aperçu,
    sauvegarde automatique, restauration, redémarrage vpinfe optionnel.
  • Outil partagé CLI + web dans opt/pincabos/tools/dof-cabinet/.
  • fix-teensy-port.sh (ExecStartPre) : recale le <ComPortName> de chaque
    strip par n° de série (le /dev/ttyACM* peut changer au boot).

Correctif libdof embarqué (Dude's Cab + Teensy ensemble)

  • Remplace libdof.so.0.4.7 aux 3 emplacements livrés par un build corrigeant un
    use-after-free dans DudesCab::Finish() au teardown (plantait par
    intermittence quand une Dude's Cab et un Teensy coexistent).
  • Fix proposé en amont : Fix use-after-free in DudesCab::Finish() at teardown vpinball/libdof#65. En attendant le merge, le build
    corrigé est embarqué (provenance/rollback dans README-libdof-build.md).

Simplification & cohérence

  • Page /dof compacte (état + matériel réel + import DOF Config Tool ; le reste
    replié en « Avancé »). DOF Commander recentré sur les outputs/tests.
  • Tuile unique « DOF » dans le hub Outils (fusion des deux tuiles).

Nettoyage sécurité

  • Retrait de la clé API DOF Config Tool versionnée dans le dépôt (elle était
    aussi affichée en clair dans la page → champ password vide, clé stockée
    réutilisée).
  • Firmware Dude's Cab : garantie de non-redistribution (exclusion publy.sh,
    retrait de manifests de cache versionnés). Téléchargé à la volée depuis
    dude.arnoz.com, sources fermées respectées — intégration validée par Arnoz.

Notes pour la revue

…pack fictif)

- dof_simple_manager_card / _friendly : definies mais jamais appelees, aucune
  page ne les rendait ; boutons pointant vers /dof/manager qui ne fait quun
  redirect. Supprimees avec leurs helpers exclusifs (dof_usb_present,
  dof_support_ready, dof_configurator_status, dof_status_badge,
  dof_manager_families, dof_path_exists).
- Carte Driver Pack : listait 11 binaires pincabos-*ctl qui nexistent sur
  aucune installation (ni dans le depot) -> affichait toujours absent/safe
  mode. Retiree avec sa route API et son script de refresh.
- CONSERVE : toute la couche support par famille (LedWiz, Pinscape KL25Z,
  Pico, Dudes Cab, PacLed, FTDI, Arduino, Serial) : dof_component_definitions,
  checks paquets/modules/udev, route /dof/install-utils. Elle est reactivee
  et rendue fonctionnelle dans les commits suivants.
- install-dof-component.sh : le script que la route /dof/install-utils
  lancait n'existait pas (ni dans le depot, ni sur les cabs). Version reelle :
  paquets (libusb/hidapi/pyserial), modules noyau, regles udev pour TOUTES les
  familles (LedWiz, Pinscape KL25Z/Pico, Teensy, Dudes Cab/ESP, PacLed, FTDI,
  Arduino). Idempotent, tolere le hors-ligne.
- Famille Teensy/PJRC (VID 16c0) ajoutee : elle etait totalement absente de
  PinCabOS alors que c'est le controleur le plus courant pour les strips
  adressables (backboard). Aucune famille existante retiree.
- La carte Utilitaires/Drivers DOF est desormais rendue sur /dof (le code
  existait mais n'etait appele nulle part).
… ensemble)

Quitter une table plantait par intermittence (double free) quand une Dudes Cab
et un TeensyStripController coexistaient : use-after-free dans
DudesCab::Finish() au teardown. Fix propose upstream (libdof PR PinCabOs#65) ;
en attendant le merge, on embarque le build corrige (master eef645d + patch).

Remplace libdof.so.0.4.7 aux trois endroits livres par l'ISO :
- overlay vpinfe-dof-ledwiz-hidraw-stable (charge par vpinfe via le bridge)
- vpinfe/_internal/third-party/dof (copies embarquees)
- plugins/dof de VPX (chemin utilise en jeu)

Valide sur cab reel (backboard Teensy 144x16 + Dudes Cab). Modulable : sans
Dudes Cab ou sans Teensy, comportement inchange (le fix ne touche que le
teardown DudesCab). Provenance et rollback documentes dans
README-libdof-build.md.
…xml) + port Teensy auto

- tools/dof-cabinet/dof-cabinet.py : detection des controleurs DOF par
  VID/PID via udevadm (Teensy 16c0, DudesCab/RP2040 2e8a, LedWiz fafa,
  Ultimarc d209, Pinscape 1209, FTDI 0403), avec distinction
  AutoConfig / a-declarer, et generation de cabinet.xml conforme au parseur
  libdof : AutoConfigEnabled + OutputControllers (strips adressables
  Teensy/Wemos, ArtNet, PinOne) + Toys (LedStrip, LedWizEquivalent).
  Modulable : cab sans strip adressable -> cabinet.xml AutoConfig seul
  (DudesCab, LedWiz, KL25Z, Pico, PacLed restent autodetectes par DOF).
  Sortie generee validee identique a un cabinet.xml de cab reel.
- tools/fix-teensy-port.sh + drop-in ExecStartPre vpinfe : le /dev/ttyACM*
  du Teensy change selon l'ordre d'enumeration USB au boot -> recale
  <ComPortName> dans cabinet.xml a chaque demarrage. Sans Teensy ou sans
  cabinet.xml : sortie 0, aucun effet (safe sur tous les cabs).
…ce web

Nouvelle page web de gestion materielle DOF, branchee sur l'outil
tools/dof-cabinet (source unique de verite CLI + web) :

- detection reelle des controleurs par VID/PID udev : Teensy, Dudes Cab,
  LedWiz, Pinscape KL25Z/Pico, PacLed, FTDI... avec distinction
  AutoConfig / a-declarer. Chaque cab est different : tout est optionnel,
  la page reflete uniquement le materiel reellement branche.
- lecture du cabinet.xml actuel selon le schema reellement lu par libdof
  (controleurs declares, toys LedStrip/LedWizEquivalent) au lieu du simple
  present/absent.
- assistant de generation : cab sans strip adressable -> AutoConfig seul ;
  strip Teensy/Wemos declare seulement si voulu ; port serie 'auto' ;
  garde-fou luminosite. Apercu avant application, sauvegarde automatique de
  l'ancien fichier, restauration en un clic, redemarrage vpinfe optionnel.
- boutons d'acces depuis /dof et /dof/commander ; famille Teensy ajoutee au
  resume peripheriques du Commander (VID 16c0, absent jusqu'ici).
- endpoint JSON /dof/hardware/detect.json pour reutilisation (dashboard...).

Enregistrement isole dans un try (meme pattern que DudesCabConfig) : si le
module ou l'outil manque, le reste de l'interface fonctionne normalement.
La page /dof (etat general, drivers, imports) n'etait accessible depuis
aucun menu : le hub Outils ne proposait que DOF Commander. Ajout :
- carte 'DOF - Materiel & Config' dans le hub Outils -> /dof ;
- chaque page DOF pointe vers les autres : /dof <-> /dof/hardware
  <-> /dof/commander (boutons croises).
/dof/hardware devient un inventaire persistant du materiel DOF
(/opt/pincabos/config/dof/hardware-inventory.json) :

- chaque equipement declare (Teensy, Wemos, ArtNet, PinOne) s'active ou se
  desactive ; le cabinet.xml est genere depuis la COMBINAISON du materiel
  actif : plusieurs Teensy (port resolu par numero de serie), Wemos reseau,
  ArtNet... chacun avec son toy LedStrip + LedWizEquivalent.
- le materiel AutoConfig (Dude's Cab, LedWiz, Pinscape, PacLed) est affiche
  dans l'inventaire mais n'a rien a declarer : une seule ligne
  AutoConfigEnabled suffit, DOF les prend en charge a l'execution. Les
  extensions Dude's Cab (MOSLight, barres MX, splits) pointent vers
  DudesCabConfig + DOF Config Tool (c'est la que ca se configure).
- premier lancement : inventaire amorce automatiquement depuis le
  cabinet.xml existant (continuite des cabs deja configures).
- un Teensy branche mais non declare est propose a l'ajout en un clic ;
  ajout manuel pour le materiel non detectable USB (Wemos/ArtNet).
- outil dof-cabinet : resolution du port serie par numero de serie
  (indispensable avec plusieurs Teensy).
…ibdof

Verification dans le source libdof (OutputControllerList::FromXml boucle sur
tous les enfants -> N controleurs du meme type OK) avec 3 corrections :

- Wemos : WemosD1MPStripController HERITE de TeensyStripController dans
  libdof -> USB SERIE (ComPortName), pas reseau. Le generateur emettait un
  HostName inexistant dans le schema ; les deux types partagent maintenant le
  meme generateur serie (+ resolution du port par numero de serie).
- strips 1..10 : libdof lit NumberOfLedsStrip1..10, on n'en gerait que 8.
  Les entrees 9-10 ne sont emises que si non nulles -> les cabinet.xml
  existants a 8 entrees restent octet-identiques a la regeneration.
- fix-teensy-port.sh : la version sed ecrasait TOUS les <ComPortName> avec le
  port du premier Teensy (destructeur avec plusieurs cartes). Reecrit :
  chaque bloc TeensyStripController/Wemos est resolu par NUMERO DE SERIE via
  l'inventaire ; fallback mono-carte conserve ; sinon port laisse intact.
- n° LedWiz auto-incremente a l'ajout d'un equipement (30, 31, 32...) pour
  eviter les collisions de fichier directoutputconfigNN.ini.

Smoke test : 3 Teensy + 4 Wemos -> 7 blocs, 7 ports, 7 toys, 7 LedWiz
distincts, pas de HostName, retro-compat 8 entrees verifiee.
- Detection : fini les familles « detecte / probable » deduites de mots-cles
  (ttyACM present -> Arduino probable, hidraw present -> HID detecte...).
  La page liste uniquement le materiel REELLEMENT branche (VID/PID udev via
  dof-cabinet), avec son role cabinet.xml (AutoConfig / a declarer). Note
  explicite : les extensions portees par une carte (Walter, MOSLight sur la
  Dude's Cab) ne sont pas des peripheriques USB separes.
- Page compacte : 2 cartes (etat + import DOF Config Tool), le reste
  (dependances par famille, fichiers, logs) replie dans « Avance ».
- Cle API DOF Config Tool : n'est PLUS affichee dans la page (champ password
  vide ; la cle enregistree est reutilisee si on laisse vide). La cle
  personnelle de l'auteur, versionnee dans le depot et livree sur les ISO
  (publy.sh l'excluait de la publication mais pas de git), est retiree.
Fusion des tuiles 'DOF Commander - Outputs' et 'DOF - Materiel & Config' en
une seule tuile 'DOF' -> /dof, qui sert de page d'accueil DOF (boutons vers
Materiel & cabinet.xml et Commander).
Le firmware Dude's Cab est la propriete d'Arnoz : le configurateur le
telecharge a la volee depuis ses canaux officiels (dude.arnoz.com
stable/beta) et le met en cache localement sur le cab de l'utilisateur,
uniquement pour flasher son propre materiel. Rien n'est redistribue.

Verrouillage structurel :
- retrait des manifests de cache dude_versions-*.json versionnes par erreur
  (opt/pincabos/config/dudescab/cache/) ;
- exclusion explicite ^opt/pincabos/config/dudescab(/|$) dans publy.sh, en
  plus du mecanisme iso.sh existant (KEEP_INVENTORY : le dossier est garde
  sur la machine en mise a jour et efface du payload d'installation neuve).

Audit realise : aucun .uf2/.hex/.bin dans aucune branche du depot ni dans
les outils annexes ; toutes les references Arnoz sont des URLs de
telechargement runtime vers ses serveurs.
Valide avec une vraie Wemos branchee sur le cab : elle se presente par sa
puce USB-serie (ici CP210x 10c4:ea60 -> /dev/ttyUSB0), pas comme 'Wemos'.
- VID 10c4 (CP210x), 1a86 (CH340) et 303a (ESP32 natif) reconnus comme
  candidats WemosD1MPStripController ('possible' : ces VID sont partages
  avec d'autres adaptateurs serie).
- la page /dof/hardware propose l'ajout 1-clic en type Wemos (comme pour
  les Teensy) ; FTDI et autres series ne sont pas proposes comme strips.
Le materiel branche est deja liste sur /dof (detection reelle) et gere dans
/dof/hardware : la carte 'Peripheriques branches' (familles detecte/non
detecte par VID) etait redondante -> retiree avec sa fonction
dof_commander_devices_summary. Les cartes 'Controleurs dans les configs' et
'Fichiers DOF trouves' sont repliees dans une section Avance. Nettoyage au
passage de balises div orphelines dans le corps de la page. Le Commander se
concentre sur son role : outputs/toys + tests + import cabinet JSON.
@KarotsSugarpie
KarotsSugarpie merged commit a3b6611 into PinCabOs:main Aug 31, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants