From 6bb2a053be7a77d26914daee7cd9a13e05454528 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 26 Oct 2014 07:03:37 +0100 Subject: joy tracker allow for input axis remap --- .../ftnoir_tracker_joystick.cpp | 89 +++-- ftnoir_tracker_joystick/ftnoir_tracker_joystick.h | 19 +- .../ftnoir_tracker_joystick_controls.ui | 441 +++++++++++++++++++-- .../ftnoir_tracker_joystick_dialog.cpp | 11 +- 4 files changed, 473 insertions(+), 87 deletions(-) diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp index 352448a3..2dc0ad6b 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp @@ -36,9 +36,9 @@ FTNoIR_Tracker::~FTNoIR_Tracker() g_pJoystick->Release(); } if (g_pDI) - { + { g_pDI->Release(); - } + } } #pragma GCC diagnostic ignored "-Wmissing-field-initializers" @@ -47,7 +47,7 @@ static BOOL CALLBACK EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext ) { auto self = (FTNoIR_Tracker*) pContext; - + if( pdidoi->dwType & DIDFT_AXIS ) { DIPROPRANGE diprg = {0}; @@ -55,8 +55,8 @@ static BOOL CALLBACK EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, diprg.diph.dwHeaderSize = sizeof( DIPROPHEADER ); diprg.diph.dwHow = DIPH_BYID; diprg.diph.dwObj = pdidoi->dwType; - diprg.lMax = FTNoIR_Tracker::AXIS_MAX; - diprg.lMin = -FTNoIR_Tracker::AXIS_MAX; + diprg.lMax = FTNoIR_Tracker::AXIS_MAX; + diprg.lMin = -FTNoIR_Tracker::AXIS_MAX; if( FAILED( self->g_pJoystick->SetProperty( DIPROP_RANGE, &diprg.diph ) ) ) return DIENUM_STOP; @@ -69,14 +69,14 @@ static BOOL CALLBACK EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) { - auto self = reinterpret_cast(pContext); - bool stop = QString(pdidInstance->tszInstanceName) == self->s.joyid; + auto self = reinterpret_cast(pContext); + bool stop = QString(pdidInstance->tszInstanceName) == self->s.joyid; - if (stop) - { - (void) self->g_pDI->CreateDevice( pdidInstance->guidInstance, &self->g_pJoystick, NULL); - qDebug() << "device" << static_cast(self->s.joyid); - } + if (stop) + { + (void) self->g_pDI->CreateDevice( pdidInstance->guidInstance, &self->g_pJoystick, NULL); + qDebug() << "device" << static_cast(self->s.joyid); + } return stop ? DIENUM_STOP : DIENUM_CONTINUE; } @@ -94,8 +94,8 @@ void FTNoIR_Tracker::start_tracker(QFrame* frame) qDebug() << "create"; goto fail; } - - if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, + + if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, this, DIEDFL_ATTACHEDONLY))) @@ -152,52 +152,67 @@ void FTNoIR_Tracker::data(double *data) if( !g_pDI || !g_pJoystick) return; - bool ok = false; + bool ok = false; - for (int i = 0; i < 100; i++) - { - if (!FAILED(g_pJoystick->Poll())) - { - ok = true; - break; - } - if (g_pJoystick->Acquire() != DI_OK) - continue; - else - ok = true; - break; - } + for (int i = 0; i < 100; i++) + { + if (!FAILED(g_pJoystick->Poll())) + { + ok = true; + break; + } + if (g_pJoystick->Acquire() != DI_OK) + continue; + else + ok = true; + break; + } - if (!ok) - return; + if (!ok) + return; - HRESULT hr = 0; + HRESULT hr = 0; if( FAILED( hr = g_pJoystick->GetDeviceState( sizeof( js ), &js ) ) ) return; const LONG values[] = { - js.lRx, - js.lRy, - js.lRz, js.lX, js.lY, js.lZ, + js.lRx, + js.lRy, + js.lRz, js.rglSlider[0], js.rglSlider[1] }; + int map[6] = { + s.joy_1 - 1, + s.joy_2 - 1, + s.joy_3 - 1, + s.joy_4 - 1, + s.joy_5 - 1, + s.joy_6 - 1, + }; + const double limits[] = { 100, 100, 100, 180, - 90, + 180, 180 }; - + for (int i = 0; i < 6; i++) - data[i] = values[i] * limits[i] / AXIS_MAX; + { + int k = map[i] - 1; + if (k < 0 || k >= 8) + data[i] = 0; + else + data[i] = values[k] * limits[i] / AXIS_MAX; + } } extern "C" OPENTRACK_EXPORT ITracker* GetConstructor() diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h index d1ae427b..7fb26dfd 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h @@ -32,17 +32,24 @@ using namespace options; struct settings { pbundle b; value joyid; + value joy_1, joy_2, joy_3, joy_4, joy_5, joy_6; settings() : b(bundle("tracker-joystick")), - joyid(b, "joy-id", "") + joyid(b, "joy-id", ""), + joy_1(b, "axis-map-1", 1), + joy_2(b, "axis-map-2", 2), + joy_3(b, "axis-map-3", 3), + joy_4(b, "axis-map-4", 4), + joy_5(b, "axis-map-5", 5), + joy_6(b, "axis-map-6", 6) {} }; class FTNoIR_Tracker : public ITracker { public: - FTNoIR_Tracker(); - ~FTNoIR_Tracker(); + FTNoIR_Tracker(); + ~FTNoIR_Tracker(); void start_tracker(QFrame *frame); void data(double *data); void reload(); @@ -53,7 +60,7 @@ public: DIDEVICEINSTANCE def; int iter; // XXX bad style settings s; - static constexpr int AXIS_MAX = 65535; + static constexpr int AXIS_MAX = 65535; }; class TrackerControls: public ITrackerDialog @@ -68,8 +75,8 @@ public: FTNoIR_Tracker* tracker; settings s; private slots: - void doOK(); - void doCancel(); + void doOK(); + void doCancel(); }; class FTNoIR_TrackerDll : public Metadata diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui index 424d1c44..3533f93d 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui @@ -9,36 +9,18 @@ 0 0 - 458 - 134 + 251 + 303 - - - 0 - 0 - - - Joystick protocol settings + Tracker settings ../facetracknoir/images/facetracknoir.png../facetracknoir/images/facetracknoir.png - - Qt::LeftToRight - - - false - - - - 6 - - - 6 - + 12 @@ -51,42 +33,417 @@ 6 - - - - Joystick - - - - - + + - + 0 0 + + QFrame::NoFrame + + + + + + + 0 + 0 + + + + Device + + + + + + + + 0 + 0 + + + + + - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + Mapping + + + + + 1 + + + + Disabled + + + + + Joystick axis #1 + + + + + Joystick axis #2 + + + + + Joystick axis #3 + + + + + Joystick axis #4 + + + + + Joystick axis #5 + + + + + Joystick axis #6 + + + + + Joystick axis #7 + + + + + Joystick axis #8 + + + + + + + + 2 + + + + Disabled + + + + + Joystick axis #1 + + + + + Joystick axis #2 + + + + + Joystick axis #3 + + + + + Joystick axis #4 + + + + + Joystick axis #5 + + + + + Joystick axis #6 + + + + + Joystick axis #7 + + + + + Joystick axis #8 + + + + + + + + 3 + + + + Disabled + + + + + Joystick axis #1 + + + + + Joystick axis #2 + + + + + Joystick axis #3 + + + + + Joystick axis #4 + + + + + Joystick axis #5 + + + + + Joystick axis #6 + + + + + Joystick axis #7 + + + + + Joystick axis #8 + + + + + + + + 4 + + + + Disabled + + + + + Joystick axis #1 + + + + + Joystick axis #2 + + + + + Joystick axis #3 + + + + + Joystick axis #4 + + + + + Joystick axis #5 + + + + + Joystick axis #6 + + + + + Joystick axis #7 + + + + + Joystick axis #8 + + + + + + + + 5 + + + + Disabled + + + + + Joystick axis #1 + + + + + Joystick axis #2 + + + + + Joystick axis #3 + + + + + Joystick axis #4 + + + + + Joystick axis #5 + + + + + Joystick axis #6 + + + + + Joystick axis #7 + + + + + Joystick axis #8 + + + + + + + + 6 + + + + Disabled + + + + + Joystick axis #1 + + + + + Joystick axis #2 + + + + + Joystick axis #3 + + + + + Joystick axis #4 + + + + + Joystick axis #5 + + + + + Joystick axis #6 + + + + + Joystick axis #7 + + + + + Joystick axis #8 + + + + + + + + X + + + + + + + Y + + + + + + + Z + + + + + + + Yaw + + + + + + + Pitch + + + + + + + Roll + + + + - - - - Only first 6 axes available. -Adjust order in mapping window "output remap" option. + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - joylist buttonBox diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp index bb95dd92..b201f3f8 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp @@ -37,8 +37,15 @@ fin: if (g_pDI) g_pDI->Release(); } - - tie_setting(s.joyid, ui.joylist); + + tie_setting(s.joyid, ui.joylist); + + tie_setting(s.joy_1, ui.joy_1); + tie_setting(s.joy_2, ui.joy_2); + tie_setting(s.joy_3, ui.joy_3); + tie_setting(s.joy_4, ui.joy_4); + tie_setting(s.joy_5, ui.joy_5); + tie_setting(s.joy_6, ui.joy_6); } void TrackerControls::doOK() { -- cgit v1.2.3