@Override public void controllerAdded(ControllerEvent ev) { Controller controller = ev.getController(); logger.info("Controller connected: " + controller.getName()); addController(controller); } });
public void setJoyRumble(int joyId, float amount){ if( joyId >= joysticks.length ) throw new IllegalArgumentException(); Controller c = joysticks[joyId].controller; for (Rumbler r : c.getRumblers()){ r.rumble(amount); } }
/** * Removes a controller. Also works while iterating over the list. * @param controller the controller to remove */ private void removeController(Controller controller) { controllers.remove(controller); logger.info("Removed controller: " + controller.getName()); }
public void update() { ControllerEnvironment ce = ControllerEnvironment.getDefaultEnvironment(); Controller[] cs = ce.getControllers(); Event e = new Event(); for (int i = 0; i < cs.length; i++){ Controller c = cs[i]; if( !c.poll() ) continue; EventQueue q = c.getEventQueue(); while (q.getNextEvent(e)){ Identifier id = e.getComponent().getIdentifier(); if (id == Identifier.Axis.POV){ float x = 0, y = 0; float v = e.getValue(); listener.onJoyAxisEvent(evt2); }else if (id instanceof Axis){ float value = e.getValue(); JoystickAxis axis = stick.axisIndex.get(e.getComponent()); JoyAxisEvent evt = new JoyAxisEvent(axis, value); listener.onJoyAxisEvent(evt); }else if (id instanceof Button){ JoystickButton button = stick.buttonIndex.get(e.getComponent()); JoyButtonEvent evt = new JoyButtonEvent(button, e.getValue() == 1f);
private ControllerAction convertEvent(Controller c, Event event) { Component comp = event.getComponent(); Identifier id = comp.getIdentifier(); float axisValue = comp.getPollData(); Input input; ButtonState state = ButtonState.UP; state = event.getValue() != 0 ? ButtonState.DOWN : ButtonState.UP; Integer buttonId = buttonMap.get(id); if (buttonId == null) { ControllerInfo info = config.getController(c.getName()); if (id.equals(Identifier.Axis.X)) { if (Math.abs(axisValue) < info.getMovementDeadZone()) { return new ControllerAction(input, c.getName(), state, axisValue);
public Joystick[] loadJoysticks(InputManager inputManager){ ControllerEnvironment ce = ControllerEnvironment.getDefaultEnvironment(); Controller[] cs = ce.getControllers(); List<Joystick> list = new ArrayList<Joystick>(); for( Controller c : ce.getControllers() ) { if (c.getType() == Controller.Type.KEYBOARD || c.getType() == Controller.Type.MOUSE) continue; logger.log(Level.FINE, "Attempting to create joystick for: \"{0}\"", c); // Try to create it like a joystick JInputJoystick stick = new JInputJoystick(inputManager, this, c, list.size(), c.getName()); for( Component comp : c.getComponents() ) { stick.addComponent(comp); } // If it has no axes then we'll assume it's not // a joystick if( stick.getAxisCount() == 0 ) { logger.log(Level.FINE, "Not a joystick: {0}", c); continue; } joystickIndex.put(c, stick); list.add(stick); } joysticks = list.toArray( new JInputJoystick[list.size()] ); return joysticks; }
protected void addAxis( Component comp ) { logger.log(Level.FINE, "Adding axis: \"{0}\" id:" + comp.getIdentifier(), comp ); Identifier id = comp.getIdentifier(); if( !(id instanceof Axis) ) { throw new IllegalArgumentException( "Component is not an axis:" + comp ); String name = comp.getName(); String original = id.getName(); String logicalId = JoystickCompatibilityMappings.remapComponent( controller.getName(), original ); if( logicalId != original ) { logger.log(Level.FINE, "Remapped:" + original + " to:" + logicalId); comp.isAnalog(), comp.isRelative(), comp.getDeadZone() ); addAxis(axis); axisIndex.put( comp, axis ); id.getName() + "_x", comp.isAnalog(), comp.isRelative(), comp.getDeadZone() ); logger.log(Level.FINE, "Adding axis: \"{0}\" id:" + id.getName() + "_x", povX.getName() ); addAxis(povX); povY = new DefaultJoystickAxis( getInputManager(), this, getAxisCount(), JoystickAxis.POV_Y, id.getName() + "_y", comp.isAnalog(), comp.isRelative(), comp.getDeadZone() ); logger.log(Level.FINE, "Adding axis: \"{0}\" id:" + id.getName() + "_y", povY.getName() ); addAxis(povY);
@Override public Queue<ControllerAction> getInputQueue() { Queue<ControllerAction> result = new ArrayDeque<>(); Event event = new Event(); Iterator<Controller> it = controllers.iterator(); while (it.hasNext()) { Controller c = it.next(); if (c.poll()) { EventQueue queue = c.getEventQueue(); while (queue.getNextEvent(event)) { ControllerAction action = convertEvent(c, event); if (action != null) { result.add(action); } } } else { removeController(c); } } return result; }
protected void addButton( Component comp ) { logger.log(Level.FINE, "Adding button: \"{0}\" id:" + comp.getIdentifier(), comp); Identifier id = comp.getIdentifier(); if( !(id instanceof Button) ) { throw new IllegalArgumentException( "Component is not an button:" + comp ); } String name = comp.getName(); String original = id.getName(); try { Integer.parseInt(original); } catch (NumberFormatException e){ original = String.valueOf(buttonIndex.size()); } String logicalId = JoystickCompatibilityMappings.remapComponent( controller.getName(), original ); if( logicalId != original ) { logger.log(Level.FINE, "Remapped:" + original + " to:" + logicalId); } JoystickButton button = new DefaultJoystickButton( getInputManager(), this, getButtonCount(), name, logicalId ); addButton(button); buttonIndex.put( comp, button ); }
public JInputControllerDevice(ControllerConfig config) { this.config = config; ControllerEnvironment env = ControllerEnvironment.getDefaultEnvironment(); // Unfortunately, no existing implementation env.addControllerListener(new ControllerListener() { @Override public void controllerRemoved(ControllerEvent ev) { Controller controller = ev.getController(); logger.info("Controller disconnected: " + controller.getName()); removeController(controller); } @Override public void controllerAdded(ControllerEvent ev) { Controller controller = ev.getController(); logger.info("Controller connected: " + controller.getName()); addController(controller); } }); for (Controller c : env.getControllers()) { addController(c); } }
private void addController(Controller c) { if (filter.contains(c.getType())) { logger.debug("Ignoring controller: " + c.getName()); return; } if (c.getControllers().length == 0) { controllers.add(c); logger.info("Registered controller: " + c.getName()); } else { for (Controller sub : c.getControllers()) { addController(sub); } } } }
public final static synchronized boolean getNextDeviceEvent(Event event, LinuxEventDevice device) throws IOException { while (device.getNextEvent(linux_event)) { LinuxAxisDescriptor descriptor = linux_event.getDescriptor(); LinuxComponent component = device.mapDescriptor(descriptor); if (component != null) { float value = component.convertValue(linux_event.getValue(), descriptor); event.set(component, value, linux_event.getNanos()); return true; } } return false; }
protected void addComponent( Component comp ) { Identifier id = comp.getIdentifier(); if( id instanceof Button ) { addButton(comp); } else if( id instanceof Axis ) { addAxis(comp); } else { logger.log(Level.FINE, "Ignoring: \"{0}\"", comp); } }
public final static synchronized boolean getNextDeviceEvent(Event event, OSXHIDQueue queue) throws IOException { if (queue.getNextEvent(osx_event)) { OSXComponent component = queue.mapEvent(osx_event); event.set(component, component.getElement().convertValue(osx_event.getValue()), osx_event.getNanos()); return true; } else return false; } }
/** * Creates a new EventQueue. Events in old queue are lost. */ public final void setEventQueueSize(int size) { try { setDeviceEventQueueSize(size); event_queue = new EventQueue(size); } catch (IOException e) { ControllerEnvironment.log("Failed to create new event queue of size " + size + ": " + e); } }
private final Component.Identifier computeIdentifier() { if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP) { return ((GenericDesktopUsage)usage_pair.getUsage()).getIdentifier(); } else if (usage_pair.getUsagePage() == UsagePage.BUTTON) { return ((ButtonUsage)usage_pair.getUsage()).getIdentifier(); } else if (usage_pair.getUsagePage() == UsagePage.KEYBOARD_OR_KEYPAD) { return ((KeyboardUsage)usage_pair.getUsage()).getIdentifier(); } else return null; }
private final Rumbler createPeriodicRumbler(DIDeviceObject[] axes, long[] directions, DIEffectInfo info) throws IOException { int[] axis_ids = new int[axes.length]; for (int i = 0; i < axis_ids.length; i++) { axis_ids[i] = axes[i].getDIIdentifier(); } long effect_address = nCreatePeriodicEffect(address, info.getGUID(), DIEFF_CARTESIAN | DIEFF_OBJECTIDS, INFINITE, 0, DI_FFNOMINALMAX, DIEB_NOTRIGGER, 0, axis_ids, directions, 0, 0, 0, 0, DI_FFNOMINALMAX, 0, 0, 50000, 0); return new IDirectInputEffect(effect_address, info); } private final static native long nCreatePeriodicEffect(long address, byte[] effect_guid, int flags, int duration, int sample_period, int gain, int trigger_button, int trigger_repeat_interval, int[] axis_ids, long[] directions, int envelope_attack_level, int envelope_attack_time, int envelope_fade_level, int envelope_fade_time, int periodic_magnitude, int periodic_offset, int periodic_phase, int periodic_period, int start_delay) throws IOException;
public final static synchronized boolean getNextDeviceEvent(Event event, LinuxEventDevice device) throws IOException { while (device.getNextEvent(linux_event)) { LinuxAxisDescriptor descriptor = linux_event.getDescriptor(); LinuxComponent component = device.mapDescriptor(descriptor); if (component != null) { float value = component.convertValue(linux_event.getValue(), descriptor); event.set(component, value, linux_event.getNanos()); return true; } } return false; }
@Override public void controllerRemoved(ControllerEvent ev) { Controller controller = ev.getController(); logger.info("Controller disconnected: " + controller.getName()); removeController(controller); }
@Override public List<String> getControllers() { List<String> ids = new ArrayList<>(); for (Controller controller : controllers) { ids.add(controller.getName()); } return ids; }