JoystickHandler.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package control.joystick;
  2. import java.awt.event.KeyEvent;
  3. import java.awt.event.KeyListener;
  4. import java.util.ArrayList;
  5. import java.util.HashSet;
  6. import java.util.List;
  7. import java.util.Set;
  8. import com.pi4j.io.gpio.GpioController;
  9. import com.pi4j.io.gpio.GpioFactory;
  10. import com.pi4j.io.gpio.GpioPinDigitalInput;
  11. import com.pi4j.io.gpio.PinState;
  12. import com.pi4j.io.gpio.RaspiPin;
  13. import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
  14. import com.pi4j.io.gpio.event.GpioPinListenerDigital;
  15. import control.joystick.Joystick.Position;
  16. public class JoystickHandler implements KeyListener{
  17. List<JoystickListener> listeners;
  18. Set<Integer> keys;
  19. public static boolean REPEAT = false;
  20. public static Joystick j = new Joystick();;
  21. public JoystickHandler()
  22. {
  23. listeners = new ArrayList<JoystickListener>();
  24. keys = new HashSet<Integer>();
  25. // if(Window.ON_RASP)
  26. // addGpioListeners();
  27. }
  28. private void addGpioListeners(){
  29. ArrayList<GpioPinDigitalInput> inputpins = new ArrayList<GpioPinDigitalInput>();
  30. final GpioController gpio = GpioFactory.getInstance();
  31. inputpins.add(gpio.provisionDigitalInputPin(RaspiPin.GPIO_04, "UP")); //button 1 to 6 + start button
  32. inputpins.add(gpio.provisionDigitalInputPin(RaspiPin.GPIO_05, "LEFT"));
  33. inputpins.add(gpio.provisionDigitalInputPin(RaspiPin.GPIO_11, "RIGHT"));
  34. inputpins.add(gpio.provisionDigitalInputPin(RaspiPin.GPIO_10, "DOWN"));
  35. for(GpioPinDigitalInput p:inputpins){
  36. p.addListener(new GpioPinListenerDigital() {
  37. @Override
  38. public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent e) {
  39. if(e.getState() == PinState.HIGH){
  40. keyReleased(new KeyEvent(
  41. new java.awt.Component(){
  42. /**
  43. *
  44. */
  45. private static final long serialVersionUID = 1L;},
  46. KeyEvent.KEY_RELEASED,
  47. System.nanoTime(),
  48. 0,
  49. stringToKeyevent(e.getPin().getName()),
  50. KeyEvent.CHAR_UNDEFINED)
  51. );
  52. System.out.println(e.getPin().getName() + " Released");
  53. }else{
  54. keyPressed(new KeyEvent(
  55. new java.awt.Component(){
  56. /**
  57. *
  58. */
  59. private static final long serialVersionUID = 1L;},
  60. KeyEvent.KEY_PRESSED,
  61. System.nanoTime(),
  62. 0,
  63. stringToKeyevent(e.getPin().getName()),
  64. KeyEvent.CHAR_UNDEFINED)
  65. );
  66. System.out.println(e.getPin().getName() + " Pressed");
  67. }
  68. }
  69. });
  70. }
  71. }
  72. public void addJoystickListener(JoystickListener toAdd) {
  73. listeners.add(toAdd);
  74. }
  75. public void onJoystickMoved(Joystick j) {
  76. JoystickEvent e = new JoystickEvent(j, System.currentTimeMillis());
  77. for (JoystickListener yst : listeners)
  78. yst.onJoystickMoved(e);
  79. }
  80. private void updateJoystickPosition()
  81. {
  82. if(keys.contains(KeyEvent.VK_UP) && keys.contains(KeyEvent.VK_RIGHT))
  83. {
  84. j.setPosition(Position.UP_RIGHT);
  85. }
  86. else if(keys.contains(KeyEvent.VK_UP) && keys.contains(KeyEvent.VK_LEFT))
  87. {
  88. j.setPosition(Position.UP_LEFT);
  89. }
  90. else if(keys.contains(KeyEvent.VK_DOWN) && keys.contains(KeyEvent.VK_RIGHT))
  91. {
  92. j.setPosition(Position.DOWN_RIGHT);
  93. }
  94. else if(keys.contains(KeyEvent.VK_DOWN) && keys.contains(KeyEvent.VK_LEFT))
  95. {
  96. j.setPosition(Position.DOWN_LEFT);
  97. }
  98. else if(keys.contains(KeyEvent.VK_UP))
  99. {
  100. j.setPosition(Position.UP);
  101. }
  102. else if(keys.contains(KeyEvent.VK_LEFT))
  103. {
  104. j.setPosition(Position.LEFT);
  105. }
  106. else if(keys.contains(KeyEvent.VK_RIGHT))
  107. {
  108. j.setPosition(Position.RIGHT);
  109. }
  110. else if(keys.contains(KeyEvent.VK_DOWN))
  111. {
  112. j.setPosition(Position.DOWN);
  113. }
  114. else
  115. {
  116. j.setPosition(Position.CENTER);
  117. }
  118. }
  119. private int stringToKeyevent(String s){
  120. switch(s){
  121. case "UP":
  122. return KeyEvent.VK_UP;
  123. case "DOWN":
  124. return KeyEvent.VK_DOWN;
  125. case "LEFT":
  126. return KeyEvent.VK_LEFT;
  127. case "RIGHT":
  128. return KeyEvent.VK_RIGHT;
  129. }
  130. return -1;
  131. }
  132. @Override
  133. public void keyPressed(KeyEvent e) {
  134. if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT)
  135. {
  136. Set<Integer> keysCopy = new HashSet<Integer>(keys);
  137. keys.add(e.getKeyCode());
  138. updateJoystickPosition();
  139. if(REPEAT || !keys.equals(keysCopy) )
  140. {
  141. onJoystickMoved(j);
  142. }
  143. }
  144. }
  145. @Override
  146. public void keyReleased(KeyEvent e) {
  147. if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT)
  148. {
  149. Set<Integer> keysCopy = new HashSet<Integer>(keys);
  150. keys.remove(e.getKeyCode());
  151. updateJoystickPosition();
  152. if(REPEAT || !keys.equals(keysCopy))
  153. {
  154. onJoystickMoved(j);
  155. }
  156. }
  157. }
  158. public void keyTyped(KeyEvent e) {}
  159. }