This is an old revision of the document!
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.
Voilà, il ne reste plus qu'à penser à initialiser Serial
dans la fonction setup()
, ce qui donne le code complet suivant :
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); }
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
.
class CustomComponent { protected; CustomComponent(std::string name, bool debug) {} public: bool debugIsActive() const; std::string getName() const; std::string 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.Précédent: Obtenir des informations
Suivant: Gérer deux LEDs