diff --git a/examples/controllers/controllerMappings.js b/examples/controllers/controllerMappings.js index 1007e7bf22..d314df3f4c 100644 --- a/examples/controllers/controllerMappings.js +++ b/examples/controllers/controllerMappings.js @@ -12,7 +12,7 @@ // Assumes you only have the default keyboard connected -myFirstMapping = function() { +/*myFirstMapping = function() { return { "name": "example", "channels": [ @@ -42,15 +42,37 @@ return { ] } } - +*/ +mySecondMapping = function() { +return { + "name": "example2", + "channels": [ + { "from": "Standard.LY", "to": "Actions.TranslateZ" }, + { "from": "Standard.LX", "to": "Actions.Yaw" }, + ] +} +} //Script.include('mapping-test0.json'); -var myFirstMappingJSON = myFirstMapping(); +/*var myFirstMappingJSON = myFirstMapping(); print('myFirstMappingJSON' + JSON.stringify(myFirstMappingJSON)); var mapping = Controller.parseMapping(JSON.stringify(myFirstMappingJSON)); -Controller.enableMapping("example"); + +Controller.enableMapping("example3"); + +var mySecondMappingJSON = mySecondMapping(); +print('mySecondMappingJSON' + JSON.stringify(mySecondMappingJSON)); + +var mapping2 = Controller.parseMapping(JSON.stringify(mySecondMappingJSON)); +mapping2.enable(); + +Controller.enableMapping("example2"); +*/ +var mapping3 = Controller.loadMapping("E:/Github/hifi/examples/controllers/example3.json"); +Controller.enableMapping("example3"); + /* Object.keys(Controller.Standard).forEach(function (input) { print("Controller.Standard." + input + ":" + Controller.Standard[input]); diff --git a/libraries/controllers/src/controllers/ScriptingInterface.cpp b/libraries/controllers/src/controllers/ScriptingInterface.cpp index abb9544892..80816d9773 100644 --- a/libraries/controllers/src/controllers/ScriptingInterface.cpp +++ b/libraries/controllers/src/controllers/ScriptingInterface.cpp @@ -14,14 +14,18 @@ #include #include +#include #include #include +#include + #include "impl/MappingBuilderProxy.h" #include "Logging.h" #include "InputDevice.h" + namespace controller { class VirtualEndpoint : public Endpoint { @@ -176,7 +180,8 @@ namespace controller { QObject* ScriptingInterface::parseMapping(const QString& json) { QJsonObject obj; - QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); + QJsonParseError error; + QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &error); // check validity of the document if (!doc.isNull()) { if (doc.isObject()) { @@ -194,12 +199,35 @@ namespace controller { qDebug() << "Mapping json Document is not an object" << endl; } } else { - qDebug() << "Invalid JSON...\n" << json << endl; + qDebug() << "Invalid JSON...\n"; + qDebug() << error.errorString(); + qDebug() << "JSON was:\n" << json << endl; + } return nullptr; } - + + QObject* ScriptingInterface::loadMapping(const QString& jsonUrl) { + auto request = ResourceManager::createResourceRequest(nullptr, QUrl(jsonUrl)); + if (request) { + QEventLoop eventLoop; + request->setCacheEnabled(false); + connect(request, &ResourceRequest::finished, &eventLoop, &QEventLoop::quit); + request->send(); + if (request->getState() != ResourceRequest::Finished) { + eventLoop.exec(); + } + + if (request->getResult() == ResourceRequest::Success) { + return parseMapping(QString(request->getData())); + } else { + qDebug() << "Failed to load mapping url <" << jsonUrl << ">" << endl; + return nullptr; + } + } + } + Q_INVOKABLE QObject* newMapping(const QJsonObject& json); void ScriptingInterface::enableMapping(const QString& mappingName, bool enable) { @@ -286,6 +314,11 @@ namespace controller { for (const auto& route : routes) { const auto& destination = route->_destination; + // THis could happen if the route destination failed to create + // FIXME: Maybe do not create the route if the destination failed and avoid this case ? + if (!destination) { + continue; + } if (writtenEndpoints.count(destination)) { continue; diff --git a/libraries/controllers/src/controllers/ScriptingInterface.h b/libraries/controllers/src/controllers/ScriptingInterface.h index 36f62a3abe..64e7cb769a 100644 --- a/libraries/controllers/src/controllers/ScriptingInterface.h +++ b/libraries/controllers/src/controllers/ScriptingInterface.h @@ -73,6 +73,8 @@ namespace controller { enableMapping(mappingName, false); } Q_INVOKABLE QObject* parseMapping(const QString& json); + Q_INVOKABLE QObject* loadMapping(const QString& jsonUrl); + Q_INVOKABLE bool isPrimaryButtonPressed() const; Q_INVOKABLE glm::vec2 getPrimaryJoystickPosition() const;