//========================================================================================================================================================================
// ETALONNAGE_CARTE.QML
// Ce fichier traite l'étalonnage d'une carte. La page affiche notamment :
// - La valeur brute actuelle
// - la valeur corrigée actuelle (rensignée manuellement)
// - l'offset actuel
// La page est appelée depuis la page information_materiel.qml, en cliquant sur le bouton ETALONNAGE lorsqu'il est disponible.
//========================================================================================================================================================================
import QtQuick 2.12
import QtQuick.Controls 2.12
import qt.koriolan.shipheart 1.0
Shipheart_page {
id: page_etalonnage_carte
// Mis en forme :
readonly property double pourcentage_largeur_colonne_gauche: 0.75
readonly property double espace_colonnes_principales: 20
readonly property double pourcentage_hauteur_ligne_haut: 1
readonly property double espace_lignes_principales: 20
readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas
readonly property int hauteur_ligne_formulaire: 60
readonly property double pourcentage_largeur_labels_formulaire: 0.4
readonly property double nombre_colonnes_secondaires: 2 // Cette valeur permet de découper les (1.0 - pourcentage_largeur_labels_formulaire) x pourcentage_largeur_colonne_gauche pour afficher les infos de chaque point d'étalonnage
readonly property double espace_colonnes_secondaires: 20
readonly property int nombre_circuits_affiches_sur_une_colonne: 5
readonly property int hauteur_bouton_droit: 80
readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1
readonly property int periode_init_raffraichissement_parametres: 1 // En ms
readonly property int periode_raffraichissement_parametres: 1000 // En ms
// Affichage :
property bool bouton_bandeau_bas_zone_retour_actif: false
property int protection_mode: 0
property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée
// Données :
property int adresse_module: -1
property string nom_carte: "---"
property int id_batterie: -1 // Cle_primaire de la batterie à laquelle le module est affecté (cas d'un ShipBS)
property string eeprom: ""
property double courant_differentiel: 0
property double courant_decharge: 0
property double tension: 0
property double resistance: 0
property bool flag_point_memorise_1: false
property double courant_differentiel_1: 0
property double courant_decharge_1: 0
property double tension_1: 0
property bool flag_point_memorise_2: false
property double courant_differentiel_2: 0
property double courant_decharge_2: 0
property double tension_2: 0
// Modèles :
// Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes
//===========================================================
// Timer periode raffraichissement parametres capteur :
//===========================================================
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 if (!clavier.active) mise_a_jour(); // Permet la mise à jour en temps réel du moment que le clavier n'est pas actif.
}
}
// Titre de la page :
Shipheart_titre_1 {titre:qsTr("Etalonnage du module [%1 - #%2]").arg(nom_carte).arg(adresse_module); 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"
//-------------------------------------------------------------------------------
// Ligne de formulaire : N° des points d'étalonnage
Rectangle {
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
// Label de la ligne :
Shipheart_formulaire_label {
id: label_no_points
text: ""
width: parent.width * pourcentage_largeur_labels_formulaire
}
// Première valeur d'étalonnage :
Rectangle {
id: val_1_no_points
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height
anchors {
left: label_no_points.right
leftMargin: 0
}
color: "transparent"
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: couleur_blanc_casse
font.weight: Font.Bold
text: qsTr("Point 1");
}
}
// Deuxième valeur d'étalonnage :
Rectangle {
id: val_2_no_points
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height
anchors {
left: val_1_no_points.right
leftMargin: espace_colonnes_secondaires
}
color: "transparent"
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: couleur_blanc_casse
font.weight: Font.Bold
text: qsTr("Point 2");
}
}
}
//-------------------------------------------------------------------------------
// Ligne de formulaire : Courant de décharge
Rectangle {
y: hauteur_ligne_formulaire
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
// Label de la ligne :
Shipheart_formulaire_label {
id: label_courant_decharge
text: qsTr("Courant de décharge")
width: parent.width * pourcentage_largeur_labels_formulaire
}
// Première valeur d'étalonnage :
Rectangle {
id: val_1_courant_decharge
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height
anchors {
left: label_courant_decharge.right
leftMargin: 0
}
color: "transparent"
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: couleur_blanc_casse
text: courant_decharge_1.toFixed(3) + " A"
}
}
// Deuxième valeur d'étalonnage :
Rectangle {
id: val_2_courant_decharge
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height
anchors {
left: val_1_courant_decharge.right
leftMargin: espace_colonnes_secondaires
}
color: "transparent"
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: couleur_blanc_casse
text: courant_decharge_2.toFixed(3) + " A"
}
}
// Ligne de séparation :
Shipheart_formulaire_ligne_separation {
haut_bas_hautbas: shipheart_formulaire_ligne_separation_haute
}
}
//-------------------------------------------------------------------------------
// Ligne de formulaire : Courant différentiel
Rectangle {
y: 2 * hauteur_ligne_formulaire
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
// Label de la ligne :
Shipheart_formulaire_label {
id: label_courant_differentiel
text: qsTr("Courant différentiel")
width: parent.width * pourcentage_largeur_labels_formulaire
}
// Première valeur d'étalonnage :
Rectangle {
id: val_1_courant_differentiel
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height
anchors {
left: label_courant_differentiel.right
leftMargin: 0
}
color: "transparent"
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: couleur_blanc_casse
text: courant_differentiel_1.toFixed(3) + " A"
}
}
// Deuxième valeur d'étalonnage :
Rectangle {
id: val_2_courant_differentiel
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height
anchors {
left: val_1_courant_differentiel.right
leftMargin: espace_colonnes_secondaires
}
color: "transparent"
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: couleur_blanc_casse
text: courant_differentiel_2.toFixed(3) + " A"
}
}
// Ligne de séparation :
Shipheart_formulaire_ligne_separation {
haut_bas_hautbas: shipheart_formulaire_ligne_separation_haute
}
}
//-------------------------------------------------------------------------------
// Ligne de formulaire : Boutons de mémorisation
Rectangle {
y: 3 * hauteur_ligne_formulaire
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_bouton_droit : 0
color: "transparent"
// Label de la ligne :
Shipheart_formulaire_label {
id: label_boutons
text: ""
width: parent.width * pourcentage_largeur_labels_formulaire
}
// Première valeur d'étalonnage :
Rectangle {
id: val_1_boutons
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height - 10
radius: shipheart_rayon_bouton
anchors {
left: label_boutons.right
leftMargin: 0
verticalCenter: parent.verticalCenter
}
color: shipheart_couleur_fond_bouton
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: flag_point_memorise_1 ? couleur_gris_fonce : couleur_blanc_casse
text: flag_point_memorise_1 ? qsTr("Recalculer ce point") : qsTr("Mémoriser ce point")
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
if (flag_point_memorise_1) flag_point_memorise_1 = false;
else
{
if (flag_point_memorise_2)
{
if ((courant_differentiel_1 === courant_differentiel_2) ||
(courant_decharge_1 === courant_decharge_2))
{
boite_alerte.open();
}
else flag_point_memorise_1 = true;
}
else flag_point_memorise_1 = true;
}
}
}
}
// Deuxième valeur d'étalonnage :
Rectangle {
id: val_2_boutons
width: (parent.width * (1 - pourcentage_largeur_labels_formulaire) / nombre_colonnes_secondaires) - (espace_colonnes_secondaires / 2)
height: parent.height - 10
radius: shipheart_rayon_bouton
anchors {
left: val_1_boutons.right
leftMargin: espace_colonnes_secondaires
verticalCenter: parent.verticalCenter
}
color: shipheart_couleur_fond_bouton
Label {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 18
color: flag_point_memorise_2 ? couleur_gris_fonce : couleur_blanc_casse
text: flag_point_memorise_2 ? qsTr("Recalculer ce point") : qsTr("Mémoriser ce point")
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
if (flag_point_memorise_2) flag_point_memorise_2 = false;
else
{
if (flag_point_memorise_1)
{
if ((courant_differentiel_1 === courant_differentiel_2) ||
(courant_decharge_1 === courant_decharge_2))
{
boite_alerte.open();
}
else flag_point_memorise_2 = true;
}
else flag_point_memorise_2 = true;
}
}
}
}
// Ligne de séparation :
Shipheart_formulaire_ligne_separation {
haut_bas_hautbas: shipheart_formulaire_ligne_separation_haute_basse
}
}
//-------------------------------------------------------------------------------
// Boutons de circuits :
ListView {
id: grille_principale
x: parent.width * pourcentage_largeur_labels_formulaire
y: (3 * hauteur_ligne_formulaire) + hauteur_bouton_droit
width: parent.width * (1- pourcentage_largeur_labels_formulaire)
height: parent.height - y
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
delegate: Rectangle {
width: grille_principale.width
height: grille_principale.height / nombre_circuits_affiches_sur_une_colonne
color: "transparent"
Rectangle { // c'est le bouton proprement dit...
width:parent.width
height: parent.height - 10
color: shipheart_couleur_fond_bouton
radius: shipheart_rayon_bouton
anchors.bottom: parent.bottom
Text { // Nom du circuit...
anchors.fill: parent
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignTop
topPadding: 10
leftPadding: 20
text: model.nom
color: commandable ? couleur_blanc_casse : couleur_gris_fonce
font.pixelSize: 18
}
Text { // Intensité du circuit...
anchors.fill: parent
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignBottom
bottomPadding: 10
leftPadding: 20
text: model.intensite.toFixed(1) + " A"
color: commandable ? couleur_blanc_casse : couleur_gris_fonce
font.pixelSize: 18
}
Rectangle { // Zone de consigne du circuit...
anchors {
top: parent.top
bottom: parent.bottom
right: parent.right
}
width: 100
radius: shipheart_rayon_bouton
color: (consigne === 0) ? couleur_rouge_transparent : couleur_vert_transparent
visible: commandable
Text { // Valeur de la consigne...
anchors.fill: parent
horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
text: (consigne === 0) ? qsTr("Off") : ((consigne === 100) ? qsTr("On") : qsTr("On (%1 %%)").arg(consigne))
color: (consigne === 0) ? couleur_rouge : couleur_green_yellow
font.pixelSize: 18
}
}
MouseArea{
anchors.fill : parent
onClicked: {
shipheart_clic();
toggle_circuit(index);
}
}
}
}
/* 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"
}
*/
ListModel {
id: modele_grille_principale
}
}
}
//-------------------------------------------------------
// 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 :
Rectangle {
width: parent.width
height: hauteur_bouton_droit
color: shipheart_couleur_fond_bouton
radius: shipheart_rayon_bouton
visible:
// !clavier.active && // SDIR #255
!flag_init &&
flag_point_memorise_1 &&
flag_point_memorise_2
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: qsTr("Enregistrer")
color: couleur_blanc_casse
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
enregistrement();
sortie();
stackView.pop();
}
}
}
// Bouton Information :
Rectangle {
width: parent.width
height: hauteur_bouton_droit
color: shipheart_couleur_fond_bouton
radius: shipheart_rayon_bouton
visible: (clavier.active || flag_init) ? false : true; // Si le clavier est déplié ou si l'init est eb cours, on ne propose pas le bouton
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: qsTr("Aide")
color: couleur_blanc_casse
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
boite_information_shipbs.open();
}
}
}
}
}
//-------------------------------------------------------
// Bandeau bas :
//-------------------------------------------------------
Row {
x: 0
y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas;
width: shipheart_largeur_page;
height: shipheart_hauteur_bandeau_bas;
spacing: 5
padding: 5
//.................................................
// Bouton retour
//.................................................
Rectangle {
id: bandeau_bas_zone_retour
width: (parent.width * pourcentage_bandeau_bas_largeur_zone_retour) - (2 * parent.padding)
height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding;
radius: shipheart_rayon_bouton
color: shipheart_couleur_fond_bouton
Image {
source: "/images/icone_retour.png"
sourceSize.height: 30
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
}
MouseArea { // Zone d'interaction. On est obligé de la mettre dans la grille pour que Rectangle et MouseArea soient frères ou parent/enfant ET qu'on n'occupe qu'un espace dans la grille.
id: mouse_area_bandeau_bas_zone_retour
anchors.fill: parent
onClicked: {
shipheart_clic();
sortie();
stackView.pop()
}
}
}
}
//===========================================================
// Boite d'alerte :
//===========================================================
Shipheart_boite_dialogue {
id: boite_alerte
niveau: 1
imageTitreSource: "/images/attention.png";
message: qsTr("L'étalonnage ne peut pas se faire avec deux points identiques.
Essayer de modifier au moins l'un des deux points de référence en jouant sur la commande des circuits ci-dessous.
")
}
//===========================================================
// Boite d'information :
//===========================================================
Shipheart_boite_dialogue {
id: boite_information_shipbs
niveau: 0
imageTitreSource: "/images/ampoule.png";
alignementMessage: Text.AlignJustify
message: qsTr("Le principe de l'étalonnage est de comparer en 2 points différents la valeur de courant différentiel mesurée par le ShipBS d'une part et
le courant de décharge mesuré par le système ShipHeart d'autre part.
Par exemple, en soumettant le ShipBS en cours d'étalonnage à une consommation faible ou nulle (premier point)
puis en mettant en fonctionnement un ou plusieurs appareils pour obtenir une consommation de plusieurs ampères si possible (second point).
Très important : pendant toute la phase d'étalonnage aucun courant de charge ne doit être appliqué sur ShipBS !
Il est donc essentiel de déconnecter tous les chargeurs, régulateurs solaires, etc... du système pendant l'étalonnage.
Faute de cela, les valeurs d'étalonnage seront erronées...
Remarques :
- toutes les consommations doivent passer par le système ShipHeart ! Il faut donc s'assurer qu'aucune charge n'est connectée directement
au parc de batteries.
- les valeurs de courant n'ont pas d'importance.
- le courant du point 2 peut être inférieur ou supérieur à celui du point 1 (mais, aussi \"éloignés\" que possible l'un de l'autre).
- il est conseillé de choisir des charges dont la consommation est relativement stable ou, a minima, évolue peu sur une période de quelques secondes.")
}
//===========================================================
// Economiseur : Doit être placé en fin de page pour fonctionner
//===========================================================
MouseArea {
anchors.fill: parent
preventStealing: true // Permet que cela fonctionne même si un élément flickable (notamment) soit derrière et "vole" le click
enabled: flag_economiseur_actif
onClicked: {
mise_en_veille(0);
}
}
//=============================================================================================================
// Initialistion de la page
//=============================================================================================================
function init_page()
{
var i;
var req, res;
var nb;
var id_variable;
var tmp;
if (adresse_module <= 0)
{
console.log("La page 'etalonnage_carte.qml' a été appelée sans 'adresse_module' valide. L'affichage de la page est impossible");
return;
}
// Recherche des informations sur la carte :
req = 'SELECT Eeprom, Type FROM TB_Modules_physiques WHERE Adresse_k_bus=' + adresse_module + ' ';
nb = bdd.requete(req);
if (nb !== 0)
{
res = bdd.lecture_ligne();
i = 0;
eeprom = res[i++]; // Sauvegarde car on va l'écraser sur la carte
switch(Number(res[i++]))
{
//-----------------------------------------
case shipheart_type_module_shipbase:
nom_carte = "ShipBase";
break;
//-----------------------------------------
case shipheart_type_module_shippower812:
nom_carte = "ShipPower812";
break;
//-----------------------------------------
case shipheart_type_module_shipBS:
nom_carte = "ShipBS";
break;
//-----------------------------------------
case shipheart_type_module_shippower4AC:
nom_carte = "ShipPower4AC";
break;
//-----------------------------------------
case shipheart_type_module_shippower8DC:
nom_carte = "ShipPower8DC";
break;
//-----------------------------------------
default:
nom_carte = "Modèle inconnu";
break;
}
}
else
{
console.log("Aucun module n'existe avec l'adresse K-bus indiquée. L'affichage de la page 'etalonnage_carte.qml' est impossible")
return;
}
// Recherche des informations sur la batterie affectée à cette carte :
req = 'SELECT Cle_primaire, Resistance_interne FROM TB_Batteries WHERE Type_entrees=' + shipheart_batteries_type_entrees_ibs + ' AND Adresse_module=' + adresse_module + ' ';
nb = bdd.requete(req);
if (nb !== 0)
{
res = bdd.lecture_ligne();
i = 0;
id_batterie = Number(res[i++]);
resistance = Number(res[i++]);
}
else
{
console.log("Aucune batterie n'est affectée à la carte à étalonner. L'affichage de la page 'etalonnage_carte.qml' est impossible")
return;
}
//-------------------------------------------------------------------
// Remplissage du modèle de circuits :
modele_grille_principale.clear();
// Récupération des informations sur les circuits rattachés à ce ShipBS :
req = 'SELECT Cle_primaire, Nom, Consigne, Intensite, Adresse_module, No_circuit FROM TB_Circuits WHERE Adresse_module IN (SELECT Adresse_k_bus FROM TB_Modules_config WHERE ID_Batterie=' + id_batterie + ') ORDER BY Adresse_module, No_circuit';
nb = bdd.requete(req);
for (i = 0; i < nb; i ++)
{
res = bdd.lecture_ligne();
if (!res.isEmpty)
{
if ((Number(res[4]) !== 0) || (Number(res[5]) !== 2)) // On exclus le port USB arrière car sa consommation est inclue dans ShipBase et sa commande semble peu pertinente...
{
modele_grille_principale.append({ "id": Number(res[0]),
"nom": res[1],
"consigne": Number(res[2]),
"consigne_init": Number(res[2]),
"intensite": Number(res[3]),
"commandable": !((Number(res[4]) === 0) && (Number(res[5]) === 0)) });
}
}
else break; // Ne devrait pas arriver....
}
//--------------------------------------------------------------------
// Demande de mis à 0 du gain et offset de la carte (uniquement les valeurs courantes, pas les valeurs usine) :
req = 'UPDATE TB_Modules_physiques SET Eeprom="00000000", New_eeprom=1 WHERE Adresse_k_bus=' + adresse_module + ' ';
bdd.requete_unique(req);
boite_information_shipbs.open();
flag_init = false;
}
//=============================================================================================================
// Mise à jour de la valeur instantannée
//=============================================================================================================
function mise_a_jour()
{
var req, res;
var nb;
var i;
i = 0;
// Récupération des informations sur les circuits rattachés à ce ShipBS :
for (i=0; i < modele_grille_principale.count; i++) // L'init de 'i' dépend de la présence ou non de ShipBase dans la liste
{
req = 'SELECT Consigne, Intensite FROM TB_Circuits WHERE Cle_primaire=' + modele_grille_principale.get(i).id + ' ';
res = bdd.requete_unique(req);
modele_grille_principale.set(i, {"consigne": Number(res[0]), "intensite": Number(res[1])});
}
// Récupération des courants différentiel et de décharge de la batterie en cours :
req = 'SELECT Courant_decharge, courant_differentiel, Tension FROM TB_Batteries WHERE Cle_primaire=' + id_batterie + ' ';
res = bdd.requete_unique(req);
i = 0;
courant_decharge = Number(res[i++]);
courant_differentiel = Number(res[i++]);
tension = Number(res[i++]);
if (!flag_point_memorise_1)
{
courant_decharge_1 = courant_decharge;
courant_differentiel_1 = courant_differentiel;
tension_1 = tension;
}
if (!flag_point_memorise_2)
{
courant_decharge_2 = courant_decharge;
courant_differentiel_2 = courant_differentiel;
tension_2 = tension;
}
}
//=============================================================================================================
// Commande d'un circuit
//=============================================================================================================
function toggle_circuit(index)
{
var consigne;
if (modele_grille_principale.get(index).consigne === 0) consigne = 100;
else consigne = 0;
modele_grille_principale.set(index, {"consigne": consigne});
// Mise à jour de la nouvelle consigne du circuit:
bdd.requete_unique('UPDATE TB_Circuits SET New_consigne=' + consigne + ' WHERE Cle_primaire="' + modele_grille_principale.get(index).id + '" ');
synchro_bdd(shipheart_type_synchro_data);
}
//=============================================================================================================
// Enregistrement des nouvelles valeur d'étalonnage
//=============================================================================================================
function enregistrement()
{
var req;
var a, b;
var gain, offset;
var chaine_gain, chaine_offset;
a = (courant_decharge_1 - courant_decharge_2) / (courant_differentiel_1 - courant_differentiel_2);
b = courant_decharge_1 - (a * courant_differentiel_1);
gain = Math.round(((a - 1) * 10000));
offset = Math.round((b * 1000));
if ((gain > -9999) && (gain < 9999) && (offset > -32000) && (offset < 32000)) // Si l egain ou l'offset sont hors limite, on n'enregistre pas de valeur d'étalonnage...
{
chaine_gain = bdd.int16_to_chaine_hexa(gain);
chaine_offset = bdd.int16_to_chaine_hexa(offset);
//console.log("Gain = " + gain + " soit, en hexa = [" + chaine_gain + "] et Offset = " + offset + " soit, en hexa = [" + chaine_offset + "]");
var new_eeprom;
new_eeprom = chaine_offset.substring(2,3) + chaine_offset.substring(3,4) + chaine_offset.substring(0,1) + chaine_offset.substring(1,2);
new_eeprom += chaine_gain.substring(2,3) + chaine_gain.substring(3,4) + chaine_gain.substring(0,1) + chaine_gain.substring(1,2);
new_eeprom += eeprom.substring(8);
eeprom = new_eeprom;
}
// Sinon, on conserve la valeur précédente de l'EEPROM qui va être rechargée dans le module.
//console.log("Eeprom = " + eeprom);
}
//=============================================================================================================
// Opération avant sortie
//=============================================================================================================
function sortie()
{
var req;
var i;
var r;
// Estimation de la résistance interne :
if ((tension_1 !== tension_2) && (courant_decharge_1 !== courant_decharge_2))
{
r = ((tension_1 - tension_2) * 1000) / (courant_decharge_1 - courant_decharge_2); // Le 'x 1000' permet d'avoir une valeur en mOhms. Le sens (I1 - I2) est inversé par rapport à la formule car les courants de décharge sont négatifs par convention.
}
//console.log("tension_1 = " + tension_1 + "V, tension_2 = " + tension_2 + "V, courant_decharge_1 = " + courant_decharge_1 + "A, courant_decharge_2 = " + courant_decharge_2 + "A");
if ((r > 0) && (r < 10000)) resistance = r.toFixed(2); // On ne prend pas en compte les valeurs négatives ou > 10 Ohms
else console.log("La valeur de résistance interne calculée est erronée : " + r + " mOhms");
// Mise à jour de la résistance dans TB_Batteries :
req = 'UPDATE TB_Batteries SET Resistance_interne="' + resistance + '" WHERE Cle_primaire=' + id_batterie + ' ';
//console.log("Requête = " + req)
bdd.requete_unique(req);
// Mise à jour de la valeur d'EEPROM :
req = 'UPDATE TB_Modules_physiques SET Eeprom="' + eeprom + '", New_eeprom=1 WHERE Adresse_k_bus=' + adresse_module + ' ';
//console.log("Requête = " + req)
bdd.requete_unique(req);
// Mise à leur valeur initiale des consignes des circuits rattachés à ce ShipBS :
for (i=0; i < modele_grille_principale.count; i++) // L'init de 'i' dépend de la présence ou non de ShipBase dans la liste
{
bdd.requete_unique('UPDATE TB_Circuits SET New_consigne=' + modele_grille_principale.get(i).consigne_init + ' WHERE Cle_primaire="' + modele_grille_principale.get(i).id + '" ');
}
// Demande de reconfiguration système via la BDD car on a modifié des valeurs de configuration :
// synchro_bdd(shipheart_type_synchro_config);
}
}