Partage
  • Partager sur Facebook
  • Partager sur Twitter

ESP32, MySensors, fonctions et... POINTEURS !!

Sujet résolu
    11 octobre 2023 à 9:53:03

    Bonjour à tous.
    J'aimerais réaliser un code qui me permette d'ouvrir une porte à distance à l'aide de la bibliothèque MySensors.
    J'ai donc un code plutôt moche qui fonctionne, mais j'aimerais le rendre plus optimisé et plus lisible.
    J'ai donc ceci maintenant : 
    Dans mon fichier "main.ino" : 
    #include <MySensors.h>
    #include "Gestion_Porte.hpp"
    
    void receive(const MyMessage &message) // Lors de réception d'un message.
    {
    	if (message.sensor == ID_GESTION_PORTE) // Si c'est message du noeud 0 (gestion de la porte) :
    	{
    		if (message.getBool())
    			Ouverture_Porte(&debugMessage, &etatPorteMessage);
    		else
    			Fermeture_Porte(&debugMessage, &etatPorteMessage);
    		delay(10);
    	}
    et dans un fichier  Gestion_Porte.hpp j'ai : 
    #ifndef GESTIONPORTE_HPP
        #define GESTIONPORTE_HPP
    
        #include <Arduino.h>
        #include <MySensors.h>
    
        void Ouverture_Porte(MyMessage *pDebugMessage, MyMessage *pEtatPorteMessage);
        void Fermeture_Porte(MyMessage *pDebugMessage, MyMessage *pEtatPorteMessage);
    
    #endif
    Dans le fichier Gestion_Porte.ino :  
    void Ouverture_Porte(MyMessage *pDebugMessage, MyMessage *pEtatPorteMessage)
    {
        unsigned char ouvertureOk = 0;
    
    	pDebugMessage->set("Ouverture de la porte");
    	send(*pDebugMessage);
    
    	if (digitalRead(PIN_FDC_OPEN)) // Si le détecteur de fin de course ouverture n'est pas actif, alors :
        {
            uint64_t timeCount = millis();
    
            digitalWrite(PIN_RELAY_PORTE,HIGH); // Alim 12V pour moteur.
            delay(20);
    
            ledcAttachPin(PIN_DRIVER_IN1, 0); // Attache la pin PIN_DRIVER_IN1 au canal pwm N°0 configuré ci-après.
    	    ledcWrite(0, 250); // Initialise le canal pwm 0 (voir setup()) à un signal pwm de 254 (= 1 logique).
    	    digitalWrite(PIN_DRIVER_IN2, LOW);
    
            while (digitalRead(PIN_FDC_OPEN) && ouvertureOk != 2) // Tant que le fin de course ouverture n'est pas actif :
            {
                if (millis() - timeCount > DELAY_OUVERTURE) // Si on est dans cette boucle plus longtemps que DELAY_OUVERTURE, alors :
                {
                    ouvertureOk = 2; // Valeur 2 = erreur.
                    pDebugMessage->set("Porte bloquee");
                }
    
                delay(2);
            } 
            
            ledcWrite(0, 0); // Met la vitesse du moteur à 0.
            ledcDetachPin(PIN_DRIVER_IN1); // Detache la pin PIN_DRIVER_IN1 du canal pwm N°0.
            digitalWrite(PIN_RELAY_PORTE,LOW); // Coupe l'alim 12V.
            //pinMode(PIN_DRIVER_IN2, INPUT);        
        }
    
    	if(!digitalRead(PIN_FDC_OPEN)) // Si le détecteur de fin de course ouverture est actif,
    	{
            ouvertureOk = 1; // Valeur 1 = Ouvert.
            pDebugMessage->set("Porte ouverte");
        }
    
    	pEtatPorteMessage->set(ouvertureOk); // ouvertureOK = soit 1 soit 2.
    	send(*pDebugMessage);
        send(*pEtatPorteMessage);
    }
    Je n'arrive pas à le compiler et j'ai ce message d'erreur :
    c:/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio\build\ESP32\src\main.cpp.o:C:\usr\Bureau\Emeteur_Recepteur RF24 ESP32 (Poulailler)/.pio/libdeps/ESP32/MySensors/core/MyTransport.cpp:46: multiple definition of `_transportReady_cb'; .pio\build\ESP32\src\Gestion_Porte.cpp.o:C:\usr\OneDrive\Bureau\Emeteur_Recepteur RF24 ESP32 (Poulailler)/.pio/libdeps/ESP32/MySensors/core/MyTransport.cpp:46: first defined here
    c:/usr/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio\build\ESP32\src\main.cpp.o: in function `stReadyTransition()':
    
    et tout plein de messages de la sorte.
    Je crois comprendre que le problème viendrait du fait que j'ai le "#include <MySensors>" dans le main et le Gestion_Porte mais du coup je ne comprends pas comment faire avec les pointeurs dans mon fichier Gestion_Porte.
    Si quelqu'un peut m'aider ce sera avec plaisir :-°
    Merci.

    -
    Edité par Aperosia 11 octobre 2023 à 9:56:53

    • Partager sur Facebook
    • Partager sur Twitter
      16 octobre 2023 à 8:08:51

      Petit update :
      Ne trouvant aucune solutions, j'ai réécris un programme SIMPLE (testé sur l'ide Arduino et également sur Visual studio code), qui à fonctionné que je vous poste ici : 
      #define MY_RADIO_RF24
      #define MY_RF24_CE_PIN GPIO_NUM_22
      #define MY_RF24_CS_PIN GPIO_NUM_21
      #define MY_RF24_IRQ_PIN GPIO_NUM_0
      #define MY_RF24_PA_LEVEL (RF24_PA_MIN) // RF24_PA_LOW, RF24_PA_MIN, RF24_PA_HIGH, RF24_PA_MAX
      #define MY_RF24_DATARATE (RF24_250KBPS)
       
      #include <Arduino.h>
      #include <MySensors.h>
      //#include "testInclude.hpp"
       
      #define ID_DEBUG 0
       
      void testPointeurMain(MyMessage *pDebugMessage);
       
      MyMessage debugMessage(ID_DEBUG, V_VAR1);
       
      void setup() 
      {
        debugMessage.set("Coucou1");
        send(debugMessage);
      }
       
      void loop() 
      {
        testPointeurMain(&debugMessage);
        //SecondTest(&debugMessage);
      }
       
      void testPointeurMain(MyMessage *pDebugMessage)
      {
        pDebugMessage->set("coucou2");
        send(*pDebugMessage);
      }
      Ce code je l'écris dans mon fichier "main.cpp" (ou "main.ino") et il compile correctement.
      Maintenant si je créé un fichier "testInclude.hpp" dans lequel j'ai : 
      #ifndef TESTINCLUDE_HPP
      #define TESTINCLUDE_HPP
       
      #define MY_RADIO_RF24
      #define MY_RF24_CE_PIN GPIO_NUM_22
      #define MY_RF24_CS_PIN GPIO_NUM_21
      #define MY_RF24_IRQ_PIN GPIO_NUM_0
      #define MY_RF24_PA_LEVEL (RF24_PA_MIN) // RF24_PA_LOW, RF24_PA_MIN, RF24_PA_HIGH, RF24_PA_MAX
      #define MY_RF24_DATARATE (RF24_250KBPS)
       
      #include <MySensors.h>
       
      void SecondTest(MyMessage *pDebugMessage);
       
      #endif
      le fichier "testInclude.cpp" dans lequel j'ai : 
      #include "testInclude.hpp"
       
      void SecondTest(MyMessage *pDebugMessage)
      {
          pDebugMessage->set("Coucou du fichier CPP");
          send(*pDebugMessage);
      }
      et mon main dans lequel j'ai : 
      #include <Arduino.h>
      #include "testInclude.hpp"
       
      #define ID_DEBUG 0
       
      void testPointeurMain(MyMessage *pDebugMessage);
       
      MyMessage debugMessage(ID_DEBUG, V_VAR1);
       
      void setup() 
      {
        debugMessage.set("Coucou1");
        send(debugMessage);
      }
       
      void loop() 
      {
        testPointeurMain(&debugMessage);
        SecondTest(&debugMessage);
      }
       
      void testPointeurMain(MyMessage *pDebugMessage)
      {
        pDebugMessage->set("coucou2");
        send(*pDebugMessage);
      }
      Ce code ne compile pas et me donne les mêmes messages d'erreur que le problème de mon sujet d'ouverture de post :
      .pio\build\ESP32\src\testInclude.cpp.o:(.bss._transportReady_cb+0x0): multiple definition of `_transportReady_cb'
      .pio\build\ESP32\src\main.cpp.o:(.bss._transportReady_cb+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `stReadyTransition()':
      testInclude.cpp:(.text._Z17stReadyTransitionv+0x0): multiple definition of `stReadyTransition()'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z17stReadyTransitionv+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `stFailureTransition()':
      testInclude.cpp:(.text._Z19stFailureTransitionv+0x0): multiple definition of `stFailureTransition()'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z19stFailureTransitionv+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `hwInit()':
      testInclude.cpp:(.text._Z6hwInitv+0x0): multiple definition of `hwInit()'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z6hwInitv+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `hwReadConfigBlock(void*, void*, unsigned int)':
      testInclude.cpp:(.text._Z17hwReadConfigBlockPvS_j+0x0): multiple definition of `hwReadConfigBlock(void*, void*, unsigned int)'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z17hwReadConfigBlockPvS_j+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `stInitTransition()':
      testInclude.cpp:(.text._Z16stInitTransitionv+0x0): multiple definition of `stInitTransition()'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z16stInitTransitionv+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `hwWriteConfigBlock(void*, void*, unsigned int)':
      testInclude.cpp:(.text._Z18hwWriteConfigBlockPvS_j+0x0): multiple definition of `hwWriteConfigBlock(void*, void*, unsigned int)'.pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z18hwWriteConfigBlockPvS_j+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `hwReadConfig(int)':
      testInclude.cpp:(.text._Z12hwReadConfigi+0x0): multiple definition of `hwReadConfig(int)'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z12hwReadConfigi+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `hwWriteConfig(int, unsigned char)':
      testInclude.cpp:(.text.app_main+0x0): multiple definition of `app_main'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text.app_main+0x0): first defined here
      .pio\build\ESP32\src\testInclude.cpp.o: In function `hwDebugPrint(char const*, ...)':
      testInclude.cpp:(.text._Z12hwDebugPrintPKcz+0x0): multiple definition of `hwDebugPrint(char const*, ...)'
      .pio\build\ESP32\src\main.cpp.o:main.cpp:(.text._Z12hwDebugPrintPKcz+0x0): first defined here
      collect2.exe: error: ld returned 1 exit status
      *** [.pio\build\ESP32\firmware.elf] Error 1
      Donc c'est le fait de déporter le fichier MySensors.h dans un fichier autre que le main qui me provoque cette erreur... Je ne comprends pas :'(

      -
      Edité par Aperosia 16 octobre 2023 à 8:11:39

      • Partager sur Facebook
      • Partager sur Twitter
        16 octobre 2023 à 22:18:51

        Et il y a quoi dans ce fichier MySensors.h qui semble impliqué dans les problèmes ?
        • Partager sur Facebook
        • Partager sur Twitter
          17 octobre 2023 à 8:07:42

          C'est la bibliothèque MySensors. J'en viens à me demander si elle est conçue pour fonctionner de la sorte ?!
          • Partager sur Facebook
          • Partager sur Twitter
            17 octobre 2023 à 9:23:25

            Ça donne l'impression que ledit  MySensors.h contient des définitions de fonctions.

            (À VÉRIFIER)

            Et donc chaque fois qu'on l'inclut, paf, les fonctions sont (re)définies.

            Il arrive malheureusement que le code écrit par les électroniciens ne respecte pas les bonnes pratiques de programmation (*) chères aux informaticiens. Ce sont des métiers différents. 

            (*) exemple : pas de définition de fonctions dans un .h. seulement des déclarations. Justement pour pouvoir inclure plusieurs fois.

            • Partager sur Facebook
            • Partager sur Twitter
              17 octobre 2023 à 10:02:23

              Alors il faudrait réécrire la bibliothèque :waw:

              Il y à effectivement des "#include "fichier.cpp""

              C'est de cela dont vous parlez ?

              -
              Edité par Aperosia 17 octobre 2023 à 10:05:29

              • Partager sur Facebook
              • Partager sur Twitter
                17 octobre 2023 à 12:12:16

                Un exemple rapide : le dernier message d'erreur se réfère à hwDebugPrint.

                J'ai téléchargé MySensors-2.3.2 et dézippé pour voir. Avec

                $ rgrep 'hwDebugPrint(' .
                ./MyConfig.h:#define DEBUG_OUTPUT(x,...)		hwDebugPrint(x, ##__VA_ARGS__)	//!< debug
                ./hal/architecture/MyHwHAL.h:void hwDebugPrint(const char *fmt, ...);
                ./hal/architecture/MyHwHAL.cpp:void hwDebugPrint(const char *fmt, ...)
                

                Je vois que la fonction est  déclarée dans un .h et définie dans un .cpp.  OK.

                Mais qui fait l'inclusion de ces fichiers ?

                $ rgrep -n 'MyHwHAL' .
                ./MySensors.h:55:#include "hal/architecture/MyHwHAL.h"
                ./MySensors.h:86:#include "hal/architecture/MyHwHAL.cpp"
                ./hal/architecture/MyHwHAL.h:21:* @file MyHwHAL.h
                ./hal/architecture/MyHwHAL.h:26:#ifndef MyHwHAL_h
                ./hal/architecture/MyHwHAL.h:27:#define MyHwHAL_h
                ./hal/architecture/MyHwHAL.cpp:20:#include "MyHwHAL.h"
                

                Apparemment, il y a un truc avec MySensors.h  qui fait l'inclusion des DEUX.

                On dirait que MySensors.h est un fourre-tout qio sert à rassembler les codes sources spécifiques des différentes plateformes matérielles

                // HARDWARE
                #include "hal/architecture/MyHwHAL.h"
                #include "hal/crypto/MyCryptoHAL.h"
                #if defined(ARDUINO_ARCH_ESP8266)
                #include "hal/architecture/ESP8266/MyHwESP8266.cpp"
                #include "hal/crypto/generic/MyCryptoGeneric.cpp"
                #elif defined(ARDUINO_ARCH_ESP32)
                #include "hal/architecture/ESP32/MyHwESP32.cpp"
                #include "hal/crypto/ESP32/MyCryptoESP32.cpp"
                #elif defined(ARDUINO_ARCH_AVR)
                #include "hal/architecture/AVR/MyHwAVR.cpp"
                #include "hal/crypto/AVR/MyCryptoAVR.cpp"
                


                mais aussi redéfinir les macros qui manquent parfois (min, max...)

                et probablement d'autres trucs.

                Bref, c'est le bazar.

                Par ailleurs, si on regarde les exemples fournis :

                $ tree examples
                examples
                ├── AirQualitySensor
                │   └── AirQualitySensor.ino
                ├── BatteryPoweredSensor
                │   └── BatteryPoweredSensor.ino
                ├── BinarySwitchSleepSensor
                │   └── BinarySwitchSleepSensor.ino
                ├── ClearEepromConfig
                │   └── ClearEepromConfig.ino
                ├── CO2Sensor
                │   └── CO2Sensor.ino
                ├── DimmableLEDActuator
                │   └── DimmableLEDActuator.ino
                ├── DimmableLight
                │   └── DimmableLight.ino
                ├── DustSensor
                │   └── DustSensor.ino
                ├── DustSensorDSM
                │   └── DustSensorDSM.ino
                ├── EnergyMeterPulseSensor
                │   └── EnergyMeterPulseSensor.ino
                ├── GatewayESP32
                │   └── GatewayESP32.ino
                ├── GatewayESP32MQTTClient
                │   └── GatewayESP32MQTTClient.ino
                ├── GatewayESP32OTA
                │   └── GatewayESP32OTA.ino
                ├── GatewayESP8266
                │   └── GatewayESP8266.ino
                ├── GatewayESP8266MQTTClient
                │   └── GatewayESP8266MQTTClient.ino
                ├── GatewayESP8266OTA
                │   └── GatewayESP8266OTA.ino
                ├── GatewayGSMMQTTClient
                │   └── GatewayGSMMQTTClient.ino
                ├── GatewaySerial
                │   └── GatewaySerial.ino
                ├── GatewaySerialRS485
                │   └── GatewaySerialRS485.ino
                ├── GatewayW5100
                │   └── GatewayW5100.ino
                ├── GatewayW5100MQTTClient
                │   └── GatewayW5100MQTTClient.ino
                ├── LightSensor
                │   └── LightSensor.ino
                ├── LogOTAGateway
                │   └── LogOTAGateway.ino
                ├── LogOTANode
                │   └── LogOTANode.ino
                ├── MockMySensors
                │   ├── MockMySensors.ino
                │   └── README.md
                ├── MotionSensor
                │   └── MotionSensor.ino
                ├── MotionSensorRS485
                │   └── MotionSensorRS485.ino
                ├── Node2Node
                │   └── Node2Node.ino
                ├── PassiveNode
                │   └── PassiveNode.ino
                ├── PHSensor
                │   └── PHSensor.ino
                ├── PingPongSensor
                │   ├── MYSLog.h
                │   └── PingPongSensor.ino
                ├── RelayActuator
                │   └── RelayActuator.ino
                ├── RepeaterNode
                │   └── RepeaterNode.ino
                ├── RFM69_RFM95_ATC_SignalReport
                │   └── RFM69_RFM95_ATC_SignalReport.ino
                ├── SecretKnockSensor
                │   └── SecretKnockSensor.ino
                ├── SecureActuator
                │   └── SecureActuator.ino
                ├── SecurityPersonalizer
                │   ├── SecurityPersonalizer.ino
                │   ├── sha204_library.cpp
                │   ├── sha204_library.h
                │   └── sha204_lib_return_codes.h
                ├── SensebenderGatewaySerial
                │   └── SensebenderGatewaySerial.ino
                ├── SoilMoistSensor
                │   └── SoilMoistSensor.ino
                ├── UVSensor
                │   └── UVSensor.ino
                ├── VibrationSensor
                │   └── VibrationSensor.ino
                └── WaterMeterPulseSensor
                    └── WaterMeterPulseSensor.ino
                
                43 directories, 47 files
                

                il y en a un seul SecurityPersonalizer qui ne soit pas réduit à un fichier unique (.ino), et MySensors.h n'est inclus qu'une fois.



                -
                Edité par michelbillaud 17 octobre 2023 à 21:51:22

                • Partager sur Facebook
                • Partager sur Twitter
                  17 octobre 2023 à 14:10:39

                  Oui donc en l'état, la bibliothèque est assez "limitée" quoi. 

                  Dans le sens ou on peut pas trop l'utiliser comme on le souhaite (ou comme je le souhaite en l'occurrence).

                  Ce serait jouable pour quelqu'un comme moi (qui à un niveau, je pense, dans la moyenne mais basse en programmation) de modifier ce qu'il y aurait à modifier pour rendre possible ce que je cherche à faire ? Ou déjà quelqu'un qui s'y connait s'y casserait les dents ? (je demande avant d'entamer la chose et de déprimer)... :-°

                  -
                  Edité par Aperosia 17 octobre 2023 à 14:13:34

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 octobre 2023 à 7:39:07

                    Si c'est pour écrire quelques programmes seulement autant prendre la bibliothèque comme elle est, avec ses défauts.    Question de rentabilité de l'investissement...

                    Il y a aussi que si on l'améliore de son côté, on sort du circuit on ne bénéficie plus des mises à jour, qu'il faudra reporter à la main.

                    -
                    Edité par michelbillaud 18 octobre 2023 à 7:41:01

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 octobre 2023 à 16:15:22

                      Ok merci quand même :) je vais m'en accommoder du coup.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 octobre 2023 à 19:18:06

                        Mais bon, je dis ça, mais essayer de "refactorer" le code, c'est un bon exercice.

                        Le problème sera de tester les exemples, faut le matériel.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 octobre 2023 à 14:20:56

                          Peut-être à l'occasion je m'y casserai quelques ratiches :lol: j'ai ce qu'il faut à la maison pour tester. Deja si j'arrive à faire un programme qui se compile après avoir modifié la bibliothèque ce sera déjà un grand pas :p
                          • Partager sur Facebook
                          • Partager sur Twitter

                          ESP32, MySensors, fonctions et... POINTEURS !!

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown