From 45dcbc49dbf42f2af8621cc06851341dcc945d95 Mon Sep 17 00:00:00 2001 From: Serge NOEL Date: Mon, 10 Aug 2026 17:49:28 +0200 Subject: [PATCH] A valider Gestion des CVs --- src/main.cpp | 71 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c4a1d32..bef9436 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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,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) { 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; } - + 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() { @@ -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(); }