L'objectif du C++ n'est pas de faire le code le plus court, C++ a pour objectif de simplifier la lisibilité, la maintenance et la réutilisation du code.
Sur le montage que vous avez, nous avons des composants physiques. Pour l'instant, nous n'avons que deux familles de composants :
L'idée est d'abstraire les composants par des classes qui offrent les fonctionalités d'une diode et d'un bouton poussoir en cachant l'ensemble des opérations de bas-niveaux que sont digitalRead()
, digitalWrite()
, pinMode()
etc.
En vous inspirant de ce qui a été fait sous Tinkercad, proposer une classe Led
en définissant :
Led
,Led
,Led
et pourquoi pas proposer aussi des opérations :
operator = (bool)
pour allumer éteindre la Led
,operator bool() const
pour récupérer l'état de la Led
,Led
ou avec une valeur booléenne : operator == ()
et
operator != ()
operator !()
.Tout ceci vous permettra de réaliser les opérations classiques sur la Led.
blink
que vous allez sauvegarder dans un répertoire.setup()
et loop()
. Normalement, il ne devrait y avoir aucune information dans le code setup()
.
L'idée est que vous ajouter une option debug
qui par défaut est à faux. De plus, il serait bien dans ce cas d'avoir aussi le nom de la “diode” pour pouvoir identifier le composant qui envoie des messages.
Led
pour contenir les deux informations supplémentaires, le nom de la diode ainsi qu'un drapeau (une valeur booléenne) qui indique si le mode débogage est activé.debug
est activé sur la diode. Le message doit contenir le nom de la diode ainsi que le nouvel état de celle-ci.En fait le mode débogage est un mode qui est intéressant pour tous les composants. On peut donc mutualiser partie du code pour tous les composants.
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
.
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); } } };
</hidden>
class CustomComponent { protected; CustomComponent(const char* name, bool debug) {} public: bool debugIsActive() const; const char* getName() const; const char* header() const; // Génère l'entête de message avec le nom du composant. };
Led
qui hérite désormais de cette classe de base.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(); } };
Précédent: Obtenir des informations
Suivant: Gérer deux LEDs