Controller la wiimote

Création d’un plugin pour wminput

Il existe de nombreux tutorials sur comment configurer cwiid, je voud laisse les suivre pour obtenir un système fonctionnel pour la wiimote (vous pourrez trouver des liens à la fin de cet article). Soyez sûr que la wiimote est reconnue avant de continuer.

Voici un code que l’on peut utiliser comme base pour la création de notre driver. Lancé en tant que main, il utilise pygame pour afficher les sources infrarouges captées par la wiimote, mais il peut également être utilisé comme plugin pour wminput (même s’il ne fait rien pour l’instant).

Vous pouvez le télécharger ici: wm_control.py (Code disponible sous licence GPL 3+)

Le code:

import wmplugin

Cet import n’existe pas, mais est créé par wminput lorsque celui-ci est lancé. Il fourni la connexion avec le cœur wminput. Il vous suffit de placer le script dans le répertoire de plugin de wminput (sur ma debian il se situe dans /usr/lib/cwiid/plugins/)

def wmplugin_init(id, wiimote_arg):
    wmplugin.set_rpt_mode(id, cwiid.RPT_IR | cwiid.RPT_BTN)
    return

def wmplugin_info():
    return [],
      [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0),
       ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)],
    []

On instancie la wiimote ici et actions le mode InfraRouge. Le nom est choisi par wminput si nous désirons pouvoir l’utiliser comme plugin. On déclare que le plugin retourne les coordonées X et Y dans un système de coordonées relative (l’ensemble des paramètres sont disponibles ici: actions list)

Si nous voulons définir de nouvons boutons, nous avons juste à les nommer dans la première list, ils seront accessibles dans le fichier de configuration sous le nom plugin.[buton_name] = ACTION

def wmplugin_exec(messages):
    '''Wiimote callback managing method
    Recieves a message list, each element is different, see the libcwiid docs'''
    x = y = 0

    for msg in messages:
        if msg[0] == cwiid.MESG_IR:
            x, y = ir_sensor.get_movement(msg)
    return [], (x, y)

Voici le cœur de notre driver. Le nom de la méthode est également imposé par wminput, de même que le format de retour. Nous recevons en paramètres la liste des messages reçus par la wiimote.

Si nous avons défini des boutons, il nous faut retourner leur état ici. Il s’agit jute d’un booléen indiquant si le bouton est préssé (True) ou non (False).

Cette méthode ne retourne aucun autre parametres, et cela nous pose problème car nous avons besoin de sauvegarder l’état du curseur entre deux appels. J’ai contourné le problème en utilisant des arguments par défaut à la fonction get_movement pour pouvoir stocker l’environnement d’un appel à un autre:

def get_movement(msg, _old_points=[], _old_position = [0, 0]):
    return 0, 0

Cette méthode retourne la difference entre la précédente position du curseur et la nouvelle: (0, 0) signifie que le curseur n’a pas bougé, (-10, 0) représente un déplacement vers la gauche.

Pour l’instant, le plugin ne bouge pas le curseur, et ne lie pas les résultats envoyés par la wiimote, mais vous avez assez d’information pour créer votre propre plugin pour controller la wiimote. Vous pouvez accéder aux méthodes de cwiid pour activer les leds, mettre en marche les differents modes (infrarouge, accéléromètre, vibration, …) et définir vos propres actions.

Links:

Le projet cwiid

Installer Cwiid ( Ubuntu Documentation )