From 051149e5026ff64f3ec477cf19080124b82de619 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 11 Sep 2014 12:37:22 +0300 Subject: [PATCH] Add a game controller input device Currently only implemented for Linux. --- Build | 4 + source/input/gamecontroller.h | 26 +++++++ source/input/linux/gamecontroller.cpp | 80 ++++++++++++++++++++ source/input/linux/gamecontroller_platform.h | 37 +++++++++ 4 files changed, 147 insertions(+) create mode 100644 source/input/gamecontroller.h create mode 100644 source/input/linux/gamecontroller.cpp create mode 100644 source/input/linux/gamecontroller_platform.h diff --git a/Build b/Build index 7972020..5ff4f78 100644 --- a/Build +++ b/Build @@ -104,6 +104,10 @@ package "mspgui" { source "source/graphics/devil"; }; + if_arch "linux" + { + overlay "linux"; + }; if_arch "windows" { overlay "windows"; diff --git a/source/input/gamecontroller.h b/source/input/gamecontroller.h new file mode 100644 index 0000000..9ebacee --- /dev/null +++ b/source/input/gamecontroller.h @@ -0,0 +1,26 @@ +#ifndef GAMECONTROLLER_H_ +#define GAMECONTROLLER_H_ + +#include "device.h" + +namespace Msp { +namespace Input { + +class GameController: public Device +{ +private: + struct Private; + + Private *priv; + +public: + GameController(unsigned); + virtual ~GameController(); + + void tick(); +}; + +} // namespace Input +} // namespace Msp + +#endif diff --git a/source/input/linux/gamecontroller.cpp b/source/input/linux/gamecontroller.cpp new file mode 100644 index 0000000..bf69049 --- /dev/null +++ b/source/input/linux/gamecontroller.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include "gamecontroller.h" +#include "gamecontroller_platform.h" + +using namespace std; + +namespace Msp { +namespace Input { + +GameController::GameController(unsigned index): + priv(new Private) +{ + priv->dev = new JsDevice(format("/dev/input/js%d", index)); + name = priv->dev->get_name(); + tick(); +} + +GameController::~GameController() +{ + delete priv->dev; + delete priv; +} + +void GameController::tick() +{ + js_event events[16]; + while(1) + { + unsigned len = priv->dev->read(reinterpret_cast(events), sizeof(events)); + + unsigned count = len/sizeof(js_event); + for(unsigned i=0; i +#include + +namespace Msp { +namespace Input { + +class JsDevice: public IO::EventObject +{ +private: + IO::Handle handle; + +public: + JsDevice(const std::string &); + + std::string get_name() const; + +protected: + virtual unsigned do_read(char *, unsigned); + virtual unsigned do_write(const char *, unsigned); + +public: + virtual const IO::Handle &get_event_handle() { return handle; } +}; + + +struct GameController::Private +{ + JsDevice *dev; +}; + +} // namespace Input +} // namespace Msp + +#endif -- 2.43.0