Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Problème avec OnKeyDown
#1

Bonjour,
J'ai réalisé un petit robot avec un raspberry. Celui-ci fonctionne très bien, et il est pilotable par un simple script en python, ou via la librairie WiringPi.
Ce que je souhaite faire désormais est de le piloter via une page web. Le principe est de le piloter avec les touches directionnelles du clavier (plutôt qu'avec des boutons par exemple).
J'ai utilisé quelques éléments trouvé à droite à gauche sur internet, mais je bloque sur une difficulté avec la fonction OnKeyDown.
En effet, avec un simple appui sur la touche haut par exemple, le robot avance correctement et s'arrête dès la fin d'un sleep d'une demi-seconde.
Le problème se présente lors d'un appui long sur la touche haut. Les instructions s'exécutent une fois, puis se rééxécutent une nouvelle fois, etc ... et cela ne s'arrête plus. Comme si un appui long correspondait à une mise en file d'attente de la fonction "avancer"...
J'ai consulté plusieurs forums à ce sujet. La solution qui semble revenir souvent est d'introduire dans le code une variable pour prendre en compte, ou non, l'appui sur la touche et autoriser ou non l'exécution des instructions associées, sur le principe suivant :
- avant l'évent OnKeyDown : autorisation = true
- après l'évent OnKeyDown et le début de l'éxécution : autorisation = false
- à la fin de l'éxécution des instructions : autorisation = true
Néanmoins, cela ne fonctionne pas, et le robot s'emballe avec un appui long sur une touche.
Les éléments de la page web sont les suivants :

Extrait de la page index.php :
Code :
<?php
system("gpio -g mode 17 out");
// ainsi que toutes les autres initialisations des gpio ...
?>

<script language="javascript">
document.onkeydown = applyKeyDown;
document.onkeyup = applyKeyUp;
</script>

<script src="js/jquery.min.js"></script>

Extrait du fichier keyboard.js qui définit la fonction applyKeyDown et appelle l'action associée en fonction de la touche :
Code :
function applyKeyDown (_event_){

        var winObj = checkEventObj(_event_);
        var intKeyCode = winObj.keyCode;
        var intAltKey = winObj.altKey;
        var intCtrlKey = winObj.ctrlKey;
        
                if ( intKeyCode == KEY_UP){   // par exemple ...
            $.ajax({
                type: "POST",
                url: "./action.php?action=avant",
                success: function(r){
             }});
            winObj.keyCode = intKeyCode = REMAP_KEY_T;
            winObj.returnValue = false;
            return false;            
        }

Extrait du fichier action.php qui définit les instructions à éxécuter pour une action donnée :
Code :
<?php

require_once('common.php');
$result['state']  = 0;
$result['error']  = '';

switch($_['action']){

    case 'avant':
        system("gpio -g write 17 1");    
                // etc ...
        sleep(0.5);
        system("gpio -g write 17 0");    
        // etc ...
    break;

        ainsi que tout les autres cases ...

}
?>

En fonction de ces bouts de code, comment résoudre cet emballement du robot si je m'endors sur une touche ?

Merci à vous.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)