hello,
je lance la tempo lorsque le premier défaut apparaît
si je dépasse 4 je raz le compteur et coupe les pompes.
si je dépasse la minute de raz le compteur.
à mon avis, ce n'est pas la bonne méthode
soit tu stockes l'horodatage lorsqu'un défaut apparaît dans une file (file FIFO = First In First Out)
un défaut vieux de plus de 1 minute sort de la file et la taille de ta file détermine l'arrêt ou pas des pompes
ta file contiendra max 30 horodatages si cadence de 30 coups / minute
soit ta cadence est bien régulière et tu pointes uniquement la présence d'un défaut dans un registre à décalage (ce que tu suggères)
genre mot de 32 bits, à chaque pas du cycle, tu décales, et tu rentres un 1 en cas de défaut
reste plus qu'à compter le nombre de bits à 1
pour une solution sans boucle :
Code : Tout sélectionner
unsigned int v; // count bits set in this (32-bit value)
unsigned int c; // store the total here
static const int S[] = {1, 2, 4, 8, 16}; // Magic Binary Numbers
static const int B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF};
c = v - ((v >> 1) & B[0]);
c = ((c >> S[1]) & B[1]) + (c & B[1]);
c = ((c >> S[2]) + c) & B[2];
c = ((c >> S[3]) + c) & B[3];
c = ((c >> S[4]) + c) & B[4];
source :
https://graphics.stanford.edu/~seander/ ... etParallel
les >> sont des décalages à droite (SHR)
les & sont des masquages (AND)
la version 16 bits que j'avais fais pour Unity :
Code : Tout sélectionner
N := WORD_TO_INT(W);
N := N - (SHR(N, 1) AND 16#5555);
N := (N AND 16#3333) + (SHR(N, 2) AND 16#3333);
N := (N + SHR(N, 4)) AND 16#0F0F;
N := (N + SHR(N, 8)) AND 16#001F;
N est un INT
W est un WORD
c'est magique mais ça marche (c'est cette variante que j'utilise toujours)
@+