commit 4d29347aab90ebd3ffa8ec84271f5c04855d6056 Author: Pierre Date: Fri Aug 14 07:29:00 2026 +0200 Première tranche verticale : domaine circuit via DataProvider/API diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25c2282 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Dossiers de build CMake/Qt Creator +build/ +CMakeFiles/ +CMakeCache.txt +cmake_install.cmake +Makefile +Testing/ +.qt/ +.qtc_clangd/ +.qtcreator/ + +# Fichier de version régénéré à chaque build (cf generate_version.cmake) +_version.h + +# Objets compilés +*.o +*.obj + +# Fichiers de session/éditeur +*.autosave +*~ + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b81f8de --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.16) +project(shipheart_wasm LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(Qt6 REQUIRED COMPONENTS + Quick + Qml + QuickControls2 + Network +) + +qt_add_executable(shipheart_wasm + main.cpp + dataprovider.cpp + dataprovider.h + mock/mock_bdd.cpp + mock/mock_bdd.h + mock/mock_systeme.h + mock/mock_tbmesures.h + qml.qrc +) + +target_link_libraries(shipheart_wasm PRIVATE + Qt6::Quick + Qt6::Qml + Qt6::QuickControls2 + Qt6::Network +) + +# Safari iOS a un plafond de mémoire par onglet bien plus bas que les valeurs +# par défaut de Qt pour wasm (cf §19.4 de la synthèse). +set_target_properties(shipheart_wasm PROPERTIES + QT_WASM_INITIAL_MEMORY 134217728 # 128 Mo + QT_WASM_MAXIMUM_MEMORY 536870912 # 512 Mo +) + +install(TARGETS shipheart_wasm + DESTINATION ${CMAKE_INSTALL_PREFIX} +) diff --git a/dataprovider.cpp b/dataprovider.cpp new file mode 100644 index 0000000..b90eb74 --- /dev/null +++ b/dataprovider.cpp @@ -0,0 +1,60 @@ +#include "dataprovider.h" +#include +#include +#include +#include +#include +#include + +DataProvider::DataProvider(QObject *parent) : QObject(parent) +{ +} + +void DataProvider::get_familles(const QString &type) +{ + QUrl url(m_baseUrl + "/elements/familles"); + QUrlQuery query; + query.addQueryItem("type", type); + url.setQuery(query); + + auto reply = m_manager.get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + reply->deleteLater(); + if (reply->error() != QNetworkReply::NoError) { + emit erreur(reply->errorString()); + return; + } + const auto doc = QJsonDocument::fromJson(reply->readAll()); + const auto obj = doc.object(); + if (obj["status"].toString() != "ok") { + emit erreur(obj["message"].toString()); + return; + } + emit famillesRecues(obj["familles"].toArray()); + }); +} + +void DataProvider::get_elements(const QString &type, int famille) +{ + QUrl url(m_baseUrl + "/elements"); + QUrlQuery query; + query.addQueryItem("type", type); + query.addQueryItem("famille", QString::number(famille)); + url.setQuery(query); + + auto reply = m_manager.get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + reply->deleteLater(); + if (reply->error() != QNetworkReply::NoError) { + emit erreur(reply->errorString()); + return; + } + const auto doc = QJsonDocument::fromJson(reply->readAll()); + const auto obj = doc.object(); + if (obj["status"].toString() != "ok") { + emit erreur(obj["message"].toString()); + return; + } + emit elementsRecus(obj["elements"].toArray()); + }); +} diff --git a/dataprovider.h b/dataprovider.h new file mode 100644 index 0000000..168a5d7 --- /dev/null +++ b/dataprovider.h @@ -0,0 +1,38 @@ +#pragma once +#include +#include +#include + +// ============================================================================ +// DataProvider - couche d'accès aux données du client WASM (cas 2/3). +// ---------------------------------------------------------------------------- +// Remplace, pour les domaines déjà portés, les appels bdd.* directs du cas 1 +// (qui reste inchangé, cf décision §21.1 de la synthèse). Toute la logique +// HTTP/JSON est encapsulée ici - le QML ne voit que des signaux avec des +// tableaux déjà prêts à l'emploi. +// +// Portée actuelle : uniquement le domaine "circuit" (première tranche +// verticale). À généraliser aux 3 autres domaines une fois ce pattern validé. +// ============================================================================ +class DataProvider : public QObject +{ + Q_OBJECT + +public: + explicit DataProvider(QObject *parent = nullptr); + + // TODO : rendre l'adresse de base configurable (IP locale du CM5 en cas 2, + // domaine VPS en cas 3 - cf QR code d'accès, §"Architecture cible"/Cas 2-3 + // de la synthèse) - en dur sur l'IP locale pour cette première tranche. + Q_INVOKABLE void get_familles(const QString &type); + Q_INVOKABLE void get_elements(const QString &type, int famille); + +signals: + void famillesRecues(const QJsonArray &familles); + void elementsRecus(const QJsonArray &elements); + void erreur(const QString &message); + +private: + QNetworkAccessManager m_manager; + QString m_baseUrl = QStringLiteral("http://192.168.1.220:8080"); +}; diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..c354d2e --- /dev/null +++ b/main.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include + +#include "mock/mock_bdd.h" +#include "mock/mock_systeme.h" +#include "mock/mock_tbmesures.h" +#include "dataprovider.h" + +// ============================================================================ +// main.cpp - shipheart_wasm +// ---------------------------------------------------------------------------- +// Dérivé du main.cpp du POC (§19). Ajout : enregistrement de DataProvider, +// qui vient s'ajouter aux mocks existants (toujours nécessaires pour +// Shipheart_page.qml/main.qml, qui appellent encore bdd.*/systeme.* pour les +// fonctions non liées aux circuits - synchro, veille, etc., cf §19.4). +// ============================================================================ + +static QJSValue appVersionSingletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine) +{ + Q_UNUSED(engine) + + QJSValue appInfo = scriptEngine->newObject(); + appInfo.setProperty("adresse_shipbase", QString()); + appInfo.setProperty("etat_connexion_bdd", 1); + appInfo.setProperty("version", QStringLiteral("3.0.0-wasm")); + appInfo.setProperty("type_installation", QStringLiteral("0")); + appInfo.setProperty("taille_ecran", QString()); + return appInfo; +} + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + app.setOverrideCursor(Qt::BlankCursor); + + QGuiApplication::setApplicationName("ShipHeart_Wasm"); + QGuiApplication::setApplicationVersion("3.0.0-wasm"); + + qmlRegisterType("qt.koriolan.shipheart", 1, 0, "Bdd"); + qmlRegisterType("qt.koriolan.shipheart", 1, 0, "TbMesuresModel"); + qmlRegisterType("qt.koriolan.shipheart", 1, 0, "Systeme"); + qmlRegisterType("qt.koriolan.shipheart", 1, 0, "DataProvider"); + qmlRegisterSingletonType("qt.koriolan.shipheart", 1, 0, "AppInfo", appVersionSingletonProvider); + + auto engine = new QQmlApplicationEngine(&app); + engine->setObjectName("currentEngine"); + + const QUrl url(QStringLiteral("qrc:/main.qml")); + QObject::connect(engine, &QQmlApplicationEngine::objectCreated, + &app, [url](QObject *obj, const QUrl &objUrl) + { + if (!obj && url == objUrl) QCoreApplication::exit(-1); + }, Qt::QueuedConnection); + + engine->load(url); + + return app.exec(); +} diff --git a/mock/mock_bdd.cpp b/mock/mock_bdd.cpp new file mode 100644 index 0000000..0761e74 --- /dev/null +++ b/mock/mock_bdd.cpp @@ -0,0 +1,46 @@ +#include "mock_bdd.h" + +// ============================================================================ +// Valeurs fixes du POC - à modifier ici si besoin d'un autre scénario de test. +// ============================================================================ +QVariant Bdd::requete_unique(const QString &req) +{ + // --- Lectures (SELECT) utilisées par le chemin main.qml -> home_attente.qml -> home_accueil.qml --- + + if (req.contains("Nom=\"Specifique_client\"")) + return QVariantList{ "0" }; // 0 = shipheart_specifique_client_tous -> mène à home_accueil.qml + + if (req.contains("Nom=\"Theme\"")) + return QVariantList{ "0" }; // Thème 0 = "Original" + + if (req.contains("Nom=\"Version_cm\"")) + return QVariantList{ "CM5" }; // Doit contenir "CM5" -> shipheart_generation_shipbase_v3 + + if (req.contains("Nom=\"Nom_du_bateau\"")) + return QVariantList{ "Bateau de test (POC WASM)" }; + + if (req.contains("Validation_economiseur")) + return QVariantList{ "0" }; // Économiseur désactivé par défaut pour ce POC + + // --- Écritures (UPDATE) : Veille, Synchro, New_bip, Theme (cas dépassement d'index) --- + // Valeur de retour jamais utilisée par l'appelant dans ces cas -> valeur neutre. + return QVariantList{ QString() }; +} + +int Bdd::requete(const QString &req) +{ + m_derniere_requete = req; + + if (req.contains("Nom=\"Fichier_image_accueil\"")) + return 1; // 1 ligne de résultat "trouvée" + + return 0; +} + +QVariant Bdd::lecture_ligne() +{ + if (m_derniere_requete.contains("Nom=\"Fichier_image_accueil\"")) + return QVariantList{ "" }; // "" -> l'image par défaut est utilisée (cf home_accueil.qml) + + return QVariantList{}; +} diff --git a/mock/mock_bdd.h b/mock/mock_bdd.h new file mode 100644 index 0000000..dd0850d --- /dev/null +++ b/mock/mock_bdd.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include +#include +#include + +// ============================================================================ +// Bdd (MOCK) - POC WebAssembly +// ---------------------------------------------------------------------------- +// Bouchon de la classe Bdd réelle (bdd.h/bdd.cpp non disponibles à ce stade). +// Ne se connecte à aucune base de données : reconnaît le texte de chaque +// requête reçue et renvoie une valeur fixe cohérente avec le comportement +// attendu par main.qml / Shipheart_page.qml / home_attente.qml / home_accueil.qml. +// +// Signatures alignées sur l'usage observé dans ces 4 fichiers QML : +// - requete_unique(req) -> une seule valeur de résultat (SELECT ou UPDATE) +// - requete(req)/lecture_ligne() -> requête à plusieurs lignes potentielles +// (ici, une seule ligne utilisée : "Fichier_image_accueil") +// ============================================================================ +class Bdd : public QObject +{ + Q_OBJECT +public: + explicit Bdd(QObject *parent = nullptr) : QObject(parent) {} + + Q_INVOKABLE QVariant requete_unique(const QString &req); + + Q_INVOKABLE int requete(const QString &req); + Q_INVOKABLE QVariant lecture_ligne(); + +private: + QString m_derniere_requete; +}; diff --git a/mock/mock_systeme.h b/mock/mock_systeme.h new file mode 100644 index 0000000..1c64816 --- /dev/null +++ b/mock/mock_systeme.h @@ -0,0 +1,26 @@ +#pragma once +#include +#include + +// ============================================================================ +// Systeme (MOCK) - POC WebAssembly +// ---------------------------------------------------------------------------- +// Bouchon de la classe Systeme réelle (systeme.h/systeme.cpp non disponibles +// à ce stade). commande_shell() n'est appelée, dans les fichiers du POC, que +// pour les installations "écran déporté" (synchro_repertoires_shiprs() dans +// home_attente.qml) - hors scope du chemin ShipBase standard testé ici. +// Bouchon neutre par sécurité, au cas où il serait tout de même invoqué. +// ============================================================================ +class Systeme : public QObject +{ + Q_OBJECT +public: + explicit Systeme(QObject *parent = nullptr) : QObject(parent) {} + + Q_INVOKABLE QString commande_shell(const QString &commande, const QString &fichier_sortie) + { + Q_UNUSED(commande) + Q_UNUSED(fichier_sortie) + return QString(); + } +}; diff --git a/mock/mock_tbmesures.h b/mock/mock_tbmesures.h new file mode 100644 index 0000000..f671142 --- /dev/null +++ b/mock/mock_tbmesures.h @@ -0,0 +1,17 @@ +#pragma once +#include + +// ============================================================================ +// TbMesuresModel (MOCK) - POC WebAssembly +// ---------------------------------------------------------------------------- +// Bouchon minimal : dans le périmètre de ce POC (main.qml jusqu'à +// home_accueil.qml), ce modèle n'est instancié qu'au niveau racine +// (property TbMesuresModel tbmesuresModel : TbMesuresModel{}) et jamais +// utilisé au-delà - un QObject vide suffit à ce stade. +// ============================================================================ +class TbMesuresModel : public QObject +{ + Q_OBJECT +public: + explicit TbMesuresModel(QObject *parent = nullptr) : QObject(parent) {} +}; diff --git a/qml.qrc b/qml.qrc new file mode 100644 index 0000000..f03a00e --- /dev/null +++ b/qml.qrc @@ -0,0 +1,9 @@ + + + qml/main.qml + qml/Shipheart_page.qml + qml/home_attente.qml + qml/home_accueil.qml + qml/home.qml + + diff --git a/qml/Shipheart_page.qml b/qml/Shipheart_page.qml new file mode 100644 index 0000000..d302a17 --- /dev/null +++ b/qml/Shipheart_page.qml @@ -0,0 +1,171 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 + +// Shipheart_page est un composant au sens QML. Il commence donc par une majuscule. +// Il peut être utilisé partout dans le projet. + +Page { + + id: page + + background: Rectangle { // Attention : Background ne peut avoir qu'un seul élément [a priori, pas complètement sûr...] => on créé un Rectangle de plus haut niveau et on met ensuite dedans ce qu'on veut... + anchors.fill: parent + color: shipheart_theme_couleur_fond_ecran + + Image { + anchors.fill: parent + fillMode: Image.Tile +// fillMode: Image.PreserveAspectCrop + source: shipheart_theme_fichier_fond_ecran + visible: (shipheart_theme_fichier_fond_ecran !== "") + } + } + + + + + //================================================================================================= + // Fonction : Shipheart_clic + // Cette fonction est normalement appelé à chaque appel d'un 'MouseArea.OnClick' + //================================================================================================= + function shipheart_clic() + { + emission_bip(); + reload_economiseur(); + } + + //===================================================================================== + // Fonction : Vérifie si la configuration en cours nécessite l'émission d'un bip. + // Si oui, met à jour le champ correspondant dans la BDD et fait une demande + // de synchro pour que celle-ci soit prise en compte rapidmeent. + // Reçoit : Rien + // Retour : Rien + //===================================================================================== + function emission_bip() + { + + if ((shipheart_bips !== "") && // Si shipheart_bips = "", il n'y a aucun bip à émettre... + (shipheart_type_installation === shipheart_type_installation_shipbase)) // SDIR 317 : ... et si on est sur ShipRS, on n'émet pas de bips + { + bdd.requete_unique("UPDATE TB_Systeme SET Valeur='" + shipheart_bips + "/0/0/0' WHERE Nom='New_bip'"); + synchro_bdd(shipheart_type_synchro_data); + } + + return; + } + + //================================================================================================= + // Fonction : Réarmement économiseur + //================================================================================================= + function reload_economiseur() + { + var req, res; + +/* // La valeur est relue à chaque fois dans la BDD pour être certain d'avoir la dernière valeur : + req = 'SELECT Valeur FROM TB_Configuration WHERE Nom LIKE "%Time_out_economiseur%" '; + res = bdd.requete_unique(req); + shipheart_compteur_economiseur = Number(res[0]); +*/ + shipheart_compteur_economiseur = shipheart_time_out_economiseur; + } + + //================================================================================================= + // Fonction : Demande de mise en veille (on ou off) + //================================================================================================= + function mise_en_veille(veille) + { + if (shipheart_type_installation !== shipheart_type_installation_shipbase) return; // SDIR #251 + + if (veille === 0) // On sort toujours du mode veille si c'est demandé + { + bdd.requete_unique('UPDATE TB_Systeme SET Valeur=' + veille + ' WHERE Nom="Veille"'); + synchro_bdd(shipheart_type_synchro_data); +//console.log("Sortie de veille"); + + flag_economiseur_actif = false; + } + else + { + if ((veille === 1) && (get_validation_economiseur() === 1)) // On ne rentre en veille que si c'est demandé (le time-out a expiré ET l'économiseur est valide) + { + bdd.requete_unique('UPDATE TB_Systeme SET Valeur=' + veille + ' WHERE Nom="Veille"'); + synchro_bdd(shipheart_type_synchro_data); + + flag_economiseur_actif = true; + } +//else console.log("Demande d'activation de l'économiseur alors qu'il est dévalidé") + } + } + + //================================================================================================= + // Fonction : Change l'état de la validation économiseur + //================================================================================================= + function changer_validation_economiseur() + { + var req, res; + var new_val; + + req = 'SELECT Valeur FROM TB_Configuration WHERE Nom LIKE "%Validation_economiseur%" '; + res = bdd.requete_unique(req); + + if (Number(res[0]) === 0) new_val = '1'; + else new_val = '0'; + + bdd.requete_unique('UPDATE TB_Configuration SET Valeur=' + new_val + ' WHERE Nom LIKE "%Validation_economiseur%" '); + } + + //================================================================================================= + // Fonction : Retourne l'état actuel de la validation de l'économiseur + //================================================================================================= + function get_validation_economiseur() + { + var req, res; + + req = 'SELECT Valeur FROM TB_Configuration WHERE Nom LIKE "%Validation_economiseur%" '; + res = bdd.requete_unique(req); + + return(Number(res[0])); + } + + //================================================================================================= + // Fonction : Charge les paramètres du thème en cours + //================================================================================================= + function chargement_theme() + { + var req, res; + + // Récupération du paramètre 'TB_Configuration.Theme' + req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Theme" '; + res = bdd.requete_unique(req); + + // Vérifie que la n° de thème sélectionné est bien compatible avec les thèmes présents sur cette version (on peut imaginer qu'on en ait supprimé...) : + if (Number(res[0]) >= shipheart_config_themes.length) + { + shipheart_theme = 0; // Valeur par défaut + req = 'UPDATE TB_Configuration '; // Mise à jour dans la BDD pour les prochains démarrages + req += ' SET Valeur="' + shipheart_theme + '" '; + req += ' WHERE Nom="Theme" '; +//console.log("Requête = " + req) + bdd.requete_unique(req); + } + else shipheart_theme = Number(res[0]); // Cas normal + + // Mise à jour des paramètres d'affcihage liés au thème choisit : + shipheart_theme_fichier_fond_ecran = shipheart_config_themes[shipheart_theme][shipheart_index_theme_fichier_fond_ecran]; + shipheart_theme_couleur_fond_ecran = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_ecran]; + shipheart_couleur_fond_bouton_actif = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_bouton_actif]; + shipheart_couleur_texte_titre_1 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_titre_1]; + shipheart_couleur_texte_titre_2 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_titre_2]; + shipheart_couleur_texte_titre_3 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_titre_3]; + shipheart_couleur_fond_boite_dialogue_niveau_0 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0]; + shipheart_couleur_fond_boite_dialogue_niveau_1 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1]; + shipheart_couleur_fond_boite_dialogue_niveau_2 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2]; + shipheart_couleur_texte_boite_dialogue_niveau_0 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0]; + shipheart_couleur_texte_boite_dialogue_niveau_1 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1]; + shipheart_couleur_texte_boite_dialogue_niveau_2 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2]; + shipheart_couleur_texte_slider = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_slider]; + shipheart_couleur_bordure_courbes = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_bordure_courbes]; + +//console.log("Thème d'affichage à utiliser = " + shipheart_theme + " [fichier = '" + shipheart_theme_fichier_fond_ecran + "' et couleur = '" + shipheart_theme_couleur_fond_ecran + "']"); + } +} diff --git a/qml/home.qml b/qml/home.qml new file mode 100644 index 0000000..32e9b7c --- /dev/null +++ b/qml/home.qml @@ -0,0 +1,183 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 + +import qt.koriolan.shipheart 1.0 + +// ============================================================================ +// home.qml (EMBRYON - POC WASM production, domaine circuit uniquement) +// ---------------------------------------------------------------------------- +// Version très réduite du vrai home.qml (~3880 lignes, tous domaines) : +// couvre uniquement l'affichage des circuits, via l'API réelle (DataProvider) +// au lieu de bdd.*. Objectif : valider la chaîne complète (HTTP réel, JSON, +// affichage QML) sur un seul domaine avant de généraliser. +// +// Simplifications volontaires par rapport au vrai home.qml : +// - Lecture seule (pas de changement de consigne au clic - l'endpoint +// d'écriture n'est pas encore construit côté API, cf synthèse §20.7) +// - Un seul domaine affiché (pas de batteries/réservoirs/capteurs/pages +// personnalisées/messages/réveils/minuteur) +// - Délégué d'affichage simplifié (pas Shipheart_bouton_circuit, qui +// embarque des actions d'écriture non encore branchées) +// - mise_a_jour_onglets_circuits() n'existe plus : l'API renvoie déjà +// l'état agrégé par famille dans /elements/familles (cf §20.7/21.5) +// ============================================================================ + +Shipheart_page { + id: page_accueil + + readonly property int deport_haut_masquage_onglets: 20 + readonly property int rayon_onglets: 20 + property int nombre_colonnes_affichage_circuits: 2 + property int nombre_circuits_affiches_sur_une_colonne: 4 + property int id_groupe_circuits: 0 + + ListModel { id: modele_onglets_circuits } + ListModel { id: modele_circuits } + + property DataProvider dataProvider: DataProvider {} + + Connections { + target: dataProvider + + function onFamillesRecues(familles) { + modele_onglets_circuits.clear(); + for (var i = 0; i < familles.length; i++) { + var f = familles[i]; + modele_onglets_circuits.append({ + "id": f.id, + "libelle": f.nom, + "etat": f.etat, + "actif": (f.id === id_groupe_circuits) + }); + // Sélectionne la première famille par défaut si aucune n'est choisie : + if (id_groupe_circuits === 0 && i === 0) { + id_groupe_circuits = f.id; + dataProvider.get_elements("circuit", id_groupe_circuits); + } + } + } + + function onElementsRecus(elements) { + modele_circuits.clear(); + for (var j = 0; j < elements.length; j++) { + modele_circuits.append(elements[j]); + } + } + + function onErreur(message) { + console.log("DataProvider erreur : " + message); + } + } + + Component.onCompleted: { + dataProvider.get_familles("circuit"); + } + + // Rafraîchissement périodique (remplace mise_a_jour_circuits(), appelée chaque seconde côté natif) : + Timer { + interval: 1000 + running: true + repeat: true + onTriggered: { + if (id_groupe_circuits > 0) dataProvider.get_elements("circuit", id_groupe_circuits); + } + } + + ColumnLayout { + anchors.fill: parent + spacing: 10 + + //----------------------------------------------------------- + // Onglets (familles) : + Rectangle { + id: onglets_circuits + Layout.fillWidth: true + height: shipheart_hauteur_bandeau_haut + color: "transparent" + visible: modele_onglets_circuits.count > 1 + + GridView { + id: grille_onglets_circuits + anchors.fill: parent + cellWidth: width / Math.max(1, Math.min(modele_onglets_circuits.count, 5)) + cellHeight: shipheart_hauteur_bandeau_haut + model: modele_onglets_circuits + clip: true + + delegate: Rectangle { + width: grille_onglets_circuits.cellWidth - 2 + height: grille_onglets_circuits.cellHeight + radius: rayon_onglets + color: model.actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton + + Text { + text: model.libelle + anchors.centerIn: parent + color: couleur_blanc_casse + font.pixelSize: 14 + font.bold: model.actif + } + + MouseArea { + anchors.fill: parent + onClicked: { + id_groupe_circuits = model.id; + for (var k = 0; k < modele_onglets_circuits.count; k++) { + modele_onglets_circuits.set(k, {"actif": (modele_onglets_circuits.get(k).id === model.id)}); + } + dataProvider.get_elements("circuit", id_groupe_circuits); + } + } + } + } + } + + //----------------------------------------------------------- + // Circuits de la famille sélectionnée : + GridView { + id: circuits_grid + Layout.fillWidth: true + Layout.fillHeight: true + cellWidth: width / nombre_colonnes_affichage_circuits + cellHeight: height / nombre_circuits_affiches_sur_une_colonne + model: modele_circuits + clip: true + + delegate: Rectangle { + width: circuits_grid.cellWidth - 4 + height: circuits_grid.cellHeight - 4 + radius: 10 + color: shipheart_couleur_fond_bouton + border.color: (model.etat === 2) ? "red" : (model.etat === 1) ? "orange" : "transparent" + border.width: 2 + + Column { + anchors.centerIn: parent + spacing: 4 + + Text { + text: model.nom + color: couleur_blanc_casse + font.pixelSize: 14 + font.bold: true + anchors.horizontalCenter: parent.horizontalCenter + } + Text { + text: model.tension.toFixed(1) + " V " + model.intensite.toFixed(2) + " A" + color: couleur_blanc_casse + font.pixelSize: 12 + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + + Label { + anchors.centerIn: parent + visible: circuits_grid.count === 0 + text: qsTr("Aucun circuit dans ce groupe.") + color: couleur_rouge_transparent + } + } + } +} diff --git a/qml/home_accueil.qml b/qml/home_accueil.qml new file mode 100644 index 0000000..31f3f69 --- /dev/null +++ b/qml/home_accueil.qml @@ -0,0 +1,222 @@ +//======================================================================================================================================================================== +// HOME_ACCUEIL.QML +// Ce fichier est la page d'accueil par défaut. Il propose l'affichage du logo ShipHeart et le nom du bateau. +// La page est appelée depuis la page main.qml lorsque le paramètre 'shipheart_specifique_client[0]' est égal à 0 +//======================================================================================================================================================================== +import QtQuick 2.12 +import QtQuick.Controls 2.12 + +import qt.koriolan.shipheart 1.0 + + + +Shipheart_page { + id: page_home_o_yachts + + + // Mis en forme : + readonly property double pourcentage_hauteur_ligne_haut: 0.7 + readonly property double espace_lignes_principales: 0 // L'espace ne sert à rien et est même contre-productif pour avoir le logo centré entre haut de l'écran et le texte "Bienvenue à bord...." + readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas + + readonly property int periode_raffraichissement_parametres: 1000 // En ms + readonly property int duree_affichage: 15 // En s + + // Affichage : + + // Données : + property string nom_du_bateau: "" + property int compteur_affichage: 0 + + // Modèles : + // Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes + + + //------------------------------------------------- + // Ouverture : + //------------------------------------------------- + StackView.onActivating: { // Le 'onActivating' permet de ne pas voir la mise à jour puisqu'elle est lancée dès que la page va être chargée + init_page(); + timer_raffraichissement_parametres.start(); + } + + //------------------------------------------------- + // Fermeture : + //------------------------------------------------- + StackView.onDeactivating: { + timer_raffraichissement_parametres.stop(); + } + + //=========================================================== + // Timer periode raffraichissement parametres : + //=========================================================== + Timer { + id: timer_raffraichissement_parametres + interval: periode_raffraichissement_parametres + triggeredOnStart: false + running: true + repeat: true + onTriggered: { + if (++ compteur_affichage > duree_affichage) sortie_page(); + } + } + + + //------------------------------------------------------- + // Ecran Haut : + //------------------------------------------------------- + Rectangle { + id: zone_affichage_haut_gauche + x: 0 + y: 0 + width: shipheart_largeur_page + height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales); + color: "transparent" + + Image { + source: (shipheart_fichier_image_accueil !== "") + ? "file://" + shipheart_repertoire_config + shipheart_sous_repertoire_images_accueil + "/" + shipheart_fichier_image_accueil + : "/images/" + shipheart_nom_fichier_image_accueil_par_defaut + sourceSize.height: parent.height * 0.7 + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + } + } + + } + + //------------------------------------------------------- + // Ecran Bas : + //------------------------------------------------------- + Rectangle { + id: zone_affichage_bas_gauche + x: 0 + y: zone_affichage_haut_gauche.height + espace_lignes_principales; + width: shipheart_largeur_page + height: (affichage_hauteur_utile * (1 - pourcentage_hauteur_ligne_haut)) - (espace_lignes_principales); + color: "transparent" + + Text { + anchors { + top: parent.top // Permet que ce texte soit juste en-dessous de la zone haute (sur laquelle le logo est centré => donc le logo est centré entre haut de l'écran et ce texte) + horizontalCenter: parent.horizontalCenter + } + font.pixelSize: 24 + text: qsTr("Bienvenue à bord de"); + color: couleur_blanc_casse + } + + Text { + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + verticalCenterOffset: -20 // Remonté légèrement le nom du bateau... + } + font.pixelSize: 50 + text: '" ' + nom_du_bateau + ' "'; + color: couleur_blanc_casse + font.weight: Font.Black + } + + } + + //------------------------------------------------------- + // 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 + + Rectangle { + + width: parent.width + height: parent.height + color: shipheart_couleur_fond_bouton //"transparent" + + Rectangle { // Barre augmentant selon l'évolution du compteur_affichage + width: (compteur_affichage / duree_affichage) * parent.width + height: parent.height + color: shipheart_couleur_fond_bouton_actif + opacity: 0.5 + radius: shipheart_rayon_bouton + Behavior on width { NumberAnimation { duration: periode_raffraichissement_parametres } } + } + + Image { + source: "/images/right_sombre.png" + sourceSize.height: parent.height * 0.5 + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + horizontalCenterOffset: -10 + } + } + Image { + source: "/images/right_sombre.png" + sourceSize.height: parent.height * 0.5 + anchors { + verticalCenter: parent.verticalCenter + horizontalCenter: parent.horizontalCenter + horizontalCenterOffset: +10 + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + shipheart_clic(); + sortie_page(); +//stackView.push("parametres_avances.qml"); + } + } + } + } + + //=========================================================== + // 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); + } + } + + + //============================================================================================================= + // Init de la page + //============================================================================================================= + function init_page() + { + var req, res + + mise_en_veille(0); +console.log("Init de Home_accueil..."); + + // Mise à jour du nom du bateau : + req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Nom_du_bateau" '; + res = bdd.requete_unique(req); + nom_du_bateau = res[0]; + + compteur_affichage = 0; + } + + //============================================================================================================= + // Sortie de la page + //============================================================================================================= + function sortie_page() + { + + compteur_affichage = 0; // Pour le cas où on réouvrirait la page (via le bouton paramètres / appui long) ; dans ce cas, la remise à 0 du compteur prend quelques secondes (ce sera donc fait avant si on le remet de suite à 0) + stackView.push("home.qml"); + } + +} + diff --git a/qml/home_attente.qml b/qml/home_attente.qml new file mode 100644 index 0000000..b894cd8 --- /dev/null +++ b/qml/home_attente.qml @@ -0,0 +1,285 @@ +//======================================================================================================================================================================== +// HOME_ATTENTE.QML +// Ce fichier affiche un fond d'écran standard mais avec rien dedans. Il est utilisé au démarrage, pour attendre que l'ApplicationWindow soit prête +// et que l'accès à la BDD permette de décider quelle page d'accueil lancer. +// Sans cette page, la StackView affiche une page toute blanche pendant 1-2s avant que la première Home page soit chargée... +//======================================================================================================================================================================== +import QtQuick 2.12 +import QtQuick.Controls 2.12 + +import qt.koriolan.shipheart 1.0 + + + +Shipheart_page { + id: page_home_attente + + + //============================================================== + // Recherche de la Home Page à utiliser : + //============================================================== + Timer { + id: timer_recherche_home_page + interval: 300 + running: true + repeat: true + onTriggered: { + + console.log("Adresse de ShipBase = " + AppInfo.adresse_shipbase) + console.log("Etat de la connexion à la BDD = " + AppInfo.etat_connexion_bdd) + console.log("Type d'installation = " + AppInfo.type_installation) + console.log("Taille de l'écran = " + AppInfo.taille_ecran) + + //---------------------------------------------------- + // Valeurs correspondant au type d'installation : + //---------------------------------------------------- + switch (Number(AppInfo.type_installation)) + { + default: + case shipheart_type_installation_shipbase: + shipheart_type_installation = shipheart_type_installation_shipbase; + break; + + case shipheart_type_installation_ecran_deporte: + switch (Number(AppInfo.taille_ecran)) + { + default: + case 7: + shipheart_type_installation = shipheart_type_installation_ecran_deporte_7_pouces; + break; + case 10: + shipheart_type_installation = shipheart_type_installation_ecran_deporte_10_pouces; + break; + case 22: + shipheart_type_installation = shipheart_type_installation_ecran_deporte_22_pouces; + break; + } + break; + } + +console.log("Type d'installation = " + shipheart_type_installation) +//shipheart_type_installation = shipheart_type_installation_shipbase +//shipheart_type_installation = shipheart_type_installation_ecran_deporte_22_pouces + + // Valeurs par défaut : +// shipheart_largeur_page = 1280 +// shipheart_hauteur_page = 800 +shipheart_largeur_page = Qt.application.screens[0].width +shipheart_hauteur_page = Qt.application.screens[0].height + + shipheart_hauteur_bandeau_haut = 60 + shipheart_hauteur_titre_2 = 50 + shipheart_hauteur_bandeau_bas = 80 + shipheart_hauteur_clavier = 305 + + + //---------------------------------------------------- + // Cas où la connexion à la BDD n'a pas été possible : + //---------------------------------------------------- + if ((AppInfo.etat_connexion_bdd === 0) && (Number(AppInfo.type_installation) === shipheart_type_installation_ecran_deporte)) + { + stackView.push("config_shiprs.qml", {"connexion_impossible": true}) + timer_recherche_home_page.stop(); // Arret du timer car il n'est plus utile maintenant + } + else + { + + //---------------------------------------------------- + // Paramètres spécifiques dans le cas des ShipRS : + // NB il est important de ne PAS faire ce traitement avant l'appel + // à 'connexion_impossible.qml' car, sinon, on peut se trouver dans une + // config de 22" (par exemple) et ne plus avoir accès aux boutons de + // configuration !! + //---------------------------------------------------- + switch (shipheart_type_installation) + { + //--------------------------------------------------------------------------- + case shipheart_type_installation_ecran_deporte_7_pouces: + shipheart_largeur_page = 1280; + shipheart_hauteur_page = 800; + synchro_repertoires_shiprs(); + break; + + //--------------------------------------------------------------------------- + case shipheart_type_installation_ecran_deporte_10_pouces: + shipheart_largeur_page = 1280; // Spec de l'écran DENSITRON de ShipBase + shipheart_hauteur_page = 800; // Spec de l'écran DENSITRON de ShipBase + synchro_repertoires_shiprs(); + break; + + + //--------------------------------------------------------------------------- + case shipheart_type_installation_ecran_deporte_22_pouces: + shipheart_largeur_page = 1920; + shipheart_hauteur_page = 1080; + synchro_repertoires_shiprs(); + break; + + //--------------------------------------------------------------------------- + default: // Dans ce cas, ce sont les valeurs par défaut qui sont conservées. + case shipheart_type_installation_shipbase: + break; + } + + //---------------------------------------------------- + // Recherche de la version de ShipBase : + //---------------------------------------------------- + init_shipheart_version_cm(); + + //---------------------------------------------------- + // Recherche du thème d'affichage : + //---------------------------------------------------- + init_shipheart_theme(); + + + //---------------------------------------------------- + // Première page à afficher selon le client : + //---------------------------------------------------- + var shipheart_nom_initial_page = ""; + switch (Number(init_shipheart_specifique_client())) + { + //--------------------------------- + default: + case shipheart_specifique_client_tous: + shipheart_nom_initial_page = "qrc:/home_accueil.qml" + break; + + //--------------------------------- + case shipheart_specifique_client_suncy: + shipheart_nom_initial_page = "qrc:/home_suncy.qml"; + break; + } + + if ((shipheart_generation_shipbase != shipheart_generation_shipbase_inconnue) && // A priori, ne devrait pas arriver mais si on n'a pas trouvé, on va reommencer la recherche après une période de timer. + (shipheart_nom_initial_page !== "")) + { + timer_recherche_home_page.stop(); // Arret du timer car il n'est plus utile maintenant + stackView.push(shipheart_nom_initial_page) + //console.log("La Home Page sélectionnée est '" + shipheart_nom_initial_page + "'") + } + } + } + } + + //============================================================== + // Réactivation de la recherche lors d'un retour sur cette page : + //============================================================== + StackView.onActivated: { +//console.log("!!! Page Home_attente activée") + timer_recherche_home_page.start(); // Relance le timer pour faire une nouvelle recherche + } + + //============================================================== + // Zone d'affichage : + //============================================================== + Rectangle { + x: 0 + y: 0 + width: 5000 // Permet d'être qûr qu'on couvre tout l'écran, quel qu'il soit + height: 5000 // Permet d'être qûr qu'on couvre tout l'écran + color: "transparent" // C'est la ligne importante qui permet de ne pas avoir un "flash' blanc au démarrage + } + + //============================================================================ + // Fonction : Récpère dans la BDD la valeur de 'Specifique_client' dans + // TB_Configuration. sépare chaque champs (séparés par des ';'). + // Met à jour la propriété globale 'shipheart_specifique_client' + // avec toutes les valeurs. Renvoi la première. + // Reçoit : Rien + // Retour : La valeur de 'shipheart_specifique_client[0]' + //============================================================================ + function init_shipheart_specifique_client() + { + var req, res + + // Récupération du paramètre 'TB_Configuration.Specifique_client' + req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Specifique_client" '; + res = bdd.requete_unique(req); + + shipheart_specifique_client = res[0].split(';') // Mémorisation de l'ensemble du tableau + + return(shipheart_specifique_client[0]); // Renvoi de la première valeur + } + + //============================================================================ + // Fonction : Récupère dans la BDD la valeur de 'Theme' dans + // TB_Configuration et met à jour la propriété globale 'shipheart_theme'. + // Reçoit : Rien + // Retour : Rien + //============================================================================ + function init_shipheart_theme() + { + var req, res; + var nb; + + // Chargement du thème demandé en config : + chargement_theme(); + + // Récupération du paramètre 'TB_Configuration.Fichier_image_accueil' + req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Fichier_image_accueil" '; +//console.log("Requête = [ " + req + "; ]"); + nb = bdd.requete(req); +//console.log("NB = "+nb); + if (nb >0) + { + res = bdd.lecture_ligne(); + if (!res.isEmpty) + { + shipheart_fichier_image_accueil = res[0]; + console.log("Le fichier d'image d'accueil est : [" + shipheart_fichier_image_accueil + "]"); + } + else + { + shipheart_fichier_image_accueil = ""; + console.log("/!\ Erreur dans le traitementr de la requête de recherche de fichier d'image d'accueil a échouée. Le nom de fichier est mis à sa valeur par défaut..."); + } + } + else + { + shipheart_fichier_image_accueil = ""; + console.log("/!\ La requête de recherche de fichier d'image d'accueil a échouée. Le nom de fichier est mis à sa valeur par défaut..."); + } + + return; + } + + //============================================================================ + // Fonction : Récupère dans la BDD la valeur de 'Version_cm' dans + // TB_Systeme et met à jour la propriété globale 'shipheart_generation_shipbase'. + // Reçoit : Rien + // Retour : Rien + //============================================================================ + function init_shipheart_version_cm() + { + var req, res + + // Récupération du paramètre 'TB_Systeme.Version_cm' + req = 'SELECT Valeur FROM TB_Systeme WHERE Nom="Version_cm" '; + res = bdd.requete_unique(req); + + if (res[0].indexOf("CM3+") !== -1) shipheart_generation_shipbase = shipheart_generation_shipbase_v1; + else if (res[0].indexOf("CM4") !== -1) shipheart_generation_shipbase = shipheart_generation_shipbase_v2; + else if (res[0].indexOf("CM5") !== -1) shipheart_generation_shipbase = shipheart_generation_shipbase_v3; + else shipheart_generation_shipbase = shipheart_generation_shipbase_inconnue; +console.log("Génération de ShipBase = " + shipheart_generation_shipbase); + + return; + } + + + //============================================================================================================= + // Synchroniser répertoire docs ShipRS + //============================================================================================================= + function synchro_repertoires_shiprs() + { + var commande; + + commande = "rsync -aPs --delete -e \"ssh -p 2022 -o StrictHostKeyChecking=no \" koriolan@" + AppInfo.adresse_shipbase + ":" + shipheart_repertoire_config + "/ " + shipheart_repertoire_config + "/"; + systeme.commande_shell(commande, ""); + + } + + +} + + diff --git a/qml/main.qml b/qml/main.qml new file mode 100644 index 0000000..f3f1747 --- /dev/null +++ b/qml/main.qml @@ -0,0 +1,1069 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +// import QtQuick.VirtualKeyboard 2.4 // Retiré pour ce POC (cf mock_bdd.h en tête de projet) +// import QtQuick.VirtualKeyboard.Settings 2.2 // Idem + +import qt.koriolan.shipheart 1.0 + +ApplicationWindow { + id: root + + //=============================================================================================================================== + // Propriétés statiques : + //=============================================================================================================================== + + //----------------------------------------------------------------------------------- + // Générations de ShipBase : + readonly property int shipheart_generation_shipbase_inconnue: 0 + readonly property int shipheart_generation_shipbase_v1: 1 + readonly property int shipheart_generation_shipbase_v2: 2 + readonly property int shipheart_generation_shipbase_v3: 3 + + + //----------------------------------------------------------------------------------- + // Thèmes : + readonly property int shipheart_index_theme_nom: 0 + readonly property int shipheart_index_theme_fichier_fond_ecran: 1 + readonly property int shipheart_index_theme_couleur_fond_ecran: 2 + readonly property int shipheart_index_theme_couleur_fond_bouton: 3 + readonly property int shipheart_index_theme_couleur_fond_bouton_actif: 4 + readonly property int shipheart_index_theme_couleur_texte_titre_1: 5 + readonly property int shipheart_index_theme_couleur_texte_titre_2: 6 + readonly property int shipheart_index_theme_couleur_texte_titre_3: 7 + readonly property int shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0: 8 + readonly property int shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1: 9 + readonly property int shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2: 10 + readonly property int shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0: 11 + readonly property int shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1: 12 + readonly property int shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2: 13 + readonly property int shipheart_index_theme_couleur_texte_slider: 14 + readonly property int shipheart_index_theme_couleur_bordure_courbes: 15 + + + readonly property variant shipheart_config_themes: [ + //-------------------------------------------- + // Theme = 0: + [ + qsTr("Original"), // shipheart_index_theme_nom + "/images/fibre_carbone.png", // shipheart_index_theme_fichier_fond_ecran + "transparent", // shipheart_index_theme_couleur_fond_ecran + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_bleu_koriolan_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 1: + [ + qsTr("Sombre"), + "", + couleur_noir, + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_bleu_koriolan_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 2: + [ + qsTr("Métallique"), + "/images/fond_2.jpg", + "transparent", + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_bleu_koriolan_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 3: + [ + qsTr("Triangles"), + "/images/fond_3.jpg", + "transparent", + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_bleu_koriolan_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 4: + [ + qsTr("Sable"), + "", + couleur_noir, + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_sable_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_sable_transparent, // shipheart_index_theme_couleur_texte_titre_1 + couleur_sable, // shipheart_index_theme_couleur_texte_titre_2 + couleur_sable_transparent, // shipheart_index_theme_couleur_texte_titre_3 + couleur_sable, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_sable, // shipheart_couleur_texte_slider + couleur_sable // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 5: + [ + qsTr("Thème 5"), + "", + couleur_bleu_koriolan_transparent, + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_bleu_koriolan_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 6: + [ + qsTr("Thème 6"), + "", + couleur_gris_pale, + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_sable_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 7: + [ + qsTr("Thème 7"), + "", + "#2F076A", + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_bleu_koriolan_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ], + + //-------------------------------------------- + // Theme = 8: + [ + qsTr("Thème 8"), + "", + "#5B1297", + couleur_gris_tres_fonce_transparent, // shipheart_index_theme_couleur_fond_bouton + couleur_bleu_koriolan_transparent, // shipheart_index_theme_couleur_fond_bouton_actif + couleur_gris_fonce, // shipheart_index_theme_couleur_texte_titre_1 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_texte_titre_2 + couleur_gris_pale, // shipheart_index_theme_couleur_texte_titre_3 + couleur_bleu_koriolan, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0 + couleur_orange, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1 + couleur_rouge, // shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1 + couleur_blanc_casse, // shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2 + couleur_bleu_koriolan, // shipheart_couleur_texte_slider + couleur_bleu_koriolan // shipheart_index_theme_couleur_bordure_courbes + ] + ]; + + + //----------------------------------------------------------------------------------- + // Type d'installation : + readonly property int shipheart_type_installation_shipbase : 0 + readonly property int shipheart_type_installation_ecran_deporte : 1 + + readonly property int shipheart_type_installation_ecran_deporte_7_pouces : 17 + readonly property int shipheart_type_installation_ecran_deporte_10_pouces : 110 + readonly property int shipheart_type_installation_ecran_deporte_22_pouces : 122 + + //----------------------------------------------------------------------------------- + // Spécificités clients : + readonly property int shipheart_specifique_client_tous : 0 + readonly property int shipheart_specifique_client_suncy : 1 + readonly property int shipheart_specifique_client_o_yachts : 2 + + //----------------------------------------------------------------------------------- + // Types de source : + readonly property int shipheart_type_source_inconnu : 0 + readonly property int shipheart_type_source_circuits : 1 + readonly property int shipheart_type_source_capteurs: 2 + readonly property int shipheart_type_source_reservoirs: 3 + readonly property int shipheart_type_source_batteries: 4 + readonly property int shipheart_type_source_modules: 5 + readonly property int shipheart_type_source_events: 6 + + //----------------------------------------------------------------------------------- + // Types de page : + readonly property int shipheart_type_page_inconnu : 0 + readonly property int shipheart_type_page_preconfiguree_ephemeride : 1 + readonly property int shipheart_type_page_preconfiguree_chronometre : 2 + readonly property int shipheart_type_page_personnalisee_minuteur : 3 + readonly property int shipheart_type_page_preconfiguree_reveil : 4 + readonly property int shipheart_type_page_personnalisee_non_masquable : 10 + readonly property int shipheart_type_page_personnalisee_masquable : 11 + + //----------------------------------------------------------------------------------- + // Paramètres d'une page personnalisée : + readonly property int shipheart_page_personnalisee_nb_max_points : 30 + + readonly property variant shipheart_page_personnalisee_type_point_icones : [ + //-------------------------------------------- + // Type_source = 0 = Système + [], + + //-------------------------------------------- + // Type_source = 1 = Circuits: + [ + "point_transparent.png", // Attention : rang #0 = icone utilisée pour circuit OFF... + "point_blanc.png", + "point_rouge.png", + "point_vert.png", + "point_bleu.png", + "point_jaune.png", + "point_orange.png", + "point_arc_en_ciel.png" + ], + + //-------------------------------------------- + // Type_source = 2 = Capteurs: + [ + "icone_barometre.png", + "icone_humidite.png", + "icone_consommation_electrique.png", + "icone_temperature.png", + "vanne.png", + "vanne_ouverte.png", + "vanne_fermee.png", + "satellite.png" + ], + + //-------------------------------------------- + // Type_source = 3 = Reservoirs: + [ + "reservoir.png", + "reservoir_eau.png" + ], + + //-------------------------------------------- + // Type_source = 4 = Batteries: + [ + "batterie_moyen.png" + ], + + //-------------------------------------------- + // Type_source = 5 = Modules: + [ + "shipbase.png", // Attention : dans l'ordre du 'Types de modules' ci-dessous ! + "sp8dc.png", // Par approximation, on met une image de 8DC... + "shipbs.png", + "sp4ac.png", + "sp8dc.png" + ], + ] + + //----------------------------------------------------------------------------------- + // Langues : + readonly property int shipheart_langue_fr: 0 + readonly property int shipheart_langue_en: 1 + readonly property int shipheart_langue_de: 2 + readonly property int shipheart_langue_es: 3 + readonly property int shipheart_langue_pt: 4 + readonly property int shipheart_langue_nl: 5 + readonly property int shipheart_langue_it: 6 + readonly property int shipheart_langue_lv: 7 + readonly property int shipheart_langue_ca: 8 + + //----------------------------------------------------------------------------------- + // Types unité : // Cf aussi 'fonctions.js' et 'shipheart.h' en cas de modifications/ajouts + readonly property int shipheart_type_unite_volume: 1 + readonly property int shipheart_type_unite_temperature: 2 + readonly property int shipheart_type_unite_latitude: 3 + readonly property int shipheart_type_unite_longitude: 4 + + // Unités volume : // Cf aussi 'fonctions.js' et 'shipheart.h' en cas de modifications/ajouts + readonly property int shipheart_unite_volume_litres: 0 + readonly property int shipheart_unite_volume_us_gallons: 1 + readonly property int shipheart_unite_volume_imp_gallons: 2 + + // Unités température : // Cf aussi 'fonctions.js' et 'shipheart.h' en cas de modifications/ajouts + readonly property int shipheart_unite_temperature_celsius: 0 + readonly property int shipheart_unite_temperature_fahrehneit: 1 + + //----------------------------------------------------------------------------------- + // Localisation des fichiers : + + readonly property string shipheart_repertoire_versions_a_charger: "/home/koriolan/shipheart/versions/a_charger" + readonly property string shipheart_repertoire_versions_a_valider: "/home/koriolan/shipheart/versions/a_valider" + readonly property string shipheart_repertoire_versions_current: "/home/koriolan/shipheart/versions/current" + readonly property string shipheart_repertoire_config: "/home/koriolan/shipheart/config" + readonly property string shipheart_repertoire_cle_usb: "/home/koriolan/cle_usb" + readonly property string shipheart_repertoire_tmp_usb: "/home/koriolan/shipheart/tmp/usb" + readonly property string shipheart_repertoire_sys_usb: "/sys/kernel/debug/usb" + readonly property string shipheart_repertoire_utils: "/home/koriolan/shipheart/utils" + + readonly property string shipheart_sous_repertoire_rapports: "/rapports" + readonly property string shipheart_sous_repertoire_images_accueil: "/images_accueil" + readonly property string shipheart_sous_repertoire_sauvegardes: "/sauvegardes" + readonly property string shipheart_sous_repertoire_images_silhouette: "/images_silhouette" + + readonly property string shipheart_nom_complet_fichier_shiprs_conf: "/home/koriolan/shipheart/versions/shiprs.conf" + + readonly property string shipheart_nom_fichier_image_accueil_par_defaut: "logo_shipheart.png" + readonly property string shipheart_nom_fichier_rapport_installation: "rapport_installation.php" + readonly property string shipheart_nom_fichier_sauvegarde: "sauvegarde.php" + readonly property string shipheart_nom_fichier_usb_devices: "devices" + readonly property string shipheart_nom_fichier_usb_lsblk: "resultat_lsblk" + readonly property string shipheart_nom_fichier_usb_ls: "resultat_ls" + + //----------------------------------------------------------------------------------- + // Modes de fonctionnement du menu 'config_fichiers' : + readonly property int shipheart_mode_config_fichiers_inconnu: 0 + readonly property int shipheart_mode_config_fichiers_image_accueil: 1 + readonly property int shipheart_mode_config_fichiers_silhouette: 2 + readonly property int shipheart_mode_config_fichiers_rapports: 3 + readonly property int shipheart_mode_config_fichiers_sauvegardes: 4 + + readonly property int shipheart_taille_maxi_image_accueil: (5 * 1000 * 1000) // En octets + readonly property int shipheart_taille_maxi_silhouette: (2 * 1000 * 1000) // En octets + readonly property int shipheart_taille_maxi_rapport: (50 * 1000 * 1000) // En octets + readonly property int shipheart_taille_maxi_sauvegarde: (50 * 1000 * 1000) // En octets + + + //----------------------------------------------------------------------------------- + // Gestion des fichiers de mise à jour : + readonly property int shipheart_demande_maj_soft_aucune: 0 // Valeur de repos + readonly property int shipheart_demande_maj_soft_validation: 1 // Validation du fichier dans A_VALIDER qui sera copié dans A_CHARGER + readonly property int shipheart_demande_maj_soft_chargement: 2 // Idem VALIDATION + demande de reset pour prise en compte immédiate + readonly property int shipheart_demande_maj_soft_annulation: -1 // Suppression du fichier présent dans A_VALIDER ou dans A_CHARGER (les 2 sont vidés) + + + //----------------------------------------------------------------------------------- + // Modules : + readonly property int shipheart_max_nombre_modules: (32+1) + + // Types de modules : // Cf aussi 'fonctions.js' en cas de modifications/ajouts + readonly property int shipheart_type_module_inconnu: -1 + readonly property int shipheart_type_module_shipbase: 0 + readonly property int shipheart_type_module_shippower812: 1 + readonly property int shipheart_type_module_shipBS: 2 + readonly property int shipheart_type_module_shippower4AC: 3 + readonly property int shipheart_type_module_shippower8DC: 4 + + // Etat commande d'une carte : + readonly property int shipheart_etat_commande_module_ok: 0 + readonly property int shipheart_etat_commande_module_undervoltage: 1 + readonly property int shipheart_etat_commande_module_test: 2 + + // Code commande d'une carte : + readonly property int shipheart_commande_module_localisation: 1 + readonly property int shipheart_commande_module_etat_systeme: 2 + + readonly property int shipheart_commande_module_etat_systeme_normal: 0 + readonly property int shipheart_commande_module_etat_systeme_alerte: 1 + readonly property int shipheart_commande_module_etat_systeme_alarme: 2 + + + //----------------------------------------------------------------------------------- + // Historique types : + readonly property int shipheart_historique_type_tous: -1 + readonly property int shipheart_historique_type_systeme: 0 + readonly property int shipheart_historique_type_circuits: 1 + readonly property int shipheart_historique_type_capteurs: 2 + readonly property int shipheart_historique_type_reservoirs: 3 + readonly property int shipheart_historique_type_batteries: 4 + readonly property int shipheart_historique_type_usb: 5 + readonly property int shipheart_historique_type_event: 6 + + //----------------------------------------------------------------------------------- + // Messages users : + readonly property int shipheart_message_users_code_aucun: 0 + readonly property int shipheart_message_users_code_fin_minuteur: 1 + readonly property int shipheart_message_users_code_reveil: 2 + readonly property int shipheart_message_users_code_maj_en_cours: 3 + readonly property int shipheart_message_users_code_redemarrage: 4 + readonly property int shipheart_message_users_code_nouvelle_version_detectee: 5 + readonly property int shipheart_message_users_code_defaut_config_k_bus: 6 + readonly property int shipheart_message_users_code_declenchement_event: 7 + + + //----------------------------------------------------------------------------------- + // Protection d'accès : + readonly property string code_koriolan: "87cf9a09f9889c4c9d2d9e30cfb6dfe6f238ef7f2db16cd5ea3ebfcd2c90b9b9" + + readonly property int shipheart_type_code_normal: 0 + readonly property int shipheart_type_code_admin: 1 + + readonly property int shipheart_niveau_acces_aucun: 0 + readonly property int shipheart_niveau_acces_user: 1 + readonly property int shipheart_niveau_acces_admin: 10 + readonly property int shipheart_niveau_acces_koriolan: 20 + + //----------------------------------------------------------------------------------- + // Types de synchro de BDD : + readonly property int shipheart_type_synchro_aucune : 0 + readonly property int shipheart_type_synchro_data : 1 + readonly property int shipheart_type_synchro_config : 2 + + //----------------------------------------------------------------------------------- + // Timings système : + readonly property int shipheart_periode_timer_home: 1000 + + //----------------------------------------------------------------------------------- + // Ports USB : + readonly property int shipheart_port_usb_aucun: -1 + readonly property int shipheart_port_usb_arriere: 0 // Connecteur USB-A à l'arrière + readonly property int shipheart_port_usb_spare: 1 // Sortie sur 4 broches à souder au pas de 2.54mm + readonly property int shipheart_port_usb_avant_bas: 2 // Connecteur USB-A à l'avant, en partie basse de la colonne des 3 ports en face avant + readonly property int shipheart_port_usb_touchpad: 3 // Connecteur pour cable plat sur carte Shipbase, vers l'écran Densitron. + + //----------------------------------------------------------------------------------- + // Entrées Auxiliaires : + readonly property int shipheart_entrees_aux_max_nombre: 32 + + //----------------------------------------------------------------------------------- + // Entrées Level Sensor : + readonly property int shipheart_entrees_level_sensor_max_nombre: 8 + + //----------------------------------------------------------------------------------- + // Entrées Volt : + readonly property int shipheart_entrees_volt_max_nombre: 4 + + //----------------------------------------------------------------------------------- + // Events : + readonly property int shipheart_max_nombre_events: 200 // Cf 'event.h' dans l'appli + readonly property int shipheart_max_nombre_conditions_horaires_par_event: 15 // Cf 'event.h' dans l'appli + readonly property int shipheart_max_nombre_action_circuits_par_event: 50 // Cf 'event.h' dans l'appli + + // Heures spéciales : + readonly property int shipheart_heure_speciale_fin_nuit: 24 // -18° de l'horizon + readonly property int shipheart_heure_speciale_aube_nautique: 25 // -12° de l'horizon + readonly property int shipheart_heure_speciale_aube: 26 // -6° de l'horizon + readonly property int shipheart_heure_speciale_lever_soleil: 27 // -0.833° de l'horizon + readonly property int shipheart_heure_speciale_zenith: 28 + readonly property int shipheart_heure_speciale_coucher_soleil: 29 // -0.833° de l'horizon + readonly property int shipheart_heure_speciale_crepuscule: 30 // -6° de l'horizon + readonly property int shipheart_heure_speciale_crepuscule_nautique: 31 // -12° de l'horizon + readonly property int shipheart_heure_speciale_debut_nuit: 32 // -18° de l'horizon + + //----------------------------------------------------------------------------------- + // Mesures : + // Type mesure : // Cf aussi 'fonctions.js' et 'shipheart.h' en cas de modifications/ajouts + readonly property int shipheart_source_mesure_circuit: 1 + readonly property int shipheart_source_mesure_capteur: 2 + readonly property int shipheart_source_mesure_reservoir: 3 + readonly property int shipheart_source_mesure_batterie: 4 + + // Modes enregistrement mesures : + readonly property int shipheart_mode_enregistrement_mesures_aucun: 0 + readonly property int shipheart_mode_enregistrement_mesures_periodique: 1 + readonly property int shipheart_mode_enregistrement_mesures_changement_etat: 2 + + //----------------------------------------------------------------------------------- + // Divers : + readonly property string shipheart_adresse_ip_inconnue: "inconnue" // Valeur identique à ADRESSE_IP_INCONNUE dans l'appli, dans 'systeme.h' + + + + //----------------------------------------------------------------------------------- + // Couleurs prédéfinies : + readonly property color couleur_bleu_koriolan: Qt.rgba((0/255), (118/255), (154/255), 1.0) + readonly property color couleur_bleu_koriolan_transparent: Qt.rgba((0/255), (118/255), (154/255), 0.4) + readonly property color couleur_bleu_koriolan_tres_transparent: Qt.rgba((0/255), (118/255), (154/255), 0.2) + readonly property color couleur_bleu_koriolan_tres_tres_transparent: Qt.rgba((0/255), (118/255), (154/255), 0.1) + readonly property color couleur_bleu_koriolan_clair: Qt.rgba((113/255), (187/255), (216/255), 1.0) + readonly property color couleur_bleu_koriolan_clair_transparent: Qt.rgba((113/255), (187/255), (216/255), 0.4) + readonly property color couleur_bleu_koriolan_clair_tres_transparent: Qt.rgba((113/255), (187/255), (216/255), 0.2) + readonly property color couleur_noir: Qt.rgba((0/255), (0/255), (0/255), 1.0) + readonly property color couleur_gris_tres_tres_fonce: Qt.rgba((10/255), (10/255), (10/255), 1.0) + readonly property color couleur_gris_tres_tres_fonce_transparent: Qt.rgba((10/255), (10/255), (10/255), 0.9) + readonly property color couleur_gris_tres_tres_fonce_tres_transparent: Qt.rgba((10/255), (10/255), (10/255), 0.2) + readonly property color couleur_gris_tres_fonce: Qt.rgba((60/255), (60/255), (60/255), 1.0) + readonly property color couleur_gris_tres_fonce_transparent: Qt.rgba((60/255), (60/255), (60/255), 0.5) + readonly property color couleur_gris_tres_fonce_tres_transparent: Qt.rgba((60/255), (60/255), (60/255), 0.2) + readonly property color couleur_gris_fonce: Qt.rgba((80/255), (80/255), (80/255), 1.0) + readonly property color couleur_gris_moyen: Qt.rgba((110/255), (110/255), (110/255), 1.0) + readonly property color couleur_gris_pale: Qt.rgba((130/255), (130/255), (130/255), 1.0) + readonly property color couleur_gris_tres_pale: Qt.rgba((150/255), (150/255), (150/255), 1.0) + readonly property color couleur_gris_tres_pale_transparent: Qt.rgba((150/255), (150/255), (150/255), 0.2) + readonly property color couleur_gris_tres_tres_pale: Qt.rgba((200/255), (200/255), (200/255), 1.0) + readonly property color couleur_blanc_casse: Qt.rgba((230/255), (230/255), (230/255), 1.0) + readonly property color couleur_blanc_casse_transparent: Qt.rgba((230/255), (230/255), (230/255), 0.5) + readonly property color couleur_blanc: Qt.rgba(1, 1, 1, 1.0) + readonly property color couleur_vert: Qt.rgba((177/255), (251/255), (23/255), 1.0) + readonly property color couleur_vert_transparent: Qt.rgba((177/255), (251/255), (23/255), 0.4) + readonly property color couleur_jaune: Qt.rgba((253/255), (240/255), (100/255), 1.0) + readonly property color couleur_jaune_transparent: Qt.rgba((253/255), (240/255), (100/255), 0.4) + readonly property color couleur_jaune_post_it: Qt.rgba((255/255), (195/255), (63/255), 1.0) + readonly property color couleur_jaune_post_it_transparent: Qt.rgba((255/255), (195/255), (63/255), 0.4) + readonly property color couleur_orange: Qt.rgba((255/255),(140/255), (0/255), 1.0) + readonly property color couleur_orange_transparent: Qt.rgba((255/255),(140/255), (0/255), 0.4) + readonly property color couleur_rouge: Qt.rgba((255/255), (30/255), (0/255), 1.0) + readonly property color couleur_rouge_transparent: Qt.rgba((255/255), (30/255), (0/255), 0.4) + readonly property color couleur_green_yellow: Qt.rgba((173/255), (255/255), (47/255), 1.0) + readonly property color couleur_green_yellow_transparent: Qt.rgba((173/255), (255/255), (47/255), 0.4) + readonly property color couleur_sable: Qt.rgba((205/255), (154/255), (124/255), 1.0) + readonly property color couleur_sable_transparent: Qt.rgba((205/255), (154/255), (124/255), 0.4) + readonly property color couleur_sable_tres_transparent: Qt.rgba((205/255), (154/255), (124/255), 0.2) + + + + // Boutons : + readonly property int shipheart_rayon_bouton: 6 + readonly property int shipheart_grand_rayon_bouton: 12 + readonly property int shipheart_rayon_zoom: 20 + + readonly property int shipheart_mouse_press_and_hold_interval_tres_court: 5 // Utilisé comme léger filtrage + readonly property int shipheart_mouse_press_and_hold_interval_court: 250 // Utilisé comme léger filtrage + readonly property int shipheart_mouse_press_and_hold_interval_long: 1000 // Utilisé pour les commandes 'sensibles', comme la comm + readonly property int shipheart_mouse_press_and_hold_interval_tres_long: 2000 // Utilisé pour valider par appui maintenu sur un "bouton défilant" + + // Mise en page : + readonly property double bandeau_bas_spacing: 0.004 // pourcentage de la largeur de page utilisé pour séparer les boutons dans le bandeau bas. + + // Formulaires : + readonly property int shipheart_formulaire_ligne_separation_haute: 1 + readonly property int shipheart_formulaire_ligne_separation_basse: 2 + readonly property int shipheart_formulaire_ligne_separation_haute_basse: 3 + + readonly property int shipheart_formulaire_ligne_separation_force_faible: 1 + readonly property int shipheart_formulaire_ligne_separation_force_moyenne: 2 + readonly property int shipheart_formulaire_ligne_separation_force_elevee: 3 + + readonly property string shipheart_font_saisie_textarea: "Noto Mono" // "Sans Serif" [Default], "URW Gothic L", "Nimbus Mono L" + readonly property string shipheart_font_saisie_textfield: "Noto Mono" + + readonly property color shipheart_formulaire_couleur_texte_par_defaut: couleur_blanc_casse + readonly property color shipheart_formulaire_couleur_texte_en_erreur: couleur_rouge + + // Boutons validation boite de dialogue : + readonly property int shipheart_boite_dialogue_bouton_1: 1 // Souvent Ok + readonly property int shipheart_boite_dialogue_bouton_2: 2 // Souvent Annuler + readonly property int shipheart_boite_dialogue_bouton_3: 3 // Souvent Plus Tard ou Supprimer + readonly property int shipheart_boite_dialogue_bouton_4: 4 // Souvent Bouton Sécurisé + + // Protection : + readonly property int protection_mode_access_parametres_avances: 1 + readonly property int protection_mode_verrouillage: 2 + readonly property int protection_mode_deverrouillage: 3 + + // Courbes : + readonly property color courbes_couleur_fond: couleur_bleu_koriolan_tres_transparent // Couleur intérieure des AreaSeries + readonly property color courbes_couleur_shades_fond: couleur_gris_tres_tres_fonce_tres_transparent // Couleur des bandes verticales du fond (celles qui ne sont pas purement transparentes). + readonly property int courbes_epaisseur_bordure: 4 // Epaisseur de la courbe elle-même + readonly property int courbe_etalonnage_max_points: 12 // Max nb de points d'étalonnage (utilisé dans'config_valeur_niveau.qml' pour les batteries et les réservoirs) + + // Caractères spéciaux : + readonly property int unicode_fleche_droite: 0x2192 // Utilisation du type 'String.fromCharCode(unicode_fleche_droite)' + readonly property int unicode_fleche_demi_epaisse_continue_droite: 0x279E + readonly property int unicode_fleche_demi_epaisse_discontinue_droite: 0x279F + readonly property int unicode_fleche_epaisse_discontinue_droite: 0x27A0 + readonly property int unicode_fleche_epaisse_continue_droite: 0x27A1 + readonly property int unicode_omega: 0x2126 // Symbole des Ohms + + //----------------------------------------------------------------------------------- + // Batteries : + // Type d'entrées batteries : + readonly property int shipheart_batteries_type_entrees_volt: 3 + readonly property int shipheart_batteries_type_entrees_predefinie: 5 + readonly property int shipheart_batteries_type_entrees_ibs: 6 + + // Types de variables : + readonly property string shipheart_batterie_temperature: "Batt_temperature" + readonly property string shipheart_batterie_tension: "Batt_tension" + readonly property string shipheart_batterie_courant_differentiel: "Batt_courant_differentiel" + readonly property string shipheart_batterie_courant_charge: "Batt_courant_charge" + readonly property string shipheart_batterie_courant_decharge: "Batt_courant_decharge" + readonly property string shipheart_batterie_soh: "Batt_soh" + readonly property string shipheart_batterie_soc: "Batt_soc" + readonly property string shipheart_batterie_autonomie: "Batt_autonomie" + readonly property string shipheart_batterie_puissance: "Batt_puissance" + readonly property string shipheart_batterie_energie: "Batt_energie" + + // Commande de batterie : + readonly property int shipheart_batteries_commande_reserve: 0 + readonly property int shipheart_batteries_commande_forcage_pleine_charge: 1 + readonly property int shipheart_batteries_commande_reset_soh: 2 + readonly property int shipheart_batteries_commande_reset_compteurs: 3 + + // Type de batterie : + readonly property int shipheart_batteries_type_indefini: 0 + readonly property int shipheart_batteries_type_plomb_acide_liquide: 1 + readonly property int shipheart_batteries_type_plomb_agm_vrla: 2 + readonly property int shipheart_batteries_type_plomb_gel: 3 + readonly property int shipheart_batteries_type_plomb_carbone: 4 + readonly property int shipheart_batteries_type_lihium: 10 + + + //----------------------------------------------------------------------------------- + // Capteurs : + readonly property int shipheart_capteur_max_nombre_entrees_aux: 4 // Vérifier cohérence avec MAX_NOMBRE_ENTREES_PAR_CAPTEUR dans 'capteurs.h' de l'Appli. + + // Type d'entrées capteurs : + readonly property int shipheart_capteur_type_entrees_aux: 1 + readonly property int shipheart_capteur_type_entrees_level_sensor: 2 + readonly property int shipheart_capteur_type_entrees_volt: 3 + readonly property int shipheart_capteur_type_entrees_ow: 4 + readonly property int shipheart_capteur_type_entrees_predefinie: 5 + readonly property int shipheart_capteur_type_entrees_ibs: 6 + readonly property int shipheart_capteur_type_entrees_nmea: 7 + readonly property int shipheart_capteur_type_entrees_can: 8 + readonly property int shipheart_capteur_type_entrees_calculee_booleen: 20 + readonly property int shipheart_capteur_type_entrees_calculee_numerique: 21 + + // Modes des capteurs : + readonly property int shipheart_capteur_mode_entrees_aux_normal: 0 + readonly property int shipheart_capteur_mode_entrees_aux_inverse: 1 + + readonly property int shipheart_capteur_mode_entrees_level_sensor_non_defini: 0 + readonly property int shipheart_capteur_mode_entrees_level_sensor_0_10v: 1 + readonly property int shipheart_capteur_mode_entrees_level_sensor_500r: 2 + readonly property int shipheart_capteur_mode_entrees_level_sensor_4_20ma: 3 + readonly property int shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_masse: 5 + readonly property int shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_v_plus: 6 + readonly property int shipheart_capteur_mode_entrees_level_sensor_defaut_isolement_complet: 7 + + // Etat capteurs : + readonly property int shipheart_capteur_etat_normal: 0 + readonly property int shipheart_capteur_etat_alerte: 1 + readonly property int shipheart_capteur_etat_alarme: 2 + + // Capteurs prédéfinis : + readonly property int shipheart_capteur_predefini_aucun: 0 + readonly property int shipheart_capteur_predefini_pat: 1 + readonly property int shipheart_capteur_predefini_hum: 2 + readonly property int shipheart_capteur_predefini_temp: 3 + readonly property int shipheart_capteur_predefini_lat: 4 + readonly property int shipheart_capteur_predefini_lon: 5 + readonly property int shipheart_capteur_predefini_in_v: 6 + readonly property int shipheart_capteur_predefini_in_i: 7 + readonly property int shipheart_capteur_predefini_usb_i: 8 + readonly property int shipheart_capteur_predefini_edm: 9 + readonly property int shipheart_capteur_predefini_acc_xyz: 10 + readonly property int shipheart_capteur_predefini_acc_x: 11 + readonly property int shipheart_capteur_predefini_acc_y: 12 + readonly property int shipheart_capteur_predefini_acc_z: 13 + readonly property int shipheart_capteur_predefini_alt: 14 + readonly property int shipheart_capteur_predefini_sog: 15 + readonly property int shipheart_capteur_predefini_cog: 16 + readonly property int shipheart_capteur_predefini_siv: 17 + readonly property int shipheart_capteur_predefini_hpa: 18 + readonly property int shipheart_capteur_predefini_vpa: 19 + readonly property int shipheart_capteur_predefini_rsrp: 20 + readonly property int shipheart_capteur_predefini_rssi: 21 + readonly property int shipheart_capteur_predefini_sinr: 22 + + // Types de variables : + readonly property string shipheart_capteur_sans_unite: "Capt_sans_unite" + readonly property string shipheart_capteur_tension_v: "Capt_tension_v" + readonly property string shipheart_capteur_tension_mv: "Capt_tension_mv" + readonly property string shipheart_capteur_courant_a: "Capt_courant_a" + readonly property string shipheart_capteur_courant_ma: "Capt_courant_ma" + readonly property string shipheart_capteur_puissance_w: "Capt_puissance_w" + readonly property string shipheart_capteur_puissance_va: "Capt_puissance_va" + readonly property string shipheart_capteur_puissance_db: "Capt_puissance_db" + readonly property string shipheart_capteur_frequence: "Capt_frequence" + readonly property string shipheart_capteur_resistance: "Capt_resistance" + readonly property string shipheart_capteur_temperature: "Capt_temperature" + readonly property string shipheart_capteur_pression_atm: "Capt_pression_atm" + readonly property string shipheart_capteur_humidite: "Capt_humidite" + readonly property string shipheart_capteur_acceleration: "Capt_acceleration" + readonly property string shipheart_capteur_position: "Capt_position" + readonly property string shipheart_capteur_pourcentage: "Capt_pourcentage" + readonly property string shipheart_capteur_distance_m: "Capt_distance_m" + readonly property string shipheart_capteur_distance_km: "Capt_distance_km" + readonly property string shipheart_capteur_distance_nq: "Capt_distance_nq" + readonly property string shipheart_capteur_vitesse_kts: "Capt_vitesse_kts" + readonly property string shipheart_capteur_vitesse_kmh: "Capt_vitesse_kmh" + readonly property string shipheart_capteur_angle_degres: "Capt_angle_degres" + readonly property string shipheart_capteur_latitude: "Capt_latitude" + readonly property string shipheart_capteur_longitude: "Capt_longitude" + readonly property string shipheart_capteur_volume: "Capt_volume" + + // Capteurs calculés : + readonly property int shipheart_max_nombre_conditions_par_capteur: 50 // Cf 'capteurs.h' dans l'appli + + // Opération de condition : + readonly property int shipheart_operation_condition_non_definie: 0 + readonly property int shipheart_operation_condition_ou: 1 + readonly property int shipheart_operation_condition_et: 2 + readonly property int shipheart_operation_condition_ou_exclusif: 3 + readonly property int shipheart_operation_condition_plus: 10 + readonly property int shipheart_operation_condition_moins: 11 + readonly property int shipheart_operation_condition_multiplie: 12 + readonly property int shipheart_operation_condition_divise: 13 + + // Type de condition : + readonly property int shipheart_type_condition_normale: 0 + readonly property int shipheart_type_condition_debut_groupe_ou: shipheart_operation_condition_ou + readonly property int shipheart_type_condition_debut_groupe_et: shipheart_operation_condition_et + readonly property int shipheart_type_condition_debut_groupe_ou_exclusif: shipheart_operation_condition_ou_exclusif + readonly property int shipheart_type_condition_debut_groupe_plus: shipheart_operation_condition_plus + readonly property int shipheart_type_condition_debut_groupe_moins: shipheart_operation_condition_moins + readonly property int shipheart_type_condition_debut_groupe_multiplie: shipheart_operation_condition_multiplie + readonly property int shipheart_type_condition_debut_groupe_divise: shipheart_operation_condition_divise + // NB : il existe les même valeurs en négatif pour fermer le groupe correspondant. + + // Tests : + readonly property int shipheart_test_non_defini: 0 + readonly property int shipheart_test_strictement_inferieur: 1 + readonly property int shipheart_test_inferieur_ou_egal: 2 + readonly property int shipheart_test_egal: 3 + readonly property int shipheart_test_superieur_ou_egal: 4 + readonly property int shipheart_test_strictement_superieur: 5 + + + //----------------------------------------------------------------------------------- + // Circuits : + + // Max : + readonly property int shipheart_max_circuits_par_module_shipbase: 3 + readonly property int shipheart_max_circuits_par_module_sp812: 8 + readonly property int shipheart_max_circuits_par_module_sp8dc: 8 + readonly property int shipheart_max_circuits_par_module_sp8xx: 8 // Valeur commune aux SP812 et aux SP8DC + readonly property int shipheart_max_circuits_par_module_sp4ac: 4 + + readonly property double shipheart_max_courant_masses_sp8dc: 25.0 // En A (le max 'technique' est 25.5 car transféré en uint_8 vers les SP8DC + + readonly property double shipheart_plancher_intensite_circuit_shipbase: 0.05 // En dessous de cette valeur, l'intensité ne sera pas affichée + readonly property double shipheart_plancher_intensite_circuit_sp8xx: 0.05 // En dessous de cette valeur, l'intensité ne sera pas affichée + readonly property double shipheart_plancher_intensite_circuit_sp4ac: 0.5 // En dessous de cette valeur, l'intensité ne sera pas affichée + + // Mode commande des circuits : + readonly property int shipheart_mode_commande_circuit_tor: 0 + readonly property int shipheart_mode_commande_circuit_soft_tor: 1 + readonly property int shipheart_mode_commande_circuit_soft_variable: 2 + + // Etat des circuits : + readonly property int shipheart_etat_circuit_ok: 0 + readonly property int shipheart_etat_circuit_limitation: 1 + readonly property int shipheart_etat_circuit_protection: 2 + readonly property int shipheart_etat_circuit_disjonte: 3 + readonly property int shipheart_etat_circuit_cc_batterie: 4 + readonly property int shipheart_etat_circuit_deleste: 5 + readonly property int shipheart_etat_circuit_undervoltage: 6 + readonly property int shipheart_etat_circuit_inversion_phase_neutre: 7 + readonly property int shipheart_etat_circuit_absence_terre: 8 + readonly property int shipheart_etat_circuit_absence_masse: 9 + readonly property int shipheart_etat_circuit_inconnu: 99 + + // Types de variables : + readonly property string shipheart_circuit_consigne: "Circ_consigne" + readonly property string shipheart_circuit_tension: "Circ_tension" + readonly property string shipheart_circuit_courant: "Circ_courant" + readonly property string shipheart_circuit_frequence: "Circ_frequence" + readonly property string shipheart_circuit_puissance: "Circ_puissance" + readonly property string shipheart_circuit_energie: "Circ_energie" + readonly property string shipheart_circuit_tension_secteur: "Circ_tension_secteur" + + + //----------------------------------------------------------------------------------- + // Réservoirs : + readonly property int shipheart_reservoir_max_nombre_entrees_aux: 12 + + // Type d'entrées réservoir : + readonly property int shipheart_reservoir_type_entrees_aux: 1 + readonly property int shipheart_reservoir_type_entrees_level_sensor: 2 + + // Mode entrées réservoir : + readonly property int shipheart_reservoir_mode_entrees_aux_normal: 0 + readonly property int shipheart_reservoir_mode_entrees_aux_inverse: 1 + + readonly property int shipheart_reservoir_mode_entrees_level_sensor_0_10v: 1 + readonly property int shipheart_reservoir_mode_entrees_level_sensor_500r: 2 + readonly property int shipheart_reservoir_mode_entrees_level_sensor_4_20ma: 3 + + // Type_sonde réservoir : + readonly property int shipheart_reservoir_mode_entrees_level_sensor_500r_0_500r: 0 + readonly property int shipheart_reservoir_mode_entrees_level_sensor_500r_0_190r: 1 + readonly property int shipheart_reservoir_mode_entrees_level_sensor_500r_240_30r: 2 + + // Types de variables : + readonly property string shipheart_reservoir_niveau: "Res_niveau" + + + + //=============================================================================================================================== + // Propriétés dynamiques : + //=============================================================================================================================== + property int shipheart_type_installation: shipheart_type_installation_shipbase + property var shipheart_specifique_client // Tableau mis à jour avec 'TB_Configuration.Specifique_client' dans 'main.qml' via l'appel à 'init_shipheart_specifique_client()' dans initialItem de StackView ci-dessous + property string shipheart_code_client: "" // Chaine contenant le code client 'TB_Configuration.Code_client' + + // Thèmes d'affichage : + property string shipheart_fichier_image_accueil: "" // Fichier dans '/docs/image_accueil' à utiliser sur la page d'accueil (ou "" pour l'image par défaut) + property int shipheart_theme: 0 // N° du thème à utiliser. Mis à jour au démarrage à partir de TB_Configuration.Theme. + property string shipheart_theme_fichier_fond_ecran: "" // Le nom du fichier à utiliser comme fond d'écran + property string shipheart_theme_couleur_fond_ecran: couleur_noir // Le nom (cf plus haut) de la couleur à utiliser en fond d'écran (ne fonctionne que si 'shipheart_theme_fichier_fond_ecran' est vide) + property color shipheart_couleur_fond_bouton: couleur_gris_tres_fonce_transparent + property color shipheart_couleur_fond_bouton_actif: couleur_bleu_koriolan_transparent + property color shipheart_couleur_texte_titre_1: couleur_gris_fonce + property color shipheart_couleur_texte_titre_2: couleur_bleu_koriolan + property color shipheart_couleur_texte_titre_3: couleur_gris_pale + property color shipheart_couleur_fond_boite_dialogue_niveau_0: couleur_bleu_koriolan + property color shipheart_couleur_fond_boite_dialogue_niveau_1: couleur_orange + property color shipheart_couleur_fond_boite_dialogue_niveau_2: couleur_rouge + property color shipheart_couleur_texte_boite_dialogue_niveau_0: couleur_blanc_casse + property color shipheart_couleur_texte_boite_dialogue_niveau_1: couleur_blanc_casse + property color shipheart_couleur_texte_boite_dialogue_niveau_2: couleur_blanc_casse + property color shipheart_couleur_texte_slider: couleur_bleu_koriolan + property color shipheart_couleur_bordure_courbes: couleur_bleu_koriolan // Couleur de la courbe elle-même + + + + property int shipheart_generation_shipbase: shipheart_generation_shipbase_inconnue + property int shipheart_defaut_config_k_bus: 0 // 0=normal, 1=défaut de config K-Bus vs modules réellement présents (mis à jour par Home en fonction du flag provenant de l'Appli) + property int shipheart_fuseau_horaire: 0 // UTC par défaut + property int shipheart_heure_ete: 0 // 0= hiver, 1= été + property int shipheart_langue: 0 // Français par défaut + property string shipheart_code_pays: "FR" // Français par défaut + property string shipheart_code_langue: "fr_FR" // Français par défaut + property int shipheart_unite_temperature: shipheart_unite_temperature_celsius // °C par défaut + property string shipheart_unite_temperature_symbole: "°C" + property int shipheart_unite_volume: shipheart_unite_volume_litres // Litres par défaut + property string shipheart_unite_volume_symbole: "l" + property int shipheart_time_out_economiseur: 0 // Image de TB_Configuration.Time_out_economiseur + property string shipheart_bips: "" // Image de TB_Configuration.Bips. + + property double shipheart_latitude: 0 + property double shipheart_longitude: 0 + property string shipheart_heure_aube_nautique: "--:--" + property string shipheart_heure_lever_soleil: "--:--" + property string shipheart_heure_zenith: "--:--" + property string shipheart_heure_coucher_soleil: "--:--" + property string shipheart_heure_crepuscule_nautique: "--:--" + + property string shipheart_fichier_a_valider: ""; + property string shipheart_fichier_a_charger: ""; + property int shipheart_nb_fichiers_a_charger: 0; + + property int max_taille_code_pattern: 10 // Nb maxi de chiffres saisissable d'un code (attention : différent de Min_taille_code et Max_taille code de TB_Configuration). D'ailleurs, cette valeur est ajustée à Max_taille_code + 2 dans 'parametres.qml' et dans les pages spécifiques qui traitent la saisie de codes d'accès (ex : home_suncy.qml). + property int shipheart_compteur_economiseur: 30 // Valeur décrémentée chaque seconde et réarmée à chaque interaction d'un utilisateur (valeur mise à jour avec 'TB_Configuration.Time_out_economiseur' à chaque 'reload_economiseur()' dans 'Shipheart_page.qml') + property bool shipheart_flag_nettoyage_ecran_en_cours: false // Permet de passer l'info que le nettoyage est en cours (et, par exemple, bloquer l'économiseur d'écran) + property bool shipheart_flag_blocage_compteurs_pendant_config: false // Permet de bloquer le compteur pendant qu'on est en config + property int shipheart_compteur_time_out_niveau_acces: 0 // Contient le temps restant, en secondes, de la validité de l'accés en cours + property int shipheart_time_out_niveau_acces: 120 + property int shipheart_niveau_acces_en_cours: shipheart_niveau_acces_aucun // 0=aucun accès valide, 1=accès user validé, 10=accès admin validé, 20=accès Koriolan validé + property int shipheart_message_users_max_nombre_reports: 3 // Valeur mise à jour avec 'TB_Configuration.Nb_maxi_reports_message_user' lors de l'init de 'home.qml' + property int shipheart_periode_obsolescence_capteur_nmea: 600 // En secondes + + property int shipheart_niveau_home: 0 // Contient le niveau dans la StackView de la page 'home.qml' (dépend si des pages spécifique au client sont disposées avant). Permet de revenir directement à la page 'home.qml' depuis certaines pages + + property double shipheart_test_vitesse_test_ecran: 1500 + property int nombre_lignes_matrice_test: 8 + property int nombre_colonnes_matrice_test: 10 + + property bool flag_economiseur_actif: false + + // Dimensions (mises à jour dans 'home_attente.qml' selon la valeur de 'shipheart_type_installation' : + property int shipheart_largeur_page + property int shipheart_hauteur_page + property int shipheart_hauteur_bandeau_haut + property int shipheart_hauteur_titre_2 + property int shipheart_hauteur_bandeau_bas + property int shipheart_hauteur_clavier + + + // Modèles : + property Bdd bdd : Bdd{} + property Systeme systeme : Systeme{} + property TbMesuresModel tbmesuresModel : TbMesuresModel{} + + // Signals : + + + + width: shipheart_largeur_page + height: shipheart_hauteur_page + color: shipheart_theme_couleur_fond_ecran + visible: true + property int duree_animation_pages: 400 // En ms + + + //=========================================================== + // Connexion BDD : + // La connexion MySql a un time-out (par défaut de 8h apparemment). La page Home faisant des mises à jour chaque secondes, il n'y a + // aucun soucis de déclenchement. + // Par contre, les mises à jour de Home étant désactivées lorsqu'on navigue sur les pages de niveau inférieur, si on reste sur + // une telle page pendant plusieurs heures, le time-out se déclenche. Par exemple, si on reste sur une page de configuration + // pensant une nuit, il est probable qu'on se trouve dans ce cas... + // Dans ce cas, seul une réinit de l'appli QT permet de redémarrer puisque la connexion à la BDD est fait dans main.cpp. + // Plutôt que d'allonger le time-out (il ne semble pas possible de le mettre à infini), il est ajouté ce timer qui fait une requête + // toutes les heures, même lorsque Home n'est pas la page active. + //=========================================================== + Timer { + id: timer_maintient_connexion_bdd + interval: 60 * 60 * 1000 // Toutes les heures = 60 minutes x 60 secondes x 1000ms + running: true + repeat: true + onTriggered: { + let req = 'SELECT Valeur FROM TB_Systeme WHERE Nom="Heart_beat" '; + let res = bdd.requete_unique(req); + console.log("Déclenchement du timer de maintient de la connexion avec la BDD") + } + } + + + //============================================================== + // Pile de pages : + //============================================================== + StackView { + id: stackView + width: root.width + height: root.height + Component.onCompleted: { + var result = stackView.push(Qt.resolvedUrl("qrc:/home_attente.qml")) // Cela permet d'avoir une page "propre" plutot qu'une page toute blanche en attendant que l'accès à la BDD soit possible et permette de déterminer la home page à charger. +// console.log("Résultat du push : " + result) + } + + pushEnter: Transition { // Nouvelle page, lors d'un PUSH + PropertyAnimation { + property: "x" + from: shipheart_largeur_page // Part du bord droit... + to:0 // ... jusqu'au bord gauche (la page "entre" par la gauche) + duration: duree_animation_pages + easing.type: Easing.OutQuad; + } + } + pushExit: Transition { // Ancienne page, lors d'un PUSH + PropertyAnimation { + property: "x" + from: 0 // Part du bord gauche, là où elle était affichée... + to: -shipheart_largeur_page // ... et sort par la gauche, jusqu'à ce qu'elle disparaisse complètement à gauche. + duration: duree_animation_pages + easing.type: Easing.OutQuad; + } + } + popEnter: Transition { // Nouvelle page, lors d'un POP + PropertyAnimation { + property: "x" + from: -shipheart_largeur_page // Part de complètement hors du cadre, à gauche... + to: 0 // ... jusqu'à ce que son bord gauche soit aligné avec le bord gauche de l'écran. + duration: duree_animation_pages + easing.type: Easing.OutQuad; + } + } + popExit: Transition { // Ancienne page lors d'un POP. + PropertyAnimation { + property: "x" + from: 0 // Part du bord gauche... + to: shipheart_largeur_page // ... jusqu'au bord droit de l'écran (sort par la droite). + duration: duree_animation_pages + easing.type: Easing.OutQuad; + } + } + } + + + + + + //============================================================== + // Clavier : retiré pour ce POC (cf imports en tête de fichier) + //============================================================== + + + + //--------------------------------------------------------------------------------------------------------------------------------------- + // Les fonctions ci-dessous sont accessibles depuis n'importe quelle page (puisque appelée, directement ou indirectement par cell-ci). + //--------------------------------------------------------------------------------------------------------------------------------------- + + + //============================================================================================================= + // Demande de synchro de la BDD + //============================================================================================================= + function synchro_bdd(type_synchro) + { + switch (type_synchro) + { + case shipheart_type_synchro_aucune: + break; + case shipheart_type_synchro_data: + bdd.requete_unique('UPDATE TB_Systeme SET Valeur=1 WHERE Nom="Synchro" '); + break; + case shipheart_type_synchro_config: + bdd.requete_unique('UPDATE TB_Systeme SET Valeur=2 WHERE Nom="Synchro" '); + break; + default: + console.log("/!\\ Le paramètre de synchro de BDD reçu n'est pas valide [" + type_synchro + "]") + break; + } + } + + //============================================================================================================= + // Rebooter via l'Appli (permet un reboot "ordonné") : + //============================================================================================================= + function rebooter() + { + + console.log("!!! Commande de REBOOT reçue !!!"); + bdd.requete_unique('UPDATE TB_Systeme SET Valeur="Reboot" WHERE Nom="Demande_reboot" '); + + stackView.pop(stackView.get(shipheart_niveau_home)); // Retour à la page 'home.qml' car on va reseter et il faut pouvoir afficher le message user + } + +}