#include <fcntl.h>
#include <linux/joystick.h>
#include <msp/core/systemerror.h>
+#include <msp/fs/dir.h>
#include <msp/io/handle_private.h>
#include <msp/strings/format.h>
#include "gamecontroller.h"
namespace Msp {
namespace Input {
+vector<string> GameController::Private::detected_controllers;
+
GameController::GameController(unsigned index):
- priv(new Private),
event_disp(0)
{
- priv->dev = new JsDevice(format("/dev/input/js%d", index));
+ if(!detect_done)
+ detect();
+ if(index>=Private::detected_controllers.size())
+ throw device_not_available(format("GameController(%d)", index));
+
+ JsDevice *device = new JsDevice(Private::detected_controllers[index]);
+
+ priv = new Private;
+ priv->dev = device;
priv->dev->signal_data_available.connect(sigc::mem_fun(this, static_cast<void (GameController::*)()>(&GameController::tick)));
name = priv->dev->get_name();
tick(Time::zero);
delete priv;
}
+unsigned GameController::detect()
+{
+ Private::detected_controllers.clear();
+
+ FS::Path dev_input = "/dev/input";
+ list<string> devices = FS::list_filtered(dev_input, "^js[0-9]+");
+ for(list<string>::const_iterator i=devices.begin(); i!=devices.end(); ++i)
+ // TODO check permissions
+ Private::detected_controllers.push_back((dev_input / *i).str());
+
+ detect_done = true;
+ n_detected_controllers = Private::detected_controllers.size();
+
+ return Private::detected_controllers.size();
+}
+
void GameController::use_event_dispatcher(IO::EventDispatcher *ed)
{
if(event_disp)