Le cutout, comme toutes les trames DCC est généré dans la méthode sous interruption void IRAM_ATTR DCC::interrupt(void)
C'est une méthode callback passée à la fonction timerAttachInterrupt et appelée toutes les 28µs (Pascal Barlier suggère 29µs mais bon... dans mon cas ça fonctionne) 28µs correspond à 1/4 de trame pour le bit 1.
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &DCC::interrupt, true);
timerAlarmWrite(timer, 28, true);
timerAlarmEnable(timer);
Dans la méthode interrupt, toutes les 28µs, un compteur est décrémenté et, tant qu'il est supérieur à 0, la pin brake est maintenu à LOW
case DCC_CUT_1: // 1/2 bit : zone de coupure
switch (m_dataMode)
{
case DCC_PACKET_CUTOUT :
if (!--m_cutoutCount)
{
m_dataMode = DCC_PACKET_HEADER;
m_headerCount = DCC_HEADER_SIZE;
digitalWrite(PIN_BRAKE, LOW);
}
else
digitalWrite(PIN_BRAKE, HIGH);
break;
default :
m_cut = DCC_CUT_0;
}
La méthode interrupt se comporte comme une machine d'état qui toutes les 28µs positionne les pins en fonction des combinaisons de variables.
Comme j'ai pu le préciser un peu plus haut, je n'ai pas implanté les fonctions pour lire ou écrire dans les décodeurs. Je cherche avant tout à réaliser des tests de détection RailCom.
Dans l'ensemble, les méthodes de mes classes sont du "copié-collé" de ce qu'a écrit Pascal Barlier avec des adaptations bien sûr. Il ne serait pas très compliqué d'adapter le code de lecture écriture de CV à mon propre code.
Et comme, je le rappelle, j'ai adopté la messagerie de DCC++, il suffit donc d'utiliser une application compatible DCC++ (comme JMRI) pour cela.