//========================================================================================================================================================================
// CONFIG_SHIPRS.QML
// La page est appelée depuis la page 'parametres_avances'home_attente.qml' lorsque la connexion a la BDD n'a pu être effectuée
//========================================================================================================================================================================
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_shiprs
// Mis en forme :
readonly property double pourcentage_largeur_colonne_gauche: 0.75
readonly property double espace_colonnes_principales: 20
readonly property double pourcentage_hauteur_message_alerte: 0.45
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.45
readonly property int hauteur_bouton_droit: 80
readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1
readonly property int periode_init_raffraichissement_parametres: 1 // En ms
readonly property int periode_raffraichissement_parametres: 1000 // En ms
readonly property int step_timer_sortie: 10 // en ms
// Affichage :
property bool bouton_bandeau_bas_zone_retour_actif: false
property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée
// Données :
property bool connexion_impossible: false
property string adresse_ip_shipbase: "inconnue
unknown"
property int taille_ecran_shiprs: 10
property bool configuration_modifiee: false
property string message_erreur: ""
property string message_info: ""
property int valeur_timer_sortie: 0
// Modèles :
// Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes
//===========================================================
// Timer periode raffraichissement parametres :
//===========================================================
Timer {
id: timer_raffraichissement_parametres
interval: periode_init_raffraichissement_parametres
triggeredOnStart: false
running: true
repeat: true
onTriggered: {
if (interval == periode_init_raffraichissement_parametres) { // Premier passage, 1ms après le premier chargement
interval = periode_raffraichissement_parametres;
init_page();
}
else if (!bouton_bandeau_bas_zone_retour_actif)
{
// mise_a_jour();
}
}
}
//===========================================================
// Timer pour gérer l'appui long du reboot :
//===========================================================
Timer {
id: timer_sortie
interval: step_timer_sortie
triggeredOnStart: false
repeat: true
onTriggered: {
if (valeur_timer_sortie < shipheart_mouse_press_and_hold_interval_tres_long) valeur_timer_sortie+= step_timer_sortie;
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_sortie.running = false;
valeur_timer_sortie = 0;
// Demande de Reset (via linux si on est sur un ShipRS !) :
let commande = "sudo sh -c \"sudo reboot now\" ";
//console.log("Commande shell : [" + commande + "]");
systeme.commande_shell(commande, "");
}
}
}
// Titre de la p"/images/ak14.png"age :
Shipheart_titre_1 {titre:"ShipRS"; hauteur: shipheart_hauteur_bandeau_haut}
//-------------------------------------------------------
// Ecran Haut :
//-------------------------------------------------------
Rectangle {
id: zone_affichage_message_alerte
x: 0
y: shipheart_hauteur_bandeau_haut;
width: shipheart_largeur_page;
height: visible ? (shipheart_hauteur_page - shipheart_hauteur_bandeau_haut) * pourcentage_hauteur_message_alerte : 0;
color: "transparent"
border.width: 3
border.color: couleur_rouge
radius: shipheart_rayon_bouton
visible: connexion_impossible
Image {
id: picto_alerte
source: "/images/ak14.png"
sourceSize.height: 100;
anchors {
left: parent.left
leftMargin: 20
verticalCenter: parent.verticalCenter
}
}
Text { // Affiche parfaitement 1, 2 ou 3 lignes de texte. A partir de 4 et 5, ça mort sur le contour du rectangle mais c'est encore lisible.
id: message_alerte
width: parent.width - picto_alerte.width - picto_alerte.anchors.leftMargin - anchors.leftMargin;
wrapMode: Text.Wrap
horizontalAlignment: Text.AlignHCenter
leftPadding: 10 // Dégage le pictogramme sur la gauche
rightPadding: 10 // Evite de se caler sur le bord droit du rectangle
text: "La connexion à ShipBase a échoué.
\
Vérifiez avant tout que ShipBase est bien sous tension et qu'il est bien connecté au réseau local.
\
Vérifiez ensuite que ShipRS est également connecté au réseau local via son port Ethernet.
\
Enfin, assurez-vous que l'adresse IP de ShipBase sur le réseau local est bien celle renseignée ci-dessous.
\
Dans le cas contraire, vous pouvez la mettre à jour puis cliquer sur [Enregistrer].
\
Attention : La prise en compte de cette nouvelle adresse ne sera prise en compte qu'après un redémarrage de ShipRS.
The connection to ShipBase has failed.
First of all, check that ShipBase is switched on and connected to the local network.
Then check that ShipRS is also connected to the local network via its Ethernet port.
Finally, make sure that the IP address of ShipBase on the local network is the one given below.
If not, you can update it and click on [Save].
Please note: The new address will only be taken into account after a restart of ShipRS.";
anchors {
left: picto_alerte.right
verticalCenter: parent.verticalCenter
}
font.pixelSize: 18
color: couleur_blanc_casse
}
}
//-------------------------------------------------------
// Ecran Bas - Gauche :
//-------------------------------------------------------
Rectangle {
id: zone_affichage_saisie_parametres
x: 0
y: shipheart_hauteur_bandeau_haut + zone_affichage_message_alerte.height + espace_lignes_principales;
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2);
height: ((shipheart_hauteur_page - shipheart_hauteur_bandeau_haut) * (1 - pourcentage_hauteur_message_alerte)) - espace_lignes_principales;
color: "transparent"
ListView {
id: grille_principale
width: parent.width
height: parent.height
snapMode: GridView.SnapToRow // L'arret de l'affichage se fera sur une rangée entière
clip: true // Nécessaire pour que les Delegates s'arretent à l'intérieur de la GridView
model: modele_grille_principale
footer: Rectangle { // Permet de dégager la place suffisante en fin de GridView pour accéder même au dernier élément lorsque que clavier est déplié
height: shipheart_hauteur_clavier
color: "transparent"
}
ObjectModel {
id: modele_grille_principale
//-------------------------------------------------------------------------------
// Ligne de formulaire : Adresse IP
Rectangle {
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
Shipheart_formulaire_label {
text: "Adresse IP de ShipBase sur le réseau local
ShipBase IP address on local network"
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_textfield {
id: champ_formulaire_Adresse_ip
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 : Taille écran
Rectangle {
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
Shipheart_formulaire_label {
text: "Taille de l'écran
Screen size"
width: parent.width * pourcentage_largeur_labels_formulaire
}
Shipheart_formulaire_combobox {
id: champ_formulaire_Taille_ecran
model: ListModel { }
width: parent.width * (1 - pourcentage_largeur_labels_formulaire)
onActivated: {
shipheart_clic();
}
}
Shipheart_formulaire_ligne_separation {
haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse
}
}
//-------------------------------------------------------------------------------
// Message d'erreur si adresse IP invalide :
Rectangle {
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
height: visible ? hauteur_ligne_formulaire : 0
color: "transparent"
visible: (message_erreur !== "") || (message_info !== "")
Text {
// height: parent.height * proportion_hauteur_texte_droite
width: parent.width;
anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
topPadding: 20 // Cette valeur permet d'être aligné avec la version courante...
bottomPadding: 50
font.pixelSize: 18
text: (message_erreur !== "") ? message_erreur : message_info
color: (message_erreur !== "") ? couleur_rouge : couleur_blanc_casse
wrapMode: Text.Wrap
}
}
}
}
}
//-------------------------------------------------------
// Ecran Bas - Droite :
//-------------------------------------------------------
Rectangle {
id: zone_affichage_droite
x: zone_affichage_saisie_parametres.width + espace_colonnes_principales
y: shipheart_hauteur_bandeau_haut + zone_affichage_message_alerte.height + espace_lignes_principales;
width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2);
height: ((shipheart_hauteur_page - shipheart_hauteur_bandeau_haut) * (1 - pourcentage_hauteur_message_alerte)) - espace_lignes_principales;
color: "transparent"
visible: !clavier.active
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
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: "Enregistrer
Save"
color: couleur_blanc_casse
}
MouseArea {
anchors.fill: parent
onClicked: {
enregistrement();
if ((!connexion_impossible) && (message_erreur === ""))
{
shipheart_clic();
stackView.pop()
}
}
}
}
//--------------------------------------------------------------------
// Bouton Rebooter :
Rectangle {
width: parent.width
height: hauteur_bouton_droit
color: shipheart_couleur_fond_bouton
radius: shipheart_rayon_bouton
visible: connexion_impossible && configuration_modifiee
Label {
anchors.centerIn: parent
text: "Redémarrer ShipRS
Restart ShipRS"
color: couleur_blanc_casse
font.pixelSize:20
}
// Barre grandissante pour montrer durée d'appui vs tempo nécessaire :
Rectangle {
width: (valeur_timer_sortie / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width
height: parent.height
color: couleur_rouge_transparent
radius: shipheart_rayon_bouton
}
MouseArea {
anchors.fill: parent
onPressed: { // Déclenché lors de l'appui inital
valeur_timer_sortie = 0;
timer_sortie.running = true;
}
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
timer_sortie.running = false;
valeur_timer_sortie = 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_sortie.running = false;
valeur_timer_sortie = 0;
}
}
}
}
}
//-------------------------------------------------------
// 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
visible: !connexion_impossible
//.................................................
// Bouton retour
//.................................................
Rectangle {
id: bandeau_bas_zone_retour
width: (parent.width * pourcentage_bandeau_bas_largeur_zone_retour) - (2 * parent.padding)
height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding;
radius: shipheart_rayon_bouton
color: shipheart_couleur_fond_bouton
Image {
source: "/images/icone_retour.png"
sourceSize.height: 30
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
}
MouseArea { // Zone d'interaction. On est obligé de la mettre dans la grille pour que Rectangle et MouseArea soient frères ou parent/enfant ET qu'on n'occupe qu'un espace dans la grille.
id: mouse_area_bandeau_bas_zone_retour
anchors.fill: parent
onClicked: {
shipheart_clic();
stackView.pop()
}
}
}
}
//=============================================================================================================
// Init de la page
//=============================================================================================================
function init_page()
{
var i;
var lignes;
lignes = systeme.lecture_fichier(shipheart_nom_complet_fichier_shiprs_conf);
// ATTENTION : la première ligne renvoyée par la fonction n'est PAS lue dans le fichier mais indique si la lecture s'est déroulée correctement ("Ok") ou pas ("Nok").
console.log("Résultat de la lecture de 'shiprs.conf' = " + lignes[0]);
console.log("Adresse IP de ShipBase dans 'shiprs.conf' = " + lignes[1]);
console.log("Taille écran dans 'shiprs.conf' = " + lignes[2]);
if (lignes[0] === "Ok")
{
adresse_ip_shipbase = lignes[1];
taille_ecran_shiprs = lignes[2];
}
else
{
adresse_ip_shipbase = "???.???.???.???";
taille_ecran_shiprs = 10;
message_erreur = "/!\\ La lecture du fichier 'shiprs.conf' est impossible
/!\\ ShipRS config file can't be accessed";
}
//-----------------------------------------------------------------------------------------
champ_formulaire_Adresse_ip.text = adresse_ip_shipbase;
//-----------------------------------------------------------------------------------------
champ_formulaire_Taille_ecran.model.clear();
champ_formulaire_Taille_ecran.model.append({"valeur": 7, "texte": "7\" " });
champ_formulaire_Taille_ecran.model.append({"valeur": 10, "texte": "10\" " });
champ_formulaire_Taille_ecran.model.append({"valeur": 22, "texte": "22\" " });
// Positionnement de l'index sur la valeur en cours :
i = recherche_index_valeur_modele(taille_ecran_shiprs, champ_formulaire_Taille_ecran.model, "taille_ecran_shiprs");
if (i === -1) champ_formulaire_Taille_ecran.currentIndex = recherche_index_valeur_modele(10, champ_formulaire_Taille_ecran.model, "taille_ecran_shiprs");
else champ_formulaire_Taille_ecran.currentIndex = i;
flag_init = false;
}
//=============================================================================================================
// Enregistrement des valeurs saisies
//=============================================================================================================
function enregistrement()
{
var lignes = [];
message_erreur = ""; // Nécessaire si une erreur était présente au préalable.
message_info = ""; // Nécessaire si un message était présent au préalable.
// Vérification de la validité du format de l'adresse IP saisie :
if (Fonctions.test_format_adresse_ip_v4(champ_formulaire_Adresse_ip.text))
//-----------------------------------------------------------
// Cas où le format est valide :
{
if(champ_formulaire_Adresse_ip.text !== "192.168.4.1")
{
adresse_ip_shipbase = champ_formulaire_Adresse_ip.text;
taille_ecran_shiprs = champ_formulaire_Taille_ecran.model.get(champ_formulaire_Taille_ecran.currentIndex).valeur;
lignes.push(adresse_ip_shipbase);
lignes.push(taille_ecran_shiprs);
if (systeme.ecriture_fichier(shipheart_nom_complet_fichier_shiprs_conf, lignes) === -1)
{
message_erreur = "/!\\ L'écriture du fichier 'shiprs.conf' est impossible.
/!\\ 'shiprs.conf' file cannot be written to";
}
else
{
configuration_modifiee = true;
message_info = "Les nouveaux paramètres ont été enregistrés.
Vous pouvez maintenant maintenir appuyé le bouton [Redémarrer ShipRS] jusqu'au redémarrage pour que ces nouveaux paramètres soient pris en compte.
The new settings have been saved.
You can now press and hold the [Restart ShipRS] button until the system restarts to take these new settings into account.";
}
//console.log("Format d'adresse IP valide...")
}
else message_erreur = "L'adresse IP [192.168.4.1] n'est pas autorisée. Merci d'entrer une adresse différente...
The [192.168.4.1] IP address is not authorized. Please enter a different address...";
}
//-----------------------------------------------------------
// Cas où le format est invalide :
else
{
message_erreur = "L'adresse IP saisie n'est pas valide et ne peut pas être enregistrée. Merci d'entrer une chaine valide...
The IP address entered is invalid and cannot be saved. Please enter a valid string...";
// champ_formulaire_Adresse_ip.text = adresse_ip_shipbase; // Retour à la valeur précédente
//console.log("Format d'adresse IP invalide !")
}
}
//=============================================================================================================
// 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