//======================================================================================================================================================================== // PAGE_PERSONNALISEE.QML // Ce fichier traite l'affichage d'une page personnalisée. La page utilise les données de TB_Pages correspondant à 'id_page'. // Elle affiche notamment : // - l'image de fond à partir des champs Fichiers, Opacité, Taille, Offset_x et Offset-y. // - Tous les points listés dans le champ Points et en fonction de leur paramètre 'type_point' // - l'état actuel de chaque point en fonction de l'état de l'équipement qu'ils représentent // - un mousearea pour les circuits qui se comporte comme le bouton On/Off de la Home Page. // La page est appelée depuis la page HOME, en cliquant sur la page, dans les onglets de page //======================================================================================================================================================================== import QtQuick 2.12 import QtQuick.Controls 2.12 import qt.koriolan.shipheart 1.0 import"fonctions.js" as Fonctions Shipheart_page { id: page_page_personnalisee // Mis en forme : readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas readonly property double espace_lignes_principales: 20 readonly property int periode_init_raffraichissement_parametres: 20 // En ms ATtention : The Timer type is synchronized with the animation timer. Since the animation timer is usually set to 60fps, the resolution of Timer will be at best 16ms. readonly property int periode_raffraichissement_parametres: 1000 // En ms readonly property int periode_base_affichage_nom: 10 // En ms readonly property int periode_affichage_nom: 150 // En x 'periode_base_affichage_nom' readonly property int tempo_avant_fadding_affichage_nom: 50 // En x 'periode_base_affichage_nom' // Données : property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée property int id_page: 0 property string nom_page: "" property string fichier: "" property int opacite: 0 property int taille: 0 property int offset_x: 0 property int offset_y: 0 property string chaine_points: "" property int nb_points: 0 property int index_affichage_nom_en_cours: -1 property int compteur_affichage_nom_en_cours: 0 property bool appui_sur_point_en_cours: false property int point_en_cours_details: -1 // 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 : //=========================================================== 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; } else { if (!appui_sur_point_en_cours) mise_a_jour(); // Evite une maj pendant que l'on est en appui long } } } //=========================================================== // Timer temporisation affichage nom : //=========================================================== Timer { id: timer_tempo_affichage_nom interval: periode_base_affichage_nom triggeredOnStart: false running: false repeat: true onTriggered: { if (point_en_cours_details === -1) // On garde le nom affiché si on est sur ses détails { if (-- compteur_affichage_nom_en_cours <= 0) { index_affichage_nom_en_cours = -1; timer_tempo_affichage_nom.stop(); } } } } //=========================================================== // Lorsque la page est sur le point d'être affichée dans la pile : //=========================================================== StackView.onActivating: { init_page(); } // Titre de la page : Shipheart_titre_1 {titre:nom_page; hauteur: shipheart_hauteur_bandeau_haut} //------------------------------------------------------- // Ecran principal : //------------------------------------------------------- Rectangle { id: zone_affichage_droite x: 0 y: shipheart_hauteur_bandeau_haut; width: shipheart_largeur_page height: affichage_hauteur_utile color: "transparent" border.color: couleur_gris_moyen ListModel { id: modele_liste_points } //========================== // Image de la silhouette : Image { id: image_silhouette anchors.fill: parent source: (fichier !== "") ? "file://" + shipheart_repertoire_config + shipheart_sous_repertoire_images_silhouette + "/" + fichier : "" fillMode: Image.PreserveAspectFit opacity: (opacite / 100) visible: (fichier !== "") } //========================== // Points : Repeater { model: modele_liste_points Rectangle { id: point property bool flag_init_point_deplacable: flag_init // Recopie au niveau du delegate du flag général pour pouvoir utiliser onFlag_xxxChanged et déclencher l'appel à une fonction JS une seule fois en fin d'init x: (image_silhouette.visible) ? (model.x * image_silhouette.paintedWidth) + (zone_affichage_droite.width / 2) - (point.width / 2) : (model.x * zone_affichage_droite.width) + (zone_affichage_droite.width / 2) - (point.width / 2) y: (image_silhouette.visible) ? (model.y * image_silhouette.paintedHeight) + (zone_affichage_droite.height / 2) - (point.height / 2) : (model.y * zone_affichage_droite.height) + (zone_affichage_droite.height / 2) - (point.height / 2) radius: model.taille_point / 2 width: model.taille_point height: width color: "transparent" //----------------------------------------------------- // Icone : // Remplissage de l'icone : Rectangle { anchors { horizontalCenter: icone_point.horizontalCenter bottom: icone_point.bottom } width: icone_point.width * 0.9 height: icone_point.height * (model.remplissage / 100) opacity: 0.7 color: (model.type_remplissage === 3) ? couleur_gris_pale : // Eaux noires/grises (model.type_remplissage === 4) ? couleur_orange : // Carburant couleur_bleu_koriolan // Eau douce (et autres...) visible: (model.remplissage !== -1) } Image { id: icone_point source: model.icone sourceSize.height: model.taille_point anchors { horizontalCenter: parent.horizontalCenter verticalCenter: parent.verticalCenter } } /* ColorOverlay { anchors.fill: icone_point source: icone_point color: couleur_green_yellow } */ Glow { anchors.fill: icone_point radius: 30 samples: 61 // spread: 0.9 color: couleur_blanc source: icone_point visible: model.halo } //----------------------------------------------------- // Nom : Text { id: libelle_nom anchors.bottom: parent.top anchors.horizontalCenter: parent.horizontalCenter text: model.nom font.pixelSize: 15 font.weight: Font.Bold color: couleur_blanc_casse opacity: (compteur_affichage_nom_en_cours > tempo_avant_fadding_affichage_nom) // Si on est > 500ms, on reste à 100% d'opacité ? 1.0 : (compteur_affichage_nom_en_cours / tempo_avant_fadding_affichage_nom) // Si on est <= 500ms, on réduit linéairement l'opacité jusqu'à 0 visible: (index_affichage_nom_en_cours === index) // On dévalide carément l'affichage du nom puisque la valeur de repos est -1 (pas obligatoire mais plus propre) } //----------------------------------------------------- // Valeur_1 : Text { id: libelle_valeur_1 anchors.top: parent.bottom anchors.horizontalCenter: parent.horizontalCenter text: model.valeur_1 font.pixelSize: 15 font.weight: Font.Bold color: couleur_blanc_casse visible: (model.valeur_1 !== "") } //----------------------------------------------------- // Valeur_2 : Text { id: libelle_valeur_2 anchors.top: libelle_valeur_1.bottom anchors.horizontalCenter: parent.horizontalCenter text: model.valeur_2 font.pixelSize: 15 // font.weight: Font.Bold color: couleur_blanc_casse visible: (model.valeur_2 !== "") } //----------------------------------------------------- // Détails du point : Rectangle { anchors.fill: libelle_details_point opacity: 0.2 radius: shipheart_rayon_bouton color: couleur_gris_moyen visible: libelle_details_point.visible && (model.details !== "") } Rectangle { id: libelle_details_point anchors { left: (model.x <= 0) ? libelle_nom.right : undefined right: (model.x > 0) ? libelle_nom.left : undefined top: (model.y < 0) ? libelle_valeur_1.bottom : undefined bottom: (model.y >= 0) ? libelle_nom.top : undefined } width: details_point.contentWidth + 20 height: details_point.contentHeight + 20 // opacity: 0.4 color: "transparent" visible: (point_en_cours_details === index) MouseArea { id: dragArea anchors.fill: parent drag.target: parent drag.axis: Drag.XAndYAxis onPressed: { libelle_details_point.anchors.left = undefined libelle_details_point.anchors.right = undefined libelle_details_point.anchors.top = undefined libelle_details_point.anchors.bottom = undefined } } Text { id: details_point anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter text: (point_en_cours_details >= 0) ? model.details : "" font.pixelSize: 15 // font.weight: Font.Bold color: couleur_blanc_casse } } //----------------------------------------------------- // Picto d'alerte : Image { id: picto_alerte source: "/images/ak14.png" sourceSize.height: 20; anchors { left: icone_point.right leftMargin: -10 bottom: icone_point.bottom } visible: (model.alarme > 0) } //----------------------------------------------------- MouseArea { id: mousearea_point width: 100 height: 100 anchors { horizontalCenter: parent.horizontalCenter verticalCenter: parent.verticalCenter } onPressed: { shipheart_clic(); appui_sur_point_en_cours = true; index_affichage_nom_en_cours = index; compteur_affichage_nom_en_cours = periode_affichage_nom; timer_tempo_affichage_nom.start(); if (model.type_source !== shipheart_type_source_modules) point_en_cours_details = -1; // Dans le doute, on dévalide les détails d'un module s'il y en a un en cours } pressAndHoldInterval: shipheart_mouse_press_and_hold_interval_long; onPressAndHold: { if (model.type_source === shipheart_type_source_circuits) { shipheart_clic(); // On enlève aussi le son si on n'est pas sur un circuit (sinon, on a le 'clic' mais aucun effet...) toggle_consigne_circuit(model.id_source, index); } else if (model.type_source === shipheart_type_source_modules) { if (point_en_cours_details >= 0) { if (point_en_cours_details === index) point_en_cours_details = -1; else point_en_cours_details = index; } else point_en_cours_details = index; } } onDoubleClicked: { shipheart_clic(); switch(model.type_source) { //------------------------------------------------------ case shipheart_type_source_circuits: stackView.push("circuit.qml", {"id_circuit": model.id_source }) break; //------------------------------------------------------ case shipheart_type_source_reservoirs: stackView.push("reservoir.qml", {"id_reservoir": model.id_source }) break; //------------------------------------------------------ case shipheart_type_source_batteries: stackView.push("batterie.qml", {"id_batterie": model.id_source }) break; //------------------------------------------------------ case shipheart_type_source_capteurs: stackView.push("capteur.qml", {"id_capteur": model.id_source }) break; } } onReleased: { timer_raffraichissement_parametres.restart(); // Permet de réarmer le timer et éviter qu'il ne se déclenche juste après le retrait du doigt (et risquer que la prise en compte de l'action sur circuit n'ait pas été complèemnt traité). appui_sur_point_en_cours = false; } } } } } //------------------------------------------------------- // Bandeau bas : //------------------------------------------------------- Row { x: 0 y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas; width: shipheart_largeur_page; height: shipheart_hauteur_bandeau_bas; //................................................. // Bouton retour //................................................. Rectangle { id: bandeau_bas_zone_retour width: parent.width - (2 * parent.padding) height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding; radius: 5 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); } } //============================================================================================================= // Init de la page //============================================================================================================= function init_page() { var req, res; var i; //console.log("Id de la page = " + id_page); //==================================================================== // Recherche des infos de la page : req = 'SELECT Nom, '; req += ' Fichier, '; req += ' Opacite, '; req += ' Taille, '; req += ' Offset_x, '; req += ' Offset_y, '; req += ' Points '; req += ' FROM TB_Pages '; req += ' WHERE Cle_primaire=' + id_page + ' '; //console.log("Requête = [" + req + "]") res = bdd.requete_unique(req); // Récupération des données : i = 0; nom_page = res[i ++]; fichier = res[i ++]; opacite = Number(res[i ++]); taille = Number(res[i ++]); offset_x = Number(res[i ++]); offset_y = Number(res[i ++]); chaine_points = res[i++]; //==================================================================== // Remplissage des modèles : if (chaine_points !== "") init_points(chaine_points.split(';')); else init_points(""); // L'appel avec un array vide (cas du résultat de split sur une chaine vide) donne des résultats pas très clairs... //==================================================================== // Première mise à jour : mise_a_jour(); //==================================================================== // Libération du flag : flag_init = false; } //============================================================================================================= // Met à jour 'modele_liste_points' avec les paramètres contenu dans 'chaines_points' //============================================================================================================= function init_points(chaines_points) { var req, res; var nb; var i; var chaine_point; var point; var validite; var type_source; var id_source; var x, y; var type_point; var taille_point; var nom; var icone; var halo; var type_remplissage // RAZ des courbes : nb_points = 0; modele_liste_points.clear(); if (chaines_points === "") { console.log("La liste de points est vide") return; // Si le tableau est vide (aucun point), il ne faut pas faire de traitement supplémentaire... } // Ajout des points dans le modèle : for (chaine_point of chaines_points) // Chaque point est du type : [validite/type_source/id_source/x/y/type_point/taille_point] { point = chaine_point.split('/'); i = 0; validite = Number(point[i++]); type_source = Number(point[i++]); id_source = Number(point[i++]); x = Number(point[i++]); y = Number(point[i++]); type_point = Number(point[i++]); taille_point = Number(point[i++]); halo = false; // Par défaut type_remplissage = 0; // Par défaut // Recherche des infos de l'équipement : switch(type_source) { //------------------------------------------------------ case shipheart_type_source_circuits: req = ' SELECT Nom, Consigne, Etat_commande_carte, Etat, Mode_test FROM TB_Circuits WHERE Cle_primaire=' + id_source + ' '; //console.log("req = [ " + req + "; ]"); res = bdd.requete_unique(req); nom = res[0]; // Calcul de l'icone à utiliser : if (Number(res[1]) > 0) { icone = "/images/" + shipheart_page_personnalisee_type_point_icones[type_source][type_point]; halo = true; } else icone = "/images/" + shipheart_page_personnalisee_type_point_icones[type_source][0]; break; //------------------------------------------------------ case shipheart_type_source_reservoirs: req = ' SELECT Nom, ID_Famille FROM TB_Reservoirs WHERE Cle_primaire=' + id_source + ' '; res = bdd.requete_unique(req); nom = res[0]; type_remplissage = Number(res[1]); // Calcul de l'icone à utiliser : icone = "/images/" + shipheart_page_personnalisee_type_point_icones[type_source][type_point]; break; //------------------------------------------------------ case shipheart_type_source_batteries: req = ' SELECT Nom FROM TB_Batteries WHERE Cle_primaire=' + id_source + ' '; res = bdd.requete_unique(req); nom = res[0]; // Calcul de l'icone à utiliser : icone = "/images/" + shipheart_page_personnalisee_type_point_icones[type_source][type_point]; break; //------------------------------------------------------ case shipheart_type_source_capteurs: req = ' SELECT Nom FROM TB_Capteurs WHERE Cle_primaire=' + id_source + ' '; res = bdd.requete_unique(req); nom = res[0]; // Calcul de l'icone à utiliser : icone = "/images/" + shipheart_page_personnalisee_type_point_icones[type_source][type_point]; break; //------------------------------------------------------ case shipheart_type_source_modules: req = ' SELECT Type FROM TB_Modules_config WHERE Adresse_k_bus=' + id_source + ' '; res = bdd.requete_unique(req); nom = Fonctions.nom_type_module(Number(res[0])); // Calcul de l'icone à utiliser : icone = "/images/" + shipheart_page_personnalisee_type_point_icones[type_source][type_point]; break; } modele_liste_points.append({ "validite": validite, "type_source": type_source, "id_source": id_source, "x": x, "y": y, "type_point": type_point, "taille_point": taille_point, "nom": nom, "icone": icone, "halo": halo, "valeur_1": "", "valeur_2": "", "details": "", "remplissage": -1, "type_remplissage": type_remplissage, "alarme": false }); } } //============================================================================================================= // Mise à jour des valeurs courantes de tous les points //============================================================================================================= function mise_a_jour() { var req, res; var sous_req, sous_res; var nb; var i, j; for (i = 0; i < modele_liste_points.count; i ++) { switch(modele_liste_points.get(i).type_source) { //------------------------------------------------------ case shipheart_type_source_circuits: req = 'SELECT Cle_primaire, '; // Note : la requete est gardée identique à celle de 'home.qml'@1905 pour faciliter la recopie... req += ' Etat_systeme, '; req += ' Nom, '; req += ' Etat_commande_carte, '; req += ' Mode_commande, '; req += ' Etat, '; req += ' Consigne, '; req += ' Old_consigne, '; req += ' Mode_test, '; req += ' Tension, '; req += ' Intensite, '; req += ' Frequence, '; req += ' (SELECT Type FROM TB_Modules_config WHERE Adresse_k_bus=TB_Circuits.Adresse_module) AS type_circuit, '; req += ' No_circuit, '; req += ' (SELECT COUNT(*) FROM TB_Events WHERE Validite=1 AND Visibilite=1 AND (Action_circuits LIKE CONCAT(TB_Circuits.Cle_primaire,"/%") OR Action_circuits LIKE CONCAT("%;", TB_Circuits.Cle_primaire,"/%") ) ) AS nb_events, '; req += ' Validation_cdes_events, '; req += ' (SELECT COUNT(*) FROM TB_Events WHERE Validite=1 AND Type_source=' + shipheart_source_mesure_circuit + ' AND Alarme_source>0 AND Etat_test=1 AND ID_Source=TB_Circuits.Cle_primaire) AS Nb_alarmes'; req += ' FROM TB_Circuits WHERE Cle_primaire=' + modele_liste_points.get(i).id_source + ' '; //console.log("Requête = [" + req + "]"); res = bdd.requete_unique(req); // Calcul de l'icone à utiliser : var icone; var halo = false; if (Number(res[6]) > 0) { icone = "/images/" + shipheart_page_personnalisee_type_point_icones[shipheart_type_source_circuits][modele_liste_points.get(i).type_point]; halo = true; } else icone = "/images/" + shipheart_page_personnalisee_type_point_icones[shipheart_type_source_circuits][0]; modele_liste_points.set(i, { "etat_systeme": Number(res[1]), "nom": res[2], "valeur_1": "", "valeur_2": "", "remplissage": -1, "icone": icone, "halo": halo, "alarme": ( (Number(res[3]) !== shipheart_etat_commande_module_ok) || (Number(res[5]) !== shipheart_etat_circuit_ok) || (Number(res[16]) > 0) ) }); break; //------------------------------------------------------ case shipheart_type_source_reservoirs: req = 'SELECT Cle_primaire, '; // Note : la requete est gardée identique à celle de 'home.qml'@2140 pour faciliter la recopie... req += ' Nom, '; req += ' Etat_systeme, '; req += ' ID_Famille, '; req += ' Niveau, '; req += ' Capacite, '; req += ' Logique, '; req += ' (SELECT COUNT(*) FROM TB_Events WHERE Validite=1 AND Type_source=' + shipheart_source_mesure_reservoir + ' AND Alarme_source>0 AND Etat_test=1 AND ID_Source=TB_Reservoirs.Cle_primaire) AS Nb_alarmes, ' req += ' Etat_entrees '; req += ' FROM TB_Reservoirs WHERE Cle_primaire=' + modele_liste_points.get(i).id_source + ' '; //console.log("Requête = [" + req + "]"); res = bdd.requete_unique(req); modele_liste_points.set(i, { "etat_systeme": Number(res[2]), "nom": res[1], "valeur_1": Fonctions.conversion_volume(((Number(res[4]) / 100) * Number(res[5])), shipheart_unite_volume, shipheart_unite_volume_symbole, 0), "valeur_2": Number(res[4]).toFixed(0) + " %", // Niveau en % "remplissage": Number(res[4]), "alarme": ((Number(res[7]) !== shipheart_capteur_etat_normal) || (Number(res[8]) !== 0)) }); break; //------------------------------------------------------ case shipheart_type_source_batteries: req = 'SELECT Cle_primaire, '; // Note : la requete est gardée identique à celle de 'home.qml'@2330 pour faciliter la recopie... req += ' Etat_systeme, '; req += ' Nom, '; req += ' Type, '; req += ' Soc, '; req += ' Tension, '; req += ' Tension_nominale, '; req += ' (SELECT COUNT(*) FROM TB_Events WHERE Validite=1 AND Type_source=' + shipheart_type_source_batteries + ' AND Alarme_source>0 AND Etat_test=1 AND ID_Source=TB_Batteries.Cle_primaire) AS Nb_alarmes'; req += ' FROM TB_Batteries WHERE Cle_primaire=' + modele_liste_points.get(i).id_source + ' '; //console.log("Requête = [" + req + "]"); res = bdd.requete_unique(req); modele_liste_points.set(i, { "etat_systeme": Number(res[1]), "nom": res[2], "valeur_1": Number(res[4]).toFixed(0) + " %", // Niveau "valeur_2": Number(res[5]).toFixed(1) + " V", "remplissage": -1, "alarme": (Number(res[7]) > 0) }); break; //------------------------------------------------------ case shipheart_type_source_capteurs: req = ' SELECT Cle_primaire, '; // Note : la requete est gardée identique à celle de 'home.qml'@2630 pour faciliter la recopie... req += ' Etat_systeme, '; req += ' Nom, '; req += ' Type_entrees, '; req += ' Entrees, '; req += ' ID_Variable, '; req += ' Etat, '; req += ' (SELECT COUNT(*) FROM TB_Events WHERE Validite=1 AND Type_source=' + shipheart_type_source_capteurs + ' AND Alarme_source>0 AND Etat_test=1 AND ID_Source=TB_Capteurs.Cle_primaire) AS Nb_alarmes, ' req += ' Valeur, '; req += ' Precision_affichage_accueil, '; req += ' Liste_valeurs_textes '; req += ' FROM TB_Capteurs WHERE Cle_primaire=' + modele_liste_points.get(i).id_source + ' '; //console.log("Requête = [" + req + "]"); res = bdd.requete_unique(req); // Recherche des infos stockées dans la Variable pointée par ID_Variable : sous_res = bdd.requete_unique('SELECT Unite, Conversion_unite FROM TB_Variables WHERE Cle_primaire="' + Number(res[5]) + '" '); // Traitement des conversions d'unités : var nouvelle_unite; var symbole_unite; var type_unite; switch(Number(sous_res[1])) { case shipheart_type_unite_volume: nouvelle_unite = shipheart_unite_volume; symbole_unite = shipheart_unite_volume_symbole; type_unite = shipheart_type_unite_volume; break; case shipheart_type_unite_temperature: nouvelle_unite = shipheart_unite_temperature; symbole_unite = shipheart_unite_temperature_symbole; type_unite = shipheart_type_unite_temperature; break; case shipheart_type_unite_latitude: nouvelle_unite = 0; symbole_unite = ""; type_unite = shipheart_type_unite_latitude; break; case shipheart_type_unite_longitude: nouvelle_unite = 0; symbole_unite = ""; type_unite = shipheart_type_unite_longitude; break; default: nouvelle_unite = 0; type_unite = 0; symbole_unite = sous_res[0]; break; } // Cas spécifiques en fonction du type de capteur : var chaine_valeur = Fonctions.conversion_unites( Number(res[8]), nouvelle_unite, "", Number(res[9]), type_unite); switch(Number(res[3])) { //----------------------------------------------------------------- case shipheart_capteur_type_entrees_aux: case shipheart_capteur_type_entrees_calculee_booleen: // Traitement des listes : var chaines_valeurs_textes = res[10].split(';'); for (let chaine_valeur_texte of chaines_valeurs_textes) { var chaine = chaine_valeur_texte.split('/'); if (chaine.length === 2) // Evite de traiter les cas invalides (notamment, une chaine totalement vide qui arrive ici avec un length de 1...) { if (Number(res[8]) === Number(chaine [0])) // Si l'une des valeurs de la liste correspond à la valeur actuelle : { chaine_valeur = chaine[1]; // La valeur affichée sera le texte correspondant. break; // Et il est inutile de chercher d'autres valeurs... } } } break; //----------------------------------------------------------------- case shipheart_capteur_type_entrees_level_sensor: break; //----------------------------------------------------------------- case shipheart_capteur_type_entrees_ow: break; //----------------------------------------------------------------- case shipheart_capteur_type_entrees_predefinie: break; //----------------------------------------------------------------- default : break; } modele_liste_points.set(i, { "etat_systeme": Number(res[1]), "nom": res[2], "valeur_1": chaine_valeur + " " + symbole_unite, "valeur_2": "", "remplissage": -1, "alarme": ((Number(res[6]) !== shipheart_capteur_etat_normal) || (Number(res[7]) !== 0)) }); break; //------------------------------------------------------ case shipheart_type_source_modules: req = 'SELECT Adresse_k_bus, '; req += ' Etat_systeme, '; req += ' Mode_test, '; req += ' Tension_etat, '; req += ' Type '; req += ' FROM TB_Modules_config WHERE Adresse_k_bus=' + modele_liste_points.get(i).id_source + ' '; //console.log("Requête = [" + req + "]"); res = bdd.requete_unique(req); modele_liste_points.set(i, { "etat_systeme": Number(res[1]), "valeur_1": (Number(res[0]) === 0) ? "" : "@" + res[0], "alarme": ( (Number(res[2]) > 0) || (Number(res[3]) > 0) ) }); //================================================== // Mise à jour de l'usage du module : var nb_elements; var type_carte; var usage = ""; var nom_circuits = []; var nom_batterie; type_carte = Number(res[4]); switch(type_carte) { //----------------------------------- case shipheart_type_module_shippower812: case shipheart_type_module_shippower4AC: case shipheart_type_module_shippower8DC: // Init du nom des circuits affectés au module : if ((type_carte === shipheart_type_module_shippower812) || (type_carte === shipheart_type_module_shippower8DC)) nb_elements = shipheart_max_circuits_par_module_sp8xx; else nb_elements = shipheart_max_circuits_par_module_sp4ac; for (j = 0; j < nb_elements; j ++) nom_circuits.push(qsTr("--- Circuit non affecté ---")); // Recherche des circuits affectés à ce n° de carte : req = 'SELECT No_circuit, Nom, ID_Circuit_esclave FROM TB_Circuits WHERE Adresse_module=' + modele_liste_points.get(i).id_source + ' ORDER BY No_circuit '; //console.log("req =" + req); nb = bdd.requete(req); for (j = 0; j < nb; j ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { nom_circuits[Number(res[0])] = res[1]; if (Number(res[2]) < 0) nom_circuits[Number(res[0])] += " " + qsTr("[renfort]") + ""; } else break; } // Création du texte d'utilisation des circuits : for (j = 0; j < nb_elements; j ++) { if (j !== 0) usage += "
"; usage += (j + 1) + " - " + nom_circuits[j]; } break; //----------------------------------- case shipheart_type_module_shipBS: // Recherche des circuits affectés à ce n° de carte : req = 'SELECT Nom FROM TB_Batteries WHERE Type_entrees=' + shipheart_batteries_type_entrees_ibs + ' AND Adresse_module=' + modele_liste_points.get(i).id_source + ' '; //console.log("req =" + req); nb = bdd.requete(req); usage = ""; for (j = 0; j < nb; j ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { usage = res[0]; } else break; } if (usage === "") usage = qsTr("--- Aucune batterie affectée ---"); break; //----------------------------------- default: break; } if (usage != "") modele_liste_points.set(i, {"details": usage }); break; } } } //============================================================================================================= // Toggle de la valeur de consigne d'un circuit //============================================================================================================= function toggle_consigne_circuit(id_source, index) { var req, res; var i; var new_consigne; // Recherche de l'état actuel du circuity : req = ' SELECT Consigne, Old_consigne FROM TB_Circuits WHERE Cle_primaire=' + id_source + ' '; //console.log("req = [ " + req + "; ]"); res = bdd.requete_unique(req); // Détermination du nouvel état et mise à jour du modèle : if (Number(res[0]) === 0) // Le circuit était Off : { if (Number(res[1]) === 0) new_consigne = 100; // Si OLD = 0, on passe la consigne à 100% else new_consigne = Number(res[1]); // Sinon, on applique OLD à NEW // Mise à jour immédiate du modèle pour que l'affichage réagisse immédiatement sur tous les points correspondant à ce circuit : for (i = 0; i < modele_liste_points.count; i ++) { if ( (modele_liste_points.get(i).type_source === shipheart_type_source_circuits) && (modele_liste_points.get(i).id_source === id_source) ) { modele_liste_points.setProperty(i , "icone", "/images/" + shipheart_page_personnalisee_type_point_icones[shipheart_type_source_circuits][modele_liste_points.get(i).type_point]); modele_liste_points.setProperty(i , "halo", true); } } } else { new_consigne = 0; // Le circuit était On : for (i = 0; i < modele_liste_points.count; i ++) { if ( (modele_liste_points.get(i).type_source === shipheart_type_source_circuits) && (modele_liste_points.get(i).id_source === id_source) ) { modele_liste_points.setProperty(i , "icone", "/images/" + shipheart_page_personnalisee_type_point_icones[shipheart_type_source_circuits][0]); modele_liste_points.setProperty(i , "halo", false); } } } // Mise à jour dans la BDD : req = "UPDATE TB_Circuits SET New_consigne=" + new_consigne + " WHERE Cle_primaire='" + id_source + "'"; //console.log("Requête = [" + req + "]"); bdd.requete_unique(req); synchro_bdd(shipheart_type_synchro_data); } }