From ca1e50e60974dad7f4ed49c52b5c01c8999d52ce Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 21 Mar 2026 19:34:03 +0100 Subject: [PATCH] =?UTF-8?q?Mise=20=C3=A0=20jour=20memoire.md=20avec=20tout?= =?UTF-8?q?es=20les=20infos=20projet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LXC 164, token Gitea, fonctionnalités implémentées, TODO, notes dev. Co-Authored-By: Claude Opus 4.6 (1M context) --- memoire.md | 83 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/memoire.md b/memoire.md index a083bdd..08b23aa 100644 --- a/memoire.md +++ b/memoire.md @@ -3,49 +3,90 @@ ## Description Borne d'impression photo tactile. Les utilisateurs importent leurs photos (USB, WiFi, QR code, email), les éditent (recadrage, rotation, effets, goodies, multi-pose, texte) et les impriment sur imprimante sublimation. +## Concept +Ce n'est PAS un photobooth (pas de capture photo). C'est une station de transfert/impression : les utilisateurs arrivent avec leurs propres photos et la borne permet de les éditer et imprimer. + ## Stack technique -- **Interface** : PyQt6 / QGraphicsScene (natif, léger, tactile) +- **Interface** : PyQt6 / QGraphicsScene (natif, léger, tactile — choisi au lieu de Chromium pour économiser la RAM sur RPi 3) - **Traitement image** : Pillow (effets, redimensionnement, export) - **Impression** : CUPS via pycups - **Hotspot WiFi** : hostapd + dnsmasq + Flask (mini serveur upload) - **QR** : qrcode (Python) ## Matériel -- **Prototype** : Raspberry Pi 3B+ (1GB RAM) — portable vers RPi 4/5 -- **Écran tactile** : à déterminer (en stock chez Jules) -- **Imprimante sublimation** : à acheter (DNP DS620A ou Mitsubishi CP-D90DW) +- **Prototype** : Raspberry Pi 3B+ (1GB RAM) — en stock chez Jules +- **Cible** : Portable vers RPi 4 ou 5 sans aucun changement de code +- **Écran tactile** : en stock chez Jules (modèle à déterminer) +- **Imprimante sublimation** : à acheter (pistes : DNP DS620A, Mitsubishi CP-D90DW) - **Pas de capture photo** — les utilisateurs apportent leurs propres photos ## Architecture ``` src/ - main.py — Point d'entrée + main.py — Point d'entrée (--kiosk pour plein écran) + services/ + usb_watcher.py — Détection USB par polling (findmnt + scan récursif) ui/ - main_window.py — Navigation QStackedWidget + main_window.py — Navigation QStackedWidget (4 écrans) screens/ - home_screen.py — Accueil, choix du mode d'import - import_screen.py — Galerie de photos importées - editor_screen.py — Éditeur (crop, rotation, effets, goodies, multi-pose, texte) - print_screen.py — Prévisualisation + impression + home_screen.py — Accueil, 4 boutons import, status USB live + import_screen.py — Galerie de photos (grille scrollable) + editor_screen.py — Éditeur complet (voir fonctionnalités ci-dessous) + print_screen.py — Prévisualisation + choix format + impression + widgets/ + crop_overlay.py — Rectangle de crop avec poignées tactiles + grille des tiers + goodies_panel.py — Panneau latéral stickers/cadres (charge depuis assets/) + multipose_dialog.py — 5 templates multi-pose avec prévisualisation assets/ - goodies/ — Stickers PNG - frames/ — Cadres photo - fonts/ — Polices custom -templates/ — Templates multi-pose -config/ — Configuration (imprimante, WiFi, etc.) + goodies/ — Stickers PNG (à peupler) + frames/ — Cadres photo PNG (à peupler) + fonts/ — Polices custom +data/ + photos/ — Photos importées (gitignored) + exports/ — Exports PNG (gitignored) +config/ — Configuration (imprimante, WiFi, etc.) ``` +## Fonctionnalités implémentées (2026-03-21) +- **Import USB** : polling montages, scan récursif photos (jpg/png/bmp/tiff/webp/heic), bouton vert + compteur quand clé détectée +- **Galerie** : grille 4 colonnes avec miniatures cliquables +- **Recadrage** : overlay interactif, grille des tiers, poignées tactiles aux coins, zone assombrie +- **Rotation** : 90° par clic (transformation réelle, pas juste visuelle) +- **Filtres Pillow** : N&B, sépia, vintage (désaturation+contraste), contraste +- **Goodies** : panneau latéral toggle, stickers draggable (20% taille scène), cadres overlay +- **Multi-pose** : 5 templates (2h, 2v, 3 gauche, 4 grille, 3 bande), remplissage auto depuis galerie +- **Texte** : éditable + draggable, police 32pt blanche +- **Annuler** : reset à l'image originale +- **Export** : scène complète → PNG haute résolution (fichier temporaire) +- **Impression** : écran prévisualisation + sélection format (10x15, 13x18, 15x20 cm) + ## Dev - **Repo Gitea** : https://git.copydev.fr/jules/photostation -- **Dev sur** : LXC Proxmox (x86) ou PC local, déploiement sur RPi -- **Lancement** : `python3 src/main.py` (fenêtré) ou `python3 src/main.py --kiosk` (plein écran) +- **Token Gitea** : `4bc923c47cf363a866daa1e1a6cf22bc44a78bc5` (claude-photostation) +- **LXC dev** : ID 164, hostname `photostation`, IP `192.168.111.164` + - Debian 12, 2GB RAM, 2 cores + - Python 3 + PyQt6 6.10.2 + Pillow 12.1.1 + venv dans `/opt/photostation/venv/` + - Code dans `/opt/photostation/` + - Xvfb :99 (1024x600) + VNC port 5900 (sans mot de passe) + - Lancer l'app : `source venv/bin/activate && DISPLAY=:99 PYTHONPATH=src python3 src/main.py` +- **Lancement local** : `python3 src/main.py` (fenêtré) ou `python3 src/main.py --kiosk` +- **Git config** : user `Jules`, email `contact@copydev.fr` +- **Credentials git** : stockés dans `/tmp/.git-cred-photostation` -## Statut -- Projet initialisé le 2026-03-21 -- Structure de base créée (4 écrans, navigation) -- TODO : import USB, éditeur complet, impression CUPS, modes WiFi/QR/email +## TODO +- [ ] Peupler assets/goodies/ et assets/frames/ avec des stickers et cadres +- [ ] Impression CUPS réelle (pycups, détection imprimante, envoi job) +- [ ] WiFi hotspot (hostapd + dnsmasq + Flask page upload) +- [ ] QR code (génération lien vers page upload) +- [ ] Email (réception SMTP) +- [ ] Thème/style plus abouti +- [ ] Tests sur RPi 3 réel ## Formats d'impression - 10x15 cm - 13x18 cm - 15x20 cm + +## Notes +- Fichiers `backend/` et `frontend/` dans le repo = version alternative (probablement générée par un autre onglet Claude). Notre approche est dans `src/` (PyQt6). +- Les libs xcb nécessaires sur le LXC : libxcb-cursor0, libxcb-xinerama0, libxcb-icccm4, libxcb-keysyms1, libxcb-render-util0, libxcb-shape0, libxcb-xfixes0, libxkbcommon-x11-0, libfontconfig1