2556 lines
140 KiB
QML
2556 lines
140 KiB
QML
//========================================================================================================================================================================
|
|
// CONFIG_CAPTEUR.QML
|
|
// Ce fichier traite la configuration d'un capteur. La page permet notamment de :
|
|
// - Modifier la config du capteur (ou de le créer la première fois),
|
|
// - Supprimer le capteur
|
|
// La page est appelée depuis la page config_capteurs.qml, en cliquant sur le capteur à modifier (ou sur le '+' en vue d'une 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
|
|
|
|
|
|
Shipheart_page {
|
|
id: page_config_capteur
|
|
|
|
|
|
// Mis en forme :
|
|
readonly property double pourcentage_largeur_colonne_gauche: 0.75
|
|
readonly property int espace_colonnes_principales: 20
|
|
readonly property double pourcentage_largeur_labels_formulaire: 0.5
|
|
readonly property double pourcentage_largeur_unites_formulaire: 0.1
|
|
|
|
|
|
readonly property double pourcentage_hauteur_ligne_haut: 1
|
|
readonly property int affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas
|
|
readonly property int espace_lignes_principales: 20
|
|
readonly property int hauteur_ligne_formulaire: 60
|
|
readonly property int hauteur_bouton_droit: 80
|
|
readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1
|
|
|
|
|
|
// Timings :
|
|
readonly property int periode_init_raffraichissement_parametres: 1 // En ms
|
|
readonly property int periode_raffraichissement_parametres: 1000 // En ms
|
|
readonly property int step_timer_appui_long: 30 // en ms
|
|
|
|
|
|
|
|
// Affichage :
|
|
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_capteur: 0
|
|
property int adresse_module: -1
|
|
property int type_entrees : 0
|
|
property string entrees: ""
|
|
property int nb_entrees: 0
|
|
property int nb_libelles: 0
|
|
property int entree_en_cours: 0
|
|
property int mode_entrees: 0
|
|
property int priorite_affichage_accueil: 0
|
|
property int id_famille: 0
|
|
property int id_variable: 0
|
|
property string liste_valeurs_textes: ""
|
|
|
|
property bool flag_affichage_mode_entrees: false
|
|
property bool flag_affichage_offset: false
|
|
property bool flag_nmea: false // Il est positionné dès qu'on "touche" à un paramètre NMEA pour demander une mise à jour NMEA
|
|
|
|
|
|
|
|
// Modèles :
|
|
// Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes
|
|
|
|
|
|
//===========================================================
|
|
// Signaux :
|
|
//===========================================================
|
|
|
|
//----------------------------------------------------------------------------------
|
|
// Connexion au signal de la page 'config_capteur_calcule_booleen.qml' :
|
|
Connections {
|
|
target: stackView.currentItem // Pointe sur la page active de StackView (qui sera créée... bientôt, ou pas)
|
|
ignoreUnknownSignals: true // Permet de ne pas déclencher d'erreur AVANT que la page ne soit créée par un StackView.push()
|
|
|
|
// -----------------------------------------------
|
|
// Fonction d'enregistrement des nouvelles data :
|
|
// -----------------------------------------------
|
|
function onEnregistrer_config_capteur_calcule_booleen(new_entrees)
|
|
{
|
|
if (type_entrees === shipheart_capteur_type_entrees_calculee_booleen) // Normalement, ça n'arivera que dans ce cas mais...
|
|
{
|
|
champ_formulaire_Entrees.model.set(champ_formulaire_Entrees.currentIndex, {"entrees": new_entrees} );
|
|
}
|
|
}
|
|
}
|
|
|
|
//===========================================================
|
|
// 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;
|
|
|
|
// Suppression du capteur :
|
|
if (mousearea_bouton_supprimer.pressed)
|
|
{
|
|
if (check_avant_suppression() !== -1)
|
|
{
|
|
shipheart_clic();
|
|
suppression_capteur(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte.
|
|
timer_tempo_reconfiguration.restart(); // Lancement du timer pour attendre la fin de la reconfiguration
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Titre de la page :
|
|
Shipheart_titre_1 {titre: (id_capteur === 0) ? qsTr("Création d'un capteur") : qsTr("Configuration du capteur"); 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"
|
|
|
|
//=========================
|
|
// Liste des champs :
|
|
//=========================
|
|
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 {
|
|
id: ligne_nom
|
|
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 capteur")
|
|
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 : Type_entrees
|
|
Rectangle {
|
|
id: ligne_type_entrees
|
|
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("Type de capteur")
|
|
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();
|
|
if (type_entrees !== champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur)
|
|
{
|
|
type_entrees = champ_formulaire_Type_entrees.model.get(champ_formulaire_Type_entrees.currentIndex).valeur;
|
|
adresse_module = -1;
|
|
entrees = "";
|
|
mode_entrees = 0;
|
|
|
|
mise_a_jour_module_entrees();
|
|
}
|
|
}
|
|
}
|
|
|
|
Shipheart_formulaire_ligne_separation {
|
|
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
// Ligne de formulaire : Adresse_module
|
|
Rectangle {
|
|
id: ligne_module_entrees
|
|
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)
|
|
&& (type_entrees < shipheart_capteur_type_entrees_calculee_booleen)
|
|
|
|
Shipheart_formulaire_label {
|
|
text: qsTr("Module")
|
|
width: parent.width * pourcentage_largeur_labels_formulaire
|
|
couleur: (champ_formulaire_Adresse_module.currentIndex !== 0)
|
|
? shipheart_formulaire_couleur_texte_par_defaut
|
|
: shipheart_formulaire_couleur_texte_en_erreur
|
|
}
|
|
|
|
Shipheart_formulaire_combobox {
|
|
id: champ_formulaire_Adresse_module
|
|
model: ListModel { }
|
|
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
|
|
onActivated: {
|
|
shipheart_clic();
|
|
if (adresse_module !== champ_formulaire_Adresse_module.model.get(champ_formulaire_Adresse_module.currentIndex).valeur)
|
|
{
|
|
adresse_module = champ_formulaire_Adresse_module.model.get(champ_formulaire_Adresse_module.currentIndex).valeur;
|
|
entrees = "";
|
|
mode_entrees = 0;
|
|
mise_a_jour_entrees();
|
|
}
|
|
}
|
|
}
|
|
|
|
Shipheart_formulaire_ligne_separation {
|
|
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
// Ligne de formulaire : Entrees
|
|
Rectangle {
|
|
id: ligne_entrees
|
|
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
|
|
height: visible ? (champ_formulaire_Entrees.height + 10) : 0
|
|
color: "transparent"
|
|
visible: ligne_module_entrees.visible
|
|
&& (champ_formulaire_Adresse_module.currentIndex !== 0)
|
|
&& (type_entrees < shipheart_capteur_type_entrees_calculee_booleen)
|
|
|
|
|
|
Shipheart_formulaire_label {
|
|
text: qsTr("Affectation")
|
|
width: parent.width * pourcentage_largeur_labels_formulaire
|
|
couleur: ( (champ_formulaire_Entrees.currentIndex !== 0) || ((type_entrees === shipheart_capteur_type_entrees_aux) && (nb_entrees > 0)) )
|
|
? shipheart_formulaire_couleur_texte_par_defaut
|
|
: shipheart_formulaire_couleur_texte_en_erreur
|
|
}
|
|
|
|
Shipheart_formulaire_combobox {
|
|
id: champ_formulaire_Entrees
|
|
visible: (type_entrees !== shipheart_capteur_type_entrees_aux) // On n'affiche pas dans le cas d'entrées AUX.
|
|
model: ListModel { }
|
|
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
|
|
onActivated: {
|
|
shipheart_clic();
|
|
entrees = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).entrees;
|
|
if (flag_affichage_mode_entrees) mise_a_jour_mode_entrees(); // Cas "normal" où le Mode_entree doit être traité
|
|
else mise_a_jour_famille(); // Si pas de Mode_entree, on passe directement à la Famille.
|
|
}
|
|
}
|
|
|
|
Shipheart_formulaire_ligne_separation {
|
|
visible: (type_entrees !== shipheart_capteur_type_entrees_aux) // On n'affiche pas dans le cas d'entrées AUX.
|
|
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
|
|
}
|
|
|
|
}
|
|
|
|
// Cas particulier des entrées AUX :
|
|
Rectangle {
|
|
id: ligne_entrees_aux
|
|
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
|
|
height: visible ? ( hauteur_ligne_formulaire * (Math.trunc((shipheart_capteur_max_nombre_entrees_aux-1) / 4) + 1) ) : 0
|
|
color: "transparent"
|
|
visible: ligne_entrees.visible
|
|
&& (type_entrees === shipheart_capteur_type_entrees_aux)
|
|
|
|
GridView {
|
|
id: entrees_aux_grid
|
|
|
|
width: parent.width
|
|
height: parent.height
|
|
anchors.verticalCenter: parent.verticalCenter;
|
|
cellWidth: (shipheart_capteur_max_nombre_entrees_aux < 4) ? (width / shipheart_capteur_max_nombre_entrees_aux) : (width / 4) // On exclus le cas où shipheart_capteur_max_nombre_entrees_aux=0...
|
|
cellHeight: height / (Math.trunc((shipheart_capteur_max_nombre_entrees_aux-1) / 4) + 1)
|
|
snapMode: GridView.SnapToRow // L'arret de l'affichage se fera sur une rangée entière
|
|
clip: true // Nécessaire pour que les Delegates s'arretent à l'intérieur de la GridView
|
|
model: ListModel { }
|
|
delegate: Rectangle {
|
|
width: entrees_aux_grid.cellWidth - 5
|
|
height: entrees_aux_grid.cellHeight - 5
|
|
radius: shipheart_rayon_bouton
|
|
color: couleur_gris_tres_fonce_transparent
|
|
|
|
Text {
|
|
anchors.fill: parent
|
|
horizontalAlignment: Qt.AlignHCenter
|
|
verticalAlignment: Qt.AlignVCenter
|
|
text: (model.no_entree_aux === 0) ? qsTr("%1 : Non définie").arg(model.no) : qsTr("%1 : %2").arg(model.no).arg(model.libelle)
|
|
color: (model.no_entree_aux === 0) ? couleur_gris_tres_pale_transparent : couleur_blanc_casse
|
|
font.pixelSize: 15
|
|
wrapMode: Label.Wrap
|
|
}
|
|
/* Text {
|
|
anchors.fill: parent
|
|
horizontalAlignment: Qt.AlignHCenter
|
|
verticalAlignment: Qt.AlignBottom
|
|
bottomPadding: 5
|
|
text: qsTr("Première entrée du capteur")
|
|
color: (model.no_entree_aux === 0) ? couleur_gris_tres_pale : couleur_blanc_casse
|
|
font.pixelSize: 10
|
|
visible: model.no === 1
|
|
}
|
|
*/
|
|
MouseArea {
|
|
id: mouse_area_entree_aux
|
|
anchors.fill: parent
|
|
onClicked: {
|
|
shipheart_clic();
|
|
entree_en_cours = model.no;
|
|
boite_selection_entree_aux.nom_equipement = Fonctions.nom_type_equipement(shipheart_source_mesure_capteur);
|
|
boite_selection_entree_aux.open();
|
|
}
|
|
}
|
|
}
|
|
ScrollBar.vertical: ScrollBar { }
|
|
}
|
|
Shipheart_formulaire_ligne_separation {
|
|
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
// Ligne de formulaire : Mode_entrees
|
|
Rectangle {
|
|
id: ligne_mode_entrees
|
|
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
|
|
height: visible ? hauteur_ligne_formulaire : 0
|
|
color: "transparent"
|
|
visible: ligne_entrees.visible
|
|
&& ( (champ_formulaire_Entrees.currentIndex !== 0) ||
|
|
((type_entrees === shipheart_capteur_type_entrees_aux) && (nb_entrees > 0)) )
|
|
&& flag_affichage_mode_entrees
|
|
&& (type_entrees < shipheart_capteur_type_entrees_calculee_booleen)
|
|
|
|
|
|
Shipheart_formulaire_label {
|
|
text: qsTr("Mode du capteur")
|
|
width: parent.width * pourcentage_largeur_labels_formulaire
|
|
couleur: ((champ_formulaire_Mode_entrees.currentIndex !== 0) || (type_entrees === shipheart_capteur_type_entrees_aux)) // Pour les entrées AUX, le cas de Mode_entrees=0 est Valide car corrrespond au mode NORMAL
|
|
? shipheart_formulaire_couleur_texte_par_defaut
|
|
: shipheart_formulaire_couleur_texte_en_erreur
|
|
}
|
|
|
|
Shipheart_formulaire_combobox {
|
|
id: champ_formulaire_Mode_entrees
|
|
model: ListModel { }
|
|
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
|
|
onActivated: {
|
|
shipheart_clic();
|
|
mode_entrees = champ_formulaire_Mode_entrees.model.get(champ_formulaire_Mode_entrees.currentIndex).valeur;
|
|
mise_a_jour_famille();
|
|
mise_a_jour_unite();
|
|
}
|
|
}
|
|
|
|
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"
|
|
visible: (type_entrees >= shipheart_capteur_type_entrees_calculee_booleen) ||
|
|
( ligne_entrees.visible
|
|
// && (champ_formulaire_Entrees.currentIndex !== 0)
|
|
&& ( (champ_formulaire_Entrees.currentIndex !== 0) ||
|
|
((type_entrees === shipheart_capteur_type_entrees_aux) && (nb_entrees > 0)) )
|
|
&& ( (champ_formulaire_Mode_entrees.currentIndex !== 0)
|
|
|| (type_entrees === shipheart_capteur_type_entrees_aux) // Pour les entrées AUX, le cas de Mode_entrees=0 est Valide car corrrespond au mode NORMAL
|
|
|| (!flag_affichage_mode_entrees) ) )
|
|
|
|
Shipheart_formulaire_label {
|
|
text: qsTr("Groupe de capteurs")
|
|
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();
|
|
if ( (type_entrees === shipheart_capteur_type_entrees_aux) || (type_entrees === shipheart_capteur_type_entrees_calculee_booleen) )
|
|
{
|
|
mise_a_jour_libelles();
|
|
}
|
|
}
|
|
}
|
|
|
|
Shipheart_formulaire_ligne_separation {
|
|
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
// Lignes de formulaire : Libelles des valeurs discrètes
|
|
ListView {
|
|
id: liste_libelles
|
|
visible: ligne_famille.visible
|
|
&& (champ_formulaire_Famille.currentIndex !== 0)
|
|
&& ( (type_entrees === shipheart_capteur_type_entrees_aux)
|
|
|| (type_entrees === shipheart_capteur_type_entrees_calculee_booleen) )
|
|
|
|
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
|
|
height: (hauteur_ligne_formulaire * nb_libelles)
|
|
snapMode: GridView.SnapToRow // L'arret de l'affichage se fera sur une rangée entière
|
|
clip: true // Nécessaire pour que les Delegates s'arretent à l'intérieur de la GridView
|
|
model: ListModel {}
|
|
delegate: Rectangle {
|
|
width: liste_libelles.width
|
|
height: (liste_libelles.height / nb_libelles)
|
|
color: "transparent"
|
|
|
|
Rectangle {
|
|
width: liste_libelles.width
|
|
height: hauteur_ligne_formulaire
|
|
color: "transparent"
|
|
|
|
Shipheart_formulaire_label {
|
|
text: qsTr("Libellé du capteur pour la valeur %1").arg(valeur)
|
|
width: parent.width * pourcentage_largeur_labels_formulaire
|
|
couleur: shipheart_formulaire_couleur_texte_par_defaut
|
|
}
|
|
|
|
Shipheart_formulaire_textfield {
|
|
id: libelle_entrees
|
|
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
|
|
x: parent.width * pourcentage_largeur_labels_formulaire
|
|
text: libelle
|
|
placeholderText: valeur // Permet de faire apparaitre la valeur par défaut
|
|
onEditingFinished: {
|
|
liste_libelles.model.set(valeur, {"libelle": text}); // Mémorisation de la valeur entrée dans le TextField
|
|
}
|
|
}
|
|
|
|
Shipheart_formulaire_ligne_separation {
|
|
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
|
|
}
|
|
}
|
|
}
|
|
ScrollBar.vertical: ScrollBar {}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
// Ligne de formulaire : Masquage
|
|
Rectangle {
|
|
id: ligne_masquage
|
|
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
|
|
height: visible ? hauteur_ligne_formulaire : 0
|
|
color: "transparent"
|
|
visible: ligne_famille.visible
|
|
&& (champ_formulaire_Famille.currentIndex !== 0)
|
|
|
|
Shipheart_formulaire_label {
|
|
text: qsTr("Masquer sur la page Capteurs")
|
|
width: parent.width * pourcentage_largeur_labels_formulaire
|
|
}
|
|
|
|
Shipheart_formulaire_checkbox {
|
|
id: champ_formulaire_Masquage
|
|
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
|
|
onCheckedChanged: {
|
|
shipheart_clic();
|
|
}
|
|
}
|
|
|
|
Shipheart_formulaire_ligne_separation {
|
|
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
// Ecran Droite :
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
id: zone_affichage_droite
|
|
x: zone_affichage_haut_gauche.width + espace_colonnes_principales
|
|
y: shipheart_hauteur_bandeau_haut;
|
|
width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2)
|
|
height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2);
|
|
color: "transparent"
|
|
|
|
|
|
Column {
|
|
anchors.fill: parent
|
|
spacing: 10
|
|
|
|
//-------------------------------------------------------
|
|
// Bouton Enregistrer/créer :
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
id: bouton_enregistrer_creer
|
|
width: parent.width
|
|
height: hauteur_bouton_droit
|
|
color: shipheart_couleur_fond_bouton
|
|
radius: shipheart_rayon_bouton
|
|
visible:
|
|
!clavier.active && // Si le clavier est déplié, // SDIR #255
|
|
// Note: ligne revalidée pour 3.4.10 car la saisie des libellés de texte est perdue si on enregistre avant de sortir du focus OU de replier le clavier.
|
|
|
|
(champ_formulaire_Nom.text !== "") // ... ou si le nom est vide,
|
|
&& (champ_formulaire_Type_entrees.currentIndex !== 0) // ... ou si aucune affectation à un capteur n'a été faite,
|
|
&& ( (type_entrees >= shipheart_capteur_type_entrees_calculee_booleen) // ... ou ce n'est pas un capteur calculé
|
|
|| ( (champ_formulaire_Adresse_module.currentIndex !== 0)
|
|
&& ( (champ_formulaire_Entrees.currentIndex !== 0) ||
|
|
((type_entrees === shipheart_capteur_type_entrees_aux) && (nb_entrees > 0)) ) // ... et aucune Entrée sélectionnée
|
|
&& ((champ_formulaire_Mode_entrees.currentIndex !== 0) // ... ou aucun Mode sélectionné
|
|
|| (type_entrees === shipheart_capteur_type_entrees_aux) // Sauf pour les entrées AUX, le cas de Mode_entrees=0 est Valide car corrrespond au mode NORMAL
|
|
|| (!flag_affichage_mode_entrees) ) ) ) // Sauf si pas besoin de Mode
|
|
&& (champ_formulaire_Famille.currentIndex !== 0) // ... ou si aucune affectation à un groupe n'a été faite, on n'autorise pas la'enregistrement/création.
|
|
Text {
|
|
anchors {
|
|
verticalCenter: parent.verticalCenter
|
|
horizontalCenter: parent.horizontalCenter
|
|
}
|
|
font.pixelSize: 20
|
|
text: (id_capteur === 0) ? qsTr("Créer le capteur") : qsTr("Enregistrer")
|
|
color: couleur_blanc_casse
|
|
}
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: {
|
|
shipheart_clic();
|
|
if (id_capteur !== 0) mise_a_jour_capteur(); // Mise à jour des données saisies dans la BDD et reconfiguration par l'application pour prise en compte.
|
|
else creation_capteur();
|
|
timer_tempo_reconfiguration.restart();
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
// Bouton d'accès à l'équation
|
|
// NB : On donne l'accès à l'équation même si le capteur n'est pas encore créé MAIS que toutes les conditions de création sont réunies.
|
|
// Dans ce cas, on effectue la création automatiquement avant de donner l'accès à l'équation.
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
width: parent.width
|
|
height: hauteur_bouton_droit
|
|
color: shipheart_couleur_fond_bouton
|
|
radius: shipheart_rayon_bouton
|
|
visible: bouton_enregistrer_creer.visible
|
|
&& (type_entrees >= shipheart_capteur_type_entrees_calculee_booleen)
|
|
|
|
Text {
|
|
anchors {
|
|
verticalCenter: parent.verticalCenter
|
|
horizontalCenter: parent.horizontalCenter
|
|
}
|
|
font.pixelSize: 20
|
|
text: qsTr("Equation")
|
|
color: couleur_blanc_casse
|
|
}
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: {
|
|
shipheart_clic();
|
|
if (id_capteur === 0) creation_capteur(); // Si le capteur n'a pas encore été créé et qu'on demande l'éccès à l'équation, on commence par créer le capteur (sinon, on ne peut pas affecter les conditions à un ID_Capteur...)
|
|
stackView.push("config_capteur_calcule_booleen.qml", {"id_capteur": id_capteur})
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------
|
|
// Bouton de suppression
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
width: parent.width
|
|
height: hauteur_bouton_droit
|
|
color: shipheart_couleur_fond_bouton
|
|
radius: shipheart_rayon_bouton
|
|
visible: bouton_enregistrer_creer.visible && (id_capteur !== 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 Etalonnage :
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
width: parent.width
|
|
height: hauteur_bouton_droit
|
|
color: shipheart_couleur_fond_bouton
|
|
radius: shipheart_rayon_bouton
|
|
visible: flag_affichage_offset && bouton_enregistrer_creer.visible
|
|
Text {
|
|
anchors {
|
|
verticalCenter: parent.verticalCenter
|
|
horizontalCenter: parent.horizontalCenter
|
|
}
|
|
font.pixelSize: 20
|
|
text: qsTr("Etalonner")
|
|
color: couleur_blanc_casse
|
|
}
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: {
|
|
shipheart_clic();
|
|
stackView.push("etalonnage_capteur.qml", {"id_capteur": id_capteur})
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
// Timer de reconfiguration :
|
|
//-------------------------------------------------------
|
|
Timer {
|
|
id: timer_tempo_reconfiguration
|
|
interval: 250 // Cette tempo n'est utilisée que pour le premier cycle
|
|
triggeredOnStart: false
|
|
running: false
|
|
repeat: true
|
|
onTriggered: {
|
|
if (bdd.check_fin_configuration())
|
|
{
|
|
timer_tempo_reconfiguration.stop();
|
|
stackView.pop(); // Retour à la page de config des capteurs
|
|
}
|
|
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 retournb_entrees
|
|
//.................................................
|
|
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 sélection entrée aux :
|
|
//-------------------------------------------------------
|
|
Shipheart_boite_dialogue_entrees_aux {
|
|
id: boite_selection_entree_aux
|
|
|
|
boutonAnnuler: true
|
|
boutonAnnulerTexte: "Annuler"
|
|
onClicked: {
|
|
|
|
if (bouton === shipheart_boite_dialogue_bouton_1)
|
|
{
|
|
var groupe = recherche_groupe_entree_aux(no_entree - 1);
|
|
|
|
if (modele_entrees_aux.get(groupe).valeurs.get((no_entree - 1) % 4).no_entree === entree_en_cours) // Si on reclique sur l'entrée déjà affectée, on supprime l'affectation.
|
|
{
|
|
entrees_aux_grid.model.set((entree_en_cours - 1), {"no_entree_aux" : 0, "libelle": ""});
|
|
modele_entrees_aux.get(groupe).valeurs.set(((no_entree - 1) % 4), {"used": 0, "no_entree": 0});
|
|
|
|
nb_entrees --;
|
|
}
|
|
else // Si on clique sur une autre entrée...
|
|
{
|
|
// ... on vérifie si le n° était déjà affecté à une entrée aux. Si oui, on supprime cette affectation avant de créer la nouvelle :
|
|
var i = entrees_aux_grid.model.get(entree_en_cours - 1).no_entree_aux;
|
|
if (i !== 0)
|
|
{
|
|
var g = recherche_groupe_entree_aux(i - 1);
|
|
|
|
modele_entrees_aux.get(g).valeurs.set(((i - 1) % 4), {"used": 0, "no_entree": 0});
|
|
|
|
nb_entrees --;
|
|
}
|
|
|
|
// On met ensuite à jour la nouvelle affectation :
|
|
entrees_aux_grid.model.set((entree_en_cours - 1), {"no_entree_aux" : no_entree, "libelle": "AUX INPUT " + no_entree });
|
|
modele_entrees_aux.get(groupe).valeurs.set(((no_entree - 1) % 4), {"used": 1, "no_entree": entree_en_cours});
|
|
|
|
nb_entrees ++;
|
|
}
|
|
|
|
if (flag_affichage_mode_entrees) mise_a_jour_mode_entrees(); // Cas "normal" où le Mode_entree doit être traité
|
|
else mise_a_jour_famille(); // Si pas de Mode_entree, on passe directement à la Famille.
|
|
|
|
boite_selection_entree_aux.close();
|
|
}
|
|
}
|
|
}
|
|
ListModel {
|
|
id: modele_entrees_aux
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------
|
|
// Boite d'info :
|
|
//-------------------------------------------------------
|
|
Shipheart_boite_dialogue {
|
|
id: boite_information
|
|
}
|
|
|
|
|
|
//===========================================================
|
|
// Busy Indicator :
|
|
//===========================================================
|
|
Shipheart_busy_indicator {
|
|
id: busy_indicator
|
|
|
|
running: timer_tempo_reconfiguration.running
|
|
}
|
|
|
|
|
|
// Note : il est inutile de prévoir un Mousearea pour sortir de l'économiseur sur cette page puisqu'il
|
|
// est systématiquement bloqué pour toutes les pages lancées depuis 'Paramètres Avancés'.
|
|
|
|
|
|
//=============================================================================================================
|
|
// Init de la page
|
|
//=============================================================================================================
|
|
function init_page()
|
|
{
|
|
var req, res;
|
|
var i;
|
|
|
|
//console.log("Id du capteur = " + id_capteur);
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Caractéristiques du capteur en cours :
|
|
//---------------------------------------------------------------------------------------
|
|
champ_formulaire_Nom.text = "";
|
|
|
|
if (id_capteur > 0) // Cas d'une modification de capteur existant :
|
|
{
|
|
req = 'SELECT Nom, ';
|
|
req += ' Adresse_module, ';
|
|
req += ' Type_entrees, ';
|
|
req += ' Entrees, ';
|
|
req += ' Mode_entrees, ';
|
|
req += ' Priorite_affichage_accueil, ';
|
|
req += ' ID_Famille, ';
|
|
req += ' ID_Variable, ';
|
|
req += ' Liste_valeurs_textes ';
|
|
req += ' FROM TB_Capteurs ';
|
|
req += ' WHERE Cle_primaire=' + id_capteur + ' ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
res = bdd.requete_unique(req);
|
|
|
|
// Récupération des données :
|
|
i = 0;
|
|
champ_formulaire_Nom.text = res[i ++];
|
|
adresse_module = Number(res[i ++]);
|
|
type_entrees = Number(res[i ++]);
|
|
entrees = res[i ++];
|
|
mode_entrees = Number(res[i ++]);
|
|
priorite_affichage_accueil = Number(res[i ++]);
|
|
id_famille = Number(res[i ++]);
|
|
id_variable = Number(res[i ++]);
|
|
liste_valeurs_textes = res[i ++];
|
|
|
|
// Cas particulier d'un capteur sur entrée NMEA :
|
|
if (type_entrees === shipheart_capteur_type_entrees_nmea) flag_nmea = true;
|
|
|
|
// Traitement de Masquage :
|
|
if (priorite_affichage_accueil <= 0) champ_formulaire_Masquage.checked = true;
|
|
else champ_formulaire_Masquage.checked = false;
|
|
|
|
// Cas particulier d'accès au réglage de l'offset pour PAT uniquement :
|
|
if ((type_entrees === shipheart_capteur_type_entrees_predefinie) && (entrees === shipheart_capteur_predefini_pat + "")) flag_affichage_offset = true;
|
|
}
|
|
|
|
// Remplissage des différents modèles, dasn l'ordre des priorités :
|
|
mise_a_jour_type_entrees();
|
|
|
|
flag_init = false; // Indique que l'init est terminée
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// MAJ du type d'entrées
|
|
//=============================================================================================================
|
|
function mise_a_jour_type_entrees()
|
|
{
|
|
var i;
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Type d'entrée :
|
|
//---------------------------------------------------------------------------------------
|
|
|
|
// Effacement du modèle et premier enregistrement avec 'Non défini' :
|
|
champ_formulaire_Type_entrees.model.clear();
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": 0,
|
|
"texte": qsTr("Non défini"),
|
|
"actif": true });
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_aux,
|
|
"texte": qsTr("Entrées Auxiliaires (AUX INPUTS)"),
|
|
"actif": true });
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_level_sensor,
|
|
"texte": qsTr("Entrées Niveau (LEVEL SENSORS)"),
|
|
"actif": true });
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_volt,
|
|
"texte": qsTr("Entrées Tension (VOLTAGE INPUTS)"),
|
|
"actif": true });
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_ow,
|
|
"texte": qsTr("Capteurs de température (ONE WIRE)"),
|
|
"actif": true });
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_nmea,
|
|
"texte": qsTr("Entrées NMEA2000"),
|
|
"actif": true });
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_predefinie,
|
|
"texte": qsTr("Capteurs sur modules"),
|
|
"actif": true });
|
|
champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_calculee_booleen,
|
|
"texte": qsTr("Calculé (conditions logiques)"),
|
|
"actif": true });
|
|
/* champ_formulaire_Type_entrees.model.append( {
|
|
"valeur": shipheart_capteur_type_entrees_calculee_numerique,
|
|
"texte": qsTr("Calculé (valeur numérique)"),
|
|
"actif": true });
|
|
*/
|
|
// Mise à jour de l'index courant du modèle champ_formulaire_Type_entrees :
|
|
i = recherche_index_valeur_modele(type_entrees, champ_formulaire_Type_entrees.model, "Type_entrees");
|
|
if (i === -1) champ_formulaire_Type_entrees.currentIndex = recherche_index_valeur_modele(0, champ_formulaire_Type_entrees.model, "Type_entrees");
|
|
else champ_formulaire_Type_entrees.currentIndex = i;
|
|
|
|
|
|
// Appel du remplissage des modèles de niveau inférieur si cela est possible :
|
|
if (type_entrees !== 0)
|
|
{
|
|
mise_a_jour_module_entrees();
|
|
}
|
|
|
|
}
|
|
|
|
//=============================================================================================================
|
|
// MAJ du module d'entrées
|
|
//=============================================================================================================
|
|
function mise_a_jour_module_entrees()
|
|
{
|
|
var req, res;
|
|
var nb;
|
|
var i;
|
|
var flag_valide;
|
|
|
|
// Effacement du modèle :
|
|
champ_formulaire_Adresse_module.model.clear();
|
|
champ_formulaire_Adresse_module.model.append({"valeur": -1, "texte": qsTr("Non défini"), "actif": true });
|
|
|
|
champ_formulaire_Adresse_module.currentIndex = 0; // Par défaut
|
|
|
|
// Remplissage du modèle avec les modules en config :
|
|
req = 'SELECT Adresse_k_bus, Type FROM TB_Modules_config ORDER BY Adresse_k_bus';
|
|
nb = bdd.requete(req);
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
flag_valide = false;
|
|
switch(Number(res[1])) // Type de module
|
|
{
|
|
//--------------------------------------
|
|
case shipheart_type_module_shipbase:
|
|
flag_valide = true; // Tous les types sont accessibles sur ShiBase donc inutile de tester...
|
|
|
|
break;
|
|
|
|
//--------------------------------------
|
|
case shipheart_type_module_shippower812:
|
|
case shipheart_type_module_shipBS:
|
|
case shipheart_type_module_shippower4AC:
|
|
case shipheart_type_module_shippower8DC:
|
|
if (type_entrees === shipheart_capteur_type_entrees_predefinie) flag_valide = true;
|
|
else flag_valide = false;
|
|
|
|
break;
|
|
|
|
//--------------------------------------
|
|
default:
|
|
flag_valide = false; // Le type est inconnu donc, dans le doute, on ne donne pas accès à ce module
|
|
break;
|
|
}
|
|
|
|
// Ajout de l'entrée dans le modèle si le module est considéré comme compatible avec le type d'entrée sélectionné:
|
|
if (flag_valide)
|
|
{
|
|
champ_formulaire_Adresse_module.model.append({
|
|
"valeur": Number(res[0]),
|
|
"texte": "@" + res[0] + " - " + Fonctions.nom_type_module(Number(res[1])),
|
|
"actif": true
|
|
});
|
|
// Mise à jour de l'index du mdoèle si l'on est sur l'entrée en cours :
|
|
if (Number(res[0]) === adresse_module) champ_formulaire_Adresse_module.currentIndex = (i+1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Si le Type_entrées est != de ENTREES_PREDEFINIES, on est sûr qu'il n'y aura que ShipBase (pour le moment au moins...) :
|
|
if (type_entrees !== shipheart_capteur_type_entrees_predefinie) adresse_module = 0;
|
|
|
|
// Mise à jour de l'index courant du modèle champ_formulaire_Module_entrees :
|
|
i = recherche_index_valeur_modele(adresse_module, champ_formulaire_Adresse_module.model, "adresse_module");
|
|
if (i === -1) champ_formulaire_Adresse_module.currentIndex = recherche_index_valeur_modele(-1, champ_formulaire_Adresse_module.model, "adresse_module");
|
|
else champ_formulaire_Adresse_module.currentIndex = i;
|
|
|
|
// Appel du remplissage des modèles de niveau inférieur si cela est possible :
|
|
if (adresse_module >= 0) mise_a_jour_entrees();
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// MAJ des Entrées
|
|
//=============================================================================================================
|
|
function mise_a_jour_entrees()
|
|
{
|
|
var req, res;
|
|
var nb;
|
|
var i, j;
|
|
var chaines_entrees;
|
|
var no;
|
|
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Mise à jour du modèle des entrées :
|
|
//
|
|
// Pour tous les types à l'exception de ENTREES AUX, on utilise le modèle 'champ_formulaire_Entrees' qui pointe vers une ComboBox.
|
|
// Ce modèle comprend donc une liste de choix parmi lesquel il faut en sélectionner 1.
|
|
// Pour le type ENTREES AUX, on utilise 2 modèles dédié :
|
|
// - 'entrees_aux_grid' qui contient les entrées du capteur (le nombre est le max possible, soit 4 a priori).
|
|
// - 'modele_entrees_aux' qui contient les 32 entrées AUX de ShipBase (et, demain, celles du module sélectionné...).
|
|
|
|
champ_formulaire_Entrees.model.clear();
|
|
champ_formulaire_Entrees.model.append({"entrees": "", "texte": qsTr("Non défini"), "actif": true });
|
|
|
|
champ_formulaire_Entrees.currentIndex = 0; // Si aucune entrée n'est trouvée (cas d'une création par exemple), l'index est égal à 0
|
|
|
|
switch(type_entrees)
|
|
{
|
|
//----------------------------------------
|
|
// Entrées AUX :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_aux:
|
|
var val;
|
|
|
|
// Entrées AUX du capteur :
|
|
entrees_aux_grid.model.clear();
|
|
|
|
chaines_entrees = entrees.split(';');
|
|
if (entrees !== "") nb_entrees = chaines_entrees.length // Si la chaine est vide, le split renvoi 1... Exactement comme dans le cas où il y a une seule valeur...
|
|
else nb_entrees = 0;
|
|
|
|
for (i = 0; i < shipheart_capteur_max_nombre_entrees_aux; i ++)
|
|
{
|
|
if (i < nb_entrees) val = Number(chaines_entrees[i]);
|
|
else val = 0;
|
|
|
|
entrees_aux_grid.model.append( { "no": (i + 1),
|
|
"no_entree_aux" : val,
|
|
"libelle": (val === 0) ? "FFFFF" : "AUX INPUT " + val });
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Entrées auxiliaires physiques :
|
|
// Les 32 entrées AUX de ShipBase par exemple
|
|
var entrees_aux = [];
|
|
|
|
// remplissage par défaut de toutes les entrées AUX possibles :
|
|
for (i=0; i<shipheart_entrees_aux_max_nombre; i++)
|
|
{
|
|
val = chaines_entrees.indexOf("" + (i+1) + "") + 1; // Le '+1' permet de passer de l'index (0..n) à un numéro d'entrée du capteur (1..N) mais aussi de passer de l'erreur (-1) à la valeur par défaut (0)
|
|
entrees_aux.push({'used': 0, 'no_entree': val}); // Init par défaut
|
|
}
|
|
|
|
// Mise à jour en fonction des entrées déjà utilisées par ailleurs (capteurs et réservoirs) :
|
|
req = '(SELECT ' + shipheart_source_mesure_reservoir + ' AS Type, Entrees ';
|
|
req += 'FROM TB_Reservoirs WHERE ';
|
|
req += 'Type_entrees=' + shipheart_reservoir_type_entrees_aux + ') ';
|
|
req += ' UNION ';
|
|
req += '(SELECT ' + shipheart_source_mesure_capteur + ' AS Type, Entrees ';
|
|
req += 'FROM TB_Capteurs WHERE ';
|
|
req += 'Type_entrees=' + shipheart_reservoir_type_entrees_aux + ') ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
chaines_entrees = res[1].split(';');
|
|
|
|
for(j = 0; j < chaines_entrees.length; j ++)
|
|
{
|
|
no = Number(chaines_entrees[j]);
|
|
if ((no >= 1) && (no <= shipheart_entrees_aux_max_nombre)) entrees_aux[no - 1]['used'] = 1; // le n° d'entrée doit être dans [1; 32]
|
|
}
|
|
}
|
|
}
|
|
|
|
modele_entrees_aux.clear();
|
|
|
|
i = 17;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
i = 21;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
i = 25;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
i = 29;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
i = 1;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
i = 5;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
i = 9;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
i = 13;
|
|
modele_entrees_aux.append({valeurs: [{no: i, used: entrees_aux[i-1]['used'], no_entree: entrees_aux[i-1]['no_entree'] },
|
|
{no: (i+1), used: entrees_aux[i+0]['used'], no_entree: entrees_aux[i+0]['no_entree'] },
|
|
{no: (i+2), used: entrees_aux[i+1]['used'], no_entree: entrees_aux[i+1]['no_entree'] },
|
|
{no: (i+3), used: entrees_aux[i+2]['used'], no_entree: entrees_aux[i+2]['no_entree'] }] } );
|
|
|
|
// Mise à jour du flag d'utilisation du paramètre Mode_entrées :
|
|
flag_affichage_mode_entrees = true; // NB : pour les entrées AUX, on utilise une case à cocher
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Level Sensor :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_level_sensor:
|
|
|
|
for (i=0; i<shipheart_entrees_level_sensor_max_nombre; i++)
|
|
{
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": ""+(i+1)+"",
|
|
"texte": "# "+ (i+1) + " - " + qsTr("<i>Entrée non utilisée</i>"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_sans_unite, // On ne sait pas le renseigner à ce stade. Sera renseigné lorsque le Mode_entree sera renseigné.
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 0, // Idem
|
|
"precision_affichage_mesures": 0 // Idem
|
|
});
|
|
|
|
// Mise à jour de l'index du mdoèle si l'on est sur l'entrée en cours :
|
|
if ((i+1) === Number(entrees)) champ_formulaire_Entrees.currentIndex = (i+1); // Le '+1' sur CurrenIndex car on a déjà ajouté une entrée NON DEFINIE
|
|
}
|
|
|
|
// Mise à jour en fonction des entrées déjà utilisées par ailleurs (capteurs et réservoirs) :
|
|
req = '(SELECT ' + shipheart_source_mesure_reservoir + ' AS Type, Nom, Entrees, "'+ shipheart_reservoir_niveau+'" AS Code_variable, 0 AS Precision_affichage_accueil, 0 AS Precision_affichage_mesures ';
|
|
req += 'FROM TB_Reservoirs WHERE ';
|
|
req += 'Type_entrees=' + shipheart_reservoir_type_entrees_level_sensor + ') ';
|
|
req += ' UNION ';
|
|
req += '(SELECT ' + shipheart_source_mesure_capteur + ' AS Type, Nom, Entrees, ';
|
|
req += ' (SELECT Code FROM TB_Variables WHERE Cle_primaire=ID_Variable) AS Code_variable, Precision_affichage_accueil, Precision_affichage_mesures ';
|
|
req += 'FROM TB_Capteurs WHERE ';
|
|
req += 'Type_entrees=' + shipheart_capteur_type_entrees_level_sensor + ') ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
no = Number(res[2]);
|
|
|
|
if ((no >= 1) && (no <= shipheart_entrees_level_sensor_max_nombre))
|
|
{
|
|
if (no === Number(entrees)) // Si on est sur l'entrée en cours, on laisse 'actif' à TRUE (et on peut ajuster le texte au passage...)
|
|
{
|
|
champ_formulaire_Entrees.model.set(no, {
|
|
"texte": "# "+ no,
|
|
"code_variable": res[3],
|
|
"precision_affichage_accueil": Number(res[4]),
|
|
"precision_affichage_mesures": Number(res[5])} )
|
|
}
|
|
else // Si on n'est pas sur l'entrée en cours, on positionne 'actif' à FALSE (et on ajuste le texte pou rinformation)
|
|
{
|
|
champ_formulaire_Entrees.model.set(no, {
|
|
"texte": "#"+ no + " - " + Fonctions.nom_type_equipement(Number(res[0])) + " \"" + res[1] + "\"",
|
|
"code_variable": res[3],
|
|
"precision_affichage_accueil": Number(res[4]),
|
|
"precision_affichage_mesures": Number(res[5]),
|
|
"actif": false} )
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mise à jour du flag d'utilisation du paramètre Mode_entrées :
|
|
flag_affichage_mode_entrees = true;
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Voltage Input :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_volt:
|
|
|
|
for (i=0; i<shipheart_entrees_volt_max_nombre; i++)
|
|
{
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": ""+(i+1)+"",
|
|
"texte": "# "+ (i+1) + " - " + qsTr("<i>Entrée non utilisée</i>"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_tension_v,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
|
|
// Mise à jour de l'index du mdoèle si l'on est sur l'entrée en cours :
|
|
if ((i+1) === Number(entrees)) champ_formulaire_Entrees.currentIndex = (i+1); // Le '+1' sur CurrenIndex car on a déjà ajouté une entrée NON DEFINIE
|
|
}
|
|
|
|
// Mise à jour en fonction des entrées déjà utilisées par ailleurs (capteurs et batteries) :
|
|
req = '(SELECT ' + shipheart_source_mesure_batterie + ' AS Type, Nom, Entrees ';
|
|
req += 'FROM TB_Batteries WHERE ';
|
|
req += 'Type_entrees=' + shipheart_batteries_type_entrees_volt + ') ';
|
|
req += ' UNION ';
|
|
req += '(SELECT ' + shipheart_source_mesure_capteur + ' AS Type, Nom, Entrees ';
|
|
req += 'FROM TB_Capteurs WHERE ';
|
|
req += 'Type_entrees=' + shipheart_capteur_type_entrees_volt + ') ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
no = Number(res[2]);
|
|
|
|
if ((no >= 1) && (no <= shipheart_entrees_volt_max_nombre))
|
|
{
|
|
if (no === Number(entrees)) // Si on est sur l'entrée en cours, on laisse 'actif' à TRUE (et on peut ajuster le texte au passage...)
|
|
{
|
|
champ_formulaire_Entrees.model.set(no, {"texte": "# "+ no} )
|
|
}
|
|
else // Si on n'est pas sur l'entrée en cours, on positionne 'actif' à FALSE (et on ajuste le texte pou rinformation)
|
|
{
|
|
champ_formulaire_Entrees.model.set(no, {"texte": "#"+ no + " - " + Fonctions.nom_type_equipement(Number(res[0])) + " \"" + res[1] + "\"", "actif": false} )
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mise à jour du flag d'utilisation du paramètre Mode_entrées :
|
|
flag_affichage_mode_entrees = false;
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées OW :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_ow:
|
|
|
|
// Recherche des capteurs de température physiquement présents :
|
|
req = 'SELECT Rom_code ';
|
|
req += ', Emplacement ';
|
|
req += ' FROM TB_One_wire ';
|
|
req += ' WHERE Presence=1 '
|
|
req += ' ORDER BY Rom_code';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": res[0],
|
|
"texte": (res[1] === "") ? (res[0]) : (res[0] + "<br />[" + res[1] + "]"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_temperature,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
|
|
// Mise à jour de l'index du mdoèle si l'on est sur l'entrée en cours :
|
|
if (res[0] === entrees) champ_formulaire_Entrees.currentIndex = (i+1); // Le '+1' sur CurrenIndex car on a déjà ajouté une entrée NON DEFINIE
|
|
}
|
|
}
|
|
|
|
// Mise à jour en fonction des entrées déjà utilisées par ailleurs (capteurs) :
|
|
req = '(SELECT ' + shipheart_source_mesure_capteur + ' AS Type, Nom, Entrees ';
|
|
req += 'FROM TB_Capteurs WHERE ';
|
|
req += 'Type_entrees=' + shipheart_capteur_type_entrees_ow + ') ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
for(j = 0; j < champ_formulaire_Entrees.model.count; j ++)
|
|
{
|
|
if (res[2] === champ_formulaire_Entrees.model.get(j).entrees)
|
|
{
|
|
if (res[2] === entrees) // Si on est sur l'entrée en cours, on laisse 'actif' à TRUE (et on peut ajuster le texte au passage...)
|
|
{
|
|
// champ_formulaire_Entrees.model.set(j, {"texte": "# "+ j} )
|
|
champ_formulaire_Entrees.model.set(j, {"texte": res[2] + "<br />" + Fonctions.nom_type_equipement(Number(res[0])) + " \"" + res[1] + "\""} )
|
|
}
|
|
else // Si on n'est pas sur l'entrée en cours, on positionne 'actif' à FALSE (et on ajuste le texte pou rinformation)
|
|
{
|
|
champ_formulaire_Entrees.model.set(j, {"texte": res[2] + "<br />" + Fonctions.nom_type_equipement(Number(res[0])) + " \"" + res[1] + "\"", "actif": false} )
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mise à jour du flag d'utilisation du paramètre Mode_entrées :
|
|
flag_affichage_mode_entrees = false;
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées NMEA :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_nmea:
|
|
|
|
// Recherche des PGN/Fields physiquement présents :
|
|
req = 'SELECT Pgn, ';
|
|
req += 'Field, ';
|
|
req += 'Nom, ';
|
|
req += '(SELECT Code FROM TB_Variables WHERE Cle_primaire=ID_Variable) as Code, ';
|
|
req += 'Precision_affichage_accueil, ';
|
|
req += 'Precision_affichage_mesures ';
|
|
req += ' FROM TB_Nmea2000 ';
|
|
req += ' ORDER BY Pgn, Field';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": res[0] + ":" + res[1],
|
|
"texte": "PGN " + res[0] + " [# " + res[1] + "] :<br />" + res[2],
|
|
"actif": true,
|
|
"code_variable": res[3],
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": Number(res[4]),
|
|
"precision_affichage_mesures": Number(res[5]),
|
|
});
|
|
|
|
// Mise à jour de l'index du modèle si l'on est sur l'entrée en cours :
|
|
if ((res[0] + ":" + res[1]) === entrees) champ_formulaire_Entrees.currentIndex = (i+1); // Le '+1' sur CurrenIndex car on a déjà ajouté une entrée NON DEFINIE
|
|
}
|
|
}
|
|
|
|
// Mise à jour en fonction des entrées déjà utilisées par ailleurs (capteurs) :
|
|
req = '(SELECT ' + shipheart_source_mesure_capteur + ' AS Type, Nom, Entrees ';
|
|
req += 'FROM TB_Capteurs WHERE ';
|
|
req += 'Type_entrees=' + shipheart_capteur_type_entrees_nmea + ') ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
for(j = 0; j < champ_formulaire_Entrees.model.count; j ++)
|
|
{
|
|
if (res[2] === champ_formulaire_Entrees.model.get(j).entrees)
|
|
{
|
|
// Mise à jour du texte en ajoutant le nom du capteur en-dessous :
|
|
champ_formulaire_Entrees.model.set(j, {"texte": champ_formulaire_Entrees.model.get(j).texte + "<br />" + Fonctions.nom_type_equipement(Number(res[0])) + " \"" + res[1] + "\""} );
|
|
|
|
// Si on n'est pas sur l'entrée en cours, on pass l'entrée 'actif' à FALSE :
|
|
if (res[2] !== entrees) champ_formulaire_Entrees.model.set(j, {"actif": false} );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mise à jour du flag d'utilisation du paramètre Mode_entrées :
|
|
flag_affichage_mode_entrees = false;
|
|
|
|
break;
|
|
|
|
|
|
//----------------------------------------
|
|
// Entrées Prédéfinies :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_predefinie:
|
|
|
|
req = 'SELECT Type FROM TB_Modules_config WHERE Adresse_k_bus=' + adresse_module+ ' ';
|
|
res = bdd.requete_unique(req);
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
|
|
|
|
switch(Number(res[0])) // Type de module
|
|
{
|
|
//--------------------------------------
|
|
case shipheart_type_module_shipbase:
|
|
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_pat + "",
|
|
"texte": qsTr("Pression Atmosphérique"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_pression_atm,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_hum + "",
|
|
"texte": qsTr("Humidité"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_humidite,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 1
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_temp + "",
|
|
"texte": qsTr("Température module"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_temperature,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_in_v + "",
|
|
"texte": qsTr("Tension d'entrée module"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_tension_v,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_in_i + "",
|
|
"texte": qsTr("Consommation module"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_courant_a,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_usb_i + "",
|
|
"texte": qsTr("Consommation ports USB"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_courant_a,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
|
|
/* champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_edm + "",
|
|
"texte": qsTr("Etat de la mer"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_sans_unite,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_changement_etat,
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
*/
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_acc_xyz + "",
|
|
"texte": qsTr("Chocs"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_acceleration,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_acc_x + "",
|
|
"texte": qsTr("Accélération X"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_acceleration,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_acc_y + "",
|
|
"texte": qsTr("Accélération Y"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_acceleration,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_acc_z + "",
|
|
"texte": qsTr("Accélération Z"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_acceleration,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_lat + "",
|
|
"texte": qsTr("GNSS - Latitude"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_latitude,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_lon + "",
|
|
"texte": qsTr("GNSS - Longitude"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_longitude,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_alt + "",
|
|
"texte": qsTr("GNSS - Altitude"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_distance_m,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 1
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_sog + "",
|
|
"texte": qsTr("GNSS - SOG<br />Speed Over Ground"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_vitesse_kts,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_cog + "",
|
|
"texte": qsTr("GNSS - COG<br />Course Over Ground"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_angle_degres,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_siv + "",
|
|
"texte": qsTr("GNSS - SIV<br />Satellites In View"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_sans_unite,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique, // Choix fait après mure réflexion : inutile d'aller chercher de la précision sur ce paramètre alors que ce qui interresse est une tendance...
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_hpa + "",
|
|
"texte": qsTr("GNSS - HPA<br />Horizontal Precision Accuracy"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_distance_m,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 1
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_vpa + "",
|
|
"texte": qsTr("GNSS - VPA<br />Vertical Precision Accuracy"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_distance_m,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 1
|
|
});
|
|
|
|
if (shipheart_generation_shipbase === shipheart_generation_shipbase_v1)
|
|
{
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_rssi + "",
|
|
"texte": qsTr("Modem 4G/LTE - RSSI<br />Received Signal Strength Indicator"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_puissance_db,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_sinr + "",
|
|
"texte": qsTr("Modem 4G/LTE - SINR<br />Signal to Interference & Noise Ratio"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_pourcentage,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
}
|
|
|
|
break;
|
|
|
|
//--------------------------------------
|
|
case shipheart_type_module_shippower812:
|
|
case shipheart_type_module_shippower8DC:
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_temp + "",
|
|
"texte": qsTr("Température module"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_temperature,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_in_v + "",
|
|
"texte": qsTr("Tension d'entrée module"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_tension_v,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
break;
|
|
|
|
//--------------------------------------
|
|
case shipheart_type_module_shipBS:
|
|
case shipheart_type_module_shippower4AC:
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": shipheart_capteur_predefini_temp + "",
|
|
"texte": qsTr("Température module"),
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_temperature,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_periodique,
|
|
"precision_affichage_accueil": 1,
|
|
"precision_affichage_mesures": 2
|
|
});
|
|
break;
|
|
|
|
//--------------------------------------
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
// Mise à jour de l'index du mdoèle si l'on est sur l'entrée en cours :
|
|
for(i = 0; i < champ_formulaire_Entrees.model.count; i ++)
|
|
{
|
|
if (entrees === champ_formulaire_Entrees.model.get(i).entrees)
|
|
{
|
|
champ_formulaire_Entrees.currentIndex = i;
|
|
break; // Inutile de poursuivre une fois qu'on a trouvé l'entrée en cours
|
|
}
|
|
}
|
|
|
|
|
|
// Mise à jour en fonction des entrées déjà utilisées par ailleurs (capteurs) :
|
|
req = '(SELECT ' + shipheart_source_mesure_capteur + ' AS Type, Nom, Entrees ';
|
|
req += ' FROM TB_Capteurs WHERE ';
|
|
req += ' Adresse_module=' + adresse_module + ' ';
|
|
req += ' AND Type_entrees=' + shipheart_capteur_type_entrees_predefinie + ') ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
for(j = 0; j < champ_formulaire_Entrees.model.count; j ++)
|
|
{
|
|
if (res[2] === champ_formulaire_Entrees.model.get(j).entrees)
|
|
{
|
|
if (res[2] === entrees) // Si on est sur l'entrée en cours, on laisse 'actif' à TRUE (et on peut ajuster le texte au passage...)
|
|
{
|
|
// champ_formulaire_Entrees.model.set(j, {"texte": "# "+ j} )
|
|
}
|
|
else // Si on n'est pas sur l'entrée en cours, on positionne 'actif' à FALSE (et on ajuste le texte pou rinformation)
|
|
{
|
|
champ_formulaire_Entrees.model.set(j, {"texte": champ_formulaire_Entrees.model.get(j).texte + "<br />" + Fonctions.nom_type_equipement(Number(res[0])) + " \"" + res[1] + "\"", "actif": false} )
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mise à jour du flag d'utilisation du paramètre Mode_entrées :
|
|
flag_affichage_mode_entrees = false;
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrée Booléenne calculée :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_calculee_booleen:
|
|
|
|
// Même si l'entrée du modèle n'est jamais affichée pour ce type de capteur, l'ajout
|
|
// de cette entrée et sa sélection permet de "porter" les renseignements tels que 'code_variable'
|
|
// ou les 'pecision_affichage_xxx'.
|
|
|
|
if (id_capteur === 0) entrees = "1/1/0:0/0/0/0;1/-1/0:0/0/0/0"; // Valeur par défaut d'ouverture et fermeture de niveau 0. NB : une chaine nulle fonctionne également mais comme cell-ci sera inévitablement créée, autant le faire directement
|
|
|
|
champ_formulaire_Entrees.model.append({
|
|
"entrees": entrees,
|
|
"texte": "Entrée calculée", // Texte jamais affiché...
|
|
"actif": true,
|
|
"code_variable": shipheart_capteur_sans_unite,
|
|
"mode_enregistrement_mesures": shipheart_mode_enregistrement_mesures_changement_etat,
|
|
"precision_affichage_accueil": 0,
|
|
"precision_affichage_mesures": 0
|
|
});
|
|
|
|
// Mise à jour de l'index du modèle si l'on est sur l'entrée en cours :
|
|
champ_formulaire_Entrees.currentIndex = 1; // Le '1' sur CurrenIndex car on a déjà ajouté une entrée NON DEFINIE
|
|
|
|
// Mise à jour du flag d'utilisation du paramètre Mode_entrées :
|
|
flag_affichage_mode_entrees = false;
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrée numérique calculée :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_calculee_numerique:
|
|
break;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Appel du remplissage des modèles de niveau inférieur si cela est possible :
|
|
if ( (entrees !== "")
|
|
|| (type_entrees >= shipheart_capteur_type_entrees_calculee_booleen)) // Si on est sur un capteur calculé, on avance quand même car le champ Entrees ne sera de toutes façons pas utile.
|
|
{
|
|
if (flag_affichage_mode_entrees) mise_a_jour_mode_entrees(); // Cas "normal" où le Mode_entree doit être traité
|
|
else mise_a_jour_famille(); // Si pas de Mode_entree, on passe directement à la Famille.
|
|
}
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// MAJ du Mode des entrées
|
|
//=============================================================================================================
|
|
function mise_a_jour_mode_entrees()
|
|
{
|
|
var req, res;
|
|
var nb;
|
|
var i, j;
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Mode :
|
|
//---------------------------------------------------------------------------------------
|
|
champ_formulaire_Mode_entrees.model.clear();
|
|
if (type_entrees !== shipheart_capteur_type_entrees_aux) // Pour les entrées AUX, on n'a pas accès à la valeur NON DEFINIE car NORMAL=0 (et pas utile !!)
|
|
{
|
|
champ_formulaire_Mode_entrees.model.append({"valeur": 0, "texte": qsTr("Non défini") });
|
|
}
|
|
|
|
switch(type_entrees)
|
|
{
|
|
//----------------------------------------
|
|
// Entrées AUX :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_aux:
|
|
|
|
champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_aux_normal, "texte": qsTr("Normal") });
|
|
champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_aux_inverse, "texte": qsTr("Inversé") });
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Level Sensor :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_level_sensor:
|
|
|
|
champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_level_sensor_0_10v, "texte": qsTr("Tension 0 - 10 V") });
|
|
champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_level_sensor_500r, "texte": qsTr("Résistance 0 - 500 Ohms") });
|
|
champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_level_sensor_4_20ma, "texte": qsTr("Courant 4 - 20 mA") });
|
|
// champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_masse, "texte": qsTr("Défaut d'isolement 0V") });
|
|
// champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_v_plus, "texte": qsTr("Défaut d'isolement V+") });
|
|
champ_formulaire_Mode_entrees.model.append({"valeur": shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_complet, "texte": qsTr("Défaut d'isolement") });
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Voltage Input :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_volt:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées OW :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_ow:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées NMEA2000 :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_nmea:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Prédéfinies :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_predefinie:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrée Booléenne calculée :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_calculee_booleen:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrée numérique calculée :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_calculee_numerique:
|
|
break;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Recherche de l'index du capteur en cours :
|
|
champ_formulaire_Mode_entrees.currentIndex = 0; // Si aucune entrée n'est trouvée (cas d'une création par exemple), l'index est égal à 0
|
|
|
|
for (i=0; i<champ_formulaire_Mode_entrees.model.count; i ++)
|
|
{
|
|
if (champ_formulaire_Mode_entrees.model.get(i).valeur === Number(mode_entrees))
|
|
{
|
|
champ_formulaire_Mode_entrees.model.set(i, {"actif": true} )
|
|
champ_formulaire_Mode_entrees.currentIndex = i;
|
|
break; // Une fois trouvé lindex en cours, inutile de poursuivre
|
|
}
|
|
}
|
|
|
|
|
|
// Appel du remplissage des modèles de niveau inférieur si cela est possible :
|
|
mise_a_jour_famille();
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// MAJ de la Famille
|
|
//=============================================================================================================
|
|
function mise_a_jour_famille()
|
|
{
|
|
var req, res;
|
|
var nb;
|
|
var i;
|
|
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
// Famille :
|
|
//---------------------------------------------------------------------------------------
|
|
champ_formulaire_Famille.model.clear();
|
|
champ_formulaire_Famille.model.append({"valeur": 0, "texte": "Non défini" });
|
|
|
|
req = 'SELECT Cle_primaire, Nom FROM TB_Familles WHERE Type_source=' + shipheart_type_source_capteurs + ' 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;
|
|
|
|
if ( (champ_formulaire_Famille.currentIndex !== 0) &&
|
|
((type_entrees === shipheart_capteur_type_entrees_aux) || (type_entrees === shipheart_capteur_type_entrees_calculee_booleen)) )
|
|
{
|
|
mise_a_jour_libelles();
|
|
}
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// MAJ des unités du capteur
|
|
//=============================================================================================================
|
|
function mise_a_jour_unite()
|
|
{
|
|
var code_variable = "";
|
|
var precision_affichage_accueil;
|
|
var precision_affichage_mesures;
|
|
|
|
switch(type_entrees)
|
|
{
|
|
//----------------------------------------
|
|
// Entrées AUX :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_aux:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Level Sensor :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_level_sensor:
|
|
|
|
switch (mode_entrees)
|
|
{
|
|
//------------------------------------------------------
|
|
case shipheart_capteur_mode_entrees_level_sensor_0_10v:
|
|
code_variable = shipheart_capteur_tension_v;
|
|
precision_affichage_accueil = 1;
|
|
precision_affichage_mesures = 2;
|
|
break;
|
|
//------------------------------------------------------
|
|
case shipheart_capteur_mode_entrees_level_sensor_500r:
|
|
code_variable = shipheart_capteur_resistance;
|
|
precision_affichage_accueil = 0;
|
|
precision_affichage_mesures = 0;
|
|
break;
|
|
//------------------------------------------------------
|
|
case shipheart_capteur_mode_entrees_level_sensor_4_20ma:
|
|
code_variable = shipheart_capteur_courant_ma;
|
|
precision_affichage_accueil = 1;
|
|
precision_affichage_mesures = 1;
|
|
break;
|
|
//------------------------------------------------------
|
|
case shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_masse:
|
|
case shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_v_plus:
|
|
case shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_complet:
|
|
code_variable = shipheart_capteur_courant_ma;
|
|
precision_affichage_accueil = 1;
|
|
precision_affichage_mesures = 1;
|
|
break;
|
|
//------------------------------------------------------
|
|
default: // Ne devrait pas arriver...
|
|
code_variable = shipheart_capteur_tension_v;
|
|
precision_affichage_accueil = 1;
|
|
precision_affichage_mesures = 2;
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Voltage Input :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_volt:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées OW :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_ow:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées NMEA2000 :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_nmea:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrées Prédéfinies :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_predefinie:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrée Booléenne calculée :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_calculee_booleen:
|
|
break;
|
|
|
|
//----------------------------------------
|
|
// Entrée numérique calculée :
|
|
//----------------------------------------
|
|
case shipheart_capteur_type_entrees_calculee_numerique:
|
|
break;
|
|
}
|
|
|
|
if (code_variable !== "") // Pour les type de capteurs qui ont déjà leurs unités de renseignées, on ne touche à rien...
|
|
{
|
|
champ_formulaire_Entrees.model.set(champ_formulaire_Entrees.currentIndex, {
|
|
"code_variable": code_variable,
|
|
"precision_affichage_accueil": precision_affichage_accueil,
|
|
"precision_affichage_mesures": precision_affichage_mesures
|
|
});
|
|
}
|
|
}
|
|
|
|
//=============================================================================================================
|
|
// MAJ des libelles
|
|
//=============================================================================================================
|
|
function mise_a_jour_libelles()
|
|
{
|
|
var i;
|
|
|
|
switch(type_entrees)
|
|
{
|
|
case shipheart_capteur_type_entrees_aux:
|
|
nb_libelles = Math.pow(2, nb_entrees);
|
|
break;
|
|
|
|
case shipheart_capteur_type_entrees_calculee_booleen:
|
|
nb_libelles = 2;
|
|
break;
|
|
|
|
default:
|
|
return;
|
|
}
|
|
|
|
liste_libelles.model.clear();
|
|
|
|
for (i=0; i<nb_libelles; i++)
|
|
{
|
|
liste_libelles.model.append({ "valeur": i,
|
|
"libelle": "" }); // Par défaut, le placeholder indique que ce sera la valeur qui sera affiché.
|
|
}
|
|
|
|
// Recherche des Valeurs/textes existants :
|
|
var chaines_valeurs_textes = liste_valeurs_textes.split(';');
|
|
|
|
for (let chaine_valeur_texte of chaines_valeurs_textes)
|
|
{
|
|
var chaine = chaine_valeur_texte.split('/');
|
|
if (chaine.length === 2) // Evite de traiter les cas invalides (notamment, une chaine totalement vide qui arrive ici avec un length de 1...)
|
|
{
|
|
liste_libelles.model.set(Number(chaine [0]), {"libelle": chaine[1]});
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// Mise à jour des valeurs saisies du capteur
|
|
//=============================================================================================================
|
|
function mise_a_jour_capteur()
|
|
{
|
|
var req, res;
|
|
var i, j;
|
|
var nb;
|
|
var nom;
|
|
var code_variable, id_variable;
|
|
var id_famille;
|
|
var mode_enregistrement_mesures;
|
|
var precision_affichage_accueil;
|
|
var precision_affichage_mesures;
|
|
|
|
|
|
nom = champ_formulaire_Nom.text;
|
|
|
|
if (flag_affichage_mode_entrees) mode_entrees = champ_formulaire_Mode_entrees.model.get(champ_formulaire_Mode_entrees.currentIndex).valeur;
|
|
else mode_entrees = 0;
|
|
|
|
id_famille = champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur;
|
|
|
|
if (type_entrees === shipheart_capteur_type_entrees_aux)
|
|
{
|
|
code_variable = shipheart_capteur_sans_unite;
|
|
mode_enregistrement_mesures = shipheart_mode_enregistrement_mesures_changement_etat;
|
|
precision_affichage_accueil = 0;
|
|
precision_affichage_mesures = 0;
|
|
}
|
|
else
|
|
{
|
|
code_variable = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).code_variable;
|
|
mode_enregistrement_mesures = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).mode_enregistrement_mesures;
|
|
precision_affichage_accueil = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).precision_affichage_accueil;
|
|
precision_affichage_mesures = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).precision_affichage_mesures;
|
|
}
|
|
|
|
// Traitement de la chaine 'Entrées' :
|
|
if (type_entrees === shipheart_capteur_type_entrees_aux)
|
|
{
|
|
// Création de la chaine représentant les n° d'entrées utilisées par le réservoir :
|
|
entrees = "";
|
|
for (i = 0; i < shipheart_capteur_max_nombre_entrees_aux; i ++)
|
|
{
|
|
j = entrees_aux_grid.model.get(i).no_entree_aux
|
|
if (j !== 0)
|
|
{
|
|
if (entrees !== "") entrees += ";";
|
|
entrees += j;
|
|
}
|
|
}
|
|
}
|
|
else entrees = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).entrees;
|
|
|
|
// Recherche de l'ID_Variable correspondant au code_variable :
|
|
req = ' SELECT Cle_primaire FROM TB_Variables WHERE Code="' + code_variable + '" ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
res = bdd.requete_unique(req);
|
|
id_variable = Number(res[0]);
|
|
|
|
// Traitement des Liste_valeurs_textes pour le type ENTREES AUX et CALCULE_BOOLEEN :
|
|
liste_valeurs_textes = "";
|
|
if ((type_entrees === shipheart_capteur_type_entrees_aux) || (type_entrees === shipheart_capteur_type_entrees_calculee_booleen))
|
|
{
|
|
for (i=0; i<liste_libelles.model.count; i ++)
|
|
{
|
|
if (liste_libelles.model.get(i).libelle !== "")
|
|
{
|
|
if (liste_valeurs_textes !== "") liste_valeurs_textes += ";";
|
|
liste_valeurs_textes += liste_libelles.model.get(i).valeur + "/" + liste_libelles.model.get(i).libelle;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Traitement de la case à cocher 'masquage' :
|
|
var paa;
|
|
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émasque (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 valur 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.
|
|
}
|
|
|
|
// Requete de mise à jour :
|
|
req = 'UPDATE TB_Capteurs SET Nom="' + nom + '" ';
|
|
req += ', Adresse_module=' + adresse_module + ' ';
|
|
req += ', Type_entrees=' + type_entrees + ' ';
|
|
req += ', Entrees="' + entrees + '"';
|
|
req += ', Mode_entrees=' + mode_entrees + ' ';
|
|
req += ', ID_Variable=' + id_variable + ' ';
|
|
req += ', Liste_valeurs_textes="' + liste_valeurs_textes + '" ';
|
|
req += ', ID_Famille=' + id_famille + ' ';
|
|
req += ', Mode_enregistrement_mesures=' + mode_enregistrement_mesures + ' ';
|
|
req += ', Priorite_affichage_accueil=' + paa + ' ';
|
|
req += ', Precision_affichage_accueil=' + precision_affichage_accueil + ' ';
|
|
req += ', Precision_affichage_mesures=' + precision_affichage_mesures + ' ';
|
|
req += ' WHERE Cle_primaire=' + id_capteur + ' '
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
bdd.requete_unique(req);
|
|
|
|
// Cas particulier d'un capteur sur entrée NMEA :
|
|
if (type_entrees === shipheart_capteur_type_entrees_nmea) flag_nmea = true;
|
|
if (flag_nmea) mise_a_jour_nmea2000();
|
|
|
|
// Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration :
|
|
synchro_bdd(shipheart_type_synchro_config);
|
|
|
|
}
|
|
|
|
//=============================================================================================================
|
|
// Création du capteur
|
|
//=============================================================================================================
|
|
function creation_capteur()
|
|
{
|
|
var req, res;
|
|
var nom;
|
|
var i, j;
|
|
var nb;
|
|
var code_variable, id_variable;
|
|
var id_famille;
|
|
var precision_affichage_accueil;
|
|
var precision_affichage_mesures;
|
|
var mode_enregistrement_mesures;
|
|
|
|
|
|
nom = champ_formulaire_Nom.text;
|
|
|
|
if (flag_affichage_mode_entrees) mode_entrees = champ_formulaire_Mode_entrees.model.get(champ_formulaire_Mode_entrees.currentIndex).valeur;
|
|
else mode_entrees = 0;
|
|
|
|
id_famille = champ_formulaire_Famille.model.get(champ_formulaire_Famille.currentIndex).valeur;
|
|
|
|
if (type_entrees === shipheart_capteur_type_entrees_aux)
|
|
{
|
|
code_variable = shipheart_capteur_sans_unite;
|
|
mode_enregistrement_mesures = shipheart_mode_enregistrement_mesures_changement_etat;
|
|
precision_affichage_accueil = 0;
|
|
precision_affichage_mesures = 0;
|
|
}
|
|
else
|
|
{
|
|
code_variable = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).code_variable;
|
|
mode_enregistrement_mesures = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).mode_enregistrement_mesures;
|
|
precision_affichage_accueil = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).precision_affichage_accueil;
|
|
precision_affichage_mesures = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).precision_affichage_mesures;
|
|
}
|
|
|
|
// Traitement de la chaine 'Entrées' :
|
|
if (type_entrees === shipheart_capteur_type_entrees_aux)
|
|
{
|
|
// Création de la chaine représentant les n° d'entrées utilisées par le réservoir :
|
|
entrees = "";
|
|
for (i = 0; i < shipheart_capteur_max_nombre_entrees_aux; i ++)
|
|
{
|
|
j = entrees_aux_grid.model.get(i).no_entree_aux
|
|
if (j !== 0)
|
|
{
|
|
if (entrees !== "") entrees += ";";
|
|
entrees += j;
|
|
}
|
|
}
|
|
}
|
|
else entrees = champ_formulaire_Entrees.model.get(champ_formulaire_Entrees.currentIndex).entrees;
|
|
|
|
// Recherche de l'ID_Variable correspondant au code_variable :
|
|
req = ' SELECT Cle_primaire FROM TB_Variables WHERE Code="' + code_variable + '" ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
res = bdd.requete_unique(req);
|
|
id_variable = Number(res[0]);
|
|
|
|
// Traitement des Liste_valeurs_textes pour le type ENTREES AUX et CALCULE_BOOLEEN :
|
|
liste_valeurs_textes = "";
|
|
if ((type_entrees === shipheart_capteur_type_entrees_aux) || (type_entrees === shipheart_capteur_type_entrees_calculee_booleen))
|
|
{
|
|
for (i=0; i<liste_libelles.model.count; i ++)
|
|
{
|
|
if (liste_libelles.model.get(i).libelle !== "")
|
|
{
|
|
if (liste_valeurs_textes !== "") liste_valeurs_textes += ";";
|
|
liste_valeurs_textes += liste_libelles.model.get(i).valeur + "/" + liste_libelles.model.get(i).libelle;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Traitement du champ Priorite_affichage_accueil :
|
|
if (champ_formulaire_Masquage.checked) priorite_affichage_accueil = 0;
|
|
else priorite_affichage_accueil = 999;
|
|
|
|
// Requete de création :
|
|
req = 'INSERT INTO TB_Capteurs (Nom, ';
|
|
req += ' Adresse_module, ';
|
|
req += ' Type_entrees, ';
|
|
req += ' Entrees, ';
|
|
req += ' Mode_entrees, ';
|
|
req += ' ID_Variable, ';
|
|
req += ' Liste_valeurs_textes, ';
|
|
req += ' ID_Famille, ';
|
|
req += ' Mode_enregistrement_mesures, ';
|
|
req += ' Precision_affichage_accueil, ';
|
|
req += ' Precision_affichage_mesures, ';
|
|
req += ' Priorite_affichage_accueil) '
|
|
req += ' VALUES ("' + nom + '"';
|
|
req += ', ' + adresse_module;
|
|
req += ', ' + type_entrees;
|
|
req += ', "' + entrees + '"';
|
|
req += ', ' + mode_entrees + ' ';
|
|
req += ', ' + id_variable + ' ';
|
|
req += ', "' + liste_valeurs_textes + '"';
|
|
req += ', ' + id_famille
|
|
req += ', ' + mode_enregistrement_mesures;
|
|
req += ', ' + precision_affichage_accueil;
|
|
req += ', ' + precision_affichage_mesures;
|
|
req += ', ' + priorite_affichage_accueil;
|
|
req += ') ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
bdd.requete_unique(req);
|
|
|
|
// Recherche de l'ID_Capteur correspondant au capteur créé :
|
|
req = ' SELECT Cle_primaire FROM TB_Capteurs ORDER BY Cle_primaire DESC LIMIT 1 ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
res = bdd.requete_unique(req);
|
|
id_capteur = Number(res[0]);
|
|
|
|
// Cas particulier d'un capteur sur entrée NMEA :
|
|
if (type_entrees === shipheart_capteur_type_entrees_nmea) flag_nmea = true;
|
|
if (flag_nmea) mise_a_jour_nmea2000();
|
|
|
|
// Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration :
|
|
synchro_bdd(shipheart_type_synchro_config);
|
|
}
|
|
|
|
//=============================================================================================================
|
|
// Check suppression du capteur
|
|
//=============================================================================================================
|
|
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_capteur + ' AND ID_Source=' + id_capteur + ' ';
|
|
req += ' ORDER BY Nom';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
if (nb > 0)
|
|
{
|
|
if (nb === 1) message += "<br /><br />" + qsTr("Ce capteur 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 capteur avant de pouvoir le supprimer.") + "<br /><br />";
|
|
else message += "<br /><br />" + qsTr("Ce capteur 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 capteur avant de pouvoir le supprimer.").arg(nb) + "<br /><br />";
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
message += "‣ " + (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_capteur + ':' + id_capteur + '/%" ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
if (nb > 0)
|
|
{
|
|
if (nb === 1) message += "<br /><br />" + qsTr("Ce capteur 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 capteur avant de pouvoir le supprimer.") + "<br /><br />";
|
|
else message += "<br /><br />" + qsTr("Ce capteur 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 capteur avant de pouvoir le supprimer.").arg(nb) + "<br /><br />";
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
message += "‣ " + (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 = 2;
|
|
boite_information.imageTitreSource = "/images/attention.png"
|
|
boite_information.message = message;
|
|
boite_information.alignementMessage = Text.AlignLeft
|
|
boite_information.open();
|
|
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// Suppression du capteur
|
|
//=============================================================================================================
|
|
function suppression_capteur()
|
|
{
|
|
var req, res;
|
|
var nb;
|
|
var i;
|
|
var liste_cdes_auto, chaines_cdes_auto;
|
|
var type_entrees;
|
|
var entrees;
|
|
|
|
// Recherche des informations actuelles du capteur :
|
|
req = 'SELECT Type_entrees, Entrees FROM TB_Capteurs WHERE Cle_primaire=' + id_capteur + ' ';
|
|
res = bdd.requete_unique(req);
|
|
type_entrees = Number(res[0]);
|
|
entrees = res[1]; // A ce stade, c'est une chaine. On ne fera la conversion en Number que lorsqu'on aura vérifié que 'Type_entrées' est de type OW.
|
|
|
|
// Pour les capteurs utilisant les sondes OW, RAZ du nom de la sonde :
|
|
if (type_entrees === shipheart_capteur_type_entrees_ow)
|
|
{
|
|
req = 'UPDATE TB_One_wire SET Nom="---" WHERE Cle_primaire=' + Number(entrees) + ' ';
|
|
bdd.requete_unique(req);
|
|
}
|
|
|
|
// Pour les capteurs utilisant les Entrees_aux :
|
|
// Il n'est pas utile de mettre à jour TB_Entrees_aux en fonction des changements effectués. En effet, on va juste après demander une "synchro" à l'appli et celle-ci
|
|
// va réinitialiser puis va le re-remplir en fonction de l'état des Capteurs et des Réservoirs. Donc si des Entrées AUX ne sont plus plus utilisées ou ont changé, elles
|
|
// seront mises à jour à ce moment-là.
|
|
|
|
// Suppression du capteur :
|
|
req = 'DELETE FROM TB_Capteurs WHERE Cle_primaire=' + id_capteur + ' ';
|
|
bdd.requete_unique(req);
|
|
|
|
// Cas particulier d'un capteur sur entrée NMEA :
|
|
if (type_entrees === shipheart_capteur_type_entrees_nmea) flag_nmea = true;
|
|
if (flag_nmea) mise_a_jour_nmea2000();
|
|
|
|
// Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration :
|
|
synchro_bdd(shipheart_type_synchro_config);
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// Mise à jour de la table NMEA2000 après modifications de capteur
|
|
//=============================================================================================================
|
|
function mise_a_jour_nmea2000()
|
|
{
|
|
var req, res;
|
|
var i;
|
|
var nb;
|
|
|
|
// RAZ de tous les flags Actifs (valeur par défaut plus rapide ; sans danger puisqu'on n'a pas demandé la mise à jour NMEA) :
|
|
req = 'UPDATE TB_Nmea2000 SET Actif=0 ';
|
|
bdd.requete_unique(req);
|
|
|
|
// Mise à 1 des PGN/Fields qui sont effectivement utilisés sur des capteurs :
|
|
req = 'SELECT Entrees FROM TB_Capteurs WHERE Type_entrees=' + shipheart_capteur_type_entrees_nmea + ' ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
var x = res[0].split(':');
|
|
req = 'UPDATE TB_Nmea2000 SET Actif=1 WHERE Pgn=' + x[0] + ' AND Field=' + x[1] + ' ';
|
|
//console.log("Requête = [ " + req + "; ]");
|
|
bdd.requete_unique(req);
|
|
}
|
|
}
|
|
|
|
// Demande de MAJ des paramètres NMEa par l'Appli :
|
|
req = 'UPDATE TB_Systeme SET Valeur=1 WHERE Nom="Demande_maj_nmea" ';
|
|
bdd.requete_unique(req);
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// Recherche groupe d'une entrée AUX à partir de son numéro et renvoit le n° de grpupe (entre 0 et 7)
|
|
//=============================================================================================================
|
|
function recherche_groupe_entree_aux(entree)
|
|
{
|
|
switch(Math.trunc(entree/4))
|
|
{
|
|
case 0: return(4);
|
|
case 1: return(5);
|
|
case 2: return(6);
|
|
case 3: return(7);
|
|
case 4: return(0);
|
|
case 5: return(1);
|
|
case 6: return(2);
|
|
case 7: return(3);
|
|
default:
|
|
console.log("Erreur de groupe d'entrée AUX")
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// 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);
|
|
}
|
|
|
|
|
|
}
|
|
|