bon j'ai fait des tests avec les nouveaux fichiers, sur l'ESP c'est la zone, ça ne fonctionne pas mieux, mais je reste persuadé que ça vient de l'architecture du code employé pour détecter les trames, je m'explique, le même code sur Mega et ESP (dans LoopPerMillis mais avec des Micros() pour être certain du timing) ne fonctionne pas sur ESP (enfin ça rate des trames) alors que sur le Mega ça fonctionne.
Bien entendu sur l'ESP j'ai adapté la lecture du port pour accélérer le traitement mais sans succès (GPIP) mais je pense que c'est parce que la routine est potentiellement interrompue pour faire d'autres tâches et ça perturbe les timing.
Voilà le code pour info
Code : Tout sélectionner
boolean FetchSignal(byte DataPin, boolean StateSignal) {
uint8_t FstateMask = StateSignal ? 1 : 0;
if (GPIP(DataPin) == FstateMask) { // Als er signaal is
// Als het een herhalend signaal is, dan is de kans groot dat we binnen hele korte tijd weer in deze
// routine terugkomen en dan midden in de volgende herhaling terecht komen. Daarom wordt er in dit
// geval gewacht totdat de pulsen voorbij zijn en we met het capturen van data beginnen na een korte
// rust tussen de signalen.Op deze wijze wordt het aantal zinloze captures teruggebracht.
if (RawSignal.Time) { // Eerst een snelle check, want dit bevindt zich in een tijdkritisch deel...
if (RawSignal.Repeats && (RawSignal.Time+SIGNAL_REPEAT_TIME)>millis()) { // ...want deze check duurt enkele micro's langer!
PulseLength=micros()+SIGNAL_TIMEOUT*1000; // delay
while ((RawSignal.Time+SIGNAL_REPEAT_TIME)>millis() && PulseLength>micros())
if ( GPIP(DataPin) == FstateMask )
PulseLength=micros()+SIGNAL_TIMEOUT*1000;
while((RawSignal.Time+SIGNAL_REPEAT_TIME)>millis() && ( GPIP(DataPin) != FstateMask));
}
}
RawCodeLength=1; // Start at 1 for legacy reasons. Element 0 can be used to pass special information like plugin number etc.
Ftoggle=false;
do { // read the pulses in microseconds and place them in temporary buffer RawSignal
my_start = micros();
do {
PulseLength = micros()-my_start ;
if (PulseLength > SIGNAL_TIMEOUT*1000 )
break;
}
while ( (GPIP(DataPin)==FstateMask) ^ Ftoggle );
if (PulseLength<MIN_PULSE_LENGTH)
break; // Pulse length too short
Ftoggle=!Ftoggle;
RawSignal.Pulses[RawCodeLength++]=PulseLength/(unsigned long)(RAWSIGNAL_SAMPLE_RATE); // store in RawSignal !!!!
} while (RawCodeLength<RAW_BUFFER_SIZE); // For as long as there is space in the buffer, no timeout etc.
if (RawCodeLength>=MIN_RAW_PULSES) {
RawSignal.Repeats=0; // no repeats
RawSignal.Multiply=RAWSIGNAL_SAMPLE_RATE; // sample size.
RawSignal.Number=RawCodeLength-1; // Number of received pulse times (pulsen *2)
RawSignal.Pulses[RawSignal.Number+1]=0; // Last element contains the timeout.
RawSignal.Time=millis(); // Time the RF packet was received (to keep track of retransmits
return true;
} else {
RawSignal.Number=0;
}
}
return false;
}
