#ifndef _JOYSTICK_H_ #define _JOYSTICK_H_ #include // If you're using the arduino-big-joystick firmware, these numbers can't be // changed. If you're writing your own Report Descriptor, tune these to match by // defining them *before* you include Joystick.h. #ifndef JOYSTICK_NUM_AXES #define JOYSTICK_NUM_AXES 8 #endif #ifndef JOYSTICK_NUM_BUTTONS #define JOYSTICK_NUM_BUTTONS 40 #endif #define JOYSTICK_NUM_BYTES (JOYSTICK_NUM_BUTTONS+7)/8 enum ButtonType { BUTTON_MAINTAINED = 0x1, BUTTON_PULSED = 0x2, BUTTON_PULSED_DOUBLE_ACTION = 0x4 }; typedef struct JoyReport { int16_t axis[JOYSTICK_NUM_AXES]; uint8_t button[JOYSTICK_NUM_BYTES]; } ; bool operator ==(JoyReport a, JoyReport b); bool operator !=(JoyReport a, JoyReport b); class Joystick { public: Joystick(bool debug=false); void Init(); void Update(); void AddButton(uint8_t pin, ButtonType type, bool pullup=false); void AddAxis(uint8_t pin); // These functions are deprecated and may become private in a future // version. Prefer the above API instead. void SetAxis(uint8_t axis, int16_t value); void PressButton(uint8_t button); void ReleaseButton(uint8_t button); void ReleaseAllButtons(); void Write(); private: void _ReleasePulsedButtons(); struct { uint8_t pin; ButtonType type; uint8_t last_state; } _buttons[JOYSTICK_NUM_BUTTONS]; uint8_t _num_buttons; bool _have_pulsed_button; uint8_t _axes[JOYSTICK_NUM_AXES]; uint8_t _num_axes; JoyReport _joyReport; bool _debug; }; // Internal use only. #define _BUTTON_PULSED_TYPES (BUTTON_PULSED | BUTTON_PULSED_DOUBLE_ACTION) #endif