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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/**
* @file controller.h
* @author Sean Pappalardo spappalardo@mixxx.org
* @date Sat Apr 30 2011
* @brief Base class representing a physical (or software) controller.
*/
#include <QApplication>
#include <QScriptValue>
#include "controllers/controller.h"
#include "controllers/controllerdebug.h"
#include "controllers/defs_controllers.h"
Controller::Controller()
: QObject(),
m_pEngine(NULL),
m_bIsOutputDevice(false),
m_bIsInputDevice(false),
m_bIsOpen(false),
m_bLearning(false) {
}
Controller::~Controller() {
// Don't close the device here. Sub-classes should close the device in their
// destructors.
}
void Controller::startEngine()
{
controllerDebug(" Starting engine");
if (m_pEngine != NULL) {
qWarning() << "Controller: Engine already exists! Restarting:";
stopEngine();
}
m_pEngine = new ControllerEngine(this);
}
void Controller::stopEngine() {
controllerDebug(" Shutting down engine");
if (m_pEngine == NULL) {
qWarning() << "Controller::stopEngine(): No engine exists!";
return;
}
m_pEngine->gracefulShutdown();
delete m_pEngine;
m_pEngine = NULL;
}
bool Controller::applyPreset(QList<QString> scriptPaths, bool initializeScripts) {
qDebug() << "Applying controller preset...";
const ControllerPreset* pPreset = preset();
// Load the script code into the engine
if (m_pEngine == NULL) {
qWarning() << "Controller::applyPreset(): No engine exists!";
return false;
}
if (pPreset->scripts.isEmpty()) {
qWarning() << "No script functions available! Did the XML file(s) load successfully? See above for any errors.";
return true;
}
bool success = m_pEngine->loadScriptFiles(scriptPaths, pPreset->scripts);
if (initializeScripts) {
m_pEngine->initializeScripts(pPreset->scripts);
}
return success;
}
void Controller::startLearning() {
qDebug() << m_sDeviceName << "started learning";
m_bLearning = true;
}
void Controller::stopLearning() {
//qDebug() << m_sDeviceName << "stopped learning.";
m_bLearning = false;
}
void Controller::send(QList<int> data, unsigned int length) {
// If you change this implementation, also change it in HidController (That
// function is required due to HID devices having report IDs)
QByteArray msg(length, 0);
for (unsigned int i = 0; i < length; ++i) {
msg[i] = data.at(i);
}
send(msg);
}
void Controller::receive(const QByteArray data) {
if (m_pEngine == NULL) {
//qWarning() << "Controller::receive called with no active engine!";
// Don't complain, since this will always show after closing a device as
// queued signals flush out
return;
}
int length = data.size();
if (ControllerDebug::enabled()) {
// Formatted packet display
QString message = QString("%1: %2 bytes:\n").arg(m_sDeviceName).arg(length);
for(int i=0; i<length; i++) {
QString spacer=" ";
if ((i+1) % 4 == 0) spacer=" ";
if ((i+1) % 16 == 0) spacer="\n";
message += QString("%1%2")
.arg((unsigned char)(data.at(i)), 2, 16, QChar('0')).toUpper()
.arg(spacer);
}
controllerDebug(message);
}
foreach (QString function, m_pEngine->getScriptFunctionPrefixes()) {
if (function == "") {
continue;
}
function.append(".incomingData");
QScriptValue incomingData = m_pEngine->resolveFunction(function, true);
if (!m_pEngine->execute(incomingData, data)) {
qWarning() << "Controller: Invalid script function" << function;
}
}
}
|