summaryrefslogtreecommitdiffhomepage
path: root/ftnoir_tracker_joystick
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2013-10-24 21:16:06 +0200
committerStanislaw Halik <sthalik@misaki.pl>2013-10-24 21:16:06 +0200
commita19d4fc2ec4ef759cae00505038c02c684c4106b (patch)
tree2f9d64008624ee708539b2080c8509193eb678f2 /ftnoir_tracker_joystick
parent032ab045327e7c442732938818e5ca4bce217406 (diff)
finish joystick impl
Diffstat (limited to 'ftnoir_tracker_joystick')
-rw-r--r--ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp80
-rw-r--r--ftnoir_tracker_joystick/ftnoir_tracker_joystick.h7
2 files changed, 61 insertions, 26 deletions
diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp
index 68ae1e91..73993999 100644
--- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp
+++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp
@@ -4,10 +4,21 @@
#include <cassert>
#include <QMutexLocker>
+static BOOL CALLBACK EnumJoysticksCallback2( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext )
+{
+ auto self = ( FTNoIR_Tracker* )pContext;
+
+ self->def = *pdidInstance;
+
+ return self->iter++ == self->joyid ? DIENUM_STOP : DIENUM_CONTINUE;
+}
+
FTNoIR_Tracker::FTNoIR_Tracker() :
g_pDI(nullptr),
g_pJoystick(nullptr),
- joyid(-1)
+ joyid(-1),
+ iter(-1),
+ mtx(QMutex::Recursive)
{
for (int i = 0; i < 6; i++)
axes[i] = -1;
@@ -72,55 +83,75 @@ static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance
if (!IsEqualGUID(pEnumContext->preferred_instance, pdidInstance->guidInstance))
return DIENUM_CONTINUE;
- if (SUCCEEDED(pEnumContext->g_pDI->CreateDevice( pdidInstance->guidInstance,
- pEnumContext->g_pJoystick, NULL )))
- pEnumContext->bPreferredJoyCfgValid = true;
+ (void) pEnumContext->g_pDI->CreateDevice( pdidInstance->guidInstance, pEnumContext->g_pJoystick, NULL);
return DIENUM_STOP;
}
-void FTNoIR_Tracker::StartTracker(QFrame* win)
+void FTNoIR_Tracker::StartTracker(QFrame* frame)
{
QMutexLocker foo(&mtx);
- frame = win;
+ iter = 0;
loadSettings();
auto hr = CoInitialize( nullptr );
- IDirectInputJoyConfig8* pJoyConfig = nullptr;
- DIJOYCONFIG PreferredJoyCfg = {0};
DI_ENUM_CONTEXT enumContext = {0};
- enumContext.pPreferredJoyCfg = &PreferredJoyCfg;
- enumContext.bPreferredJoyCfgValid = false;
- enumContext.g_pJoystick = &g_pJoystick;
if( FAILED( hr = DirectInput8Create( GetModuleHandle( NULL ), DIRECTINPUT_VERSION,
IID_IDirectInput8, ( VOID** )&g_pDI, NULL ) ) )
+ {
+ qDebug() << "create";
goto fail;
+ }
if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,
- EnumJoysticksCallback,
- &enumContext, DIEDFL_ATTACHEDONLY ) ) )
+ EnumJoysticksCallback2,
+ this,
+ DIEDFL_ATTACHEDONLY)))
+ {
+ qDebug() << "enum2";
goto fail;
+ }
- PreferredJoyCfg.dwSize = sizeof( PreferredJoyCfg );
- if( SUCCEEDED( pJoyConfig->GetConfig( 0, &PreferredJoyCfg, DIJC_GUIDINSTANCE ) ) )
- enumContext.bPreferredJoyCfgValid = true;
- if (pJoyConfig)
+ enumContext.pPreferredJoyCfg = &def;
+ enumContext.g_pDI = g_pDI;
+ enumContext.g_pJoystick = &g_pJoystick;
+ enumContext.preferred_instance = def.guidInstance;
+
+ if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,
+ EnumJoysticksCallback,
+ &enumContext,
+ DIEDFL_ATTACHEDONLY)))
{
- pJoyConfig->Release();
- pJoyConfig = nullptr;
+ qDebug() << "enum1";
+ goto fail;
}
- assert((!!enumContext.bPreferredJoyCfgValid) == !!(g_pJoystick != nullptr));
+ if (!g_pJoystick)
+ {
+ qDebug() << "ENODEV";
+ goto fail;
+ }
if (FAILED(g_pJoystick->SetDataFormat(&c_dfDIJoystick2)))
+ {
+ qDebug() << "format";
goto fail;
+ }
- if (FAILED(g_pJoystick->SetCooperativeLevel((HWND) win->winId(), DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)))
+ if (FAILED(g_pJoystick->SetCooperativeLevel((HWND) frame->window()->winId(), DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)))
+ {
+ qDebug() << "coop";
goto fail;
+ }
if( FAILED( hr = g_pJoystick->EnumObjects( EnumObjectsCallback,
- ( VOID* )this, DIDFT_ALL ) ) )
+ ( VOID* )this, DIDFT_ALL )))
+ {
+ qDebug() << "enum axes";
goto fail;
+ }
+
+ qDebug() << "joy init success";
return;
@@ -131,6 +162,8 @@ fail:
g_pDI->Release();
g_pJoystick = nullptr;
g_pDI = nullptr;
+
+ qDebug() << "joy init failure";
}
bool FTNoIR_Tracker::GiveHeadPoseData(double *data)
@@ -143,7 +176,7 @@ bool FTNoIR_Tracker::GiveHeadPoseData(double *data)
start:
auto hr = g_pJoystick->Poll();
- if( FAILED( hr ) )
+ if( FAILED( hr ))
{
hr = g_pJoystick->Acquire();
while( hr == DIERR_INPUTLOST )
@@ -182,6 +215,7 @@ start:
void FTNoIR_Tracker::loadSettings() {
+ QMutexLocker foo(&mtx);
QSettings settings("opentrack"); // Registry settings (in HK_USER)
QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/settings/default.ini" ).toString();
QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h
index c1157cba..0d27a752 100644
--- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h
+++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h
@@ -26,8 +26,7 @@
struct DI_ENUM_CONTEXT
{
- DIJOYCONFIG* pPreferredJoyCfg;
- bool bPreferredJoyCfgValid;
+ DIDEVICEINSTANCE* pPreferredJoyCfg;
GUID preferred_instance;
LPDIRECTINPUTDEVICE8* g_pJoystick;
LPDIRECTINPUT8 g_pDI;
@@ -39,7 +38,7 @@ public:
FTNoIR_Tracker();
~FTNoIR_Tracker();
- void StartTracker(QFrame *win);
+ void StartTracker(QFrame *frame);
bool GiveHeadPoseData(double *data);
void loadSettings();
LPDIRECTINPUT8 g_pDI;
@@ -49,7 +48,9 @@ public:
int joyid;
QMutex mtx;
QFrame* frame;
+ DIDEVICEINSTANCE def;
void reload();
+ int iter; // XXX bad style
};
// Widget that has controls for FTNoIR protocol client-settings.