User Tools

Site Tools


in202:seance_5:component_led

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
in202:seance_5:component_led [2021/04/30 09:48]
bmonsuez [Etape 2 : Implanter le code de la classe Led]
in202:seance_5:component_led [2022/11/18 10:46] (current)
Line 275: Line 275:
  
   * Ajouter ensuite les messages indiquant que la diode s'​allume ou s'​éteint lorsque le mode ''​debug''​ est activé sur la diode. Le message doit contenir le nom de la diode ainsi que le nouvel état de celle-ci.   * Ajouter ensuite les messages indiquant que la diode s'​allume ou s'​éteint lorsque le mode ''​debug''​ est activé sur la diode. Le message doit contenir le nom de la diode ainsi que le nouvel état de celle-ci.
 +
 +
 +<hidden Correction>​
 +Pour ce faire, nous devons ajoutons des informations complémentaires notre classe ''​Led''​ :
 +  * le nom de la diode (une chaîne de caractères),​
 +  * une variable booléenne qui indique si le mode //debug// est actif ou non.
 +
 +Donc nous ajoutons **deux champs privés** à la classe :
 +
 +<code cpp>
 +  const char* m_name;
 +  bool m_debug;
 +</​code>​
 +
 +Nous devons modifier les constructeurs pour initialiser ces champs supplémentaires.
 +
 +<code cpp>
 +  Led(uint32_t thePort, const char* theName, bool debugIsActive = false): ​
 +    Led(thePort,​ false, theName, debugIsActive)
 +  {}
 +  Led(uint32_t thePort, bool switchOnWhenStarted,​ const char* theName, bool debugIsActive = false): ​
 +    m_portNumber(thePort),​ m_isSwitchedOn(switchOnWhenStarted),​
 +    m_name(theName),​ m_debug(debugIsActive)
 +  {
 +    pinMode(m_portNumber,​ OUTPUT);
 +  }
 +</​code>​
 +
 +Nous modifions aussi les actions puisque nous souhaitons envoyer un message si le mode **debug** est actif :
 +
 +<code cpp>
 +
 +    void switchOn() ​
 +    { 
 +      if(!m_isSwitchedOn)
 +      {
 +        m_isSwitchedOn = true;
 +        digitalWrite(m_portNumber,​ HIGH);
 +        if(m_debug)
 +            Serial << "Led: " << m_name << ": switch on";
 +      }
 +    }
 +    void switchOff() ​
 +    { 
 +      if(m_isSwitchedOn)
 +      {
 +        m_isSwitchedOn = false;
 +        digitalWrite(m_portNumber,​ LOW);
 +        if(m_debug)
 +            Serial << "Led: " << m_name << ": switch off";
 +      }
 +    }  ​
 +</​code>​
 +
 +Voilà, il ne reste plus qu'à penser à initialiser ''​Serial''​ dans la fonction ''​setup()'',​ ce qui donne le code complet suivant :
 +
 +<code cpp>
 +
 +template<​class T>
 +UARTClass&​ operator << (UARTClass&​ theSerial, const T& theValue)
 +{
 +    theSerial.print(theValue);​
 +    return theSerial;
 +}
 +
 +class Led
 +{
 +private:
 +    bool m_isSwitchedOn;​
 +    uint32_t m_portNumber;​
 +    const char* m_name;
 +    bool m_debug;
 +public:
 +    Led(uint32_t thePort, const char* theName, bool debugIsActive = false): ​
 +      Led(thePort,​ false, theName, debugIsActive)
 +    {}
 +    Led(uint32_t thePort, bool switchOnWhenStarted,​ const char* theName, bool debugIsActive = false): ​
 +        m_portNumber(thePort),​ m_isSwitchedOn(switchOnWhenStarted),​
 +        m_name(theName),​ m_debug(debugIsActive)
 +    {
 +        pinMode(m_portNumber,​ OUTPUT);
 +    }
 +    bool isSwitchOn() const { return m_isSwitchedOn;​ }
 +    bool getPort() const { return m_portNumber;​ }
 + 
 +    void switchOn() ​
 +    { 
 +        if(!m_isSwitchedOn)
 +        {
 +            m_isSwitchedOn = true;
 +            digitalWrite(m_portNumber,​ HIGH);
 +            if(m_debug)
 +                Serial << "Led: " << m_name << ": switch on\n";
 +        }
 +    }
 +    void switchOff() ​
 +    { 
 +        if(m_isSwitchedOn)
 +        {
 +            m_isSwitchedOn = false;
 +            digitalWrite(m_portNumber,​ LOW);
 +            if(m_debug)
 +                Serial << "Led: " << m_name << ": switch off\n";​
 +        }
 +    }  ​
 +};
 +
 +Led builtinLed(LED_BUILTIN,​ "​Builtin",​ true);
 +
 +// the setup function runs once when you press reset or power the board
 +void setup() ​
 +{
 +  Serial.begin(9600);​
 +}
 +
 +// the loop function runs over and over again forever
 +void loop()
 +{
 +    builtinLed.switchOn();​
 +    delay(1000);​
 +    builtinLed.switchOff();​
 +    delay(1000);​
 +}
 +
 +</​code>​
 +</​hidden>​
  
 ===== Etape 4 : Profiter de l'​héritage ===== ===== Etape 4 : Profiter de l'​héritage =====
Line 281: Line 407:
  
 L'​idée est de proposer une classe de base que l'on appellera ''​CustomComponent''​ dont héritera l'​ensemble des autres classes composants comme par exemple ''​Led''​. L'​idée est de proposer une classe de base que l'on appellera ''​CustomComponent''​ dont héritera l'​ensemble des autres classes composants comme par exemple ''​Led''​.
 +
 +
 +<code cpp>
 +    bool isSwitchOn() const { return m_isSwitchedOn;​ }
 +    bool getPort() const { return m_portNumber;​ }
 +    ​
 +    void switchOn() ​
 +    { 
 +      if(!m_isSwitchedOn)
 +      {
 +        m_isSwitchedOn = true;
 +        digitalWrite(m_portNumber,​ HIGH);
 +      }
 +    }
 +    void switchOff() ​
 +    { 
 +      if(m_isSwitchedOn)
 +      {
 +        m_isSwitchedOn = false;
 +        digitalWrite(m_portNumber,​ LOW);
 +      }
 +    }
 +};
 +</​code>​
 +
 +
 +</​hidden>​
  
 <code cpp> <code cpp>
Line 286: Line 439:
   {   {
   protected;   protected;
-    CustomComponent(std::​string ​name, bool debug)+    CustomComponent(const char* name, bool debug)
     {}     {}
   public:   public:
     bool debugIsActive() const;     bool debugIsActive() const;
-    std::string getName() const; 
     ​     ​
-    ​std::​string ​header() const; // Génère l'​entête de message avec le nom du composant. ​   ​+    ​const char* getName() const; ​    
 +    const char* header() const; // Génère l'​entête de message avec le nom du composant. ​   ​
   };   };
  </​code>​  </​code>​
Line 301: Line 454:
  
   * Tester votre code.   * Tester votre code.
 +
 +<code cpp>
 +
 +class CustomComponent
 +{
 +  private: ​
 +    bool m_Debug;
 +    const char* m_Name;
 +  protected;
 +    CustomComponent(const char* theName, bool debug = false): ​
 +        Name(theName),​ m_Debug(debug)
 +    {}
 +  public:
 +    bool debugIsActive() const { return m_Debug; }
 +    ​
 +    bool EnableDebug() { m_Debug = true; }
 +    bool DisableDebug() { m_Debug = false; }
 +
 +    const char* getName() const { return m_Name; }
 +    String header() const  { return (String)m_Name + ": "; }
 +
 +};
 +
 +class Led: public CustomComponent
 +{
 +private:
 +    bool m_isSwitchedOn;​
 +    uint32_t m_portNumber;​
 +  public:
 +    Led(uint32_t thePort, const char* theName): Led(thePort,​ theName, false) {}
 +    Led(uint32_t thePort, const char* theName, bool switchOnWhenStarted):​ CustomComponent(theName,​ false),
 +        m_portNumber(thePort),​ m_isSwitchedOn(switchOnWhenStarted)
 +    {
 +        pinMode(m_portNumber,​ OUTPUT);
 +        if(switchOnWhenStarted)
 +          switchOn();
 +    }
 +    ​
 +
 +    ​
 +};
 +</​code>​
  
 ====== Navigation ====== ====== Navigation ======
in202/seance_5/component_led.1619776132.txt.gz · Last modified: 2021/04/30 09:48 by bmonsuez