View Javadoc

1   /*
2    * Copyright 2008 motej
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License. 
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   * As of now, this classic controller implementation lacks calibration data.
27   *  
28   * <p>
29   * @author <a href="mailto:vfritzsch@users.sourceforge.net">Volker Fritzsch</a>
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  		// we invert the original data as the classic controller returns
79  		// button pressed as nil and thats not that useable.
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  	 * (non-Javadoc)
90  	 * 
91  	 * @see motej.Extension#initialize()
92  	 */
93  	public void initialize() {
94  		// initialize
95  		mote.writeRegisters(new byte[] { (byte) 0xa4, 0x00, 0x40}, new byte[] { 0x00 });
96  	}
97  
98  	/*
99  	 * (non-Javadoc)
100 	 * 
101 	 * @see motej.Extension#parseExtensionData(byte[])
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 	 * (non-Javadoc)
120 	 * 
121 	 * @see motej.Extension#setMote(motej.Mote)
122 	 */
123 	public void setMote(Mote mote) {
124 		this.mote = mote;
125 	}
126 
127 }