From b4158f460d59dcc440e46d011d432bebbd42f7f5 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 18 Mar 2021 15:48:41 +0000 Subject: initial --- include/joystick.hpp | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 include/joystick.hpp (limited to 'include') diff --git a/include/joystick.hpp b/include/joystick.hpp new file mode 100644 index 0000000..1c80b0d --- /dev/null +++ b/include/joystick.hpp @@ -0,0 +1,128 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Copyright Drew Noakes 2013-2016 + +#ifndef __JOYSTICK_HH__ +#define __JOYSTICK_HH__ + +#include +#include + +#define JS_EVENT_BUTTON 0x01 // button pressed/released +#define JS_EVENT_AXIS 0x02 // joystick moved +#define JS_EVENT_INIT 0x80 // initial state of device + +/** + * Encapsulates all data relevant to a sampled joystick event. + */ +class JoystickEvent +{ +public: + /** Minimum value of axes range */ + static const short MIN_AXES_VALUE = -32768; + + /** Maximum value of axes range */ + static const short MAX_AXES_VALUE = 32767; + + /** + * The timestamp of the event, in milliseconds. + */ + unsigned int time; + + /** + * The value associated with this joystick event. + * For buttons this will be either 1 (down) or 0 (up). + * For axes, this will range between MIN_AXES_VALUE and MAX_AXES_VALUE. + */ + short value; + + /** + * The event type. + */ + unsigned char type; + + /** + * The axis/button number. + */ + unsigned char number; + + /** + * Returns true if this event is the result of a button press. + */ + bool isButton() + { + return (type & JS_EVENT_BUTTON) != 0; + } + + /** + * Returns true if this event is the result of an axis movement. + */ + bool isAxis() + { + return (type & JS_EVENT_AXIS) != 0; + } + + /** + * Returns true if this event is part of the initial state obtained when + * the joystick is first connected to. + */ + bool isInitialState() + { + return (type & JS_EVENT_INIT) != 0; + } + + /** + * The ostream inserter needs to be a friend so it can access the + * internal data structures. + */ + friend std::ostream& operator<<(std::ostream& os, const JoystickEvent& e); +}; + +/** + * Stream insertion function so you can do this: + * cout << event << endl; + */ +std::ostream& operator<<(std::ostream& os, const JoystickEvent& e); + +/** + * Represents a joystick device. Allows data to be sampled from it. + */ +class Joystick +{ +private: + void openPath(std::string devicePath, bool blocking=false); + + int _fd; + +public: + ~Joystick(); + + + /** + * Initialises an instance for the joystick device specified. + */ + void init(int joystickNumber); + + /** + * Returns true if the joystick was found and may be used, otherwise false. + */ + bool isFound(); + + /** + * Attempts to populate the provided JoystickEvent instance with data + * from the joystick. Returns true if data is available, otherwise false. + */ + bool sample(JoystickEvent* event); +}; + +#endif -- cgit v1.2.3