//======================================================================================================================================================================== // CONFIG_BATTERIE.QML // Ce fichier traite la configuration d'une batterie. La page permet notamment de : // - Modifier la config de la batterie (ou de la créer la première fois), // - Supprimer la batterie // La page est appelée depuis la page config_batteries_1, en cliquant sur la batterie à 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_batteries.js" as Fonctions_batteries Shipheart_page { id: page_config_batterie // 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 readonly property int type_boite_information_alerte_changement_type: 0 readonly property int type_boite_information_alerte_changement_tension: 1 readonly property int type_boite_information_supprimer: 2 // Affichage : property int valeur_timer_appui_long: 0 property bool mouvement_entrees_batterie_grid_en_cours: false property bool affichage_avance: false // Données : property int id_batterie: 0 property int adresse_module: 0 // Contient l'adresse du module supportant la ou les entrées affectées à cette batterie property int type_entrees: 0 property int type_entrees_init: 0 property int no_entree: 0 property int no_entree_init: 0 property int tension_nominale: 0 property int tension_nominale_init: 0 property int type_batterie: 0 // Devrait s'appeler 'type' par homogénéité vs les champs de BDD mais pb de compatibilité avec la propriété 'type' de Shipheart_boite_dialogue'... property int type_batterie_init: 0 // Idem... property int id_famille: 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_forcer_pleine_charge.pressed) forcer_pleine_charge(); if (mousearea_reset_soh.pressed) reset_soh(); if (mousearea_reset_compteur.pressed) reset_compteurs(); if (mousearea_bouton_supprimer.pressed) { if (check_avant_suppression() !== -1) { suppression_batterie(); timer_tempo_reconfiguration.restart(); // Lancement du timer pour attendre la fin de la reconfiguration } } } } } //=========================================================== // Lorsque la page est sur le point d'être affichée dans la pile : //=========================================================== StackView.onActivating: { // Relecture de la résistance interne pour le cas où l'on reviendrait d'une phase d'étalonnage : var res; res = bdd.requete_unique('SELECT Resistance_interne FROM TB_Batteries WHERE Cle_primaire=' + id_batterie + ' '); champ_formulaire_Resistance_interne.text = Number(res[0]); } // Titre de la page : Shipheart_titre_1 {titre: (id_batterie === 0) ? qsTr("Création d'un parc de batteries") : qsTr("Configuration du parc de batteries"); 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 de la batterie") 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 { id: ligne_famille 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("Groupe de batteries") 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(); id_famille = champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur; } } 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: (champ_formulaire_Famille.currentIndex !== 0) Shipheart_formulaire_label { text: qsTr("Point de mesure") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Type_entrees.currentIndex !== 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: { shipheart_clic(); adresse_module = champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).module; type_entrees = champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).type; no_entree = champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).no; if (model.get(currentIndex).type === 0) affichage_avance = false; // Dévalide le mode avancé si on revient à un état inconnu... } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Type (de batterie) Rectangle { width: parent.width height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (champ_formulaire_Type_entrees.currentIndex !== 0) Shipheart_formulaire_label { text: qsTr("Type de batterie(s)") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Type.currentIndex !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Type model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); if (model.get(currentIndex).valeur === 0) affichage_avance = false; // Dévalide le mode avancé si on revient à un état inconnu... if ((id_batterie !== 0) && // Si on n'est pas en phase de création... (model.get(currentIndex).valeur !== type_batterie) && // ... et qu'on change le type... (model.get(currentIndex).valeur !== 0)) // ... et que la nouvelle valeur n'est pas "non définie" { shipheart_clic(); boite_information.niveau = 1 boite_information.imageTitreSource = "/images/attention.png" boite_information.message = qsTr("La modification du type de batterie(s) va nécessiter la remise en configuration usine de certains paramètres.

Si vous ne souhaitez pas que cette reconfiguration soit effectuée, notamment si vous avez effectué des réglages spécifiques, cliquez sur ANNULER.

Sinon, cliquez sur CONFIRMER pour valider le changement."); boite_information.boutonOkTexte = qsTr("Confirmer") boite_information.boutonAnnuler = true boite_information.type = type_boite_information_alerte_changement_type; boite_information.open(); } else // Sinon, on prend immédiatement en compte le changement : { if (model.get(currentIndex).valeur !== 0) // Dans le cas où on passe à "Non défini", on ne traite rien et on garde la valeur précédente (aisni, si on revient ensuite sur la version initiale, on n'affichera pas le message d'alerte...) { type_batterie = model.get(currentIndex).valeur; maj_valeurs_par_defaut_type_batterie(); } } } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Tension_nominale Rectangle { width: parent.width height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (champ_formulaire_Type_entrees.currentIndex !== 0) && (champ_formulaire_Type.currentIndex !== 0) Shipheart_formulaire_label { text: qsTr("Tension nominale") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Tension_nominale.currentIndex !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Tension_nominale model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); if (model.get(currentIndex).valeur === 0) affichage_avance = false; // Dévalide le mode avancé si on revient à un état inconnu... if ((id_batterie !== 0) && // Si on n'est pas en phase de création... (model.get(currentIndex).valeur !== tension_nominale) && // ... et qu'on change la tension nominale... (model.get(currentIndex).valeur !== 0)) // ... et que la nouvelle valeur n'est pas "non définie" { shipheart_clic(); boite_information.niveau = 1 boite_information.imageTitreSource = "/images/attention.png" boite_information.message = qsTr("La modification de la tension nominale du parc de batteries va nécessiter la remise en configuration usine de certains paramètres.

Si vous ne souhaitez pas que cette reconfiguration soit effectuée, notamment si vous avez effectué des réglages spécifiques, cliquez sur ANNULER.

Sinon, cliquez sur CONFIRMER pour valider le changement."); boite_information.boutonOkTexte = qsTr("Confirmer") boite_information.boutonAnnuler = true boite_information.type = type_boite_information_alerte_changement_tension; boite_information.open(); } else // Sinon, on prend immédiatement en compte le changement : { if (model.get(currentIndex).valeur !== 0) // Dans le cas où on passe à "Non défini", on ne traite rien et on garde la valeur précédente (aisni, si on revient ensuite sur la version initiale, on n'affichera pas le message d'alerte...) { tension_nominale = champ_formulaire_Tension_nominale.model.get(champ_formulaire_Tension_nominale.currentIndex).valeur; } } } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Capacite_1 Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (champ_formulaire_Type_entrees.currentIndex !== 0) && (champ_formulaire_Type.currentIndex !== 0) && (champ_formulaire_Tension_nominale.currentIndex !== 0) // && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Capacité") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Capacite_1 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("Ah") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //============================================================================== // Bouton "Affichage avancé" : //==============================================================================- Rectangle { id: bouton_affichage_avance width: parent.width height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (champ_formulaire_Type_entrees.currentIndex !== 0) && (champ_formulaire_Type.currentIndex !== 0) && (champ_formulaire_Tension_nominale.currentIndex !== 0) Shipheart_formulaire_bouton { titre: (affichage_avance) ? qsTr("Masquer les paramètres avancés") : qsTr("Afficher les paramètres avancés") actif: false affichage_fleche : true fleche_haut: affichage_avance couleur_titre: couleur_gris_moyen gras_titre: true width: parent.width MouseArea{ anchors.fill : parent onClicked: { if (affichage_avance) affichage_avance = false; else affichage_avance = true; } } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //============================================================================== //------------------------------------------------------------------------------- // Ligne de formulaire : Tension_gain Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees !== shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Coefficient correcteur d'entrée de tension") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Tension_gain 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("") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } Shipheart_titre_2 {titre: qsTr("Caractéristiques du parc de batteries"); visible: affichage_avance && (type_entrees === shipheart_batteries_type_entrees_ibs)} //------------------------------------------------------------------------------- // Ligne de formulaire : Heures_capacite_1 Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Durée correspondant à la capacité") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Heures_capacite_1 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("h") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Capacite_2 Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" // visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) visible: false Shipheart_formulaire_label { // Label : text: qsTr("Capacité 2") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Capacite_2 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("Ah") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Heures_capacite_2 Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" // visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) visible: false Shipheart_formulaire_label { // Label : text: qsTr("Durée de capacité 2") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Heures_capacite_2 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("h") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Coeff_peukert Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Coefficient de Peukert") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Coeff_peukert 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("") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Résistance_interne Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Résistance interne") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Resistance_interne 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("mΩ") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Soh Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { text: qsTr("Soh actuel") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_valeur_fixe { id: champ_formulaire_Soh width: parent.width * (1 - pourcentage_largeur_labels_formulaire - pourcentage_largeur_unites_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_unite { // Unités : text: qsTr("%") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } Shipheart_titre_2 {titre: qsTr("Paramètres de pleine charge"); visible: affichage_avance && (type_entrees === shipheart_batteries_type_entrees_ibs)} //------------------------------------------------------------------------------- // Ligne de formulaire : Tension_pleine_charge Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Tension mini pleine charge") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Tension_pleine_charge 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("V") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Courant_pleine_charge Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Courant maxi pleine charge") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Courant_pleine_charge 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("A") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Temporisation_pleine_charge Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Temporisation pleine charge") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Temporisation_pleine_charge 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("s") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Efficacite_charge Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Efficacité de charge") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Efficacite_charge 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("") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } Shipheart_titre_2 {titre: qsTr("Caractéristiques de charge nulle"); visible: affichage_avance && (type_entrees === shipheart_batteries_type_entrees_ibs)} //------------------------------------------------------------------------------- // Ligne de formulaire : Tension_charge_nulle Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Tension de détection charge nulle") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Tension_charge_nulle 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("V") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Temporisation_charge_nulle Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { // Label : text: qsTr("Temporisation charge nulle") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { // Champ de saisie : id: champ_formulaire_Temporisation_charge_nulle 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("s") width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } Shipheart_titre_2 {titre: qsTr("Historique"); visible: affichage_avance && (type_entrees === shipheart_batteries_type_entrees_ibs)} //------------------------------------------------------------------------------- // Ligne de formulaire : Nombre_cycles Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { text: qsTr("Nombre de cycles de charge") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_valeur_fixe { id: champ_formulaire_Nombre_cycles 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 : Nombre_decharges_completes Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 color: "transparent" visible: (affichage_avance) && (type_entrees === shipheart_batteries_type_entrees_ibs) Shipheart_formulaire_label { text: qsTr("Nombre de décharges complètes") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_valeur_fixe { id: champ_formulaire_Nombre_decharges_completes width: parent.width * (1 - pourcentage_largeur_labels_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } } } } //------------------------------------------------------- // Ecran Droite : //------------------------------------------------------- Rectangle { id: zone_affichage_droite x: zone_affichage_haut_gauche.width + espace_colonnes_principales y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2); color: "transparent" Column { anchors.fill: parent spacing: 10 //....................................................... // Bouton Enregistrer/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) && // Si le clavier est n'est PAS déplié... // SDIR #255 (champ_formulaire_Nom.text !== "") && // Si le nom n'est PAS vide... (id_famille !== 0) && // Si la famille est définie... (type_entrees !== 0) && // Si le type d'entrées EST défini... (type_batterie != 0) && // Si le type de batterie (plomb, Li,...) est défini... (tension_nominale !== 0) // et si la tension (12/24V) est définie. Text { anchors.centerIn: parent font.pixelSize: 20 text: (id_batterie === 0) ? qsTr("Créer la batterie") : qsTr("Enregistrer") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); if (id_batterie !== 0) mise_a_jour_batterie(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte. else creation_batterie(); 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_batterie !== 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 Forcer Pleine Charge //....................................................... Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: (! clavier.active) && (id_batterie !== 0) && (affichage_avance) 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_forcer_pleine_charge.pressed } Text { anchors.centerIn: parent font.pixelSize: 20 text: qsTr("Forcer Pleine Charge") color: couleur_blanc_casse } MouseArea { id: mousearea_forcer_pleine_charge 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 Reset SOH //....................................................... Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: (! clavier.active) && (id_batterie !== 0) && (affichage_avance) 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_reset_soh.pressed } Text { anchors.centerIn: parent font.pixelSize: 20 text: qsTr("Réinitialiser SOH") color: couleur_blanc_casse } MouseArea { id: mousearea_reset_soh 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 Reset compteurs //....................................................... Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: (! clavier.active) && (id_batterie !== 0) && (affichage_avance) 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_reset_compteur.pressed } Text { anchors.centerIn: parent font.pixelSize: 20 text: qsTr("Réinitialiser Compteurs") color: couleur_blanc_casse } MouseArea { id: mousearea_reset_compteur 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 à l'étalonnage //....................................................... Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: (! clavier.active) && (id_batterie !== 0) && // Si l'on est en création, inutile de proposer le bouton (affichage_avance) && // Lors de la création, on ne propose pas d'étalonner (éviter de devoir s'adapter en permanence au remplissage en cours... (tension_nominale === tension_nominale_init) // Si on a chnagé de tension nominale, on ne propose pas d'étalonner (avant d'enregitrer les changements) Text { anchors.centerIn: parent font.pixelSize: 20 text: qsTr("Etalonner") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); if (type_entrees !== shipheart_batteries_type_entrees_ibs) { stackView.push("config_valeurs_niveaux.qml", {"table": "TB_Batteries", "id": id_batterie}) } else { stackView.push("etalonnage_carte.qml", {"adresse_module": champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).module}) } } } } 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 } } } } //------------------------------------------------------- // Bandeau bas : //------------------------------------------------------- Row { x: 0 y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas; width: shipheart_largeur_page; height: shipheart_hauteur_bandeau_bas; padding: 5 spacing: 10 //................................................. // 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 validation : //------------------------------------------------------- Shipheart_boite_dialogue { id: boite_information onClicked: { //console.log("Le Bouton [" + bouton + "] est appuyé"); switch (type) { //----------------------------------------------------- case type_boite_information_alerte_changement_type: if (bouton === shipheart_boite_dialogue_bouton_1) { type_batterie = champ_formulaire_Type.model.get(champ_formulaire_Type.currentIndex).valeur; maj_valeurs_par_defaut_type_batterie(); } if (bouton === shipheart_boite_dialogue_bouton_2) { // Repositionnement à la valeur d'origine : champ_formulaire_Type.currentIndex = recherche_index_valeur_modele(type, champ_formulaire_Type.model, "Type"); } break; //----------------------------------------------------- case type_boite_information_alerte_changement_tension: if (bouton === shipheart_boite_dialogue_bouton_1) { tension_nominale = champ_formulaire_Tension_nominale.model.get(champ_formulaire_Tension_nominale.currentIndex).valeur; } if (bouton === shipheart_boite_dialogue_bouton_2) { // Repositionnement à la valeur d'origine : champ_formulaire_Tension_nominale.currentIndex = recherche_index_valeur_modele(tension_nominale, champ_formulaire_Tension_nominale.model, "Tension_nominale"); } break; //----------------------------------------------------- case type_boite_information_supprimer : default: ; } } } //=========================================================== // 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 chaine_capacite_1, chaine_capacite_2; //console.log("Id de la batterie = " + id_batterie); if (id_batterie > 0) // Cas d'une modification de batterie existante : { req = 'SELECT Nom, '; req += ' Adresse_module, '; req += ' Type_entrees, '; req += ' Entrees, '; req += ' Type, '; req += ' Tension_nominale, '; req += ' Capacite_1, '; req += ' Capacite_2, '; req += ' Tension_gain, '; req += ' Coeff_peukert, '; req += ' Resistance_interne, '; req += ' Tension_pleine_charge, '; req += ' Courant_pleine_charge, '; req += ' Temporisation_pleine_charge, '; req += ' Efficacite_charge, '; req += ' Tension_charge_nulle, '; req += ' Temporisation_charge_nulle, '; req += ' Soh, '; req += ' Nombre_cycles, '; req += ' Nombre_decharges_completes, '; req += ' ID_Famille '; req += ' FROM TB_Batteries '; req += ' WHERE Cle_primaire=' + id_batterie + ' '; //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 ++]); no_entree = Number(res[i ++]); type_batterie = Number(res[i ++]); tension_nominale = Number(res[i ++]); chaine_capacite_1 = res[i ++]; chaine_capacite_2 = res[i ++]; champ_formulaire_Tension_gain.text = Number(res[i ++]).toFixed(3); champ_formulaire_Coeff_peukert.text = Number(res[i ++]).toFixed(2); champ_formulaire_Resistance_interne.text = Number(res[i ++]).toFixed(1); champ_formulaire_Tension_pleine_charge.text = Number(res[i ++]).toFixed(2); champ_formulaire_Courant_pleine_charge.text = Number(res[i ++]).toFixed(2); champ_formulaire_Temporisation_pleine_charge.text = Number(res[i ++]).toFixed(0); champ_formulaire_Efficacite_charge.text = Number(res[i ++]).toFixed(3); champ_formulaire_Tension_charge_nulle.text = Number(res[i ++]).toFixed(2); champ_formulaire_Temporisation_charge_nulle.text = Number(res[i ++]).toFixed(0); champ_formulaire_Soh.text = Number(res[i ++]).toFixed(0); // En lecture seule champ_formulaire_Nombre_cycles.text = Number(res[i ++]); // En lecture seule champ_formulaire_Nombre_decharges_completes.text = Number(res[i ++]); // En lecture seule id_famille = Number(res[i ++]); } else // Cas d'une création d'une batterie : { champ_formulaire_Nom.text = ""; adresse_module = 0; type_entrees = 0; no_entree = 0; type_batterie = 0; tension_nominale = 0; chaine_capacite_1 = "100/20"; chaine_capacite_2 = ""; id_famille = 0; } //--------------------------------------------------------------------------------------- // 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_batteries + ' ORDER BY Priorite_affichage '; //console.log("Requête = " + 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; //--------------------------------------------------------------------------------------- // Type d'entrées : // Mise à zéro et rensignement de la première entrée du modèle de liste des types d'entrées : champ_formulaire_Type_entrees.model.clear(); champ_formulaire_Type_entrees.model.append({"module": 0, "type": 0, "no": 0, "type_carte": 0, "texte": qsTr("Non défini") }); champ_formulaire_Type_entrees.currentIndex = 0; // Par défaut //========================================== // Entrées prédéfinies des ShipBS présentes (les ShipBS sont prioritaires dans ce cas et sont traitées avant les autres) : req = 'SELECT Adresse_k_bus, Type '; req += 'FROM TB_Modules_config WHERE '; // req += 'Presence=1 AND '; req += 'Type=' + shipheart_type_module_shipBS + ' '; req += 'ORDER BY Adresse_k_bus'; //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout de l'entrée dans le modèle : champ_formulaire_Type_entrees.model.append({ "module": Number(res[0]), "type": shipheart_batteries_type_entrees_ibs, "no": 0, "type_carte": shipheart_type_module_shipBS, "texte": qsTr("ShipBS [@ %1]").arg(Number(res[0])) }); // Mise à jour de l'index actuel de la combo box : if ((type_entrees === shipheart_batteries_type_entrees_ibs) && (adresse_module === Number(res[0]))) { champ_formulaire_Type_entrees.currentIndex = (champ_formulaire_Type_entrees.model.count - 1); } } } //============================================================== // Entrées prédéfinies des modules présents (autres que ShipBS) : req = 'SELECT Adresse_k_bus, Type '; req += 'FROM TB_Modules_config WHERE '; req += 'Presence=1 '; req += 'AND ('; req += 'Type=' + shipheart_type_module_shipbase + ' '; req += 'OR Type=' + shipheart_type_module_shippower812 + ' '; req += 'OR Type=' + shipheart_type_module_shippower8DC + ' '; req += ')'; req += 'ORDER BY Adresse_k_bus'; //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { champ_formulaire_Type_entrees.model.append({ "module": Number(res[0]), "type": shipheart_batteries_type_entrees_predefinie, "no": shipheart_capteur_predefini_in_v, "type_carte": Number(res[1]), "texte": qsTr("Alimentation %1").arg(Fonctions.nom_type_module(Number(res[1]))) + ((Number(res[1]) === shipheart_type_module_shipbase) ? "" : " [@ " + Number(res[0]) + "]") }); // Mise à jour de l'index actuel de la combo box : if ((type_entrees === shipheart_batteries_type_entrees_predefinie) && (adresse_module === Number(res[0])) && (no_entree === shipheart_capteur_predefini_in_v)) { champ_formulaire_Type_entrees.currentIndex = (champ_formulaire_Type_entrees.model.count - 1); } } } //============================================================== // Entrées VOLT : for (i = 0; i < shipheart_entrees_volt_max_nombre; i ++) { champ_formulaire_Type_entrees.model.append({ "module": 0, "type": shipheart_batteries_type_entrees_volt, "no": (i+1), "type_carte": shipheart_type_module_shipbase, "texte": qsTr("Entrée VOLT n° %1").arg(i+1) }); if ((type_entrees === shipheart_batteries_type_entrees_volt) && (no_entree === (i + 1))) { champ_formulaire_Type_entrees.currentIndex = (champ_formulaire_Type_entrees.model.count - 1); } } type_entrees_init = type_entrees; no_entree_init = no_entree; //--------------------------------------------------------------------------------------- // Type (de batterie) : champ_formulaire_Type.model.clear(); champ_formulaire_Type.model.append({"valeur": shipheart_batteries_type_indefini, "texte": qsTr("Non défini") }); champ_formulaire_Type.model.append({"valeur": shipheart_batteries_type_plomb_acide_liquide, "texte": qsTr("Plomb - Acide liquide") }); champ_formulaire_Type.model.append({"valeur": shipheart_batteries_type_plomb_agm_vrla, "texte": qsTr("Plomb - AGM / VRLA") }); champ_formulaire_Type.model.append({"valeur": shipheart_batteries_type_plomb_gel, "texte": qsTr("Plomb - Gel") }); champ_formulaire_Type.model.append({"valeur": shipheart_batteries_type_plomb_carbone, "texte": qsTr("Plomb - Carbone") }); champ_formulaire_Type.model.append({"valeur": shipheart_batteries_type_lihium, "texte": qsTr("Lithium") }); // Positionnement de l'index sur la valeur en cours : i = recherche_index_valeur_modele(type_batterie, champ_formulaire_Type.model, "Type"); if (i === -1) champ_formulaire_Type.currentIndex = recherche_index_valeur_modele(0, champ_formulaire_Type.model, "Type"); else champ_formulaire_Type.currentIndex = i; type_batterie_init = type_batterie; //--------------------------------------------------------------------------------------- // Tension nominale : champ_formulaire_Tension_nominale.model.clear(); champ_formulaire_Tension_nominale.model.append({"valeur": 0, "texte": qsTr("Non définie") }); champ_formulaire_Tension_nominale.model.append({"valeur": 12, "texte": qsTr("12V") }); champ_formulaire_Tension_nominale.model.append({"valeur": 24, "texte": qsTr("24V") }); champ_formulaire_Tension_nominale.model.append({"valeur": 48, "texte": qsTr("48V") }); // Positionnement de l'index sur la valeur en cours : i = recherche_index_valeur_modele(tension_nominale, champ_formulaire_Tension_nominale.model, "Tension_nominale"); if (i === -1) champ_formulaire_Tension_nominale.currentIndex = recherche_index_valeur_modele(0, champ_formulaire_Tension_nominale.model, "Tension_nominale"); else champ_formulaire_Tension_nominale.currentIndex = i; tension_nominale_init = tension_nominale; //--------------------------------------------------------------------------------------- // Entrées : if (id_batterie > 0) // Cas d'une modification de batterie existante : { req = 'SELECT Type_entrees, Entrees FROM TB_Batteries WHERE Cle_primaire=' + id_batterie + ' '; //console.log("req = [ " + req + "; ]"); res = bdd.requete_unique(req); if (Number(res[0]) === type_entrees) // On ne récupère la chaine 'Entrées' que si la batterie était déjà de ce type. Sinon, on part sur une liste vierge (idem création) { no_entree = Number(res[1]); } } //--------------------------------------------------------------------------------------- // Capacités : var chaines_capacite; if (chaine_capacite_1 !== "") { chaines_capacite = chaine_capacite_1.split('/'); champ_formulaire_Capacite_1.text = chaines_capacite[0]; champ_formulaire_Heures_capacite_1.text = chaines_capacite[1]; } else { champ_formulaire_Capacite_1.text = ""; champ_formulaire_Heures_capacite_1.text = ""; } if (chaine_capacite_2 !== "") { chaines_capacite = chaine_capacite_2.split('/'); champ_formulaire_Capacite_2.text = chaines_capacite[0]; champ_formulaire_Heures_capacite_2.text = chaines_capacite[1]; } else { champ_formulaire_Capacite_2.text = ""; champ_formulaire_Heures_capacite_2.text = ""; } } //============================================================================================================= // Mise à jour des valeurs par défaut en fonction du choix du Type (de batterie) //============================================================================================================= function maj_valeurs_par_defaut_type_batterie() { var i; switch(type_batterie) { //------------------------------------- default : case shipheart_batteries_type_plomb_acide_liquide : champ_formulaire_Tension_gain.text = "1.000"; champ_formulaire_Coeff_peukert.text = "1.20"; champ_formulaire_Resistance_interne.text = "20"; // En mOhms champ_formulaire_Tension_pleine_charge.text = "13.80"; // En V champ_formulaire_Courant_pleine_charge.text = "3.00"; // En A (Nb calculé sur 3% de la capacité) champ_formulaire_Temporisation_pleine_charge.text = "180"; // En s champ_formulaire_Efficacite_charge.text = "0.9"; // Sans unité champ_formulaire_Tension_charge_nulle.text = "11.0"; // En V champ_formulaire_Temporisation_charge_nulle.text = "30"; // En s champ_formulaire_Temperature_seuil_haut.text = "50.0"; // En °C champ_formulaire_Temperature_seuil_bas.text = "5.0"; // En °C break; //------------------------------------- case shipheart_batteries_type_plomb_agm_vrla : champ_formulaire_Tension_gain.text = "1.000"; champ_formulaire_Coeff_peukert.text = "1.05"; champ_formulaire_Resistance_interne.text = "3"; // En mOhms champ_formulaire_Tension_pleine_charge.text = "13.50"; // En V champ_formulaire_Courant_pleine_charge.text = "3.00"; // En A (Nb calculé sur 3% de la capacité) champ_formulaire_Temporisation_pleine_charge.text = "180"; // En s champ_formulaire_Efficacite_charge.text = "0.9"; // Sans unité champ_formulaire_Tension_charge_nulle.text = "11.0"; // En V champ_formulaire_Temporisation_charge_nulle.text = "30"; // En s champ_formulaire_Temperature_seuil_haut.text = "50.0"; // En °C champ_formulaire_Temperature_seuil_bas.text = "5.0"; // En °C break; //------------------------------------- case shipheart_batteries_type_plomb_gel : champ_formulaire_Tension_gain.text = "1.000"; champ_formulaire_Coeff_peukert.text = "1.1"; champ_formulaire_Resistance_interne.text = "2"; // En mOhms champ_formulaire_Tension_pleine_charge.text = "13.30"; // En V champ_formulaire_Courant_pleine_charge.text = "3.00"; // En A (Nb calculé sur 3% de la capacité) champ_formulaire_Temporisation_pleine_charge.text = "180"; // En s champ_formulaire_Efficacite_charge.text = "0.92"; // Sans unité champ_formulaire_Tension_charge_nulle.text = "11.0"; // En V champ_formulaire_Temporisation_charge_nulle.text = "30"; // En s champ_formulaire_Temperature_seuil_haut.text = "50.0"; // En °C champ_formulaire_Temperature_seuil_bas.text = "5.0"; // En °C break; //------------------------------------- case shipheart_batteries_type_plomb_carbone : champ_formulaire_Tension_gain.text = "1.000"; champ_formulaire_Coeff_peukert.text = "1.1"; champ_formulaire_Resistance_interne.text = "2"; // En mOhms champ_formulaire_Tension_pleine_charge.text = "13.50"; // En V champ_formulaire_Courant_pleine_charge.text = "3.00"; // En A (Nb calculé sur 3% de la capacité) champ_formulaire_Temporisation_pleine_charge.text = "180"; // En s champ_formulaire_Efficacite_charge.text = "0.92"; // Sans unité champ_formulaire_Tension_charge_nulle.text = "11.0"; // En V champ_formulaire_Temporisation_charge_nulle.text = "30"; // En s champ_formulaire_Temperature_seuil_haut.text = "50.0"; // En °C champ_formulaire_Temperature_seuil_bas.text = "5.0"; // En °C break; //------------------------------------- case shipheart_batteries_type_lihium : champ_formulaire_Tension_gain.text = "1.000"; champ_formulaire_Coeff_peukert.text = "1.00"; champ_formulaire_Resistance_interne.text = "0.5"; // En mOhms champ_formulaire_Tension_pleine_charge.text = "13.50"; // En V champ_formulaire_Courant_pleine_charge.text = "3.00"; // En A (Nb calculé sur 3% de la capacité) champ_formulaire_Temporisation_pleine_charge.text = "180"; // En s champ_formulaire_Efficacite_charge.text = "0.95"; // Sans unité champ_formulaire_Tension_charge_nulle.text = "11.5"; // En V champ_formulaire_Temporisation_charge_nulle.text = "30"; // En s champ_formulaire_Temperature_seuil_haut.text = "50.0"; // En °C champ_formulaire_Temperature_seuil_bas.text = "5.0"; // En °C break; } } //============================================================================================================= // Mise à jour des valeurs saisies de la batterie //============================================================================================================= function mise_a_jour_batterie() { var req; var i; var capacite_1, capacite_2; var heures_capacite_1, heures_capacite_2; var chaine_capacite_1, chaine_capacite_2; var coeff_peukert; var sous_req_liste_tension_soc = ""; //------------------------------------------------------------------------------------------------------- // Capacités : if (champ_formulaire_Capacite_1.text != "") capacite_1 = Number(champ_formulaire_Capacite_1.text); else capacite_1 = 100; // Valeur par défaut (en Ah) if (champ_formulaire_Heures_capacite_1.text != "") heures_capacite_1 = Number(champ_formulaire_Heures_capacite_1.text); else heures_capacite_1 = 20; // Valeur par défaut (en h) if (champ_formulaire_Capacite_2.text != "") capacite_2 = Number(champ_formulaire_Capacite_2.text); else capacite_2 = 0; if (champ_formulaire_Heures_capacite_2.text != "") heures_capacite_2 = Number(champ_formulaire_Heures_capacite_2.text); else heures_capacite_2 = 0; // Mise à jour des chaines pour la BDD : chaine_capacite_1 = capacite_1 + "/" + heures_capacite_1; // Pour la capacité 1, on enregistre toujours la chaine if ((capacite_2 !== 0) && (heures_capacite_2 !== 0)) chaine_capacite_2 = capacite_2 + "/" + heures_capacite_2; else chaine_capacite_2 = ""; //------------------------------------------------------------------------------------------------------- // Calcul du coefficient de Peukert : coeff_peukert = Fonctions_batteries.coefficient_de_peukert(type_batterie, capacite_1, heures_capacite_1, capacite_2, heures_capacite_2); //console.log("Coeff de Peukert calculé = " + coeff_peukert); //------------------------------------------------------------------------------------------------------- // Si la tension nominale de la batterie a été changée, on met obligatoirement à jour la liste valeurs/niveaux en version "usine" : if (tension_nominale !== tension_nominale_init) { sous_req_liste_tension_soc = ', Liste_tension_soc="' + Fonctions_batteries.chaine_tension_niveau_batterie_usine(tension_nominale) + '" '; } // Sinon, on ne fait rien sur cette liste. //------------------------------------------------------------------------------------------------------- // Mise à jour de l'entrée dans TB_Batteries : req = 'UPDATE TB_Batteries SET Nom="' + champ_formulaire_Nom.text + '" '; req += ', Type=' + type_batterie; req += ', Tension_nominale=' + tension_nominale; req += ', Adresse_module=' + adresse_module; req += ', Type_entrees=' + type_entrees; req += ', Entrees="' + no_entree + '" '; req += ', Capacite_1="' + chaine_capacite_1 + '" '; req += ', Capacite_2="' + chaine_capacite_2 + '" '; req += ', Coeff_peukert=' + champ_formulaire_Coeff_peukert.text; req += ', Resistance_interne=' + champ_formulaire_Resistance_interne.text; req += ', Tension_pleine_charge=' + champ_formulaire_Tension_pleine_charge.text; req += ', Courant_pleine_charge=' + champ_formulaire_Courant_pleine_charge.text; req += ', Temporisation_pleine_charge=' + champ_formulaire_Temporisation_pleine_charge.text; req += ', Efficacite_charge=' + champ_formulaire_Efficacite_charge.text; req += ', Tension_charge_nulle=' + champ_formulaire_Tension_charge_nulle.text; req += ', Temporisation_charge_nulle=' + champ_formulaire_Temporisation_charge_nulle.text; req += ', Liste_temperature_resistance_interne="' + Fonctions_batteries.chaine_temperature_resistance_interne_usine(type_batterie) + '" '; req += ', Tension_gain=' + champ_formulaire_Tension_gain.text; req += ', ID_Famille=' + id_famille; req += sous_req_liste_tension_soc; req += ' WHERE Cle_primaire=' + id_batterie + ' ' //console.log("req = [ " + req + "; ]"); bdd.requete_unique(req); synchro_bdd(shipheart_type_synchro_config); } //============================================================================================================= // Création de la batterie //============================================================================================================= function creation_batterie() { var req, res; var i; var capacite_1, capacite_2; var heures_capacite_1, heures_capacite_2; var chaine_capacite_1, chaine_capacite_2; var coeff_peukert; //------------------------------------------------------------------------------------------------------- // Capacités : if (champ_formulaire_Capacite_1.text != "") capacite_1 = Number(champ_formulaire_Capacite_1.text); else capacite_1 = 100; // Valeur par défaut (en Ah) if (champ_formulaire_Heures_capacite_1.text != "") heures_capacite_1 = Number(champ_formulaire_Heures_capacite_1.text); else heures_capacite_1 = 20; // Valeur par défaut (en h) if (champ_formulaire_Capacite_2.text != "") capacite_2 = Number(champ_formulaire_Capacite_2.text); else capacite_2 = 0; if (champ_formulaire_Heures_capacite_2.text != "") heures_capacite_2 = Number(champ_formulaire_Heures_capacite_2.text); else heures_capacite_2 = 0; // Mise à jour des chaines pour la BDD : chaine_capacite_1 = capacite_1 + "/" + heures_capacite_1; // Pour la capacité 1, on enregistre toujours la chaine if ((capacite_2 !== 0) && (heures_capacite_2 !== 0)) chaine_capacite_2 = capacite_2 + "/" + heures_capacite_2; else chaine_capacite_2 = ""; //------------------------------------------------------------------------------------------------------- // Calcul du coefficient de Peukert : coeff_peukert = Fonctions_batteries.coefficient_de_peukert(type_batterie, capacite_1, heures_capacite_1, capacite_2, heures_capacite_2); //console.log("Coeff de Peukert calculé = " + coeff_peukert); //------------------------------------------------------------------------------------------------------- // Création de l'entrée dans TB_Batteries : req = 'INSERT INTO TB_Batteries (Nom, '; req += ' Type, '; req += ' Tension_nominale, '; req += ' Adresse_module, '; req += ' Type_entrees, '; req += ' Entrees, '; req += ' Capacite_1, '; req += ' Capacite_2, '; req += ' Coeff_peukert, '; req += ' Resistance_interne, '; req += ' Tension_pleine_charge, '; req += ' Courant_pleine_charge, '; req += ' Temporisation_pleine_charge, '; req += ' Efficacite_charge, '; req += ' Tension_charge_nulle, ' req += ' Temporisation_charge_nulle, '; req += ' Tension_gain, '; req += ' Liste_tension_soc, '; req += ' Liste_temperature_resistance_interne, '; req += ' ID_Famille '; req += ' ) VALUES ("' + champ_formulaire_Nom.text + '"'; req += ', ' + type_batterie; req += ', ' + tension_nominale; req += ', ' + adresse_module; req += ', ' + type_entrees; req += ', "' + no_entree + '" '; req += ', "' + chaine_capacite_1 + '" '; req += ', "' + chaine_capacite_2 + '" '; req += ', ' + champ_formulaire_Coeff_peukert.text; req += ', ' + champ_formulaire_Resistance_interne.text; req += ', ' + champ_formulaire_Tension_pleine_charge.text; req += ', ' + champ_formulaire_Courant_pleine_charge.text; req += ', ' + champ_formulaire_Temporisation_pleine_charge.text; req += ', ' + champ_formulaire_Efficacite_charge.text; req += ', ' + champ_formulaire_Tension_charge_nulle.text; req += ', ' + champ_formulaire_Temporisation_charge_nulle.text; req += ', ' + champ_formulaire_Tension_gain.text; req += ', "' + Fonctions_batteries.chaine_tension_niveau_batterie_usine(tension_nominale) + '" '; req += ', "' + Fonctions_batteries.chaine_temperature_resistance_interne_usine(type_batterie) + '" '; req += ', ' + id_famille; req += ') '; //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); } //============================================================================================================= // Check suppression de la batterie //============================================================================================================= 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_batterie + ' AND ID_Source=' + id_batterie + ' '; req += ' ORDER BY Nom'; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); if (nb > 0) { if (nb === 1) message += "

" + qsTr("Cette batterie est utilisée par l'évènement ci-dessous.
Vous devez modifier ou supprimer cet évènement pour qu'il ne dépende plus de cette batterie avant de pouvoir la supprimer.") + "

"; else message += "

" + qsTr("Cette batterie est utilisée par les %1 évènements ci-dessous.
Vous devez modifier ou supprimer ces évènements pour qu'ils ne dépendent plus de cette batterie avant de pouvoir la 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_batterie + ':' + id_batterie + '/%" '; //console.log("Requête = [ " + req + "; ]") nb = bdd.requete(req); if (nb > 0) { if (nb === 1) message += "

" + qsTr("Cette batterie est utilisée par le capteur calculé ci-dessous.
Vous devez modifier ou supprimer ce capteur calculé pour qu'il ne dépende plus de cette id_batterie avant de pouvoir la supprimer.") + "

"; else message += "

" + qsTr("Cette id_batterie est utilisée 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 cette id_batterie avant de pouvoir la 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 = 2; boite_information.imageTitreSource = "/images/attention.png" boite_information.message = message; boite_information.boutonOkTexte = qsTr("Ok") boite_information.boutonAnnuler = false; boite_information.alignementMessage = Text.AlignLeft boite_information.type = type_boite_information_supprimer; boite_information.open(); return(-1); } } //============================================================================================================= // Suppression de la batterie //============================================================================================================= function suppression_batterie() { var req; // Suppression de la batterie dans TB_Batteries : req = 'DELETE FROM TB_Batteries WHERE Cle_primaire=' + id_batterie + ' '; //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); } //============================================================================================================= // Forçage pleine charge //============================================================================================================= function forcer_pleine_charge() { var req; // Suppression de la batterie dans TB_Batteries : req = 'UPDATE TB_Batteries SET New_cde=' + shipheart_batteries_commande_forcage_pleine_charge + ' WHERE Cle_primaire=' + id_batterie + ' '; //console.log("req = [ " + req + "; ]"); bdd.requete_unique(req); } //============================================================================================================= // Reset du SOH //============================================================================================================= function reset_soh() { var req; // Suppression de la batterie dans TB_Batteries : req = 'UPDATE TB_Batteries SET New_cde=' + shipheart_batteries_commande_reset_soh + ' WHERE Cle_primaire=' + id_batterie + ' '; //console.log("req = [ " + req + "; ]"); bdd.requete_unique(req); // Mise à jour des variables globales pour prise en compte immédiatement : champ_formulaire_Soh.text = 100; } //============================================================================================================= // Reset des compteurs //============================================================================================================= function reset_compteurs() { var req; // Suppression de la batterie dans TB_Batteries : req = 'UPDATE TB_Batteries SET New_cde=' + shipheart_batteries_commande_reset_compteurs + ' WHERE Cle_primaire=' + id_batterie + ' '; //console.log("req = [ " + req + "; ]"); bdd.requete_unique(req); // Mise à jour des variables globales pour prise en compte immédiatement : champ_formulaire_Nombre_cycles.text = 0; champ_formulaire_Nombre_decharges_completes.text = 0; } //============================================================================================================= // 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