arduino-joystick/Joystick.h

76 lines
2.3 KiB
C
Raw Normal View History

2015-11-05 03:02:09 +00:00
#ifndef _JOYSTICK_H_
#define _JOYSTICK_H_
#include "Button.h"
2015-11-05 03:02:09 +00:00
#include <Arduino.h>
#include <Bounce2.h>
#include <Encoder.h>
#include <Mux.h>
using namespace admux;
2015-11-05 03:02:09 +00:00
// 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
2015-11-05 03:02:09 +00:00
#define JOYSTICK_NUM_AXES 8
#endif
#ifndef JOYSTICK_NUM_BUTTONS
2015-11-05 03:02:09 +00:00
#define JOYSTICK_NUM_BUTTONS 40
#endif
2015-11-05 03:02:09 +00:00
#define JOYSTICK_NUM_BYTES (JOYSTICK_NUM_BUTTONS+7)/8
2015-11-11 05:10:45 +00:00
struct JoyReport {
2015-11-05 03:02:09 +00:00
int16_t axis[JOYSTICK_NUM_AXES];
uint8_t button[JOYSTICK_NUM_BYTES];
2015-11-11 05:10:45 +00:00
};
bool operator ==(JoyReport a, JoyReport b);
bool operator !=(JoyReport a, JoyReport b);
2015-11-05 03:02:09 +00:00
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
2015-11-05 03:02:09 +00:00
void PressButton(uint8_t button);
void ReleaseButton(uint8_t button);
private:
void SetAxis(uint8_t axis, int16_t value);
2015-11-05 03:02:09 +00:00
void ReleaseAllButtons();
void Write();
2015-11-11 05:10:45 +00:00
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.
uint8_t _axes[JOYSTICK_NUM_AXES];
uint8_t _num_axes;
2015-11-05 03:02:09 +00:00
JoyReport _joyReport;
bool _debug;
2015-11-05 03:02:09 +00:00
};
#endif