JoystickHandler.java 5.0 KB

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