IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Aide pour liaison de class


Sujet :

Langage C++

  1. #1
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut Aide pour liaison de class
    salut as tous , je souhaite modifier un "bool passeEnModeChauffage" d'une classe "Froid" via une autre class "Chauffage", comment puis-je faire merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #ifndef FROID_H
    #define FROID_H
     
    #include <ctime>
     
    #include "consignes.h"
    #include "temperatures.h"
    #include "filtre.h"
    #include "relais.h"
     
    class Froid
    {
     
    public:
        Froid();
     
        bool gifFroid = false;
     
        bool gifVentilationFroid = false;
        bool gifVentilationIntFroid = false;
        bool gifsVitessesIntFroid = false;
        bool gifVentilationExtFroid = false;
        bool gifVentilationDegFroid = false;
     
        bool gifDegivrageFroid = false;
        bool gifEgouttageFroid = false;
     
        bool degivrageFroid = false;
     
        bool passeEnModeChauffage = false;
        bool passeEnModeCanicule = false;
     
        void modeFroid();
        void etatArretFroid();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include "froid.h"
     
    #include <QDebug>
     
    Froid::Froid()
    {
        qDebug() << "Froid";
     
        m_froidConsignes = new Consignes(QString("settings/consignes.ini"), QSettings::IniFormat);
     
        m_froidTemperatures = new Temperatures(QString("settings/temperatures.ini"), QSettings::IniFormat);
     
        m_froidFiltre = new Filtre(QString("settings/filtre.ini"), QSettings::IniFormat);
    }
     
    void Froid::etatMarcheFroid()
    {
        m_froidRelais.desactiveRelaiEteHiver();
        departTempoVoletsFr = time(NULL);
        transitionGainableFroid = TEMPO_VOLETS_FROID;
    }
     
    void Froid::etatVoletsFroid()
    {
        gifVentilationFroid = true;
        m_froidRelais.activeRelaisVentilationInt();
        m_froidFiltre ->departChronoFiltre = time(NULL);
        departTempoControleTemperatureFr = time(NULL);
        transitionGainableFroid = TEMPO_CONTROLE_TEMPERATURE_FROID;
    }
     
    void Froid::etatControleTemperatureFroid()
    {
        m_froidRelais.activeRelaisVentilationInt();
    }
     
    void Froid::etatDepartFroid()
    {
        gifVentilationFroid = false;
        gifVentilationIntFroid = true;
        gifVentilationExtFroid = true;
        m_froidRelais.activeRelaisVentFroid();
        departTempoV4VFr = time(NULL);
        transitionGainableFroid = TEMPO_V4V_FROID;
    }
     
    void Froid::etatModeFroidChauffage()
    {
        passeEnModeChauffage = true;
        etatArretFroid();
        transitionGainableFroid = ARRET_FROID;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #ifndef CHAUFFAGE_H
    #define CHAUFFAGE_H
     
    #include <ctime>
     
    #include "consignes.h"
    #include "temperatures.h"
    #include "filtre.h"
    #include "relais.h"
     
    class Chauffage
    {
     
    public:
        Chauffage();
     
        bool gifChauffage = false;
     
        bool gifVentilationChauffage = false;
        bool gifVentilationIntChauffage = false;
        bool gifVentilationExtChauffage = false;
        bool gifVentilationDegChauffage = false;
     
        bool gifDegivrageChauffage = false;
        bool gifElectriqueChauffage = false;
        bool gifEgouttageChauffage = false;
     
        bool degivrageChauffage = false;
     
        bool passeEnModeFroidEnChauffage = false;
     
        void modeChauffage();
     
        void etatArretChauffage();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include "chauffage.h"
     
    #include <QDebug>
     
    Chauffage::Chauffage()
    {
        qDebug() << "Chauffage";
     
        m_chauffageConsignes = new Consignes(QString("settings/consignes.ini"), QSettings::IniFormat);
     
        m_chauffageTemperatures = new Temperatures(QString("settings/temperatures.ini"), QSettings::IniFormat);
     
        m_chauffageFiltre = new Filtre(QString("settings/filtre.ini"), QSettings::IniFormat);
    }
     
    void Chauffage::etatMarcheChauffage()
    {
        //Froid::passeEnModeChauffage = false;
        m_chauffageRelais.activeRelaiEteHiver();
        departTempoVoletsCh = time(NULL);
        transitionGainableChauffage = TEMPO_VOLETS_CHAUFFAGE;
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 466
    Par défaut
    Bonjour,

    Le booléen passeEnModeChauffage est déjà public, donc tu peux le modifier directement depuis les méthodes d'une autre classe ou même depuis une fonction ordinaire hors classe. Il te faut simplement une référence vers l'instance de la classe « Froid » dont tu veux modifier cette propriété.

    À la ligne 19 de ton dernier exemple, cependant, tu essaies de la modifier justement sans avoir d'objet « Froid » visible. Ce serait possible (avec la syntaxe que tu as écrite) si ta propriété était déclarée static mais il y a 99,9 % de chances que ce ne soit pas du tout ce que tu cherches à faire en réalité. Donc, ne suis pas cette voie pour le moment.

    Il s'agit visiblement d'un problème de conception initiale. À quoi sont censées correspondre les classes « Froid » et « Chauffage » en premier lieu ?

    ---

    Par ailleurs : je constate que tu as masqué toutes les déclarations des membres privés de tes classes. Or, tu sembles construire tous ces membres privés avec new dans tes constructeurs alors que tu n'utilises jamais de destructeur. Tout cela ressemble à du code Java transposé. Ce n'est pas de cette manière qu'il faut construire tes objets car tu induis de grosses fuites de mémoire dans ton programme. new ne fonctionne pas de la même façon en C++ et en Java, et en principe, tu ne devrais même pas avoir à y recourir si les membres de ta classe doivent vivre aussi longtemps que l'objet lui-même.

  3. #3
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    En fait, j'ai essayé avec #include Froid.h".

    Froid m_chauffageFroid dans le .h et m_chauffageFroid.passeEnModeChauffage = false; a la ligne 19 mais cela ne marche pas

    En fait, je veux passer du froid au chauffage en automatique avec l'aide du bool passeEnModeChauffageJ'ai une class gainable qui gère le mode normal et les 3 autres modes « canicule », « chauffage » et « froid » passent grâce au bool pour changer de mode , mais je veux remettre le bool passeEnModeChauffage à false dans la class Chauffage et je n'arrive pas en sachant que j'utilise QTcreator QThread.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 466
    Par défaut
    Citation Envoyé par ludoiphone Voir le message
    … et m_chauffageFroid.passeEnModeChauffage = false; a la ligne 19 mais cela ne marche pas
    Si ça ne marche pas, il faut essayer de comprendre pourquoi (et lire les messages d'avertissement du compilateur, même si C++ est souvent un peu trop volubile de ce côté).

    Es-tu sûr que tu as bien déclaré m_chauffageFroid dans la section public de ta classe Froid ? Rien n'est moins sûr puisque les autres en « m_… » n'en ont pas l'air. Et là encore, utilises-tu un destructeur dans ta classe pour éliminer en fin de vie ce que tu as alloué avec new ? new te renvoie un pointeur vers un objet construit en mémoire et il faut utiliser explicitement delete pour le libérer ensuite. Le C++ ne fonctionne pas comme Java sur ce point-là.

    Par ailleurs, de quelle classe-mère dérivent les classes Consignes, Temperatures et Filtre ? Il est possible que Qt cache le pointeur dans ce cas précis (pratique répandue mais à combattre), ce qui expliquerait les confusions ici.

    Il faut que tu nous donnes le code complet de Froid, *.h et *.c tel que tu as essayé de l'écrire, parce qu'il manque probablement des choses.

  5. #5
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    merci a toi , je un debutant a la matiere , j'apprend les classes avec Qt et c++ depuis peux et je sais pas encore m'en servir a la perfection .

    pour les destructeurs c'est une question que je me pose , car j'aimerai comprendre quand les mettres .

    lien code complet , j'aimerais avoir vos lumieres pour m'orienter dans la bonne direction

    je n'ai pas ajouter ceux que je veux faire dessus , (dans la classe Chauffage) .

    https://github.com/ludoiphone/QtGainable

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 478
    Par défaut
    La conception de vos classes me semble actuellement assez bancale.

    Je ne connais pas la source qui vous sert de cours d'apprentissage, mais j'ai peur qu'il soit d'assez piètre qualité.
    L'usage totalement abusifs des pointeurs nus m'interloque pour un code de "débutant".
    Vos classes me semblent particulièrement sensibles à l'aspect "encapsulation" de la conception objet (POO), or, ces champs publiques booléens comme "passeEnModeChauffage" etc..., me ne semble pas du tout adapté à la situation.
    (Mais du code en français, ça inhibe pas mal de mes automatismes de compréhension du code. )

    Pour moi, c'est des états internes à l'objet donc non directement accessible depuis du code "client" de l'objet.
    Il faut être capable de changer l'implémentation de la classe s'en avoir à changer le code qui utilise la classe.

    Il faut donc, au minimum, encapsuler la modification de ce champs par une fonction "accesseur" qui permettra de modifier comment fonctionne l'objet sans avoir à tout casser.

    Je pense que la notion d'encapsulation doit être revu pour que le code de vos classes soit plus "sûr".

    Ne faites pas l'erreur de vous faire imposer le design de vos classes par un Framework, même si c'est Qt. Quitte à distinguer les classes "métiers" qui modélisent la "réalité" des classes d'affichage/IHM géré par Qt.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 466
    Par défaut
    Bonsoir,

    Citation Envoyé par ludoiphone Voir le message
    pour les destructeurs c'est une question que je me pose , car j'aimerai comprendre quand les mettres .
    Le destructeur est l'opposé du constructeur. C'est une fonction-membre appelée lorsque ton programme est sur le point de détruire ton objet et libérer ses ressources. Il est facultatif, mais doit être mis en place chaque fois qu'il est nécessaire de prendre des mesures particulières avant cette libération. Cela peut être n'importe quelles opérations : libérer des sous-ressources (cas qui t'intéresse ici), signaler à l'environnement que ton objet ne sera plus disponible ou simplement écrire « au revoir » à l'écran…

    Si tu peux t'en passer, c'est une très bonne chose. Non que ce soit mal en soi de l'utiliser, au contraire, mais cela veut dire que ton objet est suffisamment propre pour que le ménage se fasse automatiquement. Par contre, dans le cas présent, tu as utilisé des new pour allouer les objets dérivant de Qt. Comme ils ne disparaîtront pas d'eux-mêmes, il te faut un destructeur dans lequel tu vas appliquer un delete sur toutes les propriétés renseignées par new, et seulement elles.

    lien code complet , j'aimerais avoir vos lumieres pour m'orienter dans la bonne direction
    Merci beaucoup d'avoir partagé le lien vers le dépôt entier. Cela va beaucoup faciliter les choses.

    Je vois qu'en effet, tu as bien déclaré des pointeurs pour les classes Qt mais que tu restes (comme il se doit) à du RAII propre en ce qui concerne tes propres classes.

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // chauffage.h
     
    …
      private:
          Temperatures *m_chauffageTemperatures;
     
          Consignes *m_chauffageConsignes;
     
          Filtre *m_chauffageFiltre;
     
          Relais m_chauffageRelais;

    Il n'y a donc pas de raison pour que tu ne puisses pas déclarer un membre Froid m_chauffageFroid au sein de ta classe comme tu y déclares Relais m_chauffageRelais (sauf si les classes s'inter-incluaient, mais ce n'est pas le cas ici).

    Il est trop tard pour recompiler ton programme ce soir mais essaie de retenter la même manipulation et donne-nous le message d'erreur le cas échéant.

    Bon courage.

  8. #8
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    j'ai été aider sur le forum de qt au depart, et sur leurs exemple je vois pas de delete.

    il serais peut-etre de faire mon code sans les pointeurs (new ect...)??
    ci c'est le cas mes classes Temperatures,consignes,filtre , je n'arrive pas est les faire sans pointeur .

    quand j'ajoute ce que je disais plus haut j'ai pas de code erreur mais le bool rest sur true .
    en faite il sert as effacer le gif animer (ventilateur interieur) dans la classe gainable qui emet un signal as mainwindow pour ne plus l'afficher .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef CHAUFFAGE_H
    #define CHAUFFAGE_H
     
    #include <ctime>
     
    #include "consignes.h"
    #include "temperatures.h"
    #include "filtre.h"
    #include "relais.h"
    #include "froid.h"
     
    Froid m_chauffageFroid;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "chauffage.h"
     
    void Chauffage::etatMarcheChauffage()
    {
        m_chauffageFroid.passeEnModeChauffage = false;
        m_chauffageRelais.activeRelaiEteHiver();
        departTempoVoletsCh = time(NULL);
        transitionGainableChauffage = TEMPO_VOLETS_CHAUFFAGE;
    }

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 478
    Par défaut
    Vous utilisez très très mal la notation hongroise (m_*).
    Vous utilisez le préfixe "m_", qui n'est réservé, normalement, qu'au champ d'un objet, aussi bien pour des variables globales, que des paramètre de fonction etc...
    Vous devez être à même de distinguer les différents types de variables et utiliser le bon préfixe.

    Vous pouvez trouver que c'est un détail mais la nature de votre question initiale montre que les différents types de variables ne sont pas maitrisés.

    Une fois que vous maitrisez les types de variables, vous pourrez répondre à votre propre question.

    Votre projet est ambitieux, il faut que vous maitrisiez l'encapsulation en POO, avant de bricoler avec Qt, qui n'est pas forcement un facilitateur de qualité de code ou de conception.

  10. #10
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    ok , je ne savait pas que c'etait de la notation hongroise , j'ai supprimer cela .

    pour mon code Qt l'interface fonctionne , mise a par le probleme de new qui n'ai peut-etre pas la bonne orientation .

    c'est juste que de ma classe gainable as chauffage le bool change pas , il change bien dans la classe chauffage mais apres il redevient true , je pense que je m'en mele un peux les pinceau , je vais voir autrement .

    apres je demande vos conseille car j'aime bien avoir des exemples de pro et votre experience m'orienteras dans la bonne direction merci

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 478
    Par défaut
    ok , je ne savait pas que c'etait de la notation hongroise , j'ai supprimer cela .
    J'ai pas dit qu'il fallait pas s'en servir.
    Il faut juste comprendre les différents types de variable et donc utiliser le bon préfixe (m_, g_, s_ ou pas de préfixe) en fonction du type de la fonction.
    Actuellement, votre code n'utilise pas les concepts SOLID de la POO, et vous vous retrouvez avec des classes "boites blanches" où beaucoup trop de champs des classes sont publiques.
    En faisant cela, vos classes deviennent beaucoup trop interdépendantes : une modification dans une classe implique des modifications en cascades dans d'autres classes.

    Je vous conseille donc, pour commencer, de rendre le plus possibles les champs privés et d'implémenter des "accesseurs/mutateurs" pour chacun des champs qui ont un intérêt à être utilisable par d'autres classes.
    Les autres classes n'ont pas à savoir comment la classe gère en interne ses données.

    Donc pour notre cas de "passeEnModeChauffage" de la classe "Froid" :
    - Rendre "passeEnModeChauffage" privé.
    - Ajouter une fonction "getPasseEnModeChauffage" qui renvoie la valeur du champ "passeEnModeChauffage", mais uniquement si les autres classes ont besoin de cette information, et j'en doute beaucoup.
    - Ajouter une fonction "setPasseEnModeChauffage" qui prend en paramètre un booléen qui sera la nouvelle valeur du champ.

    En faisant cela, vous pourrez changer la manière dont est géré ces changement de valeur d'un champ, comme l'arrêt de threads, la propagation de modifications vers des sous objets, notification de changement d'état à d'autres objets, etc...

    Et la réponse à votre question initiale devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjetFroid.setPasseEnModeChauffage(laNouvelleValeurDePasseEnModeChauffage);
    Reste à savoir comment votre objet de classe Chauffage aura accès à l'objet de classe Froid correspondant.

    Je ne pense pas qu'un objet "Chauffage" doit connaitre l'existence d'un objet "Froid".

    "Gainable" connait déjà les objets "Froid" et "Chauffage" associés.
    Le plus logique, c'est d'implémenter un mécanisme de notification de changement d'état dans la classe "Chauffage".
    "Gainable" si abonnera, et, en fonction de règles internes à "Gainable" appellera le code suivant si la notification implique un changement dans l'objet "Froid" associé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_gainableFroid.setPasseEnModeChauffage(uneValeurQueGainableACalcule);
    J'ai l'impression que votre analyse initiale, qui doit précéder la conception, a été un peu bâclée, non ?
    Sinon, le découpage des responsabilités entre les différents objets serait déjà connu et implémenté via des mécanismes plus simples que des notifications.

  12. #12
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    merci , en faite j'ai creer mes class chauffage, froid et canicule en fonction de la temperature ext 13,5°C (moyenne de notre region annuel), et je voulais ajouter une relation automatique entre c'est classe car en fonction du temps qu'il y as l'exterieur, dans la maison il peut faire trop froid quand on est en mode Froid et pareil pour le chauffage il peut faire trop chaud quand on est en chauffage (soleil se leve par exemple et vue que je suis plein sud avec des baies et porte fenetre ca chauffe tres vite dans la maison (chambre) ) et pour le passage a canicule je controle la temperature ext dans froid pour si la temperature augmente au dessu de 30°C je fait un calcule de -6°C de la temperature exterieur pour eviter d'avoir trop d'ecart entre la temperature de la maison et celle de dehors car choc thermique (effet chaleur lourde) quand on sort.

    voila dans les grande lignes .

    je vais essayer vos conseille , c'est un peux comme les signal de QT.

    merci

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 478
    Par défaut
    Vous ne mettez pas à jour votre dépôt Git, difficile de comprendre vos "changements".

    Vous mentionnez "class" de manière assez ambiguë, comme si la distinction entre classe et objet/instance est assez flou pour vous.
    Il faudrait que vos bases en POO soient assez solide pour faire la distinction entre eux.

    Une analyse/conception est "drivée" par un objectif "final" que vous ne nous donnez pas.
    Sans cela, nos conseils ne seront pas forcément pertinents. On n'a pas la 'Big Picture".

    Votre conception me semble "originale" quand on lit votre description.
    En première analyse, on a tendance à "modéliser" le réel/concret : un radiateur, un climatiseur, un système de pilotage, un tuyau etc. plutôt que des choses abstraites comme le "Froid", le "Chauffage" ou encore la "Canicule".

    Pensez à faire des diagrammes de classes ET des diagrammes d'objets tant que vous n'êtes pas très à l'aise avec les concepts de POO.

    Dans votre code du dépôt actuel, vous avez ;
    une MainWindow (une instance), qui contient les objets suivant :
    - une instance de DS18B20
    - une instance de Gainable

    une instance de Gainable contient les objets suivant :
    - une instance de Froid
    - une instance de Chauffage
    - une instance de Canicule
    - une instance de Consignes
    - une instance de Temperatures
    - une instance de Filtre
    - une instance de Vitesses

    C'est sensé représenté quoi un "Gainable" avec tout ce fatras dedans ???

    car en fonction du temps qu'il y as l'exterieur
    Comment votre système est sensé être informé de cette valeur, être averti du changement de cette valeur ?
    Vous devez avoir une vue claire de ce qui est modélisé dans votre arborescence d'objet (votre modèle) et savoir ce qui vient de l'extérieur de votre modèle (les entrées).

    Vous faites du multi-treading, si vous ne faites pas dès le départ un truc "carré", vous allez galérer comme un damné.

    c'est un peux comme les signal de QT.
    Qt et pas QT (QuickTime), SVP.
    Oui, c'est un peu la raison d'être des signaux des Qt.

    Mais moi, je suis un peu de la vieille école des casse-couilles et je m'oblige à ne pas avoir d'adhérences inutiles à un Framework graphique comme Qt pour du code qui n'a rien à voir avec l'affichage.
    Histoire de ne pas avoir à tout refaire si l'on utilisera plus tard un autre Framework graphique.
    Il y a maintenant tout ce qu'il faut dans le C++ standard pour implémenter des Design Pattern de notification de manière bien plus souple que les signaux Qt.

  14. #14
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    un gainable est un système de chauffage et/ou de climatisation qui fonctionne à l'aide d'un réseau de gaines dissimulées sous un faux-plafond.
    je le possede a la maison , la carte electronique d'origine est hs et n'est plus commercialiser , donc j'ai tous virer pour mettre des regulateurs , relais, thermostats sans fil dans chaque pieces (4 chambres et salon) il fonctionne tres bien mais c'est une "usine as gaz", donc j'ai penser au raspberry pour minimiser les organnes electrique au meme endroit et de plus sympa.

    oui je vous l'accorde que je suis un peux brouillon . au depart j'étais sur arduino et vue que j'ai la framboise qui as quand meme deja tous ce qu'il faut dessus (reseau, hdmi, ect) je me suis lancer dessus.

    j'ai construit une machine a états bizarroide.

    dans mainwindow (fenetre principal de l'application) j'ai mes 5 temperatures (ext , unité interieur, echangeur interieur, unité exterieur et echangeur exterieur) qui sont prisent sur les sondes DS18B20 (lecture des fichiers dans les bus de la framboise ) et 3 boutons (démarrer qui est cacher au lancement , consignes (pour modifier les consignes) et arret (pour arreter les modes chauffage , froid et canicule))
    je lance gainable pour selectionne l'un des 3 modes qui agissent sur la fenetre principal en affichant des gif animée (ventilateur , compresseur et des fond d'ecran animée) en fonction des trois modes froid , chauffage, canicule car il non pas les memes fonctions et les memes gifs.

    au depart je m'etais arreter qu'aux trois modes et au fil du temps je me suis aperçu que en fonction du climat , il me fallait une positions automatique . voila

    j'ai pris QtCreator car c'est ce que j'ai trouver sur le net qui etait asser simple as utiliser sur linux (raspberry) et qu'il y as des forums

    après oui je suis ouvert sur c++ , mais je ne sais pas ci cela est compatible avec linux ?

    au final j'ai trouver mon erreur , j'oublier de passer un bool en false .

    mais je reste ouvert as tous apprentissage pour pouvoir ameliorer mes connaissance et surtout de coder comme il ce doit .
    pour optimiser avec vos conseils mon code , j'avoue j'ai enormement de lacune dans l'apprentissage . mais j'essais et je perciste .

    que me conseiller vous , mise a part que je me penche plus la comprehension de c++ , je suis qu'elle qu'un qui apprend plus avec des exemples ou en presentiel , sur le net c'est pas evident . mais bon

  15. #15
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    779
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 779
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Mais moi, je suis un peu de la vieille école des casse-couilles et je m'oblige à ne pas avoir d'adhérences inutiles à un Framework graphique comme Qt pour du code qui n'a rien à voir avec l'affichage.
    Alors nous avons la même manière de faire: on code la partie métier du programme, avec des affichages basiques pour contrôler que les "calculs" sont corrects, et ensuite on réfléchit à la manière d'afficher les résultats de manière sympa. Et ce, quel que soit le langage utilisé (je connais très peut C++, je suis plutôt C).
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent ;)

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 478
    Par défaut
    j'ai construit une machine a états bizarroide.
    Je ne vois pas trop d'implémentation "orthodoxe" d'un Design Patten "state pattern" dans votre code.
    Evitez de réinventez la roue.
    Si vous avez un Design Pattern identifié, utilisez une implémentation "toute faite", au moins au départ.

    Vous semblez "mapper" directement votre "conception" dans l'IHM.
    C'est "bien" si votre IHM est destiné à un "ingénieur/réparateur" du machin, mais cela sera bien trop complexe pour l'utilisateur "standard".
    C'est pour cela qu'il est très courant d'avoir au moins 2 couches distinctes dans son code :
    - la couche "métier/business" qui contiendra en code en charge de modéliser les objets concrets et les règles de fonctionnement du "bordel"
    - la couche IHM qui sera en charge d'afficher les informations de manière "ergonomique.

    On revient donc sur le conseil de ne pas dépendre de Qt pour le code "métier".

    Là, si vous ne faites pas gaffe, le code de votre classe "Chauffage" va dépendre de la classe "Froid" (une fonction de la classe "Chauffage" utilise un champ publique de la classe "Froid").
    Donc, si vous changez comment est implémenté la classe Froid, ça cassera la classe "Chauffage".
    La modification d'implémentation dans la classe "Chauffage" pour pouvoir utiliser la nouvelle implémentation de la classe "Froid" peut casser le code utilisant la classe "Chauffage", etc...
    Si vous ne structurez pas votre code en modules assez indépendants, l'exemple de modification en cascade (nommé souvent modification "shotgun", parce que les modifications se propagent partout, comme les impacts de la chevretine d'une cartouche de fusil à pompe (shotgun)) présenté ci-avant sera systématique, et ça sera un ENFER à maintenir.

    Essayez de séparer l'IHM et le métier en au moins 2 modules distinctes et faire en sorte que les modifications de configuration (ajout d'une sonde, ajout d'un type de réglage, etc...) ne cassent pas toutes vos classes au shotgun.

  17. #17
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    bonjour , donc je vais me concentrer sur mon code metier , je reviendrai vers vous ci il y as des choses a peaufiné ou améliorer .

    merci a vous , je suis ouvert as des conseilles pour m'orienter dans la bonne direction pour creer mon programme . merci

  18. #18
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    salut a vous , donc j'ai commencer mon code metier , et j'aimerais avoir vos conseilles pour integré les pins de la class gpiopin dans le gainable.h
    pour pouvoir faire un heritage entre l'objet Gainable et l'objet Froid .

    que penser vous du debut ? ,

    en faite j'aimerais pouvoir arreter l'objet Froid et revenir sur l'objet Gainable quand le poussoir est relacher (thermostat) .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "gainable.h"
     
    int main(int argc, char *argv[])
    {
        Gainable *mainGainable;
        mainGainable = new Gainable();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #ifndef GAINABLE_H
    #define GAINABLE_H
     
    #include "ds18b20.h"
     
    class Gainable
    {
     
    public:
        Gainable();
     
        ~Gainable();
     
        unsigned long chronoNettoyageFiltre = 0;//////////// verifier
     
    private:
        DS18B20 *gainableDs18b20;
     
        const unsigned long tempsNettoyageFiltre = 1820;//1820000; // 21 jours  alerte nettoyage filtre
        const unsigned long tempsArretProgramme = 2679;//2679000; // 1 mois arret programme par manque d'entretien filtre
     
        enum
        {
            MODES,
            FROID,
            CHAUFFAGE,
            ARRET_GAINABLE
        } transitionGainable = ARRET_GAINABLE;
     
        void fonctionsGainable();
     
        void commandeGainable();
     
        void etatModes();
        void etatModeFroid();
        void etatModeChauffage();
        void etatFiltreANettoyer();
        void etatArretGainable();
    };
     
    #endif // GAINABLE_H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    #include "gainable.h"
     
    #include <ctime>
    #include <QDebug>
     
    #include "gpioPin.hpp"
     
    #define OFF HIGH
    #define ON LOW
     
    const int capteurFiltre = 27;
    const int thermostats = 17;
     
    Gainable::Gainable()
    {
        qDebug() << "Gainable";
     
        pinMode (capteurFiltre, INPUT_PULLUP);
        pinMode (thermostats, INPUT_PULLUP);
     
        gainableDs18b20 = new DS18B20();
     
        fonctionsGainable();
    }
     
    Gainable::~Gainable()
    {
        qDebug() << "Destructeur";
    }
     
    void Gainable::commandeGainable()
    {
        if (chronoNettoyageFiltre >= tempsNettoyageFiltre) {
            etatFiltreANettoyer();
        }
        if (digitalRead (thermostats) == OFF) {
            etatArretGainable();
        }
    }
     
    void Gainable::etatModes()
    {
        transitionGainable = MODES;
    }
     
    void Gainable::etatModeFroid()
    {
        transitionGainable = FROID;
    }
     
    void Gainable::etatModeChauffage()
    {
        transitionGainable = CHAUFFAGE;
    }
     
    void Gainable::etatFiltreANettoyer()
    {
         qDebug() << "***ATTENTION FILTRE A NETTOYER***";
    }
     
    void Gainable::etatArretGainable()
    {
        transitionGainable = ARRET_GAINABLE;
    }
     
    void Gainable::fonctionsGainable() {
     
        while(1) {
            time_t rawtime;
            time ( & rawtime);
            qDebug() << ctime ( & rawtime);
     
            commandeGainable();
     
            switch (transitionGainable) {
     
                case MODES:
     
                qDebug() << "MODES";
     
                gainableDs18b20 ->tempExt();
     
                if (gainableDs18b20 ->tempExtLue < 13.5) { // si la temperature ext(nord moyenne regionnale) est inferieur as 13.5°
                    etatModeChauffage();
                } else {
                    etatModeFroid();
                }
     
                //delete gainableDs18b20;
     
                break;
     
                case FROID:
     
                qDebug() << "FONCTION_FROID";
     
                //gainableFroid = new Froid();
                //gainableFroid ->modeFroid();
     
                break;
     
                case CHAUFFAGE:
     
                qDebug() << "FONCTION_CHAUFFAGE";
     
     
                break;
     
                case ARRET_GAINABLE:
     
                qDebug() << "ARRET_GAINABLE";
     
                if (digitalRead(thermostats) == ON) {
                    etatModes();
                }
     
                break;
            }
     
        }
    }

  19. #19
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #ifndef FROID_H
    #define FROID_H
     
    #include <ctime>
     
    #include "gainable.h"
    #include "ds18b20.h"
     
    class Froid
    {
     
    public:
        Froid();
     
        ~Froid();
     
        bool degivrageFroid = false;
     
        void modeFroid();
        void marcheFroid();
        void arretFroid();
     
    private:
        DS18B20 *froidDs18b20;
     
        int tempoVoletsFr = 10; // 10 secondes
        unsigned long long departTempoVoletsFr;
     
        int tempoControleTemperatureFr = 30; // 300 secondes (5 minutes)
        unsigned long long departTempoControleTemperatureFr;
     
        int tempoV4VFr = 4.5; // 45 secondes
        unsigned long long departTempoV4VFr;
     
        int tempoCompresseurFr = 9; // 1 minute 30 secondes
        unsigned long long departTempoCompresseurFr;
     
        int tempoDegivrageFroid = 12; // 2 minutes
        unsigned long long departTempoDegivrageFroid;
     
        int tempoControleDegivrageFroid = 120; // 20 minutes
        unsigned long long departTempoControleDegivrageFroid;
     
        int tempoEgouttageFr = 30; // 5 minutes
        unsigned long long departTempoEgouttageFr;
     
        int tempoFinEgouttageFroid = 10; // 1 minutes
        unsigned long long departTempoFinEgouttageFroid;
     
        enum
        {
            MARCHE_FROID,
            TEMPO_VOLETS_FROID,
            TEMPO_CONTROLE_TEMPERATURE_FROID,
            TEMPO_V4V_FROID,
            TEMPO_COMPRESSEUR_FROID,
            TEMPO_CONTROLE_TEMPERATURE_DEGIVRAGE_FROID,
            CONTROLE_DEGIVRAGE_FROID,
            FIN_DEGIVRAGE_FROID,
            TEMPO_EGOUTTAGE_FROID,
            TEMPO_FIN_EGOUTTAGE_FROID,
            ARRET_FROID,
        } transitionGainableFroid = MARCHE_FROID;
     
        void compteurFiltreFroid();
     
        void etatMarcheFroid();
        void tempoVolets();
        void etatVoletsFroid();
        void etatControleTemperatureFroid();
        void etatDepartCanicule();
        void etatDepartFroid();
        void etatVentilationsFroid();
        void etatVentilationsCanicule();
        void etatV4VFroid();
        void etatCompresseurFroid();
        void etatControleDegivrageFroid();
        void etatControleTemperatureDegivrageFroid();
        void etatFinDegivrageFroid();
        void etatEgouttageFroid();
        void etatFinEgouttageFroid();
        void etatArretFroid();
     
        void etatAutoModeChauffage();
    };
     
    #endif //FROID_H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
     
    #include "froid.h"
     
    #include <QDebug>
     
    Froid::Froid()
    {
        froidDs18b20 = new DS18B20();
        modeFroid();
    }
     
    Froid::~Froid()
    {
     
    }
     
    void Froid::marcheFroid()
    {
        transitionGainableFroid = MARCHE_FROID;
    }
     
    void Froid::etatMarcheFroid()
    {
        //froidRelais.desactiveRelaiEteHiver();
        departTempoVoletsFr = time(NULL);
        transitionGainableFroid = TEMPO_VOLETS_FROID;
    }
     
    void Froid::etatVoletsFroid()
    {
        //froidRelais.activeRelaisVentilationInt();
        departTempoControleTemperatureFr = time(NULL);
        transitionGainableFroid = TEMPO_CONTROLE_TEMPERATURE_FROID;
    }
     
    void Froid::etatControleTemperatureFroid()
    {
        //froidRelais.activeRelaisVentilationInt();
    }
     
    void Froid::etatDepartFroid()
    {
        //froidRelais.activeRelaisVentFroid();
        departTempoV4VFr = time(NULL);
        transitionGainableFroid = TEMPO_V4V_FROID;
    }
     
    void Froid::etatDepartCanicule()
    {
        //froidRelais.activeRelaisVentCanicule();
        departTempoV4VFr = time(NULL);
        transitionGainableFroid = TEMPO_V4V_FROID;
    }
     
    void Froid::etatAutoModeChauffage()
    {
     
    }
     
    void Froid::etatVentilationsFroid()
    {
        //froidRelais.activeRelaisVentFroid();
    }
     
    void Froid::etatVentilationsCanicule()
    {
        //froidRelais.activeRelaisVentCanicule();
    }
     
    void Froid::etatV4VFroid()
    {
        //froidRelais.activeRelaiV4V();
        //compteurV4V++;
        departTempoCompresseurFr = time(NULL);
        transitionGainableFroid = TEMPO_COMPRESSEUR_FROID;
    }
     
    void Froid::etatCompresseurFroid()
    {
        //froidRelais.activeRelaiComp();
        //compteurComp++;
        departTempoControleDegivrageFroid = time(NULL);
        transitionGainableFroid = TEMPO_CONTROLE_TEMPERATURE_DEGIVRAGE_FROID;
    }
     
    void Froid::etatControleDegivrageFroid()
    {
        departTempoDegivrageFroid = time(NULL);
        //froidRelais.forceVentIntDegFr = true;
        transitionGainableFroid = CONTROLE_DEGIVRAGE_FROID;
    }
     
    void Froid::etatControleTemperatureDegivrageFroid()
    {
        departTempoDegivrageFroid = time(NULL);
        //froidRelais.forceVentIntDegFr = false;
        transitionGainableFroid = CONTROLE_DEGIVRAGE_FROID;
    }
     
    void Froid::etatFinDegivrageFroid()
    {
        //froidRelais.desactiveTousRelais();
        //compteurDegFr++;
        transitionGainableFroid = FIN_DEGIVRAGE_FROID; // passe en degivrage
    }
     
    void Froid::etatEgouttageFroid()
    {
        departTempoEgouttageFr = time(NULL);
        //compteurEgouttageFr++;
        transitionGainableFroid = TEMPO_EGOUTTAGE_FROID;
    }
     
    void Froid::etatFinEgouttageFroid()
    {
        departTempoFinEgouttageFroid = time(NULL);
        //compteurFinEgouttageFr++;
        //froidRelais.activeRelaisVentEgouttageFr();
        transitionGainableFroid = TEMPO_FIN_EGOUTTAGE_FROID;
    }
     
    void Froid::arretFroid()
    {
     
    }
     
    void Froid::etatArretFroid()
    {
        //froidRelais.desactiveTousRelais();
        //compteurFiltreFroid();
     
    }
     
    void Froid::modeFroid()
    {
        while (1) {
     
    	switch (transitionGainableFroid) {
     
    	    case MARCHE_FROID:
     
    	    qDebug() << "MARCHE_FROID";
     
    	    etatMarcheFroid();
     
    	    break;
     
    	    case TEMPO_VOLETS_FROID:
     
    	    qDebug() << "TEMPO_VOLETS_FROID";
     
    	    if (time(NULL) - departTempoVoletsFr >= tempoVoletsFr) { // tempo de 10 secondes pour l'initialisation des volets
    		etatVoletsFroid();
    	    }
     
    	    break;
     
    	    case TEMPO_CONTROLE_TEMPERATURE_FROID:
     
    	    qDebug() << "TEMPO_CONTROLE_TEMPERATURE_FROID";
     
    	    if (time(NULL) - departTempoControleTemperatureFr >= tempoControleTemperatureFr) { // tempo de 3 minutes
    		froidDs18b20 ->tempExt();
    		froidDs18b20 ->tempUnitInt();
    		if (froidDs18b20 ->tempExtLue >= 30) { // si la temperature ext est supperieur à consigne canicule
    		    froidDs18b20 -> tempUnitInt();
    		    froidDs18b20 ->consigneInterieurCanicule();
    		    if (froidDs18b20 ->tempUnitIntLue >= froidDs18b20 ->consigneIntCa) {
    			etatDepartCanicule();
    			} else {
    			    departTempoControleTemperatureFr = time(NULL);
    			}
    		    } else if (froidDs18b20 ->tempUnitIntLue >= 23) { // si la temperature unite interieur est supperieur à consigne froid
    			etatDepartFroid();
    		    /*} else if (froidTemperatures ->temperatureUnitInt < froidConsignes ->consigneDepartChauffageEnFroid) { // si non si la temperature unite interieur est inferieur à consigne chauffage
    		     * etatAutoModeChauffage();*/
    		    } else {
    			departTempoControleTemperatureFr = time(NULL);
    		    }
    		} else {
    		    etatControleTemperatureFroid();
    		}
     
    	    break;
     
    	    case TEMPO_V4V_FROID:
     
    	    qDebug() << "TEMPO_V4V_FROID";
     
    	    if (time(NULL) - departTempoV4VFr >= tempoV4VFr) {
    		etatV4VFroid();
    	    } else {
    		/*if (passeEnModeCanicule == true) {
    		    etatVentilationsCanicule();
    		} else {*/
    		etatVentilationsFroid();
    		//}
    	    }
     
    	    break;
     
    	    case TEMPO_COMPRESSEUR_FROID:
     
    	    qDebug() << "TEMPO_COMPRESSEUR_FROID";
     
    	    if (time(NULL) - departTempoCompresseurFr >= tempoCompresseurFr) {
    		etatCompresseurFroid();
    	    } else {
    	    /*if (passeEnModeCanicule == true) {
    		etatVentilationsCanicule();
    	    } else {*/
    	        etatVentilationsFroid();
    	    //}
    	    }
     
    	    break;
     
    	    case TEMPO_CONTROLE_TEMPERATURE_DEGIVRAGE_FROID:
     
    	    qDebug() << "TEMPO_CONTROLE_TEMPERATURE_DEGIVRAGE_FROID";
     
    	    if (time(NULL) - departTempoControleDegivrageFroid >= tempoControleDegivrageFroid) { // tempo 20 minutes
    		froidDs18b20 ->tempEchangeurInt();
    		if (froidDs18b20 ->tempEchangeurIntLue < - 3.0) { // si temperature echangeur interieur est inferieur as -3°C (reglable)
    		    etatControleDegivrageFroid();
    		} else {
    		    departTempoControleDegivrageFroid = time(NULL);
    		}
    	    } else {
    	    /*if (passeEnModeCanicule == true) {
    		etatVentilationsCanicule();
    	    } else {*/
    	        etatVentilationsFroid();
    	    //}
    	    }
     
    	    break;
     
    	    case CONTROLE_DEGIVRAGE_FROID:
     
    	    qDebug() << "CONTROLE_DEGIVRAGE_FROID";
     
    	    if (time(NULL) - departTempoDegivrageFroid >= tempoDegivrageFroid) { // tempo 2 minutes
    		froidDs18b20 ->tempEchangeurInt();
    		if (degivrageFroid == true) {
    		    transitionGainableFroid = FIN_DEGIVRAGE_FROID; 
    		} else if (froidDs18b20 ->tempEchangeurIntLue <= - 3.0) { // si la temperature echangeur est a -3°C 
    		    etatFinDegivrageFroid();
    		} else {
    		    etatControleTemperatureDegivrageFroid();
    		}
    	    } else {
    		/*if (passeEnModeCanicule == true) {
    		    etatVentilationsCanicule();
    		} else {*/
    		    etatVentilationsFroid();
    		//}
    	    }
     
    	    break;
     
    	    case FIN_DEGIVRAGE_FROID:
     
    	    qDebug() << "FIN_DEGIVRAGE_FROID";
     
    	    froidDs18b20 ->tempEchangeurInt();
    	    if (froidDs18b20 ->tempEchangeurIntLue >= 12.0) {//froidConsignes ->consigneFinDegFr) { // si la temperature est supperieur as 12°C
    		etatEgouttageFroid();
    	    } else {
    		etatControleTemperatureDegivrageFroid();
    	    }
     
    	    break;
     
    	    case TEMPO_EGOUTTAGE_FROID:
     
    	    qDebug() << "TEMPO_EGOUTTAGE_FROID";
     
    	    if (time(NULL) - departTempoEgouttageFr >= tempoEgouttageFr) {
    		etatFinEgouttageFroid();
    	    }
     
    	    break;
     
    	    case TEMPO_FIN_EGOUTTAGE_FROID:
     
    	    qDebug() << "TEMPO_FIN_EGOUTTAGE_FROID";
     
    	    if (time(NULL) - departTempoFinEgouttageFroid >= tempoFinEgouttageFroid) {
    		etatMarcheFroid();
    	    }
     
    	    break;
     
    	    case ARRET_FROID:
     
    	    qDebug() << "ARRET_FROID";
     
    	    break;
    	}
        }
    }

  20. #20
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #pragma once
     
    const int PIN_MAX=28;
    const int OUTPUT=0;
    const int INPUT=1;
    const int INPUT_PULLUP=2;
    const int INPUT_PULLDOWN=3;
    const int OPENDRAIN_PULLUP=4 ;
    const int LOW=0;
    const int HIGH=1;
    bool pinMode (int pin,int  mode);
    void digitalWrite (int pin,int  output);
    int digitalRead (int pin);
     
    extern struct gpiod_line  *gpioline[PIN_MAX];
    extern bool isPinExported (int pin);
    bool init_gpiod();
    void release_gpiod();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #include "gpioPin.hpp"
    #include <iostream>
    #include <gpiod.h>
     
    using namespace std;
     
    // gpiod
     
    struct gpiod_chip  *gpiochip;
    struct gpiod_line  *gpioline[PIN_MAX];
     
    bool  init_gpiod() {
      gpiochip = gpiod_chip_open_by_name ("gpiochip4");
     
      if (gpiochip == NULL)
        gpiochip = gpiod_chip_open_by_name ("gpiochip0");
     
      if (gpiochip == NULL) {
        printf ("unable to open GPIO\n");
        return false;
        }
      for (int loop=0; loop<PIN_MAX; loop++)
        gpioline[loop]=NULL;
      return true;
      }
     
     
     
    bool  pinMode (int pin,int  mode) {
      bool flag=false;
      if (pin<0) return false;
      if (pin>=PIN_MAX) return false;
     
      if (gpiochip==NULL)
        init_gpiod();
      if (gpiochip==NULL)
        return false;
     
      // Pin initialise
      if (gpioline[pin]!=NULL)
        gpiod_line_release (gpioline[pin]);
     
      gpioline[pin] = gpiod_chip_get_line (gpiochip,pin);
     
      if (gpioline[pin] == NULL)
        return false;
     
      switch (mode) {
     
        case OUTPUT:
          flag=gpiod_line_request_output (gpioline[pin],"ardEmul",0) ==0;
          break;
        case INPUT:
          flag=gpiod_line_request_input (gpioline[pin],"ardEmul") ==0;
          break;
     
        case INPUT_PULLUP:
          flag=gpiod_line_request_input_flags (gpioline[pin],"ardEmul",
                                               GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP) ==0;
          break;
     
        case INPUT_PULLDOWN:
          flag=gpiod_line_request_input_flags (gpioline[pin],"ardEmul",
                                               GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN) ==0;
          break;
     
        case OPENDRAIN_PULLUP:
          flag=gpiod_line_request_output_flags (gpioline[pin],"ardEmul",
                                                GPIOD_LINE_REQUEST_FLAG_OPEN_DRAIN|GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP,1) ==0;
     
        }
      return flag;
     
      // besoin de configurer la broche
      }
     
    void release_gpiod (void) {
      if (gpiochip!=NULL) {
        for (int loop=0; loop<PIN_MAX; loop++)
          if (gpioline[loop]!=NULL) {
            gpiod_line_release (gpioline[loop]);
            gpioline[loop]=NULL;
            }
        gpiod_chip_close (gpiochip);
        gpiochip=NULL;
        }
      }
     
     
     
    void digitalWrite (int pin,int  output) {
      if (pin >= PIN_MAX)
        return;
      if (gpioline[pin]==NULL)
        pinMode (pin,OUTPUT);
      gpiod_line_set_value (gpioline[pin],output);
      }
     
     
    int digitalRead (int pin) {
      if (pin >= PIN_MAX)
        return -1;
     
      if (gpioline[pin]==NULL)
        pinMode (pin,INPUT_PULLUP);
      return gpiod_line_get_value (gpioline[pin]);
      }

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo