Hello,
Je cherche une solution pour remplacer une boucle for qui envoie des caractères depuis la carte DUE. En effet l'execution de la boucle for bloque l'execution des autres actions de mon programme (comme un while en fait).
Il y a t'il un moyen simple de le faire avec des if pour laisser le reste du code s'executer ?
for (int i = 0; i < nbrKey; ++i)
{
Keyboard.press('q');
delayWithMillis(50);
Keyboard.release('q');
delayWithMillis(50);
PosGame = PosGame-1;
}
Il vous faut comprendre comment utiliser millis() et laisser tourner la loop. Dans les tutos d’eskimon il y en a un qui parle d’introduire le temps - jetez y un œil
Lisez vous l’anglais ? Il y a en haut du forum principal de programmation un très bon article épinglé sur l’usage de millis()
Merci pour l'info. I am fluent in english, donc pas de pb avec l'anglais.
J'utilise par ailleurs la fonction millis() pour remplacer la fonction delay() qui bloque, cependant je ne vois pas trop le rapport car mon besoin ici est de boucler tant que je n'ai pas atteint une valeur.
Je croyais que votre besoin était de ne pas bloquer l'execution des autres actions de votre programme...
Donc faut Laisser la boucle tourner et de temps en temps (quand 50ms se sont écoulées) envoyer la commande press ou release jusqu’à ce que le compteur (que vous incrémenterez uniquement à ce moment) atteigne le nombre voulu
A mon sens, il manque beaucoup trop d'infos pour pouvoir t'aider de manière efficace.
par exemples :
qu'est-ce qui déclenche l'envoi du 1111 ou du 2222 ?
initialement tu parlais de touches, là de boutons
combien d'envois parallèles souhaites tu pouvoir gérer simultanément au maximum ?
50 envois max. Est-ce à dire qu'il y a des fois où on s'arrête avant 50 ? selon quelle règle de gestion ?
est-ce que les envois parallèles doivent être synchronisés entre eux ?
Il y a un délai d'appui/relachement de 50 ms.
est-ce que 1 et 2 doivent être envoyés dans la même milliseconde?
ton code ressemble à de l'émulation de clavier. Veux-tu aussi gérer les majuscules et autres caractères issus d'une combinaison de touches?
...
bref donne BEAUCOUP plus d'infos sur ce que tu veux faire
Sinon les réponses resteront d'ordre général sans t'aider vraiment.
qu'est-ce qui déclenche l'envoi du 1111 ou du 2222 ?
initialement tu parlais de touches, là de boutons
=> Les caractères sont envoyés lors de l'appuie sur les boutons poussoir (comme sur un clavier)
combien d'envois parallèles souhaites tu pouvoir gérer simultanément au maximum ?
=> plusieurs boutons poussoirs peuvent être enfoncés simultanément (une dixaine), 50 caractères max pour un des boutons.
50 envois max. Est-ce à dire qu'il y a des fois où on s'arrête avant 50 ? selon quelle règle de gestion ?
Oui, le nombre maxi de caractères envoyés est de 50 , le nombre de caractères dépend de la durée d'appuie.
est-ce que les envois parallèles doivent être synchronisés entre eux ?
Il y a un délai d'appui/relachement de 50 ms.
est-ce que 1 et 2 doivent être envoyés dans la même milliseconde?
=> il n'y a pas de synchronisation. Si le premier bouton doit envoyer 40 caractères mais qu'un second bouton est pressé, l'envoi des caractères du second bouton ne doit pas se faire après que les 40 premiers caracteres aient été envoyés. l'envoie des caractères doit être fait en parallèle.
C'est mon pb actuel avec la boucle for.
ton code ressemble à de l'émulation de clavier. Veux-tu aussi gérer les majuscules et autres caractères issus d'une combinaison de touches?
=> C'est de l'émulation clavier tout à fait: il n'y a pas de caractères issues de combinaisons de touches en tout cas pas pour l'instant
Comme tu l'a déjà compris, le problème est l'utilisation d'une boucle for.
Celle-ci est exclusive : pendant qu'elle tourne le programme ne peut rien faire d'autre.
La fonction principale de ton programme est loop().
Donc tu disposes déjà d'une boucle infinie.
C'est celle-ci qu'il faut utiliser à la place de la boucle for.
La règle à respecter absolument est : ne jamais faire appel à l'instruction delay()
Aux endroits où la logique t'incite à utiliser delay() pour séparer deux actions dans le temps, il faut :
faire la première action, en notant au passage l'heure qu'il est, c'est-à-dire en mémorisant dans une variable globale la valeur de la fonction millis() au moment de la première action
action1();
millis_action1 = millis()
calculer très régulièrement le délai découlé depuis la première action
delai = millis() - millis_action1
déclencher l'action 2 quand le délai est découlé
if (delai >= 50) action2();
En procédant ainsi depuis la fonction loop(), tu obtiendras le même résultat qu'avec un delay().
Sauf que tu peux ajouter d'autres instructions dans loop().
Et grâce à l'absence de delay(), la fonction loop() va être exécutée des milliers de fois par seconde, ce qui donne au final l'impression de gérer plusieurs choses à la fois, à notre échelle de temps.
Dans ton cas particulier, il te faudra aussi d'autre variables globales pour :
mémoriser la touche à répéter
savoir à chaque instant si elle est enfoncée ou relachée
compter le nombre de répétitions
Commence déjà par gérer une seule touche, mais sans delay()
Par la suite, pour gérer 10 boutons il te faudra 10 jeux de variables globales (utiliser des tableaux ou mieux : des objets).