process_joystick.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "process_joystick.h"
  2. #include <quantum/joystick.h>
  3. #include <quantum/quantum_keycodes.h>
  4. #ifdef __AVR__
  5. # include <drivers/avr/analog.h>
  6. #endif
  7. #include <string.h>
  8. bool process_joystick_buttons(uint16_t keycode, keyrecord_t *record);
  9. bool process_joystick(uint16_t keycode, keyrecord_t *record){
  10. if (process_joystick_buttons(keycode, record)
  11. && (joystick_status.status & JS_UPDATED)>0){
  12. send_joystick_packet(&joystick_status);
  13. joystick_status.status &= ~JS_UPDATED;
  14. }
  15. return true;
  16. }
  17. __attribute__ ((weak))
  18. void joystick_task(void){
  19. if (process_joystick_analog() && (joystick_status.status & JS_UPDATED)){
  20. send_joystick_packet(&joystick_status);
  21. joystick_status.status &= ~JS_UPDATED;
  22. }
  23. }
  24. bool process_joystick_buttons(uint16_t keycode, keyrecord_t *record){
  25. if (keycode < JS_BUTTON0 || keycode > JS_BUTTON_MAX){
  26. return true;
  27. } else {
  28. if (record->event.pressed){
  29. joystick_status.buttons[(keycode-JS_BUTTON0)/8] |= 1<<(keycode%8);
  30. } else {
  31. joystick_status.buttons[(keycode-JS_BUTTON0)/8] &= ~(1<<(keycode%8));
  32. }
  33. joystick_status.status |= JS_UPDATED;
  34. }
  35. return true;
  36. }
  37. __attribute__ ((weak))
  38. bool process_joystick_analog(){
  39. #if JOYSTICK_AXES_COUNT > 0
  40. for (int axis_index=0 ; axis_index<JOYSTICK_AXES_COUNT ; ++axis_index){
  41. if (joystick_axes[axis_index].output_pin==JS_VIRTUAL_AXIS || joystick_axes[axis_index].input_pin==JS_VIRTUAL_AXIS){
  42. continue;
  43. }
  44. setPinOutput(joystick_axes[axis_index].output_pin);
  45. writePinHigh(joystick_axes[axis_index].output_pin);
  46. //disable pull-up resistance
  47. setPinInput(joystick_axes[axis_index].input_pin);
  48. writePinLow(joystick_axes[axis_index].input_pin);
  49. #ifdef __AVR__
  50. int16_t axis_val = analogReadPin(joystick_axes[axis_index].input_pin);
  51. #else
  52. int16_t axis_val = 0;
  53. #endif
  54. if (axis_val!=joystick_status.axes[axis_index]){
  55. joystick_status.axes[axis_index] = axis_val;
  56. joystick_status.status |= JS_UPDATED;
  57. }
  58. writePinLow(joystick_axes[axis_index].output_pin);
  59. }
  60. #endif
  61. return true;
  62. }