#ifndef _JOYSTICK_H_ #define _JOYSTICK_H_ #include "Button.h" #include #include #include #include using namespace admux; // 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 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(); // Add a button to the joystick. // Button types are documented in the ButtonType enum. // If `pullup` is true, your button should connect the pin to ground. (also be sure that your board supports INPUT_PULLUP on that pin) // If `pullup` is false, your button should connect the pin to VCC. // Setting `analogOnly` to true indicates your button *must* be read with analog code, such as the A6 and A7 pins // on the Arduino Nano. void AddButton(uint8_t pin, ButtonType type, bool pullup=true, Mux* mux=NULL, bool analog_only=false); // Add a rotary encoder. ENCODER button types allow you to treat an encoder as a momentary button or an axis (TODO) void AddEncoder(uint8_t pin1, uint8_t pin2, ButtonType type); // Add an analog axis to the joystick. THIS METHOD IS NOT CURRENTLY TESTED OR SUPPORTED. It might work, but probably not. void AddAxis(uint8_t pin); // These members should not be used by end users; todo: remember how friend classes work void PressButton(uint8_t button); void ReleaseButton(uint8_t button); private: void SetAxis(uint8_t axis, int16_t value); void ReleaseAllButtons(); void Write(); void _ReleasePulsedButtons(); void _UpdateAxis(uint8_t index); Button* _buttons[JOYSTICK_NUM_BUTTONS]; uint8_t _num_buttons; uint8_t _virtual_buttons; // a single user-defined button can have multiple virtual buttons. bool _have_pulsed_button; uint8_t _axes[JOYSTICK_NUM_AXES]; uint8_t _num_axes; JoyReport _joyReport; bool _debug; }; #endif