BowlerKernel
BowlerJInputDevice.java
Go to the documentation of this file.
1 package com.neuronrobotics.sdk.addons.gamepad;
2 
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
6 import java.util.List;
7 
8 import net.java.games.input.Component;
9 import net.java.games.input.Controller;
10 import net.java.games.input.Event;
11 import net.java.games.input.EventQueue;
12 
13 import com.neuronrobotics.bowlerstudio.assets.ConfigurationDatabase;
14 import com.neuronrobotics.sdk.common.Log;
15 import com.neuronrobotics.sdk.common.NonBowlerDevice;
16 import com.neuronrobotics.sdk.util.ThreadUtil;
17 
18 import eu.mihosoft.vrl.v3d.JavaFXInitializer;
19 
20 // TODO: Auto-generated Javadoc
24 public class BowlerJInputDevice extends NonBowlerDevice {
25 
27  private Controller controller;
28 
30  private ArrayList<IGameControlEvent> listeners = new ArrayList<IGameControlEvent>();
31 
33  boolean run = true;
34 
35  private HashMap<String, Double> recentValue = new HashMap<String, Double>();
36 
38  private Thread poller;
39 
40  private String name;
41  private List<String> searches;
42  static {
43  net.java.games.input.ControllerEnvironment.getDefaultEnvironment();
44  }
45 
46  private static ArrayList<Controller> controllers(){
47  ArrayList<Controller> back = new ArrayList<Controller>();
48 
50  Controller[] getDefaultEnvironmentGetControllers = defaultEnvironment.getControllers();
51  for (int i = 0; i < getDefaultEnvironmentGetControllers.length; i++) {
52  if (!getDefaultEnvironmentGetControllers[i].getName().contains("Wacom")) {
53  back.add(getDefaultEnvironmentGetControllers[i]);
54  }
55 
56  }
57  return back;
58  }
59 
60  public static ArrayList<String> getControllers() {
61  ArrayList<Controller> getDefaultEnvironmentGetControllers = controllers();
62  ArrayList<String> cons = new ArrayList<>();
63  for (int i = 0; i < getDefaultEnvironmentGetControllers.size(); i++) {
64  Controller controller = getDefaultEnvironmentGetControllers.get(i);
65  String name = controller.getName();
66  if(! name.contains("Wacom")){
67  cons.add( name);
68  }
69  }
70  return cons;
71  }
72 
76  public BowlerJInputDevice(String... names) {
77 
78  setControllerByName(names!=null?Arrays.asList(names):null);
79  }
80  public BowlerJInputDevice( List<String> searches) {
82  }
83 
84  private void setControllerByName(List<String> names) {
85  searches =names;
86  ArrayList<Controller> getDefaultEnvironmentGetControllers = controllers();
87  int index = 0;
88 
89  if (names == null && getDefaultEnvironmentGetControllers.size() > 0) {
90  controller = getDefaultEnvironmentGetControllers.get(index);
91  } else {
92  for (String n : searches) {
93  for (int i = 0; i < getDefaultEnvironmentGetControllers.size(); i++) {
94  Controller c = getDefaultEnvironmentGetControllers.get(i);
95  if (c.getName().toLowerCase().contains(n.toLowerCase())) {
96  controller = c;
97  break;
98  } else
99  System.out.println("Non match: " + c.getName() + " " + n);
100  }
101  }
102  }
103  if (controller != null) {
104  this.setController(controller);
105  return;
106  }
107 
108  throw new RuntimeException("Contoller must not be null");
109  }
110 
111  /*
112  * (non-Javadoc)
113  *
114  * @see com.neuronrobotics.sdk.common.NonBowlerDevice#disconnectDeviceImp()
115  */
116  @Override
117  public void disconnectDeviceImp() {
118  listeners.clear();
119  poller = null;
120  run = false;
121  }
122 
123  public double getValue(String component) {
124  if (recentValue.get(component) == null)
125  return 0;
126  return recentValue.get(component);
127  }
128 
129  /*
130  * (non-Javadoc)
131  *
132  * @see com.neuronrobotics.sdk.common.NonBowlerDevice#connectDeviceImp()
133  */
134  @Override
135  public boolean connectDeviceImp() {
136 
137  if (poller == null) {
138  poller = new Thread() {
139  public void run() {
140  setName("Game Controller Poll thread");
141  Log.warning("Starting game Pad Poller");
142  try {
144  } catch (Exception e1) {
145  // TODO Auto-generated catch block
146  e1.printStackTrace();
147  }
148 
149  try {
150  while (run) {
151  if (controller == null) {
152  while (run) {
153  try {
155  break;
156  } catch (Throwable t) {
157  System.out.println("BowlerJInputDevice Waiting for device to be availible");
158  t.printStackTrace();
159  try {
160  Thread.sleep(1000);
161  } catch (InterruptedException e) {
162  // TODO Auto-generated catch block
163  e.printStackTrace();
164  }
165  }
166  }
167  }
168 
169  boolean pollStat = controller.poll();
170  if (!pollStat) {
171  controller = null;
172  continue;
173  }
174  EventQueue queue = controller.getEventQueue();
175  Event event = new Event();
176  while (queue.getNextEvent(event) && run) {
177  Component comp = event.getComponent();
178  float value = event.getValue();
179  String n = comp.getName();
180  if (n.contentEquals("pov")) {
181  double angle = Math.PI * 2 * value;
182  if (angle > 0) {
183  sendValue((float) Math.sin(angle), "pov-up-down");
184  sendValue((float) Math.cos(angle), "pov-left-right");
185  } else {
186  sendValue((float) 0, "pov-up-down");
187  sendValue((float) 0, "pov-left-right");
188  }
189  }else
190  sendValue(value, n);
191  }
192  ThreadUtil.wait(16);
193  }
194  } catch (Throwable t) {
195  t.printStackTrace();
196  }
197  disconnect();
198  }
199 
200  private void sendValue(float value, String n) {
202  if (Math.abs(value) < 0.0001 && value != 0)
203  value = 0;
204  recentValue.put(n, (double) value);
205  for (int i = 0; i < listeners.size(); i++) {
206  IGameControlEvent l = listeners.get(i);
207  try {
208  l.onEvent(n, value);
209  } catch (Throwable ex) {
210  ex.printStackTrace();
211  }
212  }
213  }
214  };
215  poller.start();
216  }
217  return true;
218  }
219 
225  public String getControllerName() {
226  return controller.getName();
227  }
228 
234  public void setController(Controller controller) {
235  System.out.println("Found! " + controller.getName());
236  this.name = controller.getName();
237  controller.poll();
238  EventQueue queue = controller.getEventQueue();
239  Event event = new Event();
240  while (queue.getNextEvent(event)) {
241  // drain startup events
242  }
243  this.controller = controller;
244  recentValue.clear();
246  JogTrainerWidget.run(this);
247  }
248  }
249 
256  if (listeners.contains(l))
257  this.listeners.remove(l);
258  }
259 
264  public void clearListeners() {
265  this.listeners.clear();
266  }
267 
274  if (!listeners.contains(l))
275  this.listeners.add(l);
276  }
277 
278  /*
279  * (non-Javadoc)
280  *
281  * @see com.neuronrobotics.sdk.common.NonBowlerDevice#getNamespacesImp()
282  */
283  @Override
284  public ArrayList<String> getNamespacesImp() {
285  // TODO Auto-generated method stub
286  return new ArrayList<String>();
287  }
288 
289  @Override
290  public String toString() {
291  String values = " unmaped:";
292  for (String key : recentValue.keySet()) {
294  values += "\n\t" + key + " = " + recentValue.get(key);
295  }
296  values += "\nMaped:";
297  for (String key : PersistantControllerMap.getMappedAxis(name)) {
298  String mappedAxisName = PersistantControllerMap.getMappedAxisName(name, key);
299  values += "\n\t" + mappedAxisName + " (from \"" + key + "\") " + getValue(mappedAxisName);
300  }
301  return name + " " + values;
302  }
303 
304  public String getMaps() {
305  String values = "";
306  for (String key : recentValue.keySet()) {
307  values += "\n\t" + key + " = " + recentValue.get(key);
308  }
309  values += "\nMaps:";
310  for (String key : PersistantControllerMap.getMappedAxis(name)) {
311  values += "\n\t" + key + "<-" + PersistantControllerMap.getMappedAxisName(name, key);
312  }
313  return name + " = " + values;
314  }
315 
316  public void map(String controllerVal, String persistantVal) {
317  PersistantControllerMap.map(name,controllerVal, persistantVal);
318  }
319 
320 
321 
322  public static void main(String[] args) throws InterruptedException {
323 
325  while (true) {
326  try {
327  BowlerJInputDevice g = new BowlerJInputDevice("X-Box","Gamesir","Dragon"); //
328  g.connect(); // Connect to it.
329  g.addListeners((name, value) -> {
330  System.out.println(g);
331  });
332  while (g.isAvailable())
333  Thread.sleep(100);
334  System.out.println("Controller clean exit");
335  } catch (Throwable t) {
336  System.out.println("Waiting for device to be availible");
337  t.printStackTrace();
338  Thread.sleep(1000);
339  }
340  }
341 
342  }
343 
344  public String getName() {
345  return name;
346  }
347 
348  public void setName(String name) {
349  this.name = name;
350  }
351 
352 }
void map(String controllerVal, String persistantVal)
static String getMappedAxisName(String controllerName, String incomingName)
static void map(String name, String controllerVal, String persistantVal)
static boolean isMapedAxis(String controllerName, String mappedValue)
static void warning(String message)
Definition: Log.java:101