//======================================================================================================================================================================== // ETALONNAGE_CAPTEUR.QML // Ce fichier traite l'étalonnage d'une carte. La page affiche notamment : // - La valeur brute actuelle // - la valeur corrigée actuelle (rensignée manuellement) // - l'offset actuel // La page est appelée depuis la page config_capteur.qml, en cliquant sur le bouton ETALONNAGE lorsqu'il est disponible. //======================================================================================================================================================================== import QtQuick 2.12 import QtQml.Models import qt.koriolan.shipheart 1.0 Shipheart_page { id: page_etalonnage_capteur // Mis en forme : readonly property double pourcentage_largeur_colonne_gauche: 0.75 readonly property double espace_colonnes_principales: 20 readonly property double pourcentage_hauteur_ligne_haut: 1 readonly property double espace_lignes_principales: 20 readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas readonly property int hauteur_ligne_formulaire: 60 readonly property double pourcentage_largeur_labels_formulaire: 0.4 readonly property int hauteur_bouton_droit: 80 readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1 readonly property int periode_init_raffraichissement_parametres: 1 // En ms readonly property int periode_raffraichissement_parametres: 1000 // En ms // Affichage : property bool bouton_bandeau_bas_zone_retour_actif: false property int protection_mode: 0 property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée // Données : property int id_capteur: -1 property string nom_capteur: "---" property double valeur_old: 0 property double valeur_brute: 0 property double valeur_new: 0 property double offset_old: 0 property double offset_new: 0 property string symbole_unite: "" property int precision_affichage: 1 property int nouvelle_unite: 0 // Modèles : // Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes //=========================================================== // Timer periode raffraichissement parametres capteur : //=========================================================== Timer { id: timer_raffraichissement_parametres interval: periode_init_raffraichissement_parametres triggeredOnStart: false running: true repeat: true onTriggered: { if (interval == periode_init_raffraichissement_parametres) // Premier passage, 1ms après le premier chargement { interval = periode_raffraichissement_parametres; init_page(); } else if (!clavier.active) mise_a_jour(); // Permet la mise à jour en temps réel du moment que le clavier n'est pas actif. } } // Titre de la page : Shipheart_titre_1 {titre:qsTr("Etalonnage du capteur [%1]").arg(nom_capteur); hauteur: shipheart_hauteur_bandeau_haut} //------------------------------------------------------- // Ecran Haut - Gauche : //------------------------------------------------------- Rectangle { id: zone_affichage_haut_gauche x: 0 y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2); color: "transparent" ListView { id: grille_principale width: parent.width height: parent.height snapMode: GridView.SnapToRow // L'arret de l'affichage se fera sur une rangée entière clip: true // Nécessaire pour que les Delegates s'arretent à l'intérieur de la GridView model: modele_grille_principale footer: Rectangle { // Permet de dégager la place suffisante en fin de GridView pour accéder même au dernier élément lorsque que clavier est déplié height: shipheart_hauteur_clavier color: "transparent" } ObjectModel { id: modele_grille_principale //------------------------------------------------------------------------------- // Ligne de formulaire : Valeur brute actuelle Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" Shipheart_formulaire_label { text: qsTr("Valeur brute actuelle") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_valeur_fixe { text: valeur_brute.toFixed(precision_affichage) + " " + symbole_unite width: parent.width * (1 - pourcentage_largeur_labels_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Valeur_corrigee Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" Shipheart_formulaire_label { text: qsTr("Valeur corrigée actuelle (%1)").arg(symbole_unite) width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { id: champ_formulaire_Valeur_corrigee text: valeur_new.toFixed(precision_affichage) width: parent.width * (1 - pourcentage_largeur_labels_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire flag_num_only: true onAccepted: { // Mise à jour à l'appui sur RETURN mais PAS en repliant le clavier (avec le bouton du clavier et la flèche vers le bas). mise_a_jour(); // Dans tous les cas, la MAJ sera faite à l'enregistrement. } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Offset Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" Shipheart_formulaire_label { text: qsTr("Correction") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_valeur_fixe { text: ((offset_new > 0) ? "+" : "") + offset_new.toFixed(precision_affichage) + " " + symbole_unite width: parent.width * (1 - pourcentage_largeur_labels_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } } } } //------------------------------------------------------- // Ecran Droite : //------------------------------------------------------- Rectangle { id: zone_affichage_droite x: zone_affichage_haut_gauche.width + espace_colonnes_principales y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2); color: "transparent" Column { anchors.fill: parent spacing: 10 // Bouton Enregistrer : Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton // visible: !clavier.active // SDIR #255 Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: qsTr("Enregistrer") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); enregistrement(); stackView.pop(); } } } } } //------------------------------------------------------- // Bandeau bas : //------------------------------------------------------- Row { x: 0 y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas; width: shipheart_largeur_page; height: shipheart_hauteur_bandeau_bas; spacing: 5 padding: 5 //................................................. // Bouton retour //................................................. Rectangle { id: bandeau_bas_zone_retour width: (parent.width * pourcentage_bandeau_bas_largeur_zone_retour) - (2 * parent.padding) height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding; radius: shipheart_rayon_bouton color: shipheart_couleur_fond_bouton Image { source: "/images/icone_retour.png" sourceSize.height: 30 anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } } MouseArea { // Zone d'interaction. On est obligé de la mettre dans la grille pour que Rectangle et MouseArea soient frères ou parent/enfant ET qu'on n'occupe qu'un espace dans la grille. id: mouse_area_bandeau_bas_zone_retour anchors.fill: parent onClicked: { shipheart_clic(); stackView.pop() } } } } //=========================================================== // Economiseur : Doit être placé en fin de page pour fonctionner //=========================================================== MouseArea { anchors.fill: parent preventStealing: true // Permet que cela fonctionne même si un élément flickable (notamment) soit derrière et "vole" le click enabled: flag_economiseur_actif onClicked: { mise_en_veille(0); } } //============================================================================================================= // Initialistion de la page //============================================================================================================= function init_page() { var i; var res; var id_variable; var tmp; if (id_capteur > 0) res = bdd.requete_unique('SELECT Nom, Valeur, Offset, Precision_affichage_accueil, ID_Variable FROM TB_Capteurs WHERE Cle_primaire=' + id_capteur + ' '); else { console.log("La page 'etalonnage_capteur.qml' a été appelée sans 'id_capteur' valide. L'affichage de la page est impossible"); stackView.pop(); } i = 0; nom_capteur = res[i++]; valeur_old = Number(res[i++]); // La Valeur en BDD est une valeur corrigée avec l'offset BDD offset_old = Number(res[i++]); precision_affichage = Number(res[i++]); id_variable = Number(res[i++]); valeur_brute = valeur_old - offset_old; valeur_new = valeur_old; offset_new = offset_old; res = bdd.requete_unique('SELECT Unite, Conversion_unite FROM TB_Variables WHERE Cle_primaire=' + id_variable + ' '); symbole_unite = res[0]; // Non utilisé pour le moment... /* switch(Number(res[1])) { case shipheart_type_unite_volume: nouvelle_unite = shipheart_unite_volume; symbole_unite = shipheart_unite_volume_symbole; break; case shipheart_type_unite_temperature: nouvelle_unite = shipheart_unite_temperature; symbole_unite = shipheart_unite_temperature_symbole; break; default: nouvelle_unite = 0; symbole_unite = unite; break; } */ } //============================================================================================================= // Mise à jour de la valeur instantannée //============================================================================================================= function mise_a_jour() { var res valeur_new = Number(champ_formulaire_Valeur_corrigee.text); offset_new = valeur_new - valeur_brute; /* // Mise à jour avec dernière valeur en cours : res = bdd.requete_unique('SELECT Valeur FROM TB_Capteurs WHERE Cle_primaire="' + id_capteur + '" '); valeur_brute = Number(res[0]); valeur_corrigee = valeur_brute + offset; */ } //============================================================================================================= // Enregistrement de la nouvelle valeur d'offset //============================================================================================================= function enregistrement() { var req, res mise_a_jour(); // Pour avoir la dernière valeur d'offset // Mise à jour de l'offset de correction : req = 'UPDATE TB_Capteurs SET Offset=' + offset_new + ' WHERE Cle_primaire="' + id_capteur + '" '; res = bdd.requete_unique(req); // Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration : synchro_bdd(shipheart_type_synchro_config); } }