Files
shipheart-qt/config_circuit.qml
T

1715 lines
91 KiB
QML

//========================================================================================================================================================================
// CONFIG_CIRCUIT.QML
// Ce fichier traite la configuration d'un circuit. La page permet notamment de :
// - Modifier la config du circuit (ou de le créer la première fois),
// - Supprimer le circuit
// La page est appelée depuis la page config_circuits_1, en cliquant sur le circuit à modifier (ou sur un circuit non affecté en vue de sa création)
//========================================================================================================================================================================
import QtQuick 2.12
import QtQml.Models
import qt.koriolan.shipheart 1.0
Shipheart_page {
id: page_config_circuit
// Mis en forme :
readonly property double pourcentage_largeur_colonne_gauche: 0.75
readonly property double espace_colonnes_principales: 20
readonly property double pourcentage_hauteur_ligne_haut: 1
readonly property double espace_lignes_principales: 20
readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas
readonly property int hauteur_ligne_formulaire: 60
readonly property double pourcentage_largeur_labels_formulaire: 0.4
readonly property int hauteur_bouton_droit: 80
readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1
readonly property int periode_init_raffraichissement_parametres: 1 // En ms
readonly property int periode_raffraichissement_parametres: 1000 // En ms
readonly property int step_timer_appui_long: 30 // en ms
readonly property int type_boite_information_alerte_changement_affectation: 0
readonly property int type_boite_information_supprimer: 1
// Affichage :
property int protection_mode: 0
property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée
// Données :
property int valeur_timer_appui_long: 0
property int id_circuit: 0
property int priorite_affichage_accueil: 0
property int adresse_module: 0
property int no_circuit: 0
property int id_circuit_esclave: 0
property string requete_differee: "" // Permet de mémoriser le contenu d'une resquête qui sera exécuté après expiration d'un timer dédié.
property int mode_commande_circuit: 0
property int old_consigne: 0
property var chaines_cdes_auto
property int nb_cdes_auto: 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_circuit(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte.
if (requete_differee === "") timer_tempo_reconfiguration.restart(); // Si pas de requete différée, on lance le timer de reconfig immédiatement.
else // Si requete différée :
{
timer_requete_differee.restart(); // ... on lance en le timer de requete différée
shipheart_clic();
}
}
}
}
}
}
//===========================================================
// Lorsque la page est sur le point d'être affichée dans la pile :
//===========================================================
// StackView.onActivating: {
// }
// Titre de la page :
Shipheart_titre_1 {titre:qsTr("Configuration du circuit"); 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 circuit")
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 : Affectation
Rectangle {
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: (adresse_module !== 0) // On n'autorise pas le changement d'affectation sur ShipBase
Shipheart_formulaire_label {
text: qsTr("Affectation")
width: parent.width * pourcentage_largeur_labels_formulaire
couleur: (champ_formulaire_Affectation.currentIndex !== 0)
? shipheart_formulaire_couleur_texte_par_defaut
: shipheart_formulaire_couleur_texte_en_erreur
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Affectation
model: ListModel { }
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
prefixe_repos: flag_init ? "" : champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).prefixe_repos
onActivated: {
shipheart_clic();
// Mise à jour de la valeur de seuil de disjonction en accord avec l'intensité maxi par circuit de la nouvelle carte sélectionnée (SDIR #185) :
if (champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).valeur !== "-1/0") // Permet de garder les valeurs déjà enregistrées pour utilisation futures
{
var new_affectation = champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).valeur.split('/');
raffraichissement_modele_intensite_seuil_haut(new_affectation[0], champ_formulaire_Intensite_seuil_haut.model.get(champ_formulaire_Intensite_seuil_haut.currentIndex).valeur, champ_formulaire_Circuit_esclave.model.get(champ_formulaire_Circuit_esclave.currentIndex).valeur);
}
}
}
Shipheart_formulaire_ligne_separation {
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
}
}
//-------------------------------------------------------------------------------
// Ligne de formulaire : Circuit renfort
Rectangle {
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: !flag_init
&& (adresse_module !== 0) // Non autorisé sur ShipBase
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& ((champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower812) ||
(champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower8DC) )
// Si l'affectation a changée depuis le dernier enregistrement, on dévalide l'accès au circuit esclave car le module a pu être changé et le modèle des circuits escalves n'est plus forcément à jour... :
&& (champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).valeur === adresse_module + "/" + no_circuit)
&& (id_circuit > 0) // SDIR #186
Shipheart_formulaire_label {
text: qsTr("Circuit renfort")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Circuit_esclave
model: ListModel { }
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
prefixe_repos: flag_init ? "" : champ_formulaire_Circuit_esclave.model.get(champ_formulaire_Circuit_esclave.currentIndex).prefixe_repos
onActivated: {
shipheart_clic();
// Mise à jour de la valeur de seuil de disjonction en accord avec l'intensité maxi par circuit du fait du changement de circuit renfort :
var new_affectation = champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).valeur.split('/');
raffraichissement_modele_intensite_seuil_haut(new_affectation[0], champ_formulaire_Intensite_seuil_haut.model.get(champ_formulaire_Intensite_seuil_haut.currentIndex).valeur, champ_formulaire_Circuit_esclave.model.get(champ_formulaire_Circuit_esclave.currentIndex).no);
// ATTENTION : le 3ème paramètre ci-dessus est le No et non l'ID de l'esclave (que l'on n'a pas à ce stade puisqu'il n'est pas forcément créé). On utilise donc le n° puisque ce que l'on va en faire est juste de savoir s'il existe ou non. On n'a pas besoin de son ID à proprement parler.
}
}
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"
visible: !flag_init
&& (champ_formulaire_Affectation.currentIndex !== 0)
Shipheart_formulaire_label {
text: qsTr("Groupe de circuits")
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 : Mode de commande
Rectangle {
width: parent.width
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: !flag_init
&& (adresse_module !== 0) // Non autorisé sur ShipBase
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0)
&& ((champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower812) ||
(champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower8DC) )
Shipheart_formulaire_label {
text: qsTr("Mode de commande")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Mode_commande
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 : Vitesse de démarrage
Rectangle {
width: parent.width
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: !flag_init
&& (adresse_module !== 0) // Non autorisé sur ShipBase
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0)
&& ((champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower812) ||
(champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower8DC) )
&& (champ_formulaire_Mode_commande.model.get(champ_formulaire_Mode_commande.currentIndex).valeur > 0)
Shipheart_formulaire_label {
text: qsTr("Vitesse de démarrage/arrêt")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Step_time
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 : Time-out
Rectangle {
width: parent.width
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: !flag_init
&& (adresse_module !== 0) // Non autorisé sur ShipBase
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0)
&& (champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type !== shipheart_type_module_shipbase)
Shipheart_formulaire_label {
text: qsTr("Commande impulsionnelle")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Time_out
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 : Seuil de disjonction
Rectangle {
width: parent.width
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: !flag_init
&& (adresse_module !== 0) // Non autorisé sur ShipBase
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0)
&& ((champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower812) ||
(champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower8DC) )
Shipheart_formulaire_label {
text: qsTr("Seuil de disjonction")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Intensite_seuil_haut
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 : Intensite_seuil_haut_tempo
Rectangle {
width: parent.width
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: !flag_init
&& (adresse_module !== 0) // Non autorisé sur ShipBase
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0)
&& ((champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower812) ||
(champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).type === shipheart_type_module_shippower8DC) )
Shipheart_formulaire_label {
text: qsTr("Vitesse de disjonction")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Intensite_seuil_haut_tempo
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 : Intensite_coeff_filtrage
Rectangle {
width: parent.width
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
/* visible: !flag_init
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0)
*/
visible: false
Shipheart_formulaire_label {
text: qsTr("Filtrage du courant consommé")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Intensite_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
}
}
//-------------------------------------------------------------------------------
// Ligne de formulaire : Masquage
Rectangle {
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: !flag_init
&& (champ_formulaire_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0)
Shipheart_formulaire_label {
text: qsTr("Masquer sur la page d'accueil")
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_checkbox {
id: champ_formulaire_Masquage
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
}
Shipheart_formulaire_ligne_separation {
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
}
}
} // Fin de modele grille principale (ObjectModel )
}
}
//-------------------------------------------------------
// 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 {
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_Affectation.currentIndex !== 0)
&& (champ_formulaire_Famille.currentIndex !== 0) )
|| ( (id_circuit > 0) // Pour un circuit existant, ...
&& (champ_formulaire_Famille.currentIndex !== 0) ) ) // ... on autorise l'affectation à Aucune
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: (id_circuit === 0) ? qsTr("Créer le circuit") : qsTr("Enregistrer")
color: couleur_blanc_casse
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
if (id_circuit !== 0) mise_a_jour_circuit(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte.
else creation_circuit();
if (requete_differee === "") timer_tempo_reconfiguration.restart(); // Si pas de requete différée, on lance le timer de reconfig immédiatement.
else // Si requete différée :
{
shipheart_clic();
boite_information.niveau = 1
boite_information.imageTitreSource = "/images/ampoule.png"
boite_information.message = qsTr("L'affectation du circuit vient d'être modifiée alors que le circuit était actif. \nAvant d'effectuer ce changement, le circuit a été passé sur OFF.\n\nPensez à le réactiver si besoin...")
boite_information.type = type_boite_information_alerte_changement_affectation;
boite_information.open(); // - on affiche la boite d'info pour signaler la désactivation du circuit
timer_requete_differee.restart(); // - On lance en // le timer de requete différée
}
}
}
}
//.......................................................
// Bouton Supprimer
//.......................................................
Rectangle {
width: parent.width
height: hauteur_bouton_droit
color: shipheart_couleur_fond_bouton
radius: shipheart_rayon_bouton
visible: (!clavier.active) && // Si le clavier est déplié...
(id_circuit !== 0) && // ... ou si création
(adresse_module !== 0) // ... ou si circuit de ShipBase, on ne propose pas le bouton
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
shipheart_clic();
timer_appui_long.running = true;
valeur_timer_appui_long = 0;
}
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
timer_appui_long.running = false;
valeur_timer_appui_long = 0;
}
onExited: { // Déclenché si le doigt sort de la zone du bouton (sinon, on continue à compter alors qu'on est sorti de la zone et même relaché le doigt !!)
timer_appui_long.running = false;
valeur_timer_appui_long = 0;
}
}
}
//.......................................................
// Timer de requêtes différées
//.......................................................
Timer {
id: timer_requete_differee // Timer lancé uniquement si une requete différée est à traiter
interval: 250 // Théoriquement, le traitement par l'appli de la requete précédente sera fait dans les 100ms.
triggeredOnStart: false
running: false
repeat: false
onTriggered: {
bdd.requete_unique(requete_differee); // A l'expiration du timer, la requete différée est exécutée
synchro_bdd(shipheart_type_synchro_config); // Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration...
timer_tempo_reconfiguration.restart(); // Lancement du timer d'attente de fin de reconfig
}
}
//.......................................................
// Timer de reconfiguration
//.......................................................
Timer {
id: timer_tempo_reconfiguration
interval: 250 // Cette tempo n'est utilisée que pour le premier cycle
triggeredOnStart: false
running: false
repeat: true
onTriggered: {
if (bdd.check_fin_configuration())
{
timer_tempo_reconfiguration.stop();
if (requete_differee !== "") requete_differee = ""; // Par principe
if (boite_information.opened === false) stackView.pop(); // S'il y a eu une boite d'info ouverte, c'est le clic sur Ok sur la boite d'info qui fera le POP.
}
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;
spacing: 5
padding: 5
//.................................................
// Bouton retour
//.................................................
Rectangle {
id: bandeau_bas_zone_retour
width: (parent.width * pourcentage_bandeau_bas_largeur_zone_retour) - (2 * parent.padding)
height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding;
radius: shipheart_rayon_bouton
color: shipheart_couleur_fond_bouton
Image {
source: "/images/icone_retour.png"
sourceSize.height: 30
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
}
MouseArea { // Zone d'interaction. On est obligé de la mettre dans la grille pour que Rectangle et MouseArea soient frères ou parent/enfant ET qu'on n'occupe qu'un espace dans la grille.
id: mouse_area_bandeau_bas_zone_retour
anchors.fill: parent
onClicked: {
shipheart_clic();
stackView.pop()
}
}
}
}
//-------------------------------------------------------
// 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_affectation:
stackView.pop(); // Retour à la page de config des circuits (a priori, par appui sur Ok puisque c'est le seul bouton valide...)
break;
case type_boite_information_supprimer:
break;
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, j, k;
var type_carte;
var texte_carte;
var texte_circuit;
var nb_circuits;
var defaut_no_carte = -1;
var defaut_no_circuit = -1;
var defaut_circuit_esclave = 0;
var defaut_mode_commande = shipheart_mode_commande_circuit_tor;
var intensite_coeff_filtrage, defaut_intensite_coeff_filtrage = 16;
var intensite_seuil_haut;
var intensite_seuil_haut_tempo, defaut_intensite_seuil_haut_tempo = 500;
var step_time, defaut_step_time = 20;
var time_out, defaut_time_out = 0;
var id_famille, defaut_id_famille = 0;
// Note préliminaire :
// Chaque circuit est affecté à un n° de module (entre O et ...) ET à un n° de circuit sur le module (entre 0 et ...).
// Le modèle d'affectation de cette page utilise donc 'adresse_module/no_circuit' comme valeur d'identification unique.
// La valeur d'affectation 'Aucune' utilise la valeur particulière '-1/-1' pour être identifiée.
// Dans la BDD, les valeurs de Adresse_module et No_circuit sont reportées telles qu'elles.
//console.log("Id du circuit = " + id_circuit);
if (id_circuit > 0) // Cas d'une modification de circuit existant :
{
req = 'SELECT Nom, ';
req += ' Adresse_module, ';
req += ' No_circuit, ';
req += ' ID_Circuit_esclave, ';
req += ' Mode_commande, ';
req += ' Old_consigne, ';
req += ' Intensite_coeff_filtrage, ';
req += ' Intensite_seuil_haut, ';
req += ' Intensite_seuil_haut_tempo, ';
req += ' Step_time, ';
req += ' Time_out, ';
req += ' ID_Famille, ';
req += ' Priorite_affichage_accueil ';
req += ' FROM TB_Circuits ';
req += ' WHERE Cle_primaire=' + id_circuit + ' ';
//console.log("Requête = " + 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 ++]);
no_circuit = Number(res[i ++]);
id_circuit_esclave = Number(res[i ++]);
mode_commande_circuit = Number(res[i ++]);
old_consigne = Number(res[i ++]);
intensite_coeff_filtrage = Number(res[i ++]);
intensite_seuil_haut = Number(res[i ++]);
intensite_seuil_haut_tempo = Number(res[i ++]);
step_time = Number(res[i ++]);
time_out = Number(res[i ++]);
id_famille = Number(res[i ++]);
priorite_affichage_accueil = Number(res[i ++]);
if (priorite_affichage_accueil <= 0) champ_formulaire_Masquage.checked = true;
else champ_formulaire_Masquage.checked = false;
}
else // Cas d'une création de circuit :
{
champ_formulaire_Nom.text = "";
adresse_module = defaut_no_carte;
no_circuit = defaut_no_circuit;
id_circuit_esclave = defaut_circuit_esclave;
mode_commande_circuit = defaut_mode_commande;
old_consigne = 0;
intensite_coeff_filtrage = defaut_intensite_coeff_filtrage;
intensite_seuil_haut = max_intensite_carte(adresse_module, id_circuit_esclave); // SDIR #185
intensite_seuil_haut_tempo = defaut_intensite_seuil_haut_tempo;
step_time = defaut_step_time;
time_out = defaut_time_out;
id_famille = defaut_id_famille;
champ_formulaire_Masquage.checked = false;
}
//console.log("circuit esclave = " + circuit_esclave);
//---------------------------------------------------------------------------------------
// Affectation et Circuit esclave :
champ_formulaire_Affectation.model.clear();
champ_formulaire_Affectation.model.append( {
"type": -1,
"valeur": defaut_no_carte + "/" + defaut_no_circuit,
"texte": qsTr("Non affecté"),
"groupe": false,
"prefixe_repos": "",
"actif": true } );
champ_formulaire_Circuit_esclave.model.clear();
champ_formulaire_Circuit_esclave.model.append({
"no": 0,
"valeur": 0,
"texte": qsTr("Aucun"),
"prefixe_repos": "",
"actif": true});
// Recherche des modules et création des enregistrements correspondant du modèle (ligne de groupe pour la carte + 8 lignes de circuits "non affectés" par défaut) :
req = 'SELECT Adresse_k_bus, ';
req += ' Type, ';
req += ' Presence ';
req += ' FROM TB_Modules_config ';
req += ' WHERE ';
req += ' ( Type=' + shipheart_type_module_shipbase + ' ';
req += ' OR Type='+shipheart_type_module_shippower812+' ';
req += ' OR Type='+shipheart_type_module_shippower4AC+' ';
req += ' OR Type='+shipheart_type_module_shippower8DC+') ';
req += ' AND ';
req += ' ( Presence=1 ';
req += ' OR Adresse_k_bus IN (SELECT Adresse_module FROM TB_Circuits GROUP BY Adresse_module ORDER BY Adresse_module) ) ';
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)
{
//console.log("carte trouvée : adresse= " + res[0] + " et Type=" + res[1]);
nb_circuits = 0;
switch(Number(res[1]))
{
//-------------------------------
case shipheart_type_module_shipbase:
type_carte = shipheart_type_module_shipbase;
texte_carte = "ShipBase";
if (shipheart_generation_shipbase === shipheart_generation_shipbase_v2) nb_circuits = 3;
else nb_circuits = 2;
break;
//-------------------------------
case shipheart_type_module_shippower812:
type_carte = shipheart_type_module_shippower812;
texte_carte = qsTr("ShipPower812 [@ %1]").arg(res[0]);
nb_circuits = 8;
break;
//-------------------------------
case shipheart_type_module_shippower4AC:
type_carte = shipheart_type_module_shippower4AC;
texte_carte = qsTr("ShipPower4AC [@ %1]").arg(res[0]);
nb_circuits = 4;
break;
//-------------------------------
case shipheart_type_module_shippower8DC:
type_carte = shipheart_type_module_shippower8DC;
texte_carte = qsTr("ShipPower8DC [@ %1]").arg(res[0]);
nb_circuits = 8;
break;
//-------------------------------
default:
type_carte = -1;
console.log ("Type de carte inconnu dans 'init_page()'...");
break;
}
if (type_carte === -1) continue;
// Ajout de l'entete du module :
champ_formulaire_Affectation.model.append({
"type": type_carte,
"valeur": "",
"texte": texte_carte,
"groupe": true,
"prefixe_repos": "",
"actif": false } );
// Création des entrées du modèle pour tous les circuits du module :
for (j = 0; j < nb_circuits; j ++)
{
champ_formulaire_Affectation.model.append({
"type": type_carte,
"valeur": Number(res[0]) + "/" + Number(j),
"texte": qsTr("Circuit %1").arg(Number(j+1)),
"groupe": false,
"prefixe_repos": texte_carte + " - ",
// "actif": true } );
"actif": (Number(res[2]) !== 0) } );
}
// Si le module en cours est le module sur lequel le circuit est positionné, on rempli au passage le modèle des circuits renfort :
if (adresse_module === Number(res[0]))
{
for (j = 0; j < nb_circuits; j ++)
{
champ_formulaire_Circuit_esclave.model.append({
"no": (j+1),
"valeur": 0,
"texte": qsTr("Circuit %1").arg(Number(j+1)),
"prefixe_repos": texte_carte + " - ",
"actif": true});
}
}
}
}
// Recherche des circuits présents et mise à jour des lignes correspondantes du modèle :
var actif;
req = 'SELECT ';
req += ' Nom, ';
req += ' Adresse_module, ';
req += ' No_circuit, ';
req += ' Cle_primaire ';
req += ' FROM TB_Circuits ';
req += ' WHERE Adresse_module>=0 '; // Evite qu'on "empile" sur le "Non affecté" tous les circuits non affectés...
req += ' ORDER BY Adresse_module, No_circuit';
//console.log("req = [ " + req + "; ]");
nb_circuits = bdd.requete(req);
for (i = 0; i < nb_circuits; i ++)
{
res = bdd.lecture_ligne();
if (!res.isEmpty)
{
if (Number(res[3]) === id_circuit) actif = true; // On laisse actif le choix actuel.
else actif = false; // Les autres circuits présents sont par contre rendus inactifs.
// On n'a pas d'autre choix que de parcourir toutes les entrées du modèle pour rechercher l'entrée dont le N° de carte / N° de circuit matche avec le circuit en cours :
for (k = 0; k < champ_formulaire_Affectation.count; k ++)
{
if (champ_formulaire_Affectation.model.get(k).valeur === (res[1] + "/" + res[2]))
{
if (actif) texte_circuit = champ_formulaire_Affectation.model.get(k).texte;
else texte_circuit = qsTr("%1 - %2").arg(champ_formulaire_Affectation.model.get(k).texte).arg(res[0]);
champ_formulaire_Affectation.model.set(k, {
"valeur": Number(res[1]) + "/" + Number(res[2]),
"texte": texte_circuit,
"actif": actif } );
break; // Il est inutile de continuer à boucler dès qu'on a trouvé l'entrée recherchée...
}
}
// Recherche pour cicuit esclave :
if (adresse_module === Number(res[1])) // Si on est sur la carte du circuit en cours
{
if (Number(res[3]) === id_circuit_esclave) actif = true; // On laisse actif le choix actuel.
else actif = false; // Les autres circuits présents sont par contre rendus inactifs.
// On n'a pas d'autre choix que de parcourir toutes les entrées du modèle pour rechercher l'entrée dont le N° de carte / N° de circuit matche avec le circuit en cours :
for (k = 0; k < champ_formulaire_Circuit_esclave.count; k ++)
{
if (champ_formulaire_Circuit_esclave.model.get(k).no === (Number(res[2]) + 1))
{
if (actif) texte_circuit = champ_formulaire_Circuit_esclave.model.get(k).texte;
else texte_circuit = qsTr("%1 - %2").arg(champ_formulaire_Circuit_esclave.model.get(k).texte).arg(res[0]);
champ_formulaire_Circuit_esclave.model.set(k, {
"no": (Number(res[2]) + 1),
"valeur": Number(res[3]),
"texte": texte_circuit,
"actif": actif } );
break; // Il est inutile de continuer à boucler dès qu'on a trouvé l'entrée recherchée...
}
}
}
}
}
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(adresse_module + "/" + no_circuit, champ_formulaire_Affectation.model, "Affectation");
if (i === -1) champ_formulaire_Affectation.currentIndex = recherche_index_valeur_modele(defaut_no_carte + "/" + defaut_no_circuit, champ_formulaire_Affectation.model, "Affectation");
else champ_formulaire_Affectation.currentIndex = i;
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(id_circuit_esclave, champ_formulaire_Circuit_esclave.model, "Circuit_esclave");
if (i === -1) champ_formulaire_Circuit_esclave.currentIndex = recherche_index_valeur_modele(defaut_circuit_esclave, champ_formulaire_Circuit_esclave.model, "Circuit_esclave");
else champ_formulaire_Circuit_esclave.currentIndex = i;
//---------------------------------------------------------------------------------------
// Mode de commande :
champ_formulaire_Mode_commande.model.clear();
champ_formulaire_Mode_commande.model.append({"valeur": defaut_mode_commande, "texte": qsTr("On-Off") });
champ_formulaire_Mode_commande.model.append({"valeur": shipheart_mode_commande_circuit_soft_tor, "texte": qsTr("On-Off progressif") });
champ_formulaire_Mode_commande.model.append({"valeur": shipheart_mode_commande_circuit_soft_variable, "texte": qsTr("Variateur") });
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(mode_commande_circuit, champ_formulaire_Mode_commande.model, "Mode_commande");
if (i === -1) champ_formulaire_Mode_commande.currentIndex = recherche_index_valeur_modele(defaut_mode_commande, champ_formulaire_Mode_commande.model, "Mode_commande");
else champ_formulaire_Mode_commande.currentIndex = i;
//---------------------------------------------------------------------------------------
// Coefficient de filtrage du courant (valeur en nombre d'échantillons ; mini = 1):
champ_formulaire_Intensite_coeff_filtrage.model.clear();
champ_formulaire_Intensite_coeff_filtrage.model.append({"valeur": 1, "texte": qsTr("Aucun filtrage") });
champ_formulaire_Intensite_coeff_filtrage.model.append({"valeur": 4, "texte": qsTr("Très faible") });
champ_formulaire_Intensite_coeff_filtrage.model.append({"valeur": 8, "texte": qsTr("Faible") });
champ_formulaire_Intensite_coeff_filtrage.model.append({"valeur": defaut_intensite_coeff_filtrage, "texte": qsTr("Moyen") });
champ_formulaire_Intensite_coeff_filtrage.model.append({"valeur": 64, "texte": qsTr("Elevé") });
champ_formulaire_Intensite_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(intensite_coeff_filtrage, champ_formulaire_Intensite_coeff_filtrage.model, "Intensite_coeff_filtrage");
if (i === -1) champ_formulaire_Intensite_coeff_filtrage.currentIndex = recherche_index_valeur_modele(defaut_intensite_coeff_filtrage, champ_formulaire_Intensite_coeff_filtrage.model, "Intensite_coeff_filtrage");
else champ_formulaire_Intensite_coeff_filtrage.currentIndex = i;
//---------------------------------------------------------------------------------------
// Seuil de disjonction (en mA) :
intensite_seuil_haut = raffraichissement_modele_intensite_seuil_haut(adresse_module, intensite_seuil_haut, id_circuit_esclave); // L'intensité est ajustée au passage si nécessaire (notamment si le max de la nouvelle carte est < valeur courante)
//---------------------------------------------------------------------------------------
// Vitesse de disjonction (valeur en ms):
champ_formulaire_Intensite_seuil_haut_tempo.model.clear();
champ_formulaire_Intensite_seuil_haut_tempo.model.append({"valeur": 50, "texte": qsTr("Très rapide") });
champ_formulaire_Intensite_seuil_haut_tempo.model.append({"valeur": 200, "texte": qsTr("Rapide") });
champ_formulaire_Intensite_seuil_haut_tempo.model.append({"valeur": defaut_intensite_seuil_haut_tempo, "texte": qsTr("Moyenne") });
champ_formulaire_Intensite_seuil_haut_tempo.model.append({"valeur": 2000, "texte": qsTr("Lente") });
champ_formulaire_Intensite_seuil_haut_tempo.model.append({"valeur": 5000, "texte": qsTr("Très lente") });
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(intensite_seuil_haut_tempo, champ_formulaire_Intensite_seuil_haut_tempo.model, "Intensite_seuil_haut_tempo");
if (i === -1) champ_formulaire_Intensite_seuil_haut_tempo.currentIndex = recherche_index_valeur_modele(defaut_intensite_seuil_haut_tempo, champ_formulaire_Intensite_seuil_haut_tempo.model, "Intensite_seuil_haut_tempo");
else champ_formulaire_Intensite_seuil_haut_tempo.currentIndex = i;
//---------------------------------------------------------------------------------------
// Vitesse démarrage :
// Note 26/01/2023 : pour les SP812, le nb de steps est passé ce jour à [nouvelle_consigne - ancienne_consigne] / 2 soit, en général, 50. Auparavant, le nb de steps était de 25.
// pour les SP8DC, le nombre de pas est fixé à 50 et il est réduit si [nouvelle_consigne - ancienne_consigne] < 50.
champ_formulaire_Step_time.model.clear();
champ_formulaire_Step_time.model.append({"valeur": 5, "texte": qsTr("Très rapide") });
champ_formulaire_Step_time.model.append({"valeur": 10, "texte": qsTr("Rapide") });
champ_formulaire_Step_time.model.append({"valeur": defaut_step_time, "texte": qsTr("Moyenne") });
champ_formulaire_Step_time.model.append({"valeur": 40, "texte": qsTr("Lente") });
champ_formulaire_Step_time.model.append({"valeur": 80, "texte": qsTr("Très lente") });
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(step_time, champ_formulaire_Step_time.model, "Step-time");
if (i === -1) champ_formulaire_Step_time.currentIndex = recherche_index_valeur_modele(defaut_step_time, champ_formulaire_Step_time.model, "Step-time");
else champ_formulaire_Step_time.currentIndex = i;
//---------------------------------------------------------------------------------------
// Time-out (en x 100ms) :
champ_formulaire_Time_out.model.clear();
champ_formulaire_Time_out.model.append({"valeur": defaut_time_out, "texte": qsTr("Non") });
champ_formulaire_Time_out.model.append({"valeur": (1), "texte": qsTr("1 seconde") });
champ_formulaire_Time_out.model.append({"valeur": (2), "texte": qsTr("2 secondes") });
champ_formulaire_Time_out.model.append({"valeur": (5), "texte": qsTr("5 secondes") });
champ_formulaire_Time_out.model.append({"valeur": (15), "texte": qsTr("15 secondes") });
champ_formulaire_Time_out.model.append({"valeur": (30), "texte": qsTr("30 secondes") });
champ_formulaire_Time_out.model.append({"valeur": (45), "texte": qsTr("45 secondes") });
champ_formulaire_Time_out.model.append({"valeur": (1*60), "texte": qsTr("1 minute") });
champ_formulaire_Time_out.model.append({"valeur": (5*60), "texte": qsTr("5 minutes") });
champ_formulaire_Time_out.model.append({"valeur": (15*60), "texte": qsTr("15 minutes") });
champ_formulaire_Time_out.model.append({"valeur": (60*60), "texte": qsTr("1 heure") });
champ_formulaire_Time_out.model.append({"valeur": (4*60*60), "texte": qsTr("4 heures") });
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(time_out, champ_formulaire_Time_out.model, "Time-out");
if (i === -1) champ_formulaire_Time_out.currentIndex = recherche_index_valeur_modele(defaut_time_out, champ_formulaire_Time_out.model, "Time-out");
else champ_formulaire_Time_out.currentIndex = i;
//---------------------------------------------------------------------------------------
// Famille :
champ_formulaire_Famille.model.clear();
champ_formulaire_Famille.model.append({"valeur": defaut_id_famille, "texte": "Non défini" });
req = 'SELECT Cle_primaire, Nom FROM TB_Familles WHERE Type_source=' + shipheart_type_source_circuits + ' 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 = recherche_index_valeur_modele(defaut_id_famille, champ_formulaire_Famille.model, "Famille");
else champ_formulaire_Famille.currentIndex = i;
flag_init = false; // Indique que l'init est terminée
}
//=============================================================================================================
// Raffraichissement de la liste cdes_auto du circuit
//=============================================================================================================
function raffraichissement_modele_intensite_seuil_haut(adresse_module, intensite_seuil_haut, id_circuit_esclave)
{
var i;
var max_intensite_seuil_haut;
champ_formulaire_Intensite_seuil_haut.model.clear();
// Recherche du type de carte et de sa version pour déterminer la plage maximale possible :
max_intensite_seuil_haut = max_intensite_carte(adresse_module, id_circuit_esclave); // Retour de 0 si adresse_module=-1
if (max_intensite_seuil_haut > 0)
{
for (i = 1; i <= max_intensite_seuil_haut; i ++ ) champ_formulaire_Intensite_seuil_haut.model.append({"valeur": i, "texte": i + " A" });
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(intensite_seuil_haut, champ_formulaire_Intensite_seuil_haut.model, "Intensite_seuil_haut");
if (i !== -1)
{
champ_formulaire_Intensite_seuil_haut.currentIndex = i;
//console.log("Retour de mise à jour modèle Intensité seuil haut = " + intensite_seuil_haut);
return(intensite_seuil_haut);
}
else
{
champ_formulaire_Intensite_seuil_haut.currentIndex = recherche_index_valeur_modele(max_intensite_seuil_haut, champ_formulaire_Intensite_seuil_haut.model, "Intensite_seuil_haut");
//console.log("Retour de mise à jour modèle Intensité seuil haut = " + max_intensite_seuil_haut);
return(max_intensite_seuil_haut);
}
}
else // Cas où le type de carte n'est pas connu (permet d'éviter des erreurs mais ce cas n'est normalement jamais affiché)...
{
champ_formulaire_Intensite_seuil_haut.model.append({"valeur": 0, "texte": "Aucun" });
champ_formulaire_Intensite_seuil_haut.currentIndex = 0;
//console.log("Retour de mise à jour modèle Intensité seuil haut = " + max_intensite_seuil_haut);
return(max_intensite_seuil_haut);
}
}
//=============================================================================================================
// Mise à jour des valeurs saisies du circuit
// Important : on considère qu'après exécution de cette fonction, on quitte la page (les propriétés globales
// peuvent en effet être affectées et/ou pas à jour après cette fonction).
//=============================================================================================================
function mise_a_jour_circuit()
{
var req, res;
// Traitement de Affectation :
var valeur = champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).valeur
const valeurs = valeur.split('/');
var new_no_carte = Number(valeurs[0]);
var new_no_circuit_carte = Number(valeurs[1]);
var paa;
var mode = champ_formulaire_Mode_commande.model.get(champ_formulaire_Mode_commande.currentIndex).valeur;
var step_time = champ_formulaire_Step_time.model.get(champ_formulaire_Step_time.currentIndex).valeur;
var intensite_seuil_haut = champ_formulaire_Intensite_seuil_haut.model.get(champ_formulaire_Intensite_seuil_haut.currentIndex).valeur;
var intensite_coeff_filtrage = champ_formulaire_Intensite_coeff_filtrage.model.get(champ_formulaire_Intensite_coeff_filtrage.currentIndex).valeur;
// Traitement du circuit esclave :
var new_id_circuit_esclave = champ_formulaire_Circuit_esclave.model.get(champ_formulaire_Circuit_esclave.currentIndex).valeur;
var new_no_circuit_esclave = champ_formulaire_Circuit_esclave.model.get(champ_formulaire_Circuit_esclave.currentIndex).no;
//--------------------------------------------------------------------------------------------------
// Changement d'affectation du circuit :
if ((new_no_carte !== adresse_module) || (new_no_circuit_carte !== no_circuit))
{
extinction_circuit_garantie(id_circuit); // L'extinction du circuit éteindra aussi (l'ancien) esclave s'il y en avait un.
// Impact sur le circuit esclave :
if (new_no_carte !== adresse_module) // Qu'il y en ait eu un ou pas, il ne peut y en avoir suite à un changement de module (puisqu'on n'a pas pu proposer un circuit esclave sur le nouveau module)
{
new_id_circuit_esclave = 0;
new_no_circuit_esclave = 0; // C'est ce qui permettra sa suppression ensuite s'il y en avait un.
}
}
//--------------------------------------------------------------------------------------------------
// Mise à jour de N° de carte et du n° de circuit :
adresse_module = new_no_carte;
no_circuit = new_no_circuit_carte;
//--------------------------------------------------------------------------------------------------
// Vérification des paramètres spécifiques au type de module support du circuit :
switch(type_carte(adresse_module))
{
//-------------------------------------------
case shipheart_type_module_shippower812:
intensite_coeff_filtrage = 16;
if (mode !== shipheart_mode_commande_circuit_soft_variable) old_consigne = 0; // SDIR #184
break;
//-------------------------------------------
case shipheart_type_module_shippower4AC:
intensite_coeff_filtrage = 4;
mode = shipheart_mode_commande_circuit_tor;
// step_time = defaut_step_time; // SDIR #193 : mise en commentaire de la ligne car 'defaut_step_time' n'existe pas et met la page en erreur...
new_id_circuit_esclave = 0; // Normalement ne doit pas arriver car déjà pris en compte de façon plus générale au § précédent (si on arrive sur un SP4AC, c'est qu'il y a eu changement de carte donc le circuit esclave a été déjà sucré...)
new_no_circuit_esclave = 0;
break;
//-------------------------------------------
case shipheart_type_module_shippower8DC:
intensite_coeff_filtrage = 16;
if (mode !== shipheart_mode_commande_circuit_soft_variable) old_consigne = 0; // SDIR #184
break;
//-------------------------------------------
default: // Ce cas correspond notamment aux circuits Non Affectés...
intensite_coeff_filtrage = 16;
break;
}
//--------------------------------------------------------------------------------------------------
// Vérification que le seuil de disjonction est compatible avec le module support :
// NB : ce test ne peut pas être intégré au § précédent car la fonction 'max_intensite_carte()' teste non seulement le type mais aussi la version hardware (cas des SP812)...
var max_intensite_seuil_haut = max_intensite_carte(adresse_module, new_id_circuit_esclave);
if (intensite_seuil_haut > max_intensite_seuil_haut) intensite_seuil_haut = max_intensite_seuil_haut;
//--------------------------------------------------------------------------------------------------
if (champ_formulaire_Masquage.checked) // Demande de masquage :
{
if (priorite_affichage_accueil <= 0) paa = priorite_affichage_accueil; // S'il était masqué, on garde la même valeur.
else paa = - priorite_affichage_accueil; // S'il était démasqué (donc > 0), on prend son opposé (comme ça, on est bien <0 mais on garde en plus la position initiale en mémoire)
}
else // Demande de ne pas le masquer :
{
if (priorite_affichage_accueil > 0) paa = priorite_affichage_accueil; // S'il était démasqué, on garde la même valeur
else if (priorite_affichage_accueil < 0) paa = - priorite_affichage_accueil; // S'il était masqué, avec une valeur mémorisée non nulle, on récupère la valeur mémorisée (l'opposé donc)
else paa = 999; // S'il était masqué mais sans valeur mémorisée (donc nulle), on attribue arbitrairement une valeur très élevée pour mettre le circuit affiché mais en dernière position.
}
//--------------------------------------------------------------------------------------------------
// Traitement du circuit esclave avec, pour l'essentiel, les mêmes paramètres que le circuit maitre :
//console.log("new_id_circuit_esclave = " + new_id_circuit_esclave + " et id_cicuit_esclave = " + id_circuit_esclave);
// Suppression de l'ancien circuit esclave si besoin :
if (id_circuit_esclave > 0) // Il y avait un circuit esclave :
{
if (new_id_circuit_esclave !== id_circuit_esclave) // Le nouveau circuit esclave est différent de l'ancien => Il faut supprimer l'ancien
{
// Suppression de la commande de l'ancien circuit esclave dans tous les cas) :
extinction_circuit_garantie(id_circuit_esclave);
// Suppression de l'ancien circuit esclave (dans tous les cas) :
req = 'DELETE FROM TB_Circuits WHERE Cle_primaire=' + id_circuit_esclave + ' ';
bdd.requete_unique(req);
}
}
// Création du nouveau circuit esclave si besoin :
if ( ((id_circuit_esclave > 0) && // Il y avait un circuit esclave...
(new_id_circuit_esclave !== id_circuit_esclave) && // ... et le nouveau est différent de l'ancien...
(new_no_circuit_esclave !== 0)) || // ... et le nouveau n'est pas nul OU
((id_circuit_esclave === 0) && // Il n'y avait pas de circuit esclave...
(new_no_circuit_esclave !== 0)) ) // ... et le nouveau n'est pas nul
{
req = 'INSERT INTO TB_Circuits (Nom, Adresse_module, No_circuit, ID_Circuit_esclave, Mode_commande, Intensite_coeff_filtrage, Intensite_seuil_haut, Intensite_seuil_haut_tempo, Step_time, Time_out, ID_Famille, Priorite_affichage_accueil) '
req += ' VALUES ("' + champ_formulaire_Nom.text + '"';
req += ', ' + adresse_module;
req += ', ' + (new_no_circuit_esclave - 1);
req += ', ' + (id_circuit * (-1));
req += ', ' + mode;
req += ', ' + intensite_coeff_filtrage;
req += ', ' + intensite_seuil_haut;
req += ', ' + champ_formulaire_Intensite_seuil_haut_tempo.model.get(champ_formulaire_Intensite_seuil_haut_tempo.currentIndex).valeur;
req += ', ' + step_time;
req += ', ' + champ_formulaire_Time_out.model.get(champ_formulaire_Time_out.currentIndex).valeur;
req += ', ' + champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur;
req += ', 0'; // Le circuit esclave est toujours masqué !
req += ') ';
//console.log("Requête = " + req)
bdd.requete_unique(req);
// Récupération de la clé primaire du circuit esclave créé :
req = 'SELECT Cle_primaire FROM TB_Circuits ORDER BY Cle_primaire DESC LIMIT 1';
res = bdd.requete_unique(req);
// id_circuit_esclave = Number(res[0]);
new_id_circuit_esclave = Number(res[0]); // SDIR #325
}
// Interdiction de mode variateur si on a un circuit esclave :
if (new_id_circuit_esclave > 0)
{
if (mode === shipheart_mode_commande_circuit_soft_variable)
{
mode = shipheart_mode_commande_circuit_soft_tor;
old_consigne = 0; // SDIR #184
// SDIR #325 req = 'UPDATE TB_Circuits SET Mode_commande=' + mode + ' WHERE Cle_primaire=' + id_circuit_esclave + ' '; // Maj de l'esclave qui a été créé avec le "mauvais" mode
req = 'UPDATE TB_Circuits SET Mode_commande=' + mode + ' WHERE Cle_primaire=' + new_id_circuit_esclave + ' '; // Maj de l'esclave qui a été créé avec le "mauvais" mode
bdd.requete_unique(req);
// Définition des paramètres de la boite de dialogue :
boite_information.niveau = 1;
boite_information.imageTitreSource = "/images/ampoule.png"
boite_information.message = qsTr("L'utilisation d'un circuit de renfort rend l'utilisation du mode de commande [Variateur] impossible.<br /><br />Le mode de commande vient donc d'être ramené à [On-Off Progressif].");
boite_information.open();
}
}
//--------------------------------------------------------------------------------------------------
// Génération de la requête de mise à jour du circuit :
req = 'UPDATE TB_Circuits SET Nom="' + champ_formulaire_Nom.text + '" ';
req += ', Adresse_module=' + adresse_module + ' ';
req += ', No_circuit=' + no_circuit + ' ';
req += ', ID_Circuit_esclave=' + new_id_circuit_esclave + ' '; // SDIR #325
req += ', Mode_commande=' + mode + ' ';
req += ', Old_consigne=' + old_consigne + ' ';
req += ', Intensite_coeff_filtrage=' + intensite_coeff_filtrage + ' ';
req += ', Intensite_seuil_haut=' + champ_formulaire_Intensite_seuil_haut.model.get(champ_formulaire_Intensite_seuil_haut.currentIndex).valeur + ' ';
req += ', Intensite_seuil_haut_tempo=' + champ_formulaire_Intensite_seuil_haut_tempo.model.get(champ_formulaire_Intensite_seuil_haut_tempo.currentIndex).valeur + ' ';
req += ', Step_time=' + champ_formulaire_Step_time.model.get(champ_formulaire_Step_time.currentIndex).valeur + ' ';
req += ', Time_out=' + champ_formulaire_Time_out.model.get(champ_formulaire_Time_out.currentIndex).valeur + ' ';
req += ', ID_Famille=' + champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur + ' ';
req += ', Priorite_affichage_accueil=' + paa + ' ';
req += ' WHERE Cle_primaire=' + id_circuit + ' '
//console.log("Requête = " + req)
bdd.requete_unique(req);
// Demande de synchro :
synchro_bdd(shipheart_type_synchro_config);
}
//=============================================================================================================
// Création du circuit
// Note : l'utilisation d'un circuit esclave est impossible lors de la création du circuit...
//=============================================================================================================
function creation_circuit()
{
var req, res;
// Traitement de Affectation :
var valeur = champ_formulaire_Affectation.model.get(champ_formulaire_Affectation.currentIndex).valeur
const valeurs = valeur.split('/');
var adresse_module = Number(valeurs[0]);
var no_circuit = Number(valeurs[1]);
var paa;
var mode = champ_formulaire_Mode_commande.model.get(champ_formulaire_Mode_commande.currentIndex).valeur;
var intensite_coeff_filtrage = champ_formulaire_Intensite_coeff_filtrage.model.get(champ_formulaire_Intensite_coeff_filtrage.currentIndex).valeur;
//--------------------------------------------------------------------------------------------------
// Vérification des paramètres spécifiques au type de module support du circuit :
switch(type_carte(adresse_module))
{
//-------------------------------------------
case shipheart_type_module_shipbase:
intensite_coeff_filtrage = 16;
break;
//-------------------------------------------
case shipheart_type_module_shippower812:
intensite_coeff_filtrage = 16;
break;
//-------------------------------------------
case shipheart_type_module_shippower4AC:
intensite_coeff_filtrage = 4;
break;
//-------------------------------------------
case shipheart_type_module_shippower8DC:
intensite_coeff_filtrage = 16;
break;
//-------------------------------------------
default: // Ce cas correspond notamment aux circuits Non Affectés...
intensite_coeff_filtrage = 16;
break;
}
if (champ_formulaire_Masquage.checked) paa = 0;
else paa = 999;
req = 'INSERT INTO TB_Circuits (Nom, Adresse_module, No_circuit, ID_Circuit_esclave, Mode_commande, Intensite_coeff_filtrage, Intensite_seuil_haut, Intensite_seuil_haut_tempo, Step_time, Time_out, ID_Famille, Priorite_affichage_accueil) '
req += ' VALUES ("' + champ_formulaire_Nom.text + '"';
req += ', ' + adresse_module;
req += ', ' + no_circuit;
req += ', ' + 0;
req += ', ' + mode;
req += ', ' + intensite_coeff_filtrage;
req += ', ' + champ_formulaire_Intensite_seuil_haut.model.get(champ_formulaire_Intensite_seuil_haut.currentIndex).valeur;
req += ', ' + champ_formulaire_Intensite_seuil_haut_tempo.model.get(champ_formulaire_Intensite_seuil_haut_tempo.currentIndex).valeur;
req += ', ' + champ_formulaire_Step_time.model.get(champ_formulaire_Step_time.currentIndex).valeur;
req += ', ' + champ_formulaire_Time_out.model.get(champ_formulaire_Time_out.currentIndex).valeur;
req += ', ' + champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur;
req += ', ' + paa;
req += ') ';
//console.log("Requête = " + req)
bdd.requete_unique(req);
// Récupération de la clé primaire du circuit maitre :
var id_circuit_maitre;
req = 'SELECT Cle_primaire FROM TB_Circuits ORDER BY Cle_primaire DESC LIMIT 1';
res = bdd.requete_unique(req);
id_circuit_maitre = Number(res[0]);
// Demande de synchro :
synchro_bdd(shipheart_type_synchro_config);
}
//=============================================================================================================
// Recherche du type de carte à partir de son n° sur K-Bus
//=============================================================================================================
function type_carte(adresse_module)
{
var req, res;
var max = 0;
if (adresse_module >= 0)
{
req = 'SELECT Type FROM TB_Modules_config WHERE Presence=1 AND Adresse_k_bus=' + adresse_module + ' ';
res = bdd.requete_unique(req);
return(Number(res[0]));
}
else return (-1); // Cas d'un circuit non affecté
}
//=============================================================================================================
// Calcul de l'intensité maxi pour une carte
//=============================================================================================================
function max_intensite_carte(adresse_module, id_circuit_esclave)
{
var req, res;
var max = 0;
if (adresse_module < 0) return(0); // Cas d'un circuit non affecté
req = 'SELECT Type, Hardware_version FROM TB_Modules_physiques WHERE Presence=1 AND Adresse_k_bus=' + adresse_module + ' ';
//console.log("req = [ " + req + "; ]");
res = bdd.requete_unique(req);
switch(Number(res[0]))
{
//-------------------------------------------
case shipheart_type_module_shipbase:
max = 0;
break;
//-------------------------------------------
case shipheart_type_module_shippower812:
if (Number(res[1]) === 0) // Hardware version = 0 :
{
if (id_circuit_esclave > 0) max = 35; // Cas d'un circuit avec circuit esclave
else max = 20;
}
else // Hardware version >= 1 :
{
if (id_circuit_esclave > 0) max = 40; // Cas d'un circuit avec circuit esclave
else max = 25;
}
break;
//-------------------------------------------
case shipheart_type_module_shippower4AC:
max = 32;
break;
//-------------------------------------------
case shipheart_type_module_shippower8DC:
if (id_circuit_esclave > 0) max = 40; // Cas d'un circuit avec circuit esclave
else return(25);
break;
//-------------------------------------------
default:
console.log ("Type de carte inconnu dans 'max_intensite_carte()'...");
max = 0;
break;
}
return(max);
}
//=============================================================================================================
// Check suppression du circuit
//=============================================================================================================
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")
for (i = 1; i < shipheart_specifique_client.length; i ++) // On commence à 1 car le premier champ est déjà traité...
{
var parametre = shipheart_specifique_client[i].split('=');
switch(parametre[0])
{
//--------------------------------------------------------
case 'id_circuit_activation_moteur':
if (id_circuit === Number(parametre[1])) // Cas où le circuit qu'on envisage de supprimer est celui utilisé pour démarrer le moteur....
{
message = qsTr("Ce circuit est utilisé pour la commande du moteur.<br />Vous devez d'abord affecter la commande moteur à un autre circuit avant de pouvoir supprimer celui-ci. ")
}
break;
//--------------------------------------------------------
default :
break;
}
}
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_circuit + ' AND ID_Source=' + id_circuit + ' ';
req += ' UNION';
req += ' SELECT Cle_primaire, Nom FROM TB_Events WHERE Action_circuits LIKE "%' + id_circuit + '/%"';
req += ' ORDER BY Nom';
//console.log("Requête = [ " + req + "; ]")
nb = bdd.requete(req);
if (nb > 0)
{
if (nb === 1) message += "<br /><br />" + qsTr("Ce circuit est utilisé par l'évènement ci-dessous.<br />Vous devez modifier ou supprimer cet évènement pour qu'il ne dépende plus de ce circuit avant de pouvoir le supprimer.") + "<br /><br />";
else message += "<br /><br />" + qsTr("Ce circuit est utilisé par les %1 évènements ci-dessous.<br />Vous devez modifier ou supprimer ces évènements pour qu'ils ne dépendent plus de ce circuit avant de pouvoir le supprimer.").arg(nb) + "<br /><br />";
for (i = 0; i < nb; i ++)
{
res = bdd.lecture_ligne();
if (!res.isEmpty)
{
message += "&#8227; " + (i+1) + " : " + res[1] + "<br />";
}
}
}
//=========================================================================
// 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_circuit + ':' + id_circuit + '/%" ';
//console.log("Requête = [ " + req + "; ]")
nb = bdd.requete(req);
if (nb > 0)
{
if (nb === 1) message += "<br /><br />" + qsTr("Ce circuit est utilisé par le capteur calculé ci-dessous.<br />Vous devez modifier ou supprimer ce capteur calculé pour qu'il ne dépende plus de ce circuit avant de pouvoir le supprimer.") + "<br /><br />";
else message += "<br /><br />" + qsTr("Ce circuit est utilisé par les %1 capteurs calculés ci-dessous.<br />Vous devez modifier ou supprimer ces capteurs calculés pour qu'ils ne dépendent plus de ce circuit avant de pouvoir le supprimer.").arg(nb) + "<br /><br />";
for (i = 0; i < nb; i ++)
{
res = bdd.lecture_ligne();
if (!res.isEmpty)
{
message += "&#8227; " + (i+1) + " : " + res[0] + "<br />";
}
}
}
//=========================================================================
// 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.type = type_boite_information_supprimer;
boite_information.open();
return(-1);
}
}
//=============================================================================================================
// Suppression du circuit
//=============================================================================================================
function suppression_circuit()
{
var req, res;
// Mise à l'arret du circuit (et donc de son éventuel esclave) :
extinction_circuit_garantie(id_circuit);
// Recherche d'un éventuel circuit esclave :
req = 'SELECT ID_Circuit_esclave FROM TB_Circuits WHERE Cle_primaire=' + id_circuit + ' ';
res = bdd.requete_unique(req);
if (Number(res[0]) > 0) // ..; et supression s'il y en a un
{
req = 'DELETE FROM TB_Circuits WHERE Cle_primaire=' + Number(res[0]) + ' ';
bdd.requete_unique(req);
}
// Suppression du circuit :
req = 'DELETE FROM TB_Circuits WHERE Cle_primaire=' + id_circuit + ' ';
bdd.requete_unique(req);
// Demande de synchro :
synchro_bdd(shipheart_type_synchro_config);
}
//=============================================================================================================
// Extinction garantie du circuit
// Cela se traduit par l'envoi d'une demande d'extinction puis une boucle d'attente (avec time out) jusqu'à ce
// que le circuit ait effectivement sa consigne à 0.
//=============================================================================================================
function extinction_circuit_garantie(id_circuit)
{
var req, res;
var i;
var limite = 200;
// Mise à l'arret du circuit :
bdd.requete_unique("UPDATE TB_Circuits SET New_consigne=0, Old_consigne=0 WHERE Cle_primaire='" + id_circuit + "'") // Ajout de la RAZ de Old_consigne (SDIR # 184)
synchro_bdd(shipheart_type_synchro_data); // Avec cette synchro, le traitement par l'appli sera fait dans 100ms maxi.
// Boucle d'attente du passage effectif à 0 :
for (i = 0; i < limite; i ++)
{
req = "SELECT Consigne FROM TB_Circuits WHERE Cle_primaire='" + id_circuit + "' ";
res = bdd.requete_unique(req);
if (Number(res[0]) === 0) break;
}
if (i === limite) console.log("La boucle d'extinction garantie n'a pas pu effectuer la RAZ avant l'expiration de son time out (" + limite + " boucles)");
else console.log("L'extinction garantie s'est déroulée correctement et est sortie après " + i + " boucles");
}
//=============================================================================================================
// 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<modele.count; i ++)
{
if (modele.get(i).valeur === cible) break; // Cas où la valeur cible a été trouvée parmi les valeurs du modèle
}
if (i === modele.count)
{
console.log("Aucune valeur trouvée pour cible = [" + cible + "] du modèle = " + nom_modele);
i = -1; // Cas où la valeur n'a pas été trouvée parmi les valeurs du modèle
}
//else console.log("Valeur trouvée : [" + i + "] pour cible = [" + cible + "] soit texte = [" + modele.get(i).texte + "]");
return(i);
}
}