Aller au contenu principal

IHM Qt : configuration et scan

Pages concernées​

FichierRôle
qml/pages/config/ConfigPage.qmlListe des réglages avec icônes (style iOS / Android)
qml/pages/config/GeneralSettingsPage.qmlAncien formulaire de configuration (nom, site, MQTT)
qml/pages/config/ConsigneSettingsPage.qmlInterrupteur Mode consigne, état des casiers et de la sync
qml/pages/consigne/ConsignePage.qmlÉcran de scan (lecteur QR HID)
qml/pages/consigne/ConsigneLayoutPage.qmlMur de casiers : casier ouvert clignotant, casiers occupés
qml/launcher/HomeScreen.qmlTuile Consigne affichée seulement si le mode est actif
src/consigne/consigne_client.{hpp,cpp}Élément QML ConsigneClient (client HTTP de l'agent)

Captures depuis le Raspberry Pi​

Écran de scan Consigne (avant ouverture)​

Écran Consigne de scan QR avant ouverture du casier

Mur des casiers Consigne​

Vue casiers Consigne sur Raspberry Pi avec casier ouvert et surbrillance

ConsigneClient (C++ → QML)​

class ConsigneClient : public QObject {
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(bool online READ online NOTIFY changed)
Q_PROPERTY(bool enabled READ enabled NOTIFY changed)
Q_PROPERTY(QVariantList lockers READ lockers NOTIFY changed)
Q_PROPERTY(int occupied READ occupied NOTIFY changed)
Q_PROPERTY(QString lastSyncChannel READ lastSyncChannel NOTIFY changed)
Q_PROPERTY(QString lastSyncError READ lastSyncError NOTIFY changed)
public:
Q_INVOKABLE void refresh(); // GET /consigne/status (auto toutes les 5 s)
Q_INVOKABLE void setEnabled(bool on); // POST /consigne/mode/on|off
Q_INVOKABLE void scan(const QString& code); // POST /consigne/scan
signals:
void scanFinished(bool ok, int locker, const QString& recipientName, const QString& message);
};

L'URL de l'agent est lue dans LEUKOS_NODE_API_URL ou dérivée de /etc/leukos/node.json (api.port, défaut http://127.0.0.1:8080).

Interrupteur du mode consigne​

ToggleSwitch {
checked: consigne.enabled
busy: consigne.busy || !consigne.online
accent: "#d29922"
onToggled: consigne.setEnabled(!consigne.enabled)
}

La page affiche aussi :

  • N libre(s) · M occupé(s) · T casier(s) ;
  • Synchronisé avec Saturn via grpc|rest, ou l'erreur de synchronisation ;
  • une grille des casiers (vert = libre, orange = occupé).

Tuile d'accueil conditionnelle​

ConsigneClient {
id: consigneState
onChanged: home.syncConsigneTile()
}

function syncConsigneTile() {
if (!consigneState.online)
return; // ne rien changer tant que l'agent n'a pas répondu
// ajoute la tuile "consigne" si enabled, la retire sinon,
// puis launcherGrid.rebuildSlots()
}

Scan QR​

Le lecteur QR (ex. BF SCAN SCAN KEYBOARD, VID 9901 / PID 0301) est un clavier HID : il tape le contenu du QR puis Entrée. La page garde un TextField invisible avec le focus (re-forcé chaque seconde) :

TextField {
id: scannerField
width: 1; height: 1; opacity: 0
focus: true
inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhSensitiveData
onAccepted: page.submitCode(text)
}

Connections {
target: consigne
function onScanFinished(ok, locker, recipientName, message) {
page.checking = false
if (ok)
page.stack.push(layoutComponent, { stack: page.stack,
assignedDoor: locker, recipientName: recipientName })
else
page.lastError = message || "Code refusé"
}
}

:::tip Configuration du lecteur Le lecteur doit être configuré avec le suffixe CR/Entrée (réglage usine habituel). Sans ce suffixe, le code n'est jamais validé. L'application Scanner de l'accueil permet de vérifier qu'il est détecté et de voir les données lues. :::

Mur de casiers​

ConsigneLayoutPage dessine les portes depuis /etc/leukos/consigne.json (ConsigneConfig). Le casier assignedDoor clignote en vert, les casiers occupés (d'après ConsigneClient.lockers) sont entourés en orange.

Compilation et déploiement​

make -C .build/buildroot BR2_EXTERNAL="$PWD/nodes/os" leukos-ui-rebuild -j1
# binaire : .build/buildroot/output/target/usr/bin/leukos-ui

Voir Déploiement pour l'installation sur le node.