Bonjour,
Je suis en train de faire un développement sur un Arduino. Je veux faire une classe pour faire le Logging. Pour ne pas passer l'instance de Logger en paramètre aux autres classes, j'ai décidé de créer un singleton.
Mais depuis plusieurs jours j'essaie de créer cette classe et je n'arrive toujours pas à faire en sorte qu'elle soit utilisée à la fois par le fichier sketch et les autres classes. Je peux faire fonctionner la classe Logger soit pour l'un ou pour l'autre, mais pas les 2.
Voici le code:
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 //TestLogger.ino #include "MotorDriver.h" //#include "Logger.h" #include <Arduino.h> MotorDriver motorDriver; Logger* logger = NULL; //Logger::getInstance(Logger::DEBUG); void setup(){ // *logger = Logger::getInstance(Logger::DEBUG); *logger = Logger::getInstance(); logger->setLevel(Logger::DEBUG); logger->log(Logger::DEBUG, "start: "); } void loop(){ delay(2000); }
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 //Logger.h #ifndef LOGGER_H #define LOGGER_H #include <Arduino.h> //#include <string.h> class Logger{ private: // static Logger instance; Logger(){ Serial.begin(9600); Serial.println("Logger()"); }; public: static const byte OFF = 0; static const byte DEBUG = 1; static const byte INFO = 2; static const byte WARN = 3; static const byte ERROR = 4; static Logger& getInstance(){ static Logger instance; return instance; } // static Logger getInstance(byte level); void setLevel(byte level); void log(byte,String); }; #endif
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 //Logger.cpp #include "Logger.h" static Logger* instance = NULL; static byte loggerLevel=Logger::DEBUG; void Logger::setLevel(byte level){ // Serial.begin(9600); Serial.print("set level "); Serial.println(level, DEC); // delay(200); loggerLevel = level; if(level != OFF){ // Serial.begin(9600); } } void Logger::log(byte level, String str){ if (level >= loggerLevel){ Serial.println(str); } }
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 //MotorDriver.h #ifndef MOTOR_DRIVER_H #define MOTOR_DRIVER_H #include <Arduino.h> #include "Logger.h" class MotorDriver{ private: Logger *logger; //= Logger::getInstance(); public: MotorDriver(); void motorDrive(); }; #endifle code actuel le sketch affiche bien les messages suivants:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //MotorDriver.cpp #include "MotorDriver.h" MotorDriver::MotorDriver(){ // *logger = Logger::getInstance(); } //////////////// MOTOR DRIVER PART //////////////////////////////// void MotorDriver::motorDrive() { // logger.log(Logger::DEBUG, "motorDrive"); }
Mais lorsque je décommente la ligne 5 dans le constructeur de la classe MotorDriver, ça m'affiche seulement 2 caractères. Comme s'il existe 2 instances du singleton. J'ai essayé plusieurs solutions, mais je n'arrive toujours pas à faire en sorte que le Logger soit utilisé par 2 classes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Logger() set level 1 start:
Est ce que quelqu'un a une idée ?
![]()
Partager