diff --git a/src/main.cpp b/src/main.cpp index e3bfa5e..7024d45 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,6 +27,9 @@ uint8_t ServoMaxDown = DEFAULT_MAX_DOWN; int STROBE_ON = 0; int HelicoUP = 0; +/** + * Génére un clignotement de la LED pour signaler l'accusé de réception d'une commande DCC. + */ void notifyCVAck(void) { digitalWrite(LED_PIN, HIGH); @@ -34,6 +37,11 @@ void notifyCVAck(void) digitalWrite(LED_PIN, LOW); } +/** + * Notifie le changement d'une CV. + * @param CV Le numéro de la CV modifiée. + * @param Value La nouvelle valeur de la CV. + */ void notifyCVChange(uint16_t CV, uint8_t Value) { if (CV == CV_PALES_SPEED) { @@ -45,6 +53,9 @@ void notifyCVChange(uint16_t CV, uint8_t Value) } } +/** + * Notifie la réinitialisation des valeurs par défaut de la CV. + */ void notifyCVResetFactoryDefault() { Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED); @@ -53,6 +64,9 @@ void notifyCVResetFactoryDefault() EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE); } +/** + * Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées. + */ void loadCvDefaultsIfNeeded() { if (EEPROM.read(EEPROM_SIG_ADDR) != EEPROM_SIG_VALUE) { @@ -65,6 +79,9 @@ void loadCvDefaultsIfNeeded() } } +/** + * Charge les valeurs des CV depuis le bus DCC. + */ void loadCvFromDcc() { PalesSpeed = Dcc.getCV(CV_PALES_SPEED); @@ -83,6 +100,12 @@ void loadCvFromDcc() } } +/** + * Notifie la sortie d'une voie d'accès DCC. + * @param Addr L'adresse de la voie d'accès. + * @param Direction La direction de la voie d'accès. + * @param OutputPower La puissance de sortie. + */ void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower) { if (Addr == 1) { @@ -95,41 +118,95 @@ void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputP } } +/** + * Notifie le changement d'état d'une sortie DCC. + * @param Addr L'adresse de la sortie. + * @param State L'état de la sortie. + */ void notifyDccSigOutputState(uint16_t Addr, uint8_t State) { digitalWrite(LED_PIN, State ? HIGH : LOW); } +/** + * Initialise le système. + */ void setup() { + // Sens des PINs pinMode(LED_PIN, OUTPUT); pinMode(PWM_PIN, OUTPUT); + // Configure la pin pour le servo moteur servoMotor.attach(SERVO_PIN); servoMotor.write(90); + // Attachen l'interruption pour le signal DCC #ifdef digitalPinToInterrupt Dcc.pin(DCC_SIGNAL_PIN, 0); #else Dcc.pin(0, DCC_SIGNAL_PIN, 1); #endif + // Initialise le décodeur DCC avec l'adresse 10 et les fonctionnalités de décodeur d'accessoires et de mode d'adresse de sortie. Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0); + // Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées. loadCvDefaultsIfNeeded(); loadCvFromDcc(); } + +static unsigned long strobeNextMillis = 0; +static uint8_t strobePhase = 0; + +/** + * Boucle principale. + */ void loop() { + // Lire le temps actuel en millisecondes + unsigned long now = millis(); + + // Traite les signaux DCC entrants Dcc.process(); + + if (STROBE_ON) { - digitalWrite(LED_PIN, HIGH); - delay(100); + switch (strobePhase) { + case 0: + digitalWrite(LED_PIN, HIGH); + strobePhase = 1; + strobeNextMillis = now + 100; + break; + case 1: + if (now >= strobeNextMillis) { + digitalWrite(LED_PIN, LOW); + strobePhase = 2; + strobeNextMillis = now + 100; + } + break; + case 2: + if (now >= strobeNextMillis) { + digitalWrite(LED_PIN, HIGH); + strobePhase = 3; + strobeNextMillis = now + 100; + } + break; + case 3: + if (now >= strobeNextMillis) { + digitalWrite(LED_PIN, LOW); + strobePhase = 4; + strobeNextMillis = now + 1000; + } + break; + case 4: + if (now >= strobeNextMillis) { + strobePhase = 0; + } + break; + } + } else { + strobePhase = 0; digitalWrite(LED_PIN, LOW); - delay(100); - digitalWrite(LED_PIN, HIGH); - delay(100); - digitalWrite(LED_PIN, LOW); - delay(100); } }