A valider Gestion des CVs

This commit is contained in:
Serge NOEL
2026-08-10 17:49:28 +02:00
parent 4acea1a799
commit 45dcbc49db
+48 -23
View File
@@ -36,7 +36,7 @@ struct DCCAccessoryConfig {
byte MotorSpeed; // Speed of the motor (0-255) byte MotorSpeed; // Speed of the motor (0-255)
byte ServoMaxUp; // Maximum position for servo up (0-180) byte ServoMaxUp; // Maximum position for servo up (0-180)
byte ServoMaxDown; // Maximum position for servo down (0-180) byte ServoMaxDown; // Maximum position for servo down (0-180)
}; } MyConfig;
NmraDcc Dcc; NmraDcc Dcc;
@@ -63,7 +63,7 @@ void notifyCVAck(void)
/** /**
* Notifie le changement d'une CV. * 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. * @param Value La nouvelle valeur de la CV.
*/ */
void notifyCVChange(uint16_t CV, uint8_t Value) void notifyCVChange(uint16_t CV, uint8_t Value)
@@ -91,19 +91,24 @@ 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) uint8_t notifyCVValid (uint16_t CV, uint8_t Writable)
{ {
if (CV == CV_PALES_SPEED || CV == CV_MAX_UP || CV == CV_MAX_DOWN || if (CV == CV_PALES_SPEED || CV == CV_MAX_UP || CV == CV_MAX_DOWN ||
CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB || CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB || CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB) {
CV == CV_ACCESSORY_DECODER_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
return 1; return 1;
} }
return 0; return 0;
} }
/** /**
* 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() void notifyCVResetFactoryDefault()
{ {
@@ -112,25 +117,44 @@ void notifyCVResetFactoryDefault()
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN); Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF); Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07); 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) { // Vérifie si les valeurs par défaut ont déjà été initialisées dans l'EEPROM
if (Dcc.isSetCVReady()) { if (EEPROM.read(EEPROM_SIG_ADDR) != EEPROM_SIG_VALUE)
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED); {
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP); // Non, pas de valeurs par défaut initialisées, donc on les initialise maintenant
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN); MyConfig.Sig = EEPROM_SIG_VALUE;
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF); MyConfig.ManufacturerID = DIY_MANUFACTURER_ID;
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07); MyConfig.Version = 1;
MyConfig.address = DEFAULT_ADDRESS;
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE); 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.attach(SERVO_PIN);
servoMotor.write(90); servoMotor.write(90);
// Attachen l'interruption pour le signal DCC // Attache l'interruption pour le signal DCC
#ifdef digitalPinToInterrupt #ifdef digitalPinToInterrupt
Dcc.pin(DCC_SIGNAL_PIN, 0); Dcc.pin(DCC_SIGNAL_PIN, 0);
#else #else
Dcc.pin(0, DCC_SIGNAL_PIN, 1); Dcc.pin(0, DCC_SIGNAL_PIN, 1);
#endif #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. // 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(); loadCvFromDcc();
} }