#ifndef _JOYSTICK_H_ #define _JOYSTICK_H_ #include #include #include using std::list; // 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_PASSTHRU = 0x1, // always use the (debounced) absolute state of the input BUTTON_PULSED = 0x2, // on button press, send an on signal followed immediately by an off signal. BUTTON_PULSED_DOUBLE_ACTION = 0x4, // Send a button press twice - once for press and once for release. BUTTON_PULSED_DOUBLE_ACTION_SPLIT = 0x8, // Send two separate button presses - one button on press, another on release. BUTTON_LATCHED_MOMENTARY = 0x10 }; struct JoyReport { int16_t axis[JOYSTICK_NUM_AXES]; uint8_t button[JOYSTICK_NUM_BYTES]; }; struct Button { ButtonType type; Bounce bouncer; uint8_t index0; uint8_t index1; // only used by BUTTON_PULSED_DOUBLE_ACTION_SPLIT bool pressed = false; // only used by BUTTON_LATCHED_MOMENTARY bool inverted = false; // if true, send button press on release and vice versa. }; 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=true); void AddAxis(uint8_t pin); // Axes don't actually work yet! // Public access to these functions is deprecated and they 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(); void _UpdateButton(uint8_t index); void _UpdateAxis(uint8_t index); list