JoystickHandler.java 4.9 KB

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