Logiciels Libres et Systèmes Embarqués


2.3. Conversion

2.3.1. Fonctionnement

Afin de fournir continuellement des événements de la souris virtuelle lors d'un mouvement, il faut que la lecture du joystick soit non bloquante et que la fonction de conversion j2m_convert() continue sa simulation selon le statut du joystick. Pour connaître ce dernier, cette fonction renvoie un drapeau ACTIVED pour indiquer qu'une touche ou un axe a été activé, DESACTIVED lorsque l'un d'eux a été désactivé, NONE lorsqu'un événement redondant est apparu ou qu'une touche non cartographiée a été enfoncée. Ensuite la fonction appelante j2m_loop() met à jour le masque binaire state et écrit dans le tube si besoin est.

Extrait de j2m_loop() :

[...]
//lecture non bloquante mais qui dort pendant 20µs si rien ne se passe.
ret = poll( poll_fd, 1, 20))
[...]
ret = j2m_convert( type, joy_event.value, mouse_buff, state);
[...]
switch ( ret ) {
    case NONE :
        if ( !(state & ~((1<< JS_CLICK_LEFT) | (1<< JS_CLICK_RIGHT))) )
            continue;

    case DESACTIVED :
        if ( 0 == state)
            continue;
        state &= ~(1<< type);
        break;

    case ACTIVED :
        state |= (1<< type);
        break;

    default :
        break;
}

Enfin, j2m_convert() réutilisera ce masque pour continuer à simuler le mouvement de la souris et cela même si l'événement en cours est, par exemple, un clic.

Extrait de j2m_convert() :

#define AXES_ACTIVE ( (state & (1<<JS_MOVE_HORIZONTAL)) || \
                      (state & (1<<JS_MOVE_VERTICAL)) )
[...]
if ( AXES_ACTIVE || move )
    j2m_accel(mouse_buff); //fonction de simulation des mouvements

2.3.2. Mouvements

Les valeurs d'inclinaison d'un axe du joystick vont de -32767 à 32767, Js2Mouse recadre ces valeurs entre -16 et 16 pour être acceptable par les logiciels utilisant la souris. Un phénomène étrange apparaît à cause des multiples transtypages, les valeur sont au final comprises entre -13 et 13, mais cela n'est pas gênant. Ce valeurs ne sont pas converties tels quelles, mais sont lissées en étant mises sous forme cubique pour éviter une trop grande sensibilité.

Extrait de j2m_convert() :

value = (__s16) (value/2048);
value = (__s16) (value*value*value/256);

Figure 2.1. Graphe des valeurs de mouvement cadrées puis lissées

Graphe des valeurs de mouvement cadrées puis lissées

Je ne suis pas pleinement satisfait du résultat, car on obtient une valeur nulle sur une trop grand plage, l'utilisation d'une table de correspondance pourrait être mieux adaptée. L'accélération est gérée de manière très rudimentaire car ce sont les logiciels telle que GPM ou XFree86 qui doivent s'en occuper. Js2Mouse la lisse tout de même pour apporter un peu de confort, mais surtout pour que les joysticks digitaux puissent fonctionner correctement. En effet, avec ces derniers les valeurs d'inclinaison passent de 0 à +/- 32767 sans étapes intermédiaires. Dans notre cas, l'accélération est une fonction constante (+/- 1), donc la vitesse évolue linéairement. C'est la fonction j2m_accel()qui s'en occupe.

2.3.3. clics

En ce qui concerne la simulation des clics de souris, il n'y a rien de particulier à dire.