-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathdirectinputsource.cpp
More file actions
102 lines (92 loc) · 2.93 KB
/
Copy pathdirectinputsource.cpp
File metadata and controls
102 lines (92 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <QDebug>
#include "directinputsource.h"
DirectInputSource::DirectInputSource(int device)
{
controller = new QGameController(device);
connect(controller, &QGameController::gameControllerButtonEvent, this, &DirectInputSource::handleButtonEvent);
connect(controller, &QGameController::gameControllerAxisEvent, this, &DirectInputSource::handleAxisEvent);
connect(&timer, &QTimer::timeout, controller, &QGameController::readGameController);
timer.setInterval(10);
for (unsigned int i = 0; i < controller->axisCount(); i++)
{
oldAxisValue[i] = 0;
}
}
void DirectInputSource::start()
{
timer.start();
}
void DirectInputSource::stop()
{
timer.stop();
}
bool DirectInputSource::isReady()
{
return controller->isValid();
}
QString DirectInputSource::statusText()
{
return tr("Gamepad connected");
}
QString DirectInputSource::name() const
{
return controller->description();
}
void DirectInputSource::setMapping(QMap<InputProvider::SNESButton, LocalControllerButtonAxisInfos> map)
{
QMapIterator<InputProvider::SNESButton, LocalControllerButtonAxisInfos> it(map);
buttonMapping.clear();
axisMapping.clear();
while (it.hasNext())
{
it.next();
if (it.value().button != -1)
{
buttonMapping[it.value().button] = it.key();
} else {
axisMapping[QPair<unsigned int, double>(it.value().axis, it.value().value)] = it.key();
}
}
qDebug() << buttonMapping;
qDebug() << axisMapping;
}
void DirectInputSource::handleButtonEvent(QGameControllerButtonEvent *buttonEvent)
{
if (buttonMapping.contains(buttonEvent->button()))
{
if (buttonEvent->pressed())
{
emit buttonPressed(buttonMapping[buttonEvent->button()]);
} else {
emit buttonReleased(buttonMapping[buttonEvent->button()]);
}
}
delete buttonEvent;
}
void DirectInputSource::handleAxisEvent(QGameControllerAxisEvent *axisEvent)
{
QMapIterator<QPair<unsigned int, double>, InputProvider::SNESButton> it(axisMapping);
qDebug() << "Axis event" << axisEvent->axis() << axisEvent->value();
while (it.hasNext())
{
it.next();
if (it.key().first == axisEvent->axis())
{
qDebug() << "Axis match " << it.value() << " old value " << oldAxisValue[axisEvent->axis()];
if (axisEvent->value() == it.key().second)
{
qDebug() << "Axis " << axisEvent->axis() << " pressed";
emit buttonPressed(it.value());
continue;
}
if (axisEvent->value() != oldAxisValue[axisEvent->axis()]
&& it.key().second == oldAxisValue[axisEvent->axis()])
{
qDebug() << "Axis " << axisEvent->axis() << " released";
emit buttonReleased(it.value());
}
}
}
oldAxisValue[axisEvent->axis()] = axisEvent->value();
delete axisEvent;
}