//======================================================================================================================================================================== // CONFIG_RESERVOIR.QML // Ce fichier traite la configuration d'un réservoir. La page permet notamment de : // - Modifier la config du réservoir (ou de le créer la première fois), // - Supprimer le réservoir // La page est appelée depuis la page config_reservoirs_1, en cliquant sur le réservoir à modifier (ou sur le '+' en vue de sa création) //======================================================================================================================================================================== import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQml.Models import qt.koriolan.shipheart 1.0 import"fonctions.js" as Fonctions import"fonctions_reservoirs.js" as Fonctions_reservoirs Shipheart_page { id: page_config_reservoir // 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.5 readonly property double pourcentage_largeur_unites_formulaire: 0.1 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 // Affichage : // 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 id_reservoir: 0 property int adresse_module_init: 0 property int adresse_module: 0 // Contient l'adresse du module supportant la ou les entrées affectées à ce réservoir property int type_entrees_init: 0 // Contient le type d'entrées configuré pour ce réservoir lors de l'init (permet, si cette valeur varie, de forcer un recalcul de la Liste_valeurs_niveaux). property int type_entrees: 0 property string entrees_init: "" property string entrees: "" property int mode_entrees_init: 0 // Utile pour un réservoir en mode 'Entrée Level Sensor'. Contient le mode de cette entrée configuré lors de l'init ((permet, si ce nombre varie, de forcer un recalcul de la Liste_valeurs_niveaux). property int mode_entrees: 0 property int type_sonde_entrees_init: 0 // Utile pour un réservoir en mode 'Entrée Level Sensor'. Contient le sous_mode de cette entrée configuré lors de l'init ((permet, si ce nombre varie, de forcer un recalcul de la Liste_valeurs_niveaux). property int type_sonde_entrees: 0 property int nb_entrees_reservoir_init: 0 // Utile pour un réservoir en mode 'Entrées AUX'. Contient le nombre d'entrées configurées pour ce réservoir lors de l'init (permet, si ce nombre varie, de forcer un recalcul de la Liste_valeurs_niveaux). property int nb_entrees_reservoir: 0 property int entree_en_cours: 0 // property int creation_no_carte: 0 // property int creation_no_circuit_carte: 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 : //=========================================================== 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 { } } } //=========================================================== // 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_reservoir(); // 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 } } } } } // Titre de la page : Shipheart_titre_1 {titre: (id_reservoir === 0) ? qsTr("Création d'un réservoir") : qsTr("Configuration du réservoir"); 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 : Nom 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("Nom du réservoir") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Nom.text !== "") ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_textfield { id: champ_formulaire_Nom 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 : Famille 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("Famille de réservoirs") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Famille.currentIndex !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Famille model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Capacite Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (champ_formulaire_Famille.currentIndex !== 0) Shipheart_formulaire_label { text: qsTr("Capacité du réservoir") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (Number(champ_formulaire_Capacite.text) !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_textfield { id: champ_formulaire_Capacite width: parent.width * (1 - pourcentage_largeur_labels_formulaire - pourcentage_largeur_unites_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire flag_num_only: true } Shipheart_formulaire_unite { // Unités : text: qsTr("litres") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Type d'entrées Rectangle { width: parent.width height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (Number(champ_formulaire_Capacite.text) !== 0) Shipheart_formulaire_label { text: qsTr("Type de capteur de niveau") width: parent.width * pourcentage_largeur_labels_formulaire couleur: ((champ_formulaire_Type_entrees.currentIndex !== 0) && (nb_entrees_reservoir !== 0)) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Type_entrees model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { //console.log("Valeur courante=" + model.get(currentIndex).valeur + "/init=" + type_entrees_init + " mode courant=" + model.get(currentIndex).mode + " /init=" + mode_reservoir_init + " sous_mode courant=" + model.get(currentIndex).sous_mode + " /init=" + sous_mode_reservoir); shipheart_clic(); if (id_reservoir !== 0) // Si on change de type de capteur alors qu'on est sur une modification de réservoir existant, on alerte avant de valider la saisie : { boite_alerte_changement_type_capteur.open(); } else // En création, on applique de suite le nouveau type d'entrée : { type_entrees = model.get(currentIndex).valeur; mode_entrees = model.get(currentIndex).mode; type_sonde_entrees = model.get(currentIndex).sous_mode; if (type_entrees === shipheart_reservoir_type_entrees_aux) init_entrees_aux(); else if (type_entrees === shipheart_reservoir_type_entrees_level_sensor) init_entrees_level_sensor(); } } } } //------------------------------------------------------------------------------- // Ligne de formulaire : Choix des entrées Auxiliaires Rectangle { width: parent.width height: visible ? (hauteur_ligne_formulaire * 2) : 0 visible: (type_entrees === shipheart_reservoir_type_entrees_aux) color: "transparent" GridView { id: entrees_aux_reservoir_grid width: parent.width height: parent.height anchors.verticalCenter: parent.verticalCenter; cellWidth: (width / 4) - 1 // Ce choix permet de laisser une zone libre à droite pour le scrollbar (nb : le '-1' est x 4 cells...) cellHeight: height / 2 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: ListModel { } delegate: Rectangle { width: entrees_aux_reservoir_grid.cellWidth - 5 height: entrees_aux_reservoir_grid.cellHeight - 5 radius: shipheart_rayon_bouton color: couleur_gris_tres_fonce_transparent Text { anchors.fill: parent horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter text: (model.no_entree_aux === 0) ? qsTr("%1 : Non définie").arg(model.no) : qsTr("%1 : %2").arg(model.no).arg(model.libelle) color: (model.no_entree_aux === 0) ? couleur_gris_tres_pale_transparent : couleur_blanc_casse font.pixelSize: 15 wrapMode: Label.Wrap } Text { anchors.fill: parent horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignBottom bottomPadding: 5 text: qsTr("Sonde la plus basse dans le réservoir") color: (model.no_entree_aux === 0) ? couleur_gris_tres_pale : couleur_blanc_casse font.pixelSize: 10 visible: model.no === 1 } MouseArea { id: mouse_area_entree_aux anchors.fill: parent onClicked: { shipheart_clic(); entree_en_cours = model.no; boite_selection_entree_aux.nom_equipement = Fonctions.nom_type_equipement(shipheart_source_mesure_reservoir); boite_selection_entree_aux.open(); } } } ScrollBar.vertical: ScrollBar { policy: ScrollBar.AlwaysOn } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Choix de l'entrées Level Sensor Rectangle { width: parent.width height: visible ? (hauteur_ligne_formulaire * 1) : 0 visible: (type_entrees === shipheart_reservoir_type_entrees_level_sensor) color: "transparent" GridView { id: entree_level_sensor_reservoir_grid width: parent.width * (1 - pourcentage_largeur_labels_formulaire); height: parent.height - 10 anchors.verticalCenter: parent.verticalCenter; anchors.right: parent.right cellWidth: width cellHeight: 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: ListModel { } delegate: Rectangle { width: entree_level_sensor_reservoir_grid.cellWidth height: entree_level_sensor_reservoir_grid.cellHeight radius: shipheart_rayon_bouton color: couleur_gris_tres_fonce_transparent Text { anchors.fill: parent horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter text: (model.no_entree_level_sensor === 0) ? qsTr("Non définie") : model.libelle color: (model.no_entree_level_sensor === 0) ? couleur_gris_tres_pale_transparent : couleur_blanc_casse font.pixelSize: 15 wrapMode: Label.Wrap } MouseArea { id: mouse_area_entree_level_sensor anchors.fill: parent onClicked: { shipheart_clic(); entree_en_cours = model.no; boite_selection_entree_level_sensor.open(); } } } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Logique inversée des entrées AUX Rectangle { id: ligne_logique_inversee width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 visible: (type_entrees === shipheart_reservoir_type_entrees_aux) color: "transparent" Shipheart_formulaire_label { text: qsTr("Logique des entrées inversée") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_checkbox { id: champ_formulaire_Logique_inversee width: parent.width * (1 - pourcentage_largeur_labels_formulaire) } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Logique Rectangle { width: parent.width height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (champ_formulaire_Type_entrees.currentIndex !== 0) && (nb_entrees_reservoir !== 0) Shipheart_formulaire_label { text: qsTr("Logique d'alarme") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_combobox { id: champ_formulaire_Logique model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Niveau_coeff_filtrage Rectangle { width: parent.width height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (champ_formulaire_Type_entrees.currentIndex !== 0) && (nb_entrees_reservoir !== 0) Shipheart_formulaire_label { text: qsTr("Filtrage des mesures") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_combobox { id: champ_formulaire_Niveau_coeff_filtrage model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); } } 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/créer //....................................................... Rectangle { id: bouton_enregistrer_creer width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: // (!clavier.active) && // SDIR #255 (champ_formulaire_Nom.text !== "") && (champ_formulaire_Famille.currentIndex !== 0) && (nb_entrees_reservoir !== 0) && (champ_formulaire_Type_entrees.currentIndex !== 0) && (Number(champ_formulaire_Capacite.text) !== 0) Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: (id_reservoir === 0) ? qsTr("Créer le réservoir") : qsTr("Enregistrer") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); if (id_reservoir !== 0) mise_a_jour_reservoir(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte. else creation_reservoir(); timer_tempo_reconfiguration.restart(); } } } //....................................................... // Bouton de suppression //....................................................... Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: (!clavier.active) && (id_reservoir !== 0) 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; } } } //....................................................... // Bouton d'accès à la config de la courbe de conversion //....................................................... Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: (!flag_init) && (bouton_enregistrer_creer.visible) && (id_reservoir !== 0) && (champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur === type_entrees_init) && (champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).mode === mode_entrees_init) && (champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).sous_mode === type_sonde_entrees_init) && (nb_entrees_reservoir === nb_entrees_reservoir_init) Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: qsTr("Etalonnage") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); stackView.push("config_valeurs_niveaux.qml", {"table": "TB_Reservoirs", "id": id_reservoir}) } } } 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) - parent.leftPadding - (parent.spacing / 2) 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() } } } } //------------------------------------------------------- // Boite de sélection entrée aux : //------------------------------------------------------- Shipheart_boite_dialogue_entrees_aux { id: boite_selection_entree_aux boutonAnnuler: true boutonAnnulerTexte: "Annuler" onClicked: { //console.log("Le Bouton [" + bouton + "] est appuyé"); if (bouton === shipheart_boite_dialogue_bouton_1) { var groupe = recherche_groupe_entree_aux(no_entree - 1); if (modele_entrees_aux.get(groupe).valeurs.get((no_entree - 1) % 4).no_entree === entree_en_cours) // Si on reclique sur l'entrée déjà affectée, on supprime l'affectation. { entrees_aux_reservoir_grid.model.set((entree_en_cours - 1), {"no_entree_aux" : 0, "libelle": ""}); modele_entrees_aux.get(groupe).valeurs.set(((no_entree - 1) % 4), {"used": 0, "no_entree": 0}); nb_entrees_reservoir --; } else // Si on clique sur une autre entrée... { // ... on vérifie si le n° était déjà affecté à une entrée aux. Si oui, on supprime cette affectation avant de créer la nouvelle : var i = entrees_aux_reservoir_grid.model.get(entree_en_cours - 1).no_entree_aux; if (i !== 0) { var g = recherche_groupe_entree_aux(i - 1); modele_entrees_aux.get(g).valeurs.set(((i - 1) % 4), {"used": 0, "no_entree": 0}); nb_entrees_reservoir --; } // On met ensuite à jour la nouvelle affectation : entrees_aux_reservoir_grid.model.set((entree_en_cours - 1), {"no_entree_aux" : no_entree, "libelle": qsTr("AUX INPUT %1").arg(no_entree)}); modele_entrees_aux.get(groupe).valeurs.set(((no_entree - 1) % 4), {"used": 1, "no_entree": entree_en_cours}); nb_entrees_reservoir ++; } boite_selection_entree_aux.close(); } } } ListModel { id: modele_entrees_aux } //------------------------------------------------------- // Boite de sélection entrée Level Sensor : //------------------------------------------------------- Shipheart_boite_dialogue_entrees_level_sensor { id: boite_selection_entree_level_sensor boutonAnnuler: true boutonAnnulerTexte: "Annuler" onClicked: { //console.log("Le Bouton [" + bouton + "] est appuyé"); if (bouton === shipheart_boite_dialogue_bouton_1) { //console.log("Retour de choix d'entrée Level Sensor = " + no_entree + " et no_en_cours = " + no_entree_en_cours); var groupe = recherche_groupe_entree_level_sensor(no_entree - 1); if (modele_entrees_level_sensor.get(groupe).valeurs.get((no_entree - 1) % 4).no_entree === entree_en_cours) // Si on reclique sur l'entrée déjà affectée, on supprime l'affectation. { entree_level_sensor_reservoir_grid.model.set((entree_en_cours - 1), {"no_entree_level_sensor" : 0, "libelle": ""}); modele_entrees_level_sensor.get(groupe).valeurs.set(((no_entree - 1) % 4), {"used": 0, "no_entree": 0}); nb_entrees_reservoir --; } else // Si on clique sur une autre entrée... { // ... on vérifie si le n° était déjà affecté à une entrée level sensor. Si oui, on supprime cette affectation avant de créer la nouvelle : var i = entree_level_sensor_reservoir_grid.model.get(entree_en_cours - 1).no_entree_level_sensor; if (i !== 0) { var g = recherche_groupe_entree_level_sensor(i - 1); modele_entrees_level_sensor.get(g).valeurs.set(((i - 1) % 4), {"used": 0, "no_entree": 0}); nb_entrees_reservoir --; } // On met ensuite à jour la nouvelle affectation : entree_level_sensor_reservoir_grid.model.set((entree_en_cours - 1), {"no_entree_level_sensor" : no_entree, "libelle": qsTr("LEVEL SENSOR %1").arg(no_entree)}); modele_entrees_level_sensor.get(groupe).valeurs.set(((no_entree - 1) % 4), {"used": 1, "no_entree": entree_en_cours}); nb_entrees_reservoir ++; } boite_selection_entree_level_sensor.close(); } } } ListModel { id: modele_entrees_level_sensor } //------------------------------------------------------- // Boite d'alerte changement type capteur : //------------------------------------------------------- Shipheart_boite_dialogue { id: boite_alerte_changement_type_capteur niveau: 2 imageTitreSource: "/images/attention.png" message: qsTr("La modification du type de capteur va nécessiter la remise en configuration usine de tous les paramètres du réservoir.

Si vous ne souhaitez pas que cette reconfiguration soit effectuée, cliquez sur ANNULER.

Sinon, cliquez sur CONFIRMER pour valider le changement."); boutonAnnuler: true boutonOkTexte: qsTr("Confirmer") onClicked: { //console.log("Le Bouton [" + bouton + "] est appuyé"); if (bouton === shipheart_boite_dialogue_bouton_1) { if (champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur !== type_entrees) { // RAZ des entrées si on a change de type (il est dangereux de garder des n° d'entrées AUX pour les considérer comme des entrées Level Sensor ou réciproquement...) : if (champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur !== type_entrees_init) { entrees = ""; nb_entrees_reservoir = 0; } else // Si on revient au type d'entrée initial, on reprend les entrées initiales : { entrees = entrees_init; nb_entrees_reservoir = nb_entrees_reservoir_init; } type_entrees = champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur; } mode_entrees = champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).mode; // Le fait de changer de Mode_entrees ne nécessite pas de RAZ le n° d'entrée qui reste, a priori, valable type_sonde_entrees = champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).sous_mode; // Le fait de changer de type_sonde_entrees ne nécessite pas de RAZ le n° d'entrée qui reste, a priori, valable if (type_entrees === shipheart_reservoir_type_entrees_aux) init_entrees_aux(); else if (type_entrees === shipheart_reservoir_type_entrees_level_sensor) init_entrees_level_sensor(); } if (bouton === shipheart_boite_dialogue_bouton_2) { // Repositionnement à la valeur d'origine : champ_formulaire_Type_entrees.currentIndex = recherche_index_type_entree(type_entrees, mode_entrees, type_sonde_entrees); } } } //------------------------------------------------------- // Boite d'info : //------------------------------------------------------- Shipheart_boite_dialogue { id: boite_information } //=========================================================== // Busy Indicator : //=========================================================== Shipheart_busy_indicator { id: busy_indicator running: timer_tempo_reconfiguration.running } // 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 nb; var i; var niveau_coeff_filtrage, defaut_niveau_coeff_filtrage = 16; var logique, defaut_logique = -1; var id_famille; //console.log("Id du réservoir = " + id_reservoir); if (id_reservoir > 0) // Cas d'une modification de circuit existant : { req = 'SELECT Nom, '; req += ' Adresse_module, '; req += ' Type_entrees, '; req += ' Entrees, '; req += ' Mode_entrees, '; req += ' Type_sonde_entrees, '; req += ' ID_Famille, '; req += ' Niveau_coeff_filtrage, '; req += ' Liste_valeurs_niveaux, '; req += ' Capacite, '; req += ' Logique '; req += ' FROM TB_Reservoirs '; req += ' WHERE Cle_primaire=' + id_reservoir + ' '; //console.log("req = [ " + req + "; ]"); res = bdd.requete_unique(req); //--------------------------------------------------------------- // Mise à jour du champs de saisie de chaque zone de formulaire : i = 0; champ_formulaire_Nom.text = res[i ++]; adresse_module = Number(res[i ++]); type_entrees = Number(res[i ++]); entrees = res[i ++]; mode_entrees = Number(res[i ++]); type_sonde_entrees = Number(res[i ++]); id_famille = Number(res[i ++]); niveau_coeff_filtrage = Number(res[i ++]); i++; // liste valeurs niveaux non utilisée ici (soit on n'y touche pas quand on ne change pas le nombre d'entrées du réservoir ; soit on la regénère automatiquement si changement de nombre d'entrées) champ_formulaire_Capacite.text = res[i ++]; logique = Number(res[i ++]); } else // Cas d'une création de circuit : { adresse_module = 0; type_entrees = 0; entrees = ""; mode_entrees = 0; type_sonde_entrees = 0; champ_formulaire_Nom.text = ""; id_famille = 0; champ_formulaire_Capacite.text = "0"; niveau_coeff_filtrage = defaut_niveau_coeff_filtrage; logique = defaut_logique; } // Init des entrés selon leur type ; if (type_entrees === shipheart_reservoir_type_entrees_aux) init_entrees_aux(); else if (type_entrees === shipheart_reservoir_type_entrees_level_sensor) init_entrees_level_sensor(); // Mémorisation des valeurs d'init : adresse_module_init = adresse_module; type_entrees_init = type_entrees; entrees_init = entrees; nb_entrees_reservoir_init = nb_entrees_reservoir; mode_entrees_init = mode_entrees; type_sonde_entrees_init = type_sonde_entrees; //--------------------------------------------------------------------------------------- // Type d'entrées : champ_formulaire_Type_entrees.model.clear(); champ_formulaire_Type_entrees.model.append({"valeur": 0, "mode": 0, "sous_mode": 0, "texte": qsTr("Non défini") }); champ_formulaire_Type_entrees.model.append({"valeur": shipheart_reservoir_type_entrees_aux, "mode": 0, "sous_mode": 0, "texte": qsTr("Electrodes plongées ou contacts secs") }); champ_formulaire_Type_entrees.model.append({"valeur": shipheart_reservoir_type_entrees_level_sensor, "mode": 2, "sous_mode": 1, "texte": qsTr("Résistif 0 - 190Ω") }); champ_formulaire_Type_entrees.model.append({"valeur": shipheart_reservoir_type_entrees_level_sensor, "mode": 2, "sous_mode": 2, "texte": qsTr("Résistif 240 - 30Ω") }); champ_formulaire_Type_entrees.model.append({"valeur": shipheart_reservoir_type_entrees_level_sensor, "mode": 2, "sous_mode": 0, "texte": qsTr("Résistif 0 - 700Ω") }); champ_formulaire_Type_entrees.model.append({"valeur": shipheart_reservoir_type_entrees_level_sensor, "mode": 3, "sous_mode": 0, "texte": qsTr("Boucle de courant 4 - 20mA") }); champ_formulaire_Type_entrees.model.append({"valeur": shipheart_reservoir_type_entrees_level_sensor, "mode": 1, "sous_mode": 0, "texte": qsTr("Tension 0 - 10V") }); // Positionnement de l'index sur la valeur en cours : champ_formulaire_Type_entrees.currentIndex = recherche_index_type_entree(type_entrees, mode_entrees, type_sonde_entrees); //--------------------------------------------------------------------------------------- // Logique inversée des entrées AUX : if (type_entrees === shipheart_reservoir_type_entrees_aux) { if (mode_entrees === shipheart_reservoir_mode_entrees_aux_inverse) champ_formulaire_Logique_inversee.checked = true; else champ_formulaire_Logique_inversee.checked = false; } //--------------------------------------------------------------------------------------- // Coefficient de filtrage des mesures (valeur en nombre d'échantillons ; mini = 1): champ_formulaire_Niveau_coeff_filtrage.model.clear(); champ_formulaire_Niveau_coeff_filtrage.model.append({"valeur": 1, "texte": qsTr("Aucun filtrage") }); champ_formulaire_Niveau_coeff_filtrage.model.append({"valeur": 4, "texte": qsTr("Très faible") }); champ_formulaire_Niveau_coeff_filtrage.model.append({"valeur": 8, "texte": qsTr("Faible") }); champ_formulaire_Niveau_coeff_filtrage.model.append({"valeur": defaut_niveau_coeff_filtrage, "texte": qsTr("Moyen") }); champ_formulaire_Niveau_coeff_filtrage.model.append({"valeur": 64, "texte": qsTr("Elevé") }); champ_formulaire_Niveau_coeff_filtrage.model.append({"valeur": 96, "texte": qsTr("Très élevé") }); // Positionnement de l'index sur la valeur en cours : i = recherche_index_valeur_modele(niveau_coeff_filtrage, champ_formulaire_Niveau_coeff_filtrage.model, "Niveau_coeff_filtrage"); if (i === -1) champ_formulaire_Niveau_coeff_filtrage.currentIndex = recherche_index_valeur_modele(defaut_niveau_coeff_filtrage, champ_formulaire_Niveau_coeff_filtrage.model, "Niveau_coeff_filtrage"); else champ_formulaire_Niveau_coeff_filtrage.currentIndex = i; //--------------------------------------------------------------------------------------- // Logique : champ_formulaire_Logique.model.clear(); champ_formulaire_Logique.model.append({"valeur": defaut_logique, "texte": qsTr("Alerte sur niveau faible") }); champ_formulaire_Logique.model.append({"valeur": 1, "texte": qsTr("Alerte sur niveau élevé") }); // champ_formulaire_Logique.model.append({"valeur": 0, "texte": qsTr("Alerte sur niveau faible ou élevé") }); // Positionnement de l'index sur la valeur en cours : i = recherche_index_valeur_modele(logique, champ_formulaire_Logique.model, "Logique"); if (i === -1) champ_formulaire_Logique.currentIndex = recherche_index_valeur_modele(defaut_logique, champ_formulaire_Logique.model, "Logique"); else champ_formulaire_Logique.currentIndex = i; //--------------------------------------------------------------------------------------- // Famille : champ_formulaire_Famille.model.clear(); champ_formulaire_Famille.model.append({"valeur": 0, "texte": "Non défini" }); req = 'SELECT Cle_primaire, Nom FROM TB_Familles WHERE Type_source=' + shipheart_type_source_reservoirs + ' ORDER BY Priorite_affichage '; //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { champ_formulaire_Famille.model.append({"valeur": Number(res[0]), "texte": res[1] }); } } // Positionnement de l'index sur la valeur en cours : i = recherche_index_valeur_modele(id_famille, champ_formulaire_Famille.model, "Famille"); if (i === -1) champ_formulaire_Famille.currentIndex = 0; else champ_formulaire_Famille.currentIndex = i; flag_init = false; } //============================================================================================================= // Init des valeurs initiales des modèles liées aux entrées du réservoir lorsqu'il est dans l'un des modes utilisant les entrées AUX // Il est important de noter l'utilisation de DEUX modèles de données : // - 'entrees_aux_reservoir_grid.model' qui contient (a priori) 12 entrées ; chacune représentant l'une des entrée // configurée sur ce réservoir. // - 'modele_entrees_aux' qui contient les 32 AUX INPUTS disponibles sur ShipBase. //============================================================================================================= function init_entrees_aux() { var req, res; var nb; var i; var val; var chaines_entrees = []; // Traitement de la chaine "entrees" pour définir les entrées actuelles du réservoir : if (entrees !== "") { chaines_entrees = entrees.split(';'); nb_entrees_reservoir = chaines_entrees.length; } else { chaines_entrees[0] = ""; nb_entrees_reservoir = 0; } //--------------------------------------------------------------------------------------- // Entrées réservoir : // Les 12 entrées qui sont affectables au réservoir entrees_aux_reservoir_grid.model.clear(); for (i = 0; i < shipheart_reservoir_max_nombre_entrees_aux; i ++) { if (i < nb_entrees_reservoir) val = Number(chaines_entrees[i]); else val = 0; entrees_aux_reservoir_grid.model.append({"no": (i + 1), "no_entree_aux" : val, "libelle": (val === 0) ? "FFFFF" : qsTr("AUX INPUT %1").arg(val) }); } //--------------------------------------------------------------------------------------- // Entrées auxiliaires : // Les 32 entrées AUX de ShipBase par exemple var entrees_aux = []; // remplissage par défaut de toutes les entrées AUX possibles : for (i=0; i= 1) && (no <= shipheart_entrees_aux_max_nombre)) entrees_aux[no - 1]['used'] = 1; // le n° d'entrée doit être dans [1; 32] } } } modele_entrees_aux.clear(); i = 17; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); i = 21; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); i = 25; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); i = 29; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); i = 1; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); i = 5; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); i = 9; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); i = 13; modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] }, {no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] }, {no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] }, {no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } ); } //============================================================================================================= // Init des valeurs initiales des modèles liées aux entrées du réservoir lorsqu'il est dans l'un des modes utilisant une entrée Level Sensor //============================================================================================================= function init_entrees_level_sensor() { var req, res; var nb; var i; var entree; // Traitement de la chaine "entrees" pour définir les entrées actuelles du réservoir : if (entrees !== "") { entree = Number(entrees); nb_entrees_reservoir = 1; } else { entree = 0; nb_entrees_reservoir = 0; } //--------------------------------------------------------------------------------------- // Entrée réservoir : entree_level_sensor_reservoir_grid.model.clear(); entree_level_sensor_reservoir_grid.model.append({"no": 1, "no_entree_level_sensor" : entree, "libelle": (entree === 0) ? "" : qsTr("LEVEL SENSOR %1").arg(entree) }); //--------------------------------------------------------------------------------------- // Entrées Level Sensor : var entrees_level_sensor = []; for (i=0; i= 1) && (no <= shipheart_entrees_level_sensor_max_nombre)) entrees_level_sensor[no - 1]['used'] = 1; } } modele_entrees_level_sensor.clear(); i = 1; modele_entrees_level_sensor.append({valeurs: [{no: i, used: entrees_level_sensor[i-1]['used'], no_entree: entrees_level_sensor[i-1]['no_entree'] }, {no: (i+1), used: entrees_level_sensor[i+0]['used'], no_entree: entrees_level_sensor[i+0]['no_entree'] }, {no: (i+2), used: entrees_level_sensor[i+1]['used'], no_entree: entrees_level_sensor[i+1]['no_entree'] }, {no: (i+3), used: entrees_level_sensor[i+2]['used'], no_entree: entrees_level_sensor[i+2]['no_entree'] }] } ); i = 5; modele_entrees_level_sensor.append({valeurs: [{no: i, used: entrees_level_sensor[i-1]['used'], no_entree: entrees_level_sensor[i-1]['no_entree'] }, {no: (i+1), used: entrees_level_sensor[i+0]['used'], no_entree: entrees_level_sensor[i+0]['no_entree'] }, {no: (i+2), used: entrees_level_sensor[i+1]['used'], no_entree: entrees_level_sensor[i+1]['no_entree'] }, {no: (i+3), used: entrees_level_sensor[i+2]['used'], no_entree: entrees_level_sensor[i+2]['no_entree'] }] } ); } //============================================================================================================= // Mise à jour des valeurs saisies du réservoir //============================================================================================================= function mise_a_jour_reservoir() { var req; var i, j; var chaine_entrees = ""; var groupe; // Création de la chaine représentant les n° d'entrées utilisées par le réservoir : //------------------------------------------------------------------------------------------------------- if (type_entrees === shipheart_reservoir_type_entrees_aux) { for (i = 0; i < shipheart_reservoir_max_nombre_entrees_aux; i ++) { j = entrees_aux_reservoir_grid.model.get(i).no_entree_aux if (j !== 0) { if (chaine_entrees === "") chaine_entrees = j; else chaine_entrees += ';' + j; } } //console.log("chaine entrées = " + chaine_entrees); // Mise à jour du champ Mode_entrees en fonction de la check-box d'inversion des entrées AUX : // Pour mémoire, le champ 'Mode_entrees' : Si Type_entrees=1, 0=Normal, 1=logique inversée sur les entrées. if (champ_formulaire_Logique_inversee.checked) mode_entrees = shipheart_reservoir_mode_entrees_aux_inverse; else mode_entrees = shipheart_reservoir_mode_entrees_aux_normal; } //------------------------------------------------------------------------------------------------------- else if (type_entrees === shipheart_reservoir_type_entrees_level_sensor) { j = entree_level_sensor_reservoir_grid.model.get(0).no_entree_level_sensor if (j !== 0) { chaine_entrees = j; } else return; // On ne peut pas enregistrer un réservoir avec un # de Level sensor = 0 //console.log("chaine entrées = " + chaine_entrees); } // Mise à jour de l'entrée dans TB_Réservoirs : req = 'UPDATE TB_Reservoirs SET Nom="' + champ_formulaire_Nom.text + '" '; req += ', Adresse_module=' + adresse_module; req += ', Type_entrees=' + type_entrees; // champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur; req += ', Entrees="' + chaine_entrees + '" '; req += ', Mode_entrees=' + mode_entrees; req += ', Type_sonde_entrees=' + type_sonde_entrees; req += ', ID_Famille=' + champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur; req += ', Niveau_coeff_filtrage=' + champ_formulaire_Niveau_coeff_filtrage.model.get(champ_formulaire_Niveau_coeff_filtrage.currentIndex).valeur; req += ', Capacite=' + Number(champ_formulaire_Capacite.text); req += ', Logique=' + champ_formulaire_Logique.model.get(champ_formulaire_Logique.currentIndex).valeur; if (type_entrees === shipheart_reservoir_type_entrees_aux) { if (nb_entrees_reservoir_init !== nb_entrees_reservoir) req += ', Liste_valeurs_niveaux="' + Fonctions_reservoirs.chaine_valeur_niveau_reservoir_usine(shipheart_reservoir_type_entrees_aux, nb_entrees_reservoir) + '" '; // On ne met à jour la table d'étalonnage que si le nombre d'entrées à changé... } else if (type_entrees === shipheart_reservoir_type_entrees_level_sensor) { if ((mode_entrees_init !== champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).mode) || (type_sonde_entrees_init !== champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).sous_mode)) { req += ', Liste_valeurs_niveaux="' + Fonctions_reservoirs.chaine_valeur_niveau_reservoir_usine(shipheart_reservoir_type_entrees_level_sensor, champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).mode, champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).sous_mode) + '" '; // On ne met à jour la table d'étalonnage que si le mode ou le sous-mode à changé... } } req += ' WHERE Cle_primaire=' + id_reservoir + ' ' //console.log("req = [ " + req + "; ]"); bdd.requete_unique(req); synchro_bdd(shipheart_type_synchro_config); } //============================================================================================================= // Création du réservoir //============================================================================================================= function creation_reservoir() { var req, res; var i, j; var chaine_entrees = ""; var nb_entrees; //----------------------------------------------------------------------------------------------------------- if (type_entrees === shipheart_reservoir_type_entrees_aux) { // Création de la chaine représentant les n° d'entrées utilisées par le réservoir : nb_entrees = 0; for (i = 0; i < shipheart_reservoir_max_nombre_entrees_aux; i ++) { j = entrees_aux_reservoir_grid.model.get(i).no_entree_aux if (j !== 0) { if (chaine_entrees === "") chaine_entrees = j; else chaine_entrees += ';' + j; nb_entrees ++; // Nécessaire pour appeler la fonction 'create_liste_valeurs_niveaux()' } } //console.log("chaine entrées = " + chaine_entrees); // Mise à jour du champ Mode_entrees en fonction de la check-box d'inversion des entrées AUX : // Pour mémoire, le champ 'Mode_entrees' : Si Type_entrees=1, 0=Normal, 1=logique inversée sur les entrées. if (champ_formulaire_Logique_inversee.checked) mode_entrees = shipheart_reservoir_mode_entrees_aux_inverse; else mode_entrees = shipheart_reservoir_mode_entrees_aux_normal; } //----------------------------------------------------------------------------------------------------------- else if (type_entrees === shipheart_reservoir_type_entrees_level_sensor) { // Création de la chaine représentant les n° d'entrées utilisées par le réservoir : j = entree_level_sensor_reservoir_grid.model.get(0).no_entree_level_sensor if (j !== 0) { chaine_entrees = j; } else return; // On ne peut pas créer un réservoir avec un # de Level sensor = 0 } // Création de l'entrée dans TB_Réservoirs : req = 'INSERT INTO TB_Reservoirs '; req += ' (Nom, '; req += ' Adresse_module, '; req += ' Type_entrees, '; req += ' Entrees, '; req += ' Mode_entrees, '; req += ' Type_sonde_entrees, '; req += ' ID_Famille, '; req += ' Niveau_coeff_filtrage, '; req += ' Liste_valeurs_niveaux, '; req += ' Capacite, '; req += ' Logique) ' req += ' VALUES ('; req += ' "' + champ_formulaire_Nom.text + '"'; req += ', ' + adresse_module + ' '; req += ', ' + type_entrees; // champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur; req += ', "' + chaine_entrees + '" '; req += ', ' + mode_entrees + ' '; req += ', ' + type_sonde_entrees + ' '; req += ', ' + champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur; req += ', ' + champ_formulaire_Niveau_coeff_filtrage.model.get(champ_formulaire_Niveau_coeff_filtrage.currentIndex).valeur; if (type_entrees === shipheart_reservoir_type_entrees_aux) req += ', "' + Fonctions_reservoirs.chaine_valeur_niveau_reservoir_usine(shipheart_reservoir_type_entrees_aux, nb_entrees) + '" '; else req += ', "' + Fonctions_reservoirs.chaine_valeur_niveau_reservoir_usine(shipheart_reservoir_type_entrees_level_sensor, champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).mode, champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).sous_mode) + '" '; req += ', ' + Number(champ_formulaire_Capacite.text); req += ', ' + champ_formulaire_Logique.model.get(champ_formulaire_Logique.currentIndex).valeur; req += ') '; //console.log("req = [ " + req + "; ]"); bdd.requete_unique(req); // Mise à jour des entrées (après l'insertion du réservoir pour avoir sa nouvelle clé_primaire) : req = 'SELECT Cle_primaire FROM TB_Reservoirs ORDER BY Cle_primaire DESC LIMIT 1 '; //console.log("req = [ " + req + "; ]"); res = bdd.requete_unique(req); id_reservoir = Number(res[0]); // Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration : synchro_bdd(shipheart_type_synchro_config); } //============================================================================================================= // Check suppression du réservoir //============================================================================================================= function check_avant_suppression() { var req, res; var nb; var i; var message = ""; //========================================================================= // Recherche de l'impact de cette suppression sur les spécifiques clients : switch(Number(shipheart_specifique_client[0])) { //------------------------------------------------------ default: case shipheart_specifique_client_tous: //console.log("Tous les clients") break; //------------------------------------------------------ case shipheart_specifique_client_suncy: //console.log("Client Suncy") break; } //========================================================================= // Recherche de l'impact de cette suppression sur les évènements : req = 'SELECT Cle_primaire, Nom FROM TB_Events WHERE Type_source=' + shipheart_source_mesure_reservoir + ' AND ID_Source=' + id_reservoir + ' '; req += ' ORDER BY Nom'; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); if (nb > 0) { if (nb === 1) message += "

" + qsTr("Ce réservoir est utilisé par l'évènement ci-dessous.
Vous devez modifier ou supprimer cet évènement pour qu'il ne dépende plus de ce réservoir avant de pouvoir le supprimer.") + "

"; else message += "

" + qsTr("Ce réservoir est utilisé par les %1 évènements ci-dessous.
Vous devez modifier ou supprimer ces évènements pour qu'ils ne dépendent plus de ce réservoir avant de pouvoir le supprimer.").arg(nb) + "

"; for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { message += "‣ " + (i+1) + " : " + res[1] + "
"; } } } //========================================================================= // Recherche de l'impact de cette suppression sur les capteurs calculés : /* Retour de la forme : +-------------+ | Nom_capteur | +-------------+ | Calculation | | Calcul 2 | +-------------+ */ req = 'SELECT Nom FROM TB_Capteurs '; req += ' WHERE Type_entrees=' + shipheart_capteur_type_entrees_calculee_booleen + ' '; req += ' AND Entrees LIKE "%/' + shipheart_source_mesure_reservoir + ':' + id_reservoir + '/%" '; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); if (nb > 0) { if (nb === 1) message += "

" + qsTr("Ce réservoir est utilisé par le capteur calculé ci-dessous.
Vous devez modifier ou supprimer ce capteur calculé pour qu'il ne dépende plus de ce réservoir avant de pouvoir le supprimer.") + "

"; else message += "

" + qsTr("Ce réservoir est utilisé par les %1 capteurs calculés ci-dessous.
Vous devez modifier ou supprimer ces capteurs calculés pour qu'ils ne dépendent plus de ce réservoir avant de pouvoir le supprimer.").arg(nb) + "

"; for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { message += "‣ " + (i+1) + " : " + res[0] + "
"; } } } //========================================================================= // Conclusion : if (message === "") return(0); // Aucune réserve à supprimer le message.... else // Affichage de la boite de dialogue. La suppression n'est pas autorisée... { boite_information.niveau = 1; boite_information.imageTitreSource = "/images/attention.png"; boite_information.message = message; boite_information.alignementMessage = Text.AlignLeft boite_information.open(); return(-1); } } //============================================================================================================= // Suppression du réservoir //============================================================================================================= function suppression_reservoir() { var req; var i, j; // Suppression du réservoir dans TB_Réservoirs : req = 'DELETE FROM TB_Reservoirs WHERE Cle_primaire=' + id_reservoir + ' '; //console.log("Requête = " + req) 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); } //============================================================================================================= // Recherche de l'index d'une certaine valeur dans un modele //============================================================================================================= function recherche_index_valeur_modele(cible, modele, nom_modele) { var i; for (i=0; i