aboutsummaryrefslogtreecommitdiff
path: root/content/Informatique/2009-03-11-wiimote.fr.rst
blob: 501b5627235cf4b675c0cf6a5a79e6fbff0322fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
.. -*- mode: rst -*-
.. -*-  coding: utf-8 -*-

Controller la wiimote
#####################


:date: 2009-03-11
:tags: Programmation, Wiimote, Python
:slug: controling-the-wiimote-i
:lang: fr
:logo: /images/wiican.png
:summary: |abstract|

.. default-role:: literal


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.

|abstract|

.. |abstract| replace::
    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+)

.. _wm_control.py: {static}/resources/ir_control_0.py


Le code :

.. code-block:: python

        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/`)

.. code-block:: python

    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
<http://abstrakraft.org/cwiid/browser/trunk/wminput/action_enum.txt>`_)

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`

.. code-block:: python

    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 :

.. code-block:: python

    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 <http://abstrakraft.org/cwiid/>`_

`Installer Cwiid ( Ubuntu Documentation
) <https://help.ubuntu.com/community/CWiiD>`_