A valider Gestion des CVs

This commit is contained in:
Serge NOEL
2026-08-10 17:49:28 +02:00
parent 4acea1a799
commit 45dcbc49db
+46 -21
View File
@@ -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();
}