Fix ordering of standard vs device routes

This commit is contained in:
Brad Davis 2015-10-22 22:02:09 -07:00
parent 103fe3c545
commit 91804fbc04

View file

@ -18,6 +18,7 @@
#include <QtCore/QJsonArray> #include <QtCore/QJsonArray>
#include <PathUtils.h> #include <PathUtils.h>
#include <NumericalConstants.h>
#include "StandardController.h" #include "StandardController.h"
#include "Logging.h" #include "Logging.h"
@ -653,7 +654,16 @@ Input UserInputMapper::makeStandardInput(controller::StandardPoseChannel pose) {
return Input(STANDARD_DEVICE, pose, ChannelType::POSE); return Input(STANDARD_DEVICE, pose, ChannelType::POSE);
} }
static auto lastDebugTime = usecTimestampNow();
static auto debugRoutes = false;
static const auto DEBUG_INTERVAL = USECS_PER_SECOND;
void UserInputMapper::runMappings() { void UserInputMapper::runMappings() {
auto now = usecTimestampNow();
if (now - lastDebugTime > DEBUG_INTERVAL) {
lastDebugTime = now;
debugRoutes = true;
}
static auto deviceNames = getDeviceNames(); static auto deviceNames = getDeviceNames();
for (auto endpointEntry : this->_endpointsByInput) { for (auto endpointEntry : this->_endpointsByInput) {
endpointEntry.second->reset(); endpointEntry.second->reset();
@ -673,17 +683,17 @@ void UserInputMapper::runMappings() {
} }
applyRoute(route); applyRoute(route);
} }
debugRoutes = false;
} }
void UserInputMapper::applyRoute(const Route::Pointer& route) { void UserInputMapper::applyRoute(const Route::Pointer& route) {
if (route->debug) { if (debugRoutes && route->debug) {
qCDebug(controllers) << "Applying route " << route->json; qCDebug(controllers) << "Applying route " << route->json;
} }
if (route->conditional) { if (route->conditional) {
if (!route->conditional->satisfied()) { if (!route->conditional->satisfied()) {
if (route->debug) { if (debugRoutes && route->debug) {
qCDebug(controllers) << "Conditional failed"; qCDebug(controllers) << "Conditional failed";
} }
return; return;
@ -698,7 +708,7 @@ void UserInputMapper::applyRoute(const Route::Pointer& route) {
// I press the button. The exception is if I'm wiring a control back to itself // I press the button. The exception is if I'm wiring a control back to itself
// in order to adjust my interface, like inverting the Y axis on an analog stick // in order to adjust my interface, like inverting the Y axis on an analog stick
if (!source->readable()) { if (!source->readable()) {
if (route->debug) { if (debugRoutes && route->debug) {
qCDebug(controllers) << "Source unreadable"; qCDebug(controllers) << "Source unreadable";
} }
return; return;
@ -708,14 +718,14 @@ void UserInputMapper::applyRoute(const Route::Pointer& route) {
// THis could happen if the route destination failed to create // 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 ? // FIXME: Maybe do not create the route if the destination failed and avoid this case ?
if (!destination) { if (!destination) {
if (route->debug) { if (debugRoutes && route->debug) {
qCDebug(controllers) << "Bad Destination"; qCDebug(controllers) << "Bad Destination";
} }
return; return;
} }
if (!destination->writeable()) { if (!destination->writeable()) {
if (route->debug) { if (debugRoutes && route->debug) {
qCDebug(controllers) << "Destination unwritable"; qCDebug(controllers) << "Destination unwritable";
} }
return; return;
@ -723,17 +733,24 @@ void UserInputMapper::applyRoute(const Route::Pointer& route) {
// Fetch the value, may have been overriden by previous loopback routes // Fetch the value, may have been overriden by previous loopback routes
if (source->isPose()) { if (source->isPose()) {
if (route->debug) {
qCDebug(controllers) << "Applying pose";
}
Pose value = getPose(source); Pose value = getPose(source);
static const Pose IDENTITY_POSE { vec3(), quat() };
if (debugRoutes && route->debug) {
if (!value.valid) {
qCDebug(controllers) << "Applying invalid pose";
} else if (value == IDENTITY_POSE) {
qCDebug(controllers) << "Applying identity pose";
} else {
qCDebug(controllers) << "Applying valid pose";
}
}
// no filters yet for pose // no filters yet for pose
destination->apply(value, Pose(), source); destination->apply(value, Pose(), source);
} else { } else {
// Fetch the value, may have been overriden by previous loopback routes // Fetch the value, may have been overriden by previous loopback routes
float value = getValue(source); float value = getValue(source);
if (route->debug) { if (debugRoutes && route->debug) {
qCDebug(controllers) << "Value was " << value; qCDebug(controllers) << "Value was " << value;
} }
// Apply each of the filters. // Apply each of the filters.
@ -741,7 +758,7 @@ void UserInputMapper::applyRoute(const Route::Pointer& route) {
value = filter->apply(value); value = filter->apply(value);
} }
if (route->debug) { if (debugRoutes && route->debug) {
qCDebug(controllers) << "Filtered value was " << value; qCDebug(controllers) << "Filtered value was " << value;
} }
@ -1148,13 +1165,13 @@ void UserInputMapper::enableMapping(const Mapping::Pointer& mapping) {
// because standard -> action is the first set of routes added. // because standard -> action is the first set of routes added.
Route::List standardRoutes = mapping->routes; Route::List standardRoutes = mapping->routes;
standardRoutes.remove_if([](const Route::Pointer& value) { standardRoutes.remove_if([](const Route::Pointer& value) {
return (value->source->getInput().device == STANDARD_DEVICE); return (value->source->getInput().device != STANDARD_DEVICE);
}); });
_standardRoutes.insert(_standardRoutes.begin(), standardRoutes.begin(), standardRoutes.end()); _standardRoutes.insert(_standardRoutes.begin(), standardRoutes.begin(), standardRoutes.end());
Route::List deviceRoutes = mapping->routes; Route::List deviceRoutes = mapping->routes;
deviceRoutes.remove_if([](const Route::Pointer& value) { deviceRoutes.remove_if([](const Route::Pointer& value) {
return (value->source->getInput().device != STANDARD_DEVICE); return (value->source->getInput().device == STANDARD_DEVICE);
}); });
_deviceRoutes.insert(_deviceRoutes.begin(), deviceRoutes.begin(), deviceRoutes.end()); _deviceRoutes.insert(_deviceRoutes.begin(), deviceRoutes.begin(), deviceRoutes.end());
} }