Créer un singleton pour qu'il puisse être utilisé par 2 classes
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.
:arf:
Voici le code:
Code:
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:
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:
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:
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();
};
#endif |
Code:
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");
} |
le code actuel le sketch affiche bien les messages suivants:
Code:
1 2 3
| Logger()
set level 1
start: |
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.
Est ce que quelqu'un a une idée ?
:help: