//======================================================================================================================================================================== // CONFIG_MODULE.QML // Ce fichier traite la configuration d'un module (à la fois sur l'aspect physique et config) // La page est appelée depuis la page config_reseau_j_bus.qml, en cliquant sur un module dans la colonne 'config' //======================================================================================================================================================================== import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQml.Models import qt.koriolan.shipheart 1.0 import"fonctions.js" as Fonctions Shipheart_page { id: page_config_module // 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: 0 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: 50 readonly property double pourcentage_largeur_labels_formulaire: 0.45 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 readonly property int step_timer_appui_long: 30 // en ms // Données : property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée property int valeur_timer_appui_long: 0 property int adresse_module; property int type_module: 0 property string titre_page: "" property int consigne_en_cours: 0 // Contient la commande en cours sur le module property int index_courant_masses: -1 // SDIR #321 // 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; // init_page(); // Pas nécessaire car fait par le 'StackView.onActivating:' ci-dessous } else { mise_a_jour(); } } } //=========================================================== // Timer pour gérer les appuis longs : //=========================================================== Timer { id: timer_appui_long interval: step_timer_appui_long triggeredOnStart: false repeat: true onTriggered: { if (valeur_timer_appui_long < shipheart_mouse_press_and_hold_interval_tres_long) valeur_timer_appui_long+= step_timer_appui_long; else // Le fait de ne pas utilise le OnPressandHold permet d'être sût que la sortie se fait au même moment que la fin du comptage (sinon, on peut avoir de petits décalages) { timer_appui_long.running = false; valeur_timer_appui_long = 0; if (mousearea_bouton_supprimer.pressed) { if (check_avant_suppression() !== -1) { suppression_module(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte. timer_tempo_reconfiguration.restart(); // Lancement du timer pour attendre la fin de la reconfiguration } else ; // La fonction 'check_avant_suppression()' a lancé l'ouverture d'une boite de dialogue sécurisée pour confirmer, ou non, la suppression. } } } } //=========================================================== // Lorsque la page est sur le point d'être affichée dans la pile : //=========================================================== StackView.onActivating: { init_page(); // Permet un rafraichissement des champs qui ont pu être modifiés dans les pages en-dessous (Emplacement du module, Commentaires,...) } //=========================================================== // Titre de la page : //=========================================================== Shipheart_titre_1 {titre:titre_page; 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; 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 // Cf Ship2net.qml pour ajouter ici des champs de saisie... } } } //------------------------------------------------------- // Ecran Milieu - Gauche : //------------------------------------------------------- Rectangle { id: zone_affichage_milieu_gauche x: 0 y: shipheart_hauteur_bandeau_haut + zone_affichage_haut_gauche.height + espace_lignes_principales; width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * (1 - pourcentage_hauteur_ligne_haut)) - espace_lignes_principales; color: "transparent" //------------------------------------------------------------------- // Grille pour afficher les valeurs des paramètres non configurables : ListView { id: grille_informations width: parent.width height: parent.height spacing: 5 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_informations delegate: ligne_champ Component { id: ligne_champ Rectangle { width: grille_informations.width height: undefined // Permet de faire fonctionner le 'implicitHeight' qui suit implicitHeight: (texte_valeur_champ.implicitHeight > hauteur_ligne_formulaire) ? texte_valeur_champ.implicitHeight : hauteur_ligne_formulaire color: "transparent" // visible: !flag_init Shipheart_formulaire_label { text: nom_champ width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_valeur_fixe { id: texte_valeur_champ textFormat: Text.RichText text: valeur_champ width: parent.width * (1 - pourcentage_largeur_labels_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire padding: 10 } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } } ListModel { id: modele_grille_informations } } } //------------------------------------------------------- // 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 modifier les informations du module : Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: qsTr("Modifier") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); stackView.push("config_module_modification.qml", {"adresse_module": adresse_module}) } } } //------------------------------------------------ // Bouton localiser le module : Rectangle { width: parent.width height: hauteur_bouton_droit color: (consigne_en_cours !== 0) ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: !clavier.active && (type_module !== shipheart_type_module_shipbase) Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: qsTr("Localiser le module") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); if (consigne_en_cours === 0) consigne_en_cours = 1; else consigne_en_cours = 0; commande_localisation_module(adresse_module, consigne_en_cours); } } } //------------------------------------------------ // Bouton de suppression : Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: !clavier.active && (type_module !== shipheart_type_module_shipbase) Rectangle { // Barre grandissante pour montrer durée d'appui vs tempo nécessaire : width: (valeur_timer_appui_long / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width height: parent.height color: couleur_rouge_transparent radius: shipheart_rayon_bouton visible: mousearea_bouton_supprimer.pressed } Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: qsTr("Supprimer") color: couleur_blanc_casse } MouseArea { id: mousearea_bouton_supprimer anchors.fill: parent onPressed: { // Déclenché lors de l'appui inital timer_appui_long.running = true; valeur_timer_appui_long = 0; shipheart_clic(); } onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold : timer_appui_long.running = false; valeur_timer_appui_long = 0; } onExited: { // Déclenché si le doigt sort de la zone du bouton (sinon, on continue à compter alors qu'on est sorti de la zone et même relaché le doigt !!) timer_appui_long.running = false; valeur_timer_appui_long = 0; } } } //------------------------------- // Timer de reconfiguration : Timer { id: timer_tempo_reconfiguration interval: 250 // Cette tempo n'est utilisée que pour le premier cycle triggeredOnStart: false running: false repeat: true onTriggered: { if (bdd.check_fin_configuration()) { timer_tempo_reconfiguration.stop(); stackView.pop(); // Retour à la page de config des circuits } else timer_tempo_reconfiguration.interval = 100 // Tempo plus courte pour les lectures suivantes //console.log("Passage dans le timer_tempo_reconfiguration") } } } } //------------------------------------------------------- // 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(); if (consigne_en_cours !== 0) commande_localisation_module(adresse_module, 0); // Coupure de la localisation du module si on quitte la page et que la localisation est en cours stackView.pop() } } } } //------------------------------------------------------- // Boite d'information : //------------------------------------------------------- Shipheart_boite_dialogue_validation_securisee { id: boite_validation_securisee onClicked: { switch(bouton) { case shipheart_boite_dialogue_bouton_4: // Confirmation sécurisée : suppression_module(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte. timer_tempo_reconfiguration.restart(); // Lancement du timer pour attendre la fin de la reconfiguration break; case shipheart_boite_dialogue_bouton_2: // Annuler : on revient sur la page pour que l'on puisse enregistrer. break; default: } boite_validation_securisee.close(); } } // Modèle utilisé pour stocker les usages (directs et indirects) liés à ce module : // Note : ce modèle n'est pas affiché directement (c'est pourquoi il n'est pas intégré à un ListView par exemple) // mais il sert à générer le texte d'utilisation du module puis, en cas de demande de suppression du module, // à lancer les suppressions en cascades. ListModel { id: modele_usage } // Note : il est inutile de prévoir un Mousearea pour sortir de l'économiseur sur cette page puisqu'il // est systématiquement bloqué pour toutes les pages lancées depuis 'Paramètres Avancés'. //============================================================================================================= // Init de la page //============================================================================================================= function init_page() { var req, res; var i; var nom_champ, valeur_champ, flag_valide; var index = 0; var nom_champ_emplacement, valeur_champ_emplacement; var nom_champ_commentaires, valeur_champ_commentaires; modele_grille_informations.clear(); // RAZ des valeurs existantes // La liste ci-dessous permet de définir les champs qui seront affichés ainsi que leur ordre d'affichage : // Attention : 'Type' est traité hors boucle et doit donc rester en première position !! var param = ["Type", "Adresse_k_bus", "Nom", "Date_maj"]; // Laissé actif en dernière position pour gérer les ',' lors de commentaires... Mais supprimé dans le switch... req = 'SELECT '; req += param[0]; for (i=1; i<(param.length - 1); i++) req += ', ' + param[i]; req += ' FROM TB_Modules_config WHERE Adresse_k_bus=' + adresse_module + ' '; //console.log("req =[" + req + "]"); res = bdd.requete_unique(req); //======================================================= // Cas particulier du 'Type' qui est traité hors boucle : // NB : il doit donc rester en première position de la liste des paramètres !! type_module = Number(res[0]); //================================================== // Traitement de tous les autres paramètres : for (i=1; i<(param.length - 1); i++) { flag_valide = true; switch(param[i]) // NB : l'ordre de traitement dans le switch n'a aucun impact sur l'affichage.... { case "Adresse_k_bus" : if (type_module === shipheart_type_module_shipbase) titre_page = qsTr("Paramètres du module [%1]").arg(Fonctions.nom_type_module(type_module)) else titre_page = qsTr("Paramètres du module [%1] à l'adresse [%2]").arg(Fonctions.nom_type_module(type_module)).arg(Number(res[i])); continue; case "Nom" : nom_champ = qsTr("Nom du module"); valeur_champ = res[i]; break; case "Date_maj": flag_valide = false; break; default: nom_champ = param[i]; valeur_champ = res[i]; break; } if (flag_valide) { valeur_champ = valeur_champ.replace(/\n/g, "
"); // Remplace les '\n' par '
'. Sinon, les '\n' ne sont pas pris en compte par le RichText d'affichage. modele_grille_informations.append({"nom_champ": nom_champ, "valeur_champ": valeur_champ}); } } /* //================================================== // Cas particulier des SP8DC avec leur courant de masse : if (type_carte === shipheart_type_module_shippower8DC) { // Ajout de l'entrée dans le modèle : modele_grille_informations.append({"nom_champ": qsTr("Courant de masses sur réseau"), "valeur_champ": "0"}); index_courant_masses = modele_grille_informations.count - 1; // Permet d'accéder ensuite à ce champ particulier pour mettre sa valeur à jour. Le '-1' permet d'avoir une valeur entre 0 et N car l'append précédent a positionné le COUNT à >= 1. } */ //================================================== // Usage du module : modele_grille_informations.append({"nom_champ": qsTr("Affectations"), "valeur_champ": usage_module()}); //========================================================= // Cas particulier des champs Emplacement et Commentaires à faire apparaitre à la fin : req = 'SELECT Emplacement, Commentaires FROM TB_Modules_config WHERE Adresse_k_bus=' + adresse_module + ' '; res = bdd.requete_unique(req); modele_grille_informations.append({"nom_champ": qsTr("Emplacement du module à bord"), "valeur_champ": (res[0].length === 0) ? "--" : res[0].replace(/\n/g, "
") }); modele_grille_informations.append({"nom_champ": qsTr("Commentaires"), "valeur_champ": (res[1].length === 0) ? "--" : res[1].replace(/\n/g, "
") }); mise_a_jour(); flag_init = false; } //============================================================================================================= // Mise à jour des informations variables //============================================================================================================= function mise_a_jour() { var req, res; if (index_courant_masses >= 0) // SDIR #321 : si l'index est toujours égal à -1, c'est que le champ n'est pas utilisé sur ce module et on ne fait pas de mises à jour. { req = 'SELECT Courant_masses FROM TB_Modules_config WHERE Adresse_k_bus=' + adresse_module + ' '; //console.log("req = [" + req + "]"); res = bdd.requete_unique(req); modele_grille_informations.setProperty(index_courant_masses, "valeur_champ", Number(res[0]).toFixed(3).toString() + " A"); } } //============================================================================================================= // Emission d'une commande à destination d'une carte //============================================================================================================= function commande_localisation_module(id, consigne) { var req; consigne_en_cours = consigne; req = "UPDATE TB_Modules_config SET New_cde='" + shipheart_commande_module_localisation + "/" + consigne + "' WHERE Adresse_k_bus=" + adresse_module + " "; bdd.requete_unique(req); } //============================================================================================================= // Usage du module // Liste tous les éléments (circuits, capteurs, réservoirs, batteries, events) qui sont affectés par le module // en cours. Cette liste est d'abord utilisée pour afficher les éléments liés au module. Elle est aussi utilisée // en cas de suppression du module pour aleter sur les effets + supprimer tous les éléments liés si la suppression // est confirmée. //============================================================================================================= function usage_module() { var req, res; var nb; var i; var s; modele_usage.clear(); //----------------------------------------------------------------------------------- // Recherche des affectations directe d'un objet au module en cours : // La recherche dépend du type de module en cours (on ne cherche pas // les circuits sur un ShipBS par exemple). // Note : dans cette partie, on utilise directement des appels à 'modele.append()' ou // 'modele.set()' plutôt que 'ajout_modele_usage()' car on contourne le principe // d'ajout dans la liste en créant des entrées "fake" (avec id=-1 par exemple) // et la fonction d'ajout utilisée plus bas ne fonctionnerait pas telle qu'elle ; // sans compter qu'elle est fait e pour des ajouts et non des modifications. Ce // focntionnement ne pose pas de soucis car, dans cette partie, il ne doit pas y // avoir de risque de doublons. //----------------------------------------------------------------------------------- switch(type_module) { //======================================================== case shipheart_type_module_shippower812: case shipheart_type_module_shippower4AC: case shipheart_type_module_shippower8DC: //---------------------------------------------------- // Init du nom des circuits affectés au module : // (Ne sert que pour l'affichage) if ((type_module === shipheart_type_module_shippower812) || (type_module === shipheart_type_module_shippower8DC)) nb = shipheart_max_circuits_par_module_sp8xx; else nb = shipheart_max_circuits_par_module_sp4ac; for (i = 0; i < nb; i ++) { modele_usage.append({ "type": 0, // Ce type n'existe pas... "id": -1, // Cet ID n'existe pas... "libelle": qsTr("Circuit #%1 : ---").arg(i+1) }); } modele_usage.append({ "type": 0, // Ce type n'existe pas... "id": -1, // Cet ID n'existe pas... "libelle": "" }); // Ligne vide utilisée pour l'affichage //---------------------------------------------------- // Recherche des circuits affectés à ce n° de module : req = 'SELECT Cle_primaire, No_circuit, Nom, ID_Circuit_esclave FROM TB_Circuits WHERE Adresse_module=' + adresse_module + ' ORDER BY No_circuit '; //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Mise à jour du circuit dans la liste des usages : modele_usage.set( Number(res[1]), { "type": shipheart_type_source_circuits, "id": Number(res[0]), "libelle": qsTr("‣ Circuit #%1 : %2").arg(Number(res[1])).arg(res[2]) + ((Number(res[3] >= 0) ? "" : " " + qsTr("[renfort]") + "")) }); } else break; } //---------------------------------------------------- // Recherche des capteurs affectés à ce module : req = 'SELECT Cle_primaire, Nom FROM TB_Capteurs WHERE Adresse_module=' + adresse_module + ' '; //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout du capteur à la liste des usages : modele_usage.append({ "type": shipheart_type_source_capteurs, "id": Number(res[0]), "libelle": qsTr("‣ Capteur : %1").arg(res[1]) }); } else break; } break; //======================================================== case shipheart_type_module_shipBS: //---------------------------------------------------- // Init du nom de la batterie affectée au module : // (Ne sert que pour l'affichage) modele_usage.append({ "type": 0, // Ce type n'existe pas... "id": -1, // Cet ID n'existe pas... "libelle": qsTr("Parc de batteries : ---") }); modele_usage.append({ "type": 0, // Ce type n'existe pas... "id": -1, // Cet ID n'existe pas... "libelle": "" }); // Ligne vide utilisée pour l'affichage //---------------------------------------------------- // Recherche de la batterie affecté à ce n° de module : req = 'SELECT Cle_primaire, Nom FROM TB_Batteries WHERE Type_entrees=' + shipheart_batteries_type_entrees_ibs + ' AND Adresse_module=' + adresse_module + ' '; //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Mise à jour de la batterie dans la liste des usages : modele_usage.set( 0, { "type": shipheart_type_source_batteries, "id": Number(res[0]), "libelle": qsTr("‣ Parc de batteries : %1").arg(res[1]) }); } else break; } //---------------------------------------------------- // Recherche des capteurs affectés à ce module : req = 'SELECT Cle_primaire, Nom FROM TB_Capteurs WHERE Adresse_module=' + adresse_module + ' '; //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout du capteur à la liste des usages : modele_usage.append({ "type": shipheart_type_source_capteurs, "id": Number(res[0]), "libelle": qsTr("‣ Capteur : %1").arg(res[1]) }); } else break; } break; //======================================================== case shipheart_type_module_shipbase: // On ne peut pas supprimer ShipBase.... default: break; } //----------------------------------------------------------------------------------- // Traitement récursif(*) de toutes les entrées de la liste des usages : // (*) : chaque recherche identifiant un élément lié au module en cours ajoute l'élément // à la liste en cours d'analyse. Le nouvel élément sera donc lui aussi analysé à la fin // pour déterminer si d'autres éléments lui sont liés. // NB : On vérifie à chaque ajout si l'élément n'est pas déjà présent afin d'éviter les risques // de boucles infinies... //----------------------------------------------------------------------------------- for (s = 0; s < modele_usage.count; s++) { //console.log("Boucle sur type:" + modele_usage.get(s).type + " / id:" + modele_usage.get(s).id); switch(modele_usage.get(s).type) { //====================================== case shipheart_type_source_circuits: //------------------------------------------------------------------------------------------------ // Recherche de events qui utilisent le circuit comme déclencheur OU dans leurs 'Actions_circuits' : req = 'SELECT Cle_primaire, Nom FROM TB_Events WHERE '; req += ' (Type_source=' + shipheart_type_source_circuits + ' AND ID_Source=' + modele_usage.get(s).id + ') '; req += ' OR '; req += ' (Action_circuits LIKE "' + modele_usage.get(s).id + '/%")'; // Cas où le n° d'ID apparait en première position dans la liste (ex. avec '123' : "123/1;12/1;..." req += ' OR '; req += ' (Action_circuits LIKE "%;' + modele_usage.get(s).id + '/%")'; // Cas où le n° d'ID n'est pas en première position dans la liste (ex. avec '123' : "5/1;123/1;..." //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout de l'event à la liste des usages : ajout_modele_usage(shipheart_type_source_events, Number(res[0]), qsTr("‣ Evènement : %1").arg(res[1]) ); } else break; } //------------------------------------------------------------------------------------------------ // Recherche de capteurs qui utilisent le circuit : req = 'SELECT Cle_primaire, Nom FROM TB_Capteurs WHERE '; req += ' (Type_entrees=' + shipheart_capteur_type_entrees_calculee_booleen + ' OR Type_entrees=' + shipheart_capteur_type_entrees_calculee_numerique + ') '; req += ' AND '; req += ' (Entrees LIKE "%/' + shipheart_type_source_circuits + ':' + modele_usage.get(s).id + '/%")'; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout du capteur à la liste des usages : ajout_modele_usage(shipheart_type_source_capteurs, Number(res[0]), qsTr("‣ Capteur : %1").arg(res[1]) ); } else break; } break; //====================================== case shipheart_type_source_capteurs: //------------------------------------------------------------------------------------------------ // Recherche de events qui utilisent le capteur comme déclencheur : req = 'SELECT Cle_primaire, Nom FROM TB_Events WHERE '; req += ' (Type_source=' + shipheart_type_source_capteurs + ' AND ID_Source=' + modele_usage.get(s).id + ') '; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout de l'event à la liste des usages : ajout_modele_usage(shipheart_type_source_events, Number(res[0]), qsTr("‣ Evènement : %1").arg(res[1]) ); } else break; } //------------------------------------------------------------------------------------------------ // Recherche de capteurs qui utilisent le capteur : req = 'SELECT Cle_primaire, Nom FROM TB_Capteurs WHERE '; req += ' (Type_entrees=' + shipheart_capteur_type_entrees_calculee_booleen + ' OR Type_entrees=' + shipheart_capteur_type_entrees_calculee_numerique + ') '; req += ' AND '; req += ' (Entrees LIKE "%/' + shipheart_type_source_capteurs + ':' + modele_usage.get(s).id + '/%")'; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout du capteur à la liste des usages : ajout_modele_usage(shipheart_type_source_capteurs, Number(res[0]), qsTr("‣ Capteur : %1").arg(res[1]) ); } else break; } break; //====================================== case shipheart_type_source_reservoirs: //------------------------------------------------------------------------------------------------ // Recherche de events qui utilisent le réservoir comme déclencheur : req = 'SELECT Cle_primaire, Nom FROM TB_Events WHERE '; req += ' (Type_source=' + shipheart_type_source_reservoirs + ' AND ID_Source=' + modele_usage.get(s).id + ') '; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout de l'event à la liste des usages : ajout_modele_usage(shipheart_type_source_events, Number(res[0]), qsTr("‣ Evènement : %1").arg(res[1]) ); } else break; } //------------------------------------------------------------------------------------------------ // Recherche de capteurs qui utilisent le réservoir : req = 'SELECT Cle_primaire, Nom FROM TB_Capteurs WHERE '; req += ' (Type_entrees=' + shipheart_capteur_type_entrees_calculee_booleen + ' OR Type_entrees=' + shipheart_capteur_type_entrees_calculee_numerique + ') '; req += ' AND '; req += ' (Entrees LIKE "%/' + shipheart_type_source_reservoirs + ':' + modele_usage.get(s).id + '/%")'; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout du capteur à la liste des usages : ajout_modele_usage(shipheart_type_source_capteurs, Number(res[0]), qsTr("‣ Capteur : %1").arg(res[1]) ); } else break; } break; //====================================== case shipheart_type_source_batteries: //------------------------------------------------------------------------------------------------ // Recherche de events qui utilisent la batterie comme déclencheur : req = 'SELECT Cle_primaire, Nom FROM TB_Events WHERE '; req += ' (Type_source=' + shipheart_type_source_batteries + ' AND ID_Source=' + modele_usage.get(s).id + ') '; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout de l'event à la liste des usages : ajout_modele_usage(shipheart_type_source_events, Number(res[0]), qsTr("‣ Evènement : %1").arg(res[1]) ); } else break; } //------------------------------------------------------------------------------------------------ // Recherche de capteurs qui utilisent la batterie : req = 'SELECT Cle_primaire, Nom FROM TB_Capteurs WHERE '; req += ' (Type_entrees=' + shipheart_capteur_type_entrees_calculee_booleen + ' OR Type_entrees=' + shipheart_capteur_type_entrees_calculee_numerique + ') '; req += ' AND '; req += ' (Entrees LIKE "%/' + shipheart_type_source_batteries + ':' + modele_usage.get(s).id + '/%")'; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout du capteur à la liste des usages : ajout_modele_usage(shipheart_type_source_capteurs, Number(res[0]), qsTr("‣ Capteur : %1").arg(res[1]) ); } else break; } break; //====================================== case shipheart_type_source_modules: default: break; } } //------------------------------------------------------------- // Création du texte d'utilisation des circuits : var usage = ""; for (i=0; i
Confirmez-vous la suppression ?

") for (i=0; i