A valider Gestion des CVs
This commit is contained in:
+47
-22
@@ -36,7 +36,7 @@ struct DCCAccessoryConfig {
|
||||
byte MotorSpeed; // Speed of the motor (0-255)
|
||||
byte ServoMaxUp; // Maximum position for servo up (0-180)
|
||||
byte ServoMaxDown; // Maximum position for servo down (0-180)
|
||||
};
|
||||
} MyConfig;
|
||||
|
||||
|
||||
NmraDcc Dcc;
|
||||
@@ -63,7 +63,7 @@ void notifyCVAck(void)
|
||||
|
||||
/**
|
||||
* Notifie le changement d'une CV.
|
||||
* @param CV Le numéro de la CV modifiée.
|
||||
* @param CV Le numéro de la CV à modifier.
|
||||
* @param Value La nouvelle valeur de la CV.
|
||||
*/
|
||||
void notifyCVChange(uint16_t CV, uint8_t Value)
|
||||
@@ -91,11 +91,16 @@ void notifyCVChange(uint16_t CV, uint8_t Value)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Appellé par le décodeur DCC pour vérifier si une CV est valide et peut être modifiée.
|
||||
* @param CV Le numéro de la CV.
|
||||
* @param Writable Indique si la CV est modifiable (1) ou non (0).
|
||||
* @return 1 si la CV est valide et modifiable, 0 sinon.
|
||||
*/
|
||||
uint8_t notifyCVValid (uint16_t CV, uint8_t Writable)
|
||||
{
|
||||
if (CV == CV_PALES_SPEED || CV == CV_MAX_UP || CV == CV_MAX_DOWN ||
|
||||
CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB ||
|
||||
CV == CV_ACCESSORY_DECODER_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
|
||||
CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB || CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -103,7 +108,7 @@ uint8_t notifyCVValid (uint16_t CV, uint8_t Writable)
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifie la réinitialisation des valeurs par défaut de la CV.
|
||||
* Notifie la demande de réinitialisation des valeurs par défaut de la CV.
|
||||
*/
|
||||
void notifyCVResetFactoryDefault()
|
||||
{
|
||||
@@ -112,25 +117,44 @@ void notifyCVResetFactoryDefault()
|
||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
|
||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||
MyConfig.address = DEFAULT_ADDRESS;
|
||||
MyConfig.MotorSpeed = DEFAULT_PALES_SPEED;
|
||||
MyConfig.ServoMaxUp = DEFAULT_MAX_UP;
|
||||
MyConfig.ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||
EEPROM.put(1, MyConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées.
|
||||
* Charge les valeurs par des CV
|
||||
* récupère les veleurs par défaut si elles n'ont pas encore été initialisées.
|
||||
*/
|
||||
void loadCvDefaultsIfNeeded()
|
||||
void loadCv()
|
||||
{
|
||||
if (EEPROM.read(EEPROM_SIG_ADDR) != EEPROM_SIG_VALUE) {
|
||||
if (Dcc.isSetCVReady()) {
|
||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
|
||||
|
||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||
}
|
||||
// Vérifie si les valeurs par défaut ont déjà été initialisées dans l'EEPROM
|
||||
if (EEPROM.read(EEPROM_SIG_ADDR) != EEPROM_SIG_VALUE)
|
||||
{
|
||||
// Non, pas de valeurs par défaut initialisées, donc on les initialise maintenant
|
||||
MyConfig.Sig = EEPROM_SIG_VALUE;
|
||||
MyConfig.ManufacturerID = DIY_MANUFACTURER_ID;
|
||||
MyConfig.Version = 1;
|
||||
MyConfig.address = DEFAULT_ADDRESS;
|
||||
MyConfig.MotorSpeed = DEFAULT_PALES_SPEED;
|
||||
MyConfig.ServoMaxUp = DEFAULT_MAX_UP;
|
||||
MyConfig.ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||
// Enregistrer la structure de configuration dans l'EEPROM
|
||||
EEPROM.put(1, MyConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Lire la structure de configuration depuis l'EEPROM
|
||||
EEPROM.get(1, MyConfig);
|
||||
}
|
||||
// Charger les valeurs des CV depuis la structure de configuration
|
||||
Dcc.setCV(CV_PALES_SPEED, MyConfig.MotorSpeed);
|
||||
Dcc.setCV(CV_MAX_UP, MyConfig.ServoMaxUp);
|
||||
Dcc.setCV(CV_MAX_DOWN, MyConfig.ServoMaxDown);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, MyConfig.address & 0xFF);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (MyConfig.address >> 8) & 0x07);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -212,17 +236,18 @@ void setup()
|
||||
servoMotor.attach(SERVO_PIN);
|
||||
servoMotor.write(90);
|
||||
|
||||
// Attachen l'interruption pour le signal DCC
|
||||
// Attache l'interruption pour le signal DCC
|
||||
#ifdef digitalPinToInterrupt
|
||||
Dcc.pin(DCC_SIGNAL_PIN, 0);
|
||||
#else
|
||||
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
|
||||
#endif
|
||||
|
||||
// Lire les valeurs des CV depuis l'EEPROM et les charger dans le décodeur DCC
|
||||
loadCv();
|
||||
// Initialise le décodeur DCC en mode accessoire avec filtrage d'adresse sur l'adresse DCC courante.
|
||||
Dcc.init(MAN_ID_DIY, 10, FLAGS_MY_ADDRESS_ONLY | FLAGS_DCC_ACCESSORY_DECODER | FLAGS_OUTPUT_ADDRESS_MODE, 0);
|
||||
Dcc.init(DIY_MANUFACTURER_ID, 10, FLAGS_MY_ADDRESS_ONLY | FLAGS_DCC_ACCESSORY_DECODER | FLAGS_OUTPUT_ADDRESS_MODE, 0);
|
||||
|
||||
|
||||
loadCvDefaultsIfNeeded();
|
||||
loadCvFromDcc();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user