JoystickHandler.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. KeyEvent.KEY_RELEASED,
  44. System.nanoTime(),
  45. 0,
  46. stringToKeyevent(e.getPin().getName()),
  47. KeyEvent.CHAR_UNDEFINED)
  48. );
  49. System.out.println(e.getPin().getName() + " Released");
  50. }else{
  51. keyPressed(new KeyEvent(
  52. new java.awt.Component(){},
  53. KeyEvent.KEY_PRESSED,
  54. System.nanoTime(),
  55. 0,
  56. stringToKeyevent(e.getPin().getName()),
  57. KeyEvent.CHAR_UNDEFINED)
  58. );
  59. System.out.println(e.getPin().getName() + " Pressed");
  60. }
  61. }
  62. });
  63. }
  64. }
  65. public void addJoystickListener(JoystickListener toAdd) {
  66. listeners.add(toAdd);
  67. }
  68. public void onJoystickMoved(Joystick j) {
  69. JoystickEvent e = new JoystickEvent(j, System.currentTimeMillis());
  70. for (JoystickListener yst : listeners)
  71. yst.onJoystickMoved(e);
  72. }
  73. private void updateJoystickPosition()
  74. {
  75. if(keys.contains(KeyEvent.VK_UP) && keys.contains(KeyEvent.VK_RIGHT))
  76. {
  77. j.setPosition(Position.UP_RIGHT);
  78. }
  79. else if(keys.contains(KeyEvent.VK_UP) && keys.contains(KeyEvent.VK_LEFT))
  80. {
  81. j.setPosition(Position.UP_LEFT);
  82. }
  83. else if(keys.contains(KeyEvent.VK_DOWN) && keys.contains(KeyEvent.VK_RIGHT))
  84. {
  85. j.setPosition(Position.DOWN_RIGHT);
  86. }
  87. else if(keys.contains(KeyEvent.VK_DOWN) && keys.contains(KeyEvent.VK_LEFT))
  88. {
  89. j.setPosition(Position.DOWN_LEFT);
  90. }
  91. else if(keys.contains(KeyEvent.VK_UP))
  92. {
  93. j.setPosition(Position.UP);
  94. }
  95. else if(keys.contains(KeyEvent.VK_LEFT))
  96. {
  97. j.setPosition(Position.LEFT);
  98. }
  99. else if(keys.contains(KeyEvent.VK_RIGHT))
  100. {
  101. j.setPosition(Position.RIGHT);
  102. }
  103. else if(keys.contains(KeyEvent.VK_DOWN))
  104. {
  105. j.setPosition(Position.DOWN);
  106. }
  107. else
  108. {
  109. j.setPosition(Position.CENTER);
  110. }
  111. }
  112. private int stringToKeyevent(String s){
  113. switch(s){
  114. case "UP":
  115. return KeyEvent.VK_UP;
  116. case "DOWN":
  117. return KeyEvent.VK_DOWN;
  118. case "LEFT":
  119. return KeyEvent.VK_LEFT;
  120. case "RIGHT":
  121. return KeyEvent.VK_RIGHT;
  122. }
  123. return -1;
  124. }
  125. @Override
  126. public void keyPressed(KeyEvent e) {
  127. if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT)
  128. {
  129. Set<Integer> keysCopy = new HashSet<Integer>(keys);
  130. keys.add(e.getKeyCode());
  131. updateJoystickPosition();
  132. if(!keys.equals(keysCopy))
  133. {
  134. onJoystickMoved(j);
  135. }
  136. }
  137. }
  138. @Override
  139. public void keyReleased(KeyEvent e) {
  140. if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT)
  141. {
  142. Set<Integer> keysCopy = new HashSet<Integer>(keys);
  143. keys.remove(e.getKeyCode());
  144. updateJoystickPosition();
  145. if(!keys.equals(keysCopy))
  146. {
  147. onJoystickMoved(j);
  148. }
  149. }
  150. }
  151. public void keyTyped(KeyEvent e) {}
  152. }