Bonsoir,
j'ai fait une erreur dans le nom de la librairie: c'est DCC_Decoder que j'utilise.
Ci-dessous, copie de mon programme, pour la partie acquisition des données DCC:
#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0 // pin 2 for UNO
int old_address = 0;
int old_action = 0;
//Handler DCC
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data){
// Conversion de l'adresse NMRA en adresse decodeur d'accessoire
address -= 1;
address *= 4;
address += 1;
address += (data & 0x06) >> 1;
int action = (data & 0x01);
if ((address != old_address) || (action != old_action)){
//
//
// ici se situe le programme pour activer les sorties
// en fonction des données reçues
//
//
}
}
void setup() {
Serial.begin(115200);
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder( 0x00, 0x00, kDCC_INTERRUPT );
}
void loop() {
DCC.loop();
}
Le décodage des données DCC, qui fonctionne sous une interruption (pin 2 pour moi), me renvoi 3 variables: activate (non utilisé), address et data qui après passage dans une formule "magique" me donne l'adresse de l'accessoire et une action (0 ou 1).
Quand je me limite à ce programme, je vois bien passer toutes les données DCC. Dès que je fais un peu de traitement, sans utiliser de fonction delay, je perds des données, surtout pour les signaux qui envoient 2 adresses et comme un ROUGE sur n, déclenche un JAUNE sur n-1 et un VERT sur n-2, cela peut faire 6 données à la suite.
Mon idées est donc d'enregistrer ces données dans un buffer, dès qu'elles sortent de la fonction DECODER, puis de les traiter ensuite. Il faudrait que ce buffer puisse enregistrer 2 x 10 variables (10 adresses et 10 actions) et qu'il se remplisse lors de l'interruption.
Je pense que c'est possible mais je n'ai aucune idée sur la manière de faire, même après avoir étudié la biblothèque CircularBuffer par exemple