1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package motejx.extensions.classic;
17
18 import java.awt.Point;
19
20 import javax.swing.event.EventListenerList;
21
22 import motej.AbstractExtension;
23 import motej.Mote;
24
25
26
27
28
29
30
31 public class ClassicController extends AbstractExtension {
32
33 private EventListenerList listenerList = new EventListenerList();
34
35 private Mote mote;
36
37 public void addClassicControllerAnalogListener(ClassicControllerAnalogListener listener) {
38 listenerList.add(ClassicControllerAnalogListener.class, listener);
39 }
40
41 public void addClassicControllerButtonListener(ClassicControllerButtonListener listener) {
42 listenerList.add(ClassicControllerButtonListener.class, listener);
43 }
44
45 protected void fireAnalogEvents(byte[] data) {
46 ClassicControllerAnalogListener[] listeners = listenerList.getListeners(ClassicControllerAnalogListener.class);
47 if (listeners.length == 0) {
48 return;
49 }
50
51 int lx = data[0] & 0x3f;
52 int ly = data[1] & 0x3f;
53 int rx = ((data[0] & 0xc0) >> 3) ^ ((data[1] & 0xc0) >> 5) ^ ((data[2] & 0x80) >> 7);
54 int ry = data[2] & 0x1f;
55 int rt = data[3] & 0x1f;
56 int lt = ((data[2] & 0x60) >> 2) ^ ((data[3] & 0xe0) >> 5);
57
58 LeftAnalogStickEvent leftStickEvt = new LeftAnalogStickEvent(this, new Point(lx, ly));
59 RightAnalogStickEvent rightStickEvt = new RightAnalogStickEvent(this, new Point(rx, ry));
60 LeftAnalogTriggerEvent leftTriggerEvt = new LeftAnalogTriggerEvent(this, lt);
61 RightAnalogTriggerEvent rightTriggerEvt = new RightAnalogTriggerEvent(this, rt);
62
63 for (ClassicControllerAnalogListener l : listeners) {
64 l.leftAnalogStickChanged(leftStickEvt);
65 l.rightAnalogStickChanged(rightStickEvt);
66 l.leftAnalogTriggerChanged(leftTriggerEvt);
67 l.rightAnalogTriggerChanged(rightTriggerEvt);
68 }
69 }
70
71 protected void fireButtonEvent(byte[] data) {
72 ClassicControllerButtonListener[] listeners = listenerList
73 .getListeners(ClassicControllerButtonListener.class);
74 if (listeners.length == 0) {
75 return;
76 }
77
78
79
80 int modifiers = (((data[5] & 0xff) ^ 0xff) << 8) ^ ((data[4] & 0xff) ^ 0xff);
81
82 ClassicControllerButtonEvent evt = new ClassicControllerButtonEvent(this, modifiers);
83 for (ClassicControllerButtonListener l : listeners) {
84 l.buttonPressed(evt);
85 }
86 }
87
88
89
90
91
92
93 public void initialize() {
94
95 mote.writeRegisters(new byte[] { (byte) 0xa4, 0x00, 0x40}, new byte[] { 0x00 });
96 }
97
98
99
100
101
102
103 public void parseExtensionData(byte[] extensionData) {
104 decrypt(extensionData);
105
106 fireAnalogEvents(extensionData);
107 fireButtonEvent(extensionData);
108 }
109
110 public void removeClassicControllerAnalogListener(ClassicControllerAnalogListener listener) {
111 listenerList.remove(ClassicControllerAnalogListener.class, listener);
112 }
113
114 public void removeClassicControllerButtonListener(ClassicControllerButtonListener listener) {
115 listenerList.remove(ClassicControllerButtonListener.class, listener);
116 }
117
118
119
120
121
122
123 public void setMote(Mote mote) {
124 this.mote = mote;
125 }
126
127 }