summaryrefslogtreecommitdiffhomepage
path: root/proto-vjoy
diff options
context:
space:
mode:
Diffstat (limited to 'proto-vjoy')
-rw-r--r--proto-vjoy/CMakeLists.txt14
-rw-r--r--proto-vjoy/ftnoir_protocol_vjoy.cpp33
-rw-r--r--proto-vjoy/ftnoir_protocol_vjoy.h91
-rw-r--r--proto-vjoy/ftnoir_protocol_vjoy_dialog.cpp22
-rw-r--r--proto-vjoy/ftnoir_vjoy_controls.ui113
-rw-r--r--proto-vjoy/images/vjoy.pngbin0 -> 694 bytes
-rw-r--r--proto-vjoy/vjoy-protocol.qrc5
-rw-r--r--proto-vjoy/vjoy.def5
8 files changed, 283 insertions, 0 deletions
diff --git a/proto-vjoy/CMakeLists.txt b/proto-vjoy/CMakeLists.txt
new file mode 100644
index 00000000..22678c32
--- /dev/null
+++ b/proto-vjoy/CMakeLists.txt
@@ -0,0 +1,14 @@
+if(WIN32)
+ set(SDK_VJOY "" CACHE PATH "VJoy SDK path")
+ if(SDK_VJOY)
+ opentrack_boilerplate(opentrack-proto-vjoy GNU-LINK "-Wl,--enable-stdcall-fixup")
+ if(MSVC)
+ set(ext .lib)
+ else()
+ set(ext .dll)
+ endif()
+ target_link_libraries(opentrack-proto-vjoy ${MY_QT_LIBS} ${SDK_VJOY}/VJoy${ext})
+ target_include_directories(opentrack-proto-vjoy SYSTEM PUBLIC ${SDK_VJOY})
+ install(FILES "${SDK_VJOY}/VJoy.dll" DESTINATION . ${opentrack-perms})
+ endif()
+endif()
diff --git a/proto-vjoy/ftnoir_protocol_vjoy.cpp b/proto-vjoy/ftnoir_protocol_vjoy.cpp
new file mode 100644
index 00000000..24148c63
--- /dev/null
+++ b/proto-vjoy/ftnoir_protocol_vjoy.cpp
@@ -0,0 +1,33 @@
+#include "ftnoir_protocol_vjoy.h"
+#include "opentrack/plugin-api.hpp"
+
+FTNoIR_Protocol::FTNoIR_Protocol()
+{
+ static char meh[1] = {0};
+ VJoy_Initialize(meh, meh);
+}
+
+FTNoIR_Protocol::~FTNoIR_Protocol()
+{
+ VJoy_Shutdown();
+}
+
+void FTNoIR_Protocol::pose( const double *headpose ) {
+#ifdef __GNUC__
+# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#endif
+ JOYSTICK_STATE state[2] = { 0 };
+
+ state[0].POV = (4 << 12) | (4 << 8) | (4 << 4) | 4;
+
+ state[0].XAxis = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[Yaw] * VJOY_AXIS_MAX / 180.0));
+ state[0].YAxis = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[Pitch] * VJOY_AXIS_MAX / 180.0));
+ state[0].ZAxis = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[Roll] * VJOY_AXIS_MAX / 180.0));
+ state[0].XRotation = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[TX] * VJOY_AXIS_MAX / 100.0));
+ state[0].YRotation = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[TY] * VJOY_AXIS_MAX / 100.0));
+ state[0].ZRotation = std::min<int>(VJOY_AXIS_MAX, std::max<int>(VJOY_AXIS_MIN, headpose[TZ] * VJOY_AXIS_MAX / 100.0));
+
+ VJoy_UpdateJoyState(0, state);
+}
+
+OPENTRACK_DECLARE_PROTOCOL(FTNoIR_Protocol, VJoyControls, FTNoIR_ProtocolDll)
diff --git a/proto-vjoy/ftnoir_protocol_vjoy.h b/proto-vjoy/ftnoir_protocol_vjoy.h
new file mode 100644
index 00000000..118306b5
--- /dev/null
+++ b/proto-vjoy/ftnoir_protocol_vjoy.h
@@ -0,0 +1,91 @@
+/* Homepage http://facetracknoir.sourceforge.net/home/default.htm *
+ * *
+ * ISC License (ISC) *
+ * *
+ * Copyright (c) 2015, Wim Vriend *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ */
+#pragma once
+#include "ui_ftnoir_vjoy_controls.h"
+#include <cmath>
+#include "opentrack/plugin-api.hpp"
+
+#define FT_PROGRAMID "FT_ProgramID"
+
+class FTNoIR_Protocol : public IProtocol
+{
+public:
+ FTNoIR_Protocol();
+ ~FTNoIR_Protocol() override;
+ bool correct() {
+ return true;
+ }
+ void pose( const double *headpose );
+ QString game_name() {
+ return "Virtual joystick";
+ }
+private:
+};
+
+// Widget that has controls for FTNoIR protocol client-settings.
+class VJoyControls: public IProtocolDialog
+{
+ Q_OBJECT
+public:
+
+ explicit VJoyControls();
+ void register_protocol(IProtocol *) {}
+ void unregister_protocol() {}
+
+private:
+ Ui::UICVJoyControls ui;
+ void save();
+
+private slots:
+ void doOK();
+ void doCancel();
+};
+
+class FTNoIR_ProtocolDll : public Metadata
+{
+public:
+ QString name() { return QString("Joystick emulation -- VJoy"); }
+ QIcon icon() { return QIcon(":/images/vjoy.png"); }
+};
+
+#define VJOY_AXIS_MIN -32768
+#define VJOY_AXIS_NIL 0
+#define VJOY_AXIS_MAX 32767
+
+#include <windows.h>
+
+#include <pshpack1.h>
+
+typedef struct _JOYSTICK_STATE
+{
+ UCHAR ReportId; // Report Id
+ SHORT XAxis; // X Axis
+ SHORT YAxis; // Y Axis
+ SHORT ZAxis; // Z Axis
+ SHORT XRotation; // X Rotation
+ SHORT YRotation; // Y Rotation
+ SHORT ZRotation; // Z Rotation
+ SHORT Slider; // Slider
+ SHORT Dial; // Dial
+ USHORT POV; // POV
+ UINT32 Buttons; // 32 Buttons
+} JOYSTICK_STATE, * PJOYSTICK_STATE;
+
+#ifndef _MSC_VER
+EXTERN_C BOOL __stdcall VJoy_Initialize(PCHAR name, PCHAR serial);
+EXTERN_C VOID __stdcall VJoy_Shutdown();
+EXTERN_C BOOL __stdcall VJoy_UpdateJoyState(int id, PJOYSTICK_STATE pJoyState);
+#else
+#define VJOY_API __declspec(dllimport)
+VJOY_API BOOL __stdcall VJoy_Initialize(PCHAR name, PCHAR serial);
+VJOY_API VOID __stdcall VJoy_Shutdown();
+VJOY_API BOOL __stdcall VJoy_UpdateJoyState(int id, PJOYSTICK_STATE pJoyState);
+#endif
diff --git a/proto-vjoy/ftnoir_protocol_vjoy_dialog.cpp b/proto-vjoy/ftnoir_protocol_vjoy_dialog.cpp
new file mode 100644
index 00000000..08c65558
--- /dev/null
+++ b/proto-vjoy/ftnoir_protocol_vjoy_dialog.cpp
@@ -0,0 +1,22 @@
+#include "ftnoir_protocol_vjoy.h"
+#include "opentrack/plugin-api.hpp"
+
+VJoyControls::VJoyControls()
+{
+ ui.setupUi( this );
+ connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK()));
+ connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel()));
+}
+
+void VJoyControls::doOK() {
+ save();
+ this->close();
+}
+
+void VJoyControls::doCancel() {
+ this->close();
+}
+
+void VJoyControls::save() {
+}
+
diff --git a/proto-vjoy/ftnoir_vjoy_controls.ui b/proto-vjoy/ftnoir_vjoy_controls.ui
new file mode 100644
index 00000000..2214b887
--- /dev/null
+++ b/proto-vjoy/ftnoir_vjoy_controls.ui
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UICVJoyControls</class>
+ <widget class="QWidget" name="UICVJoyControls">
+ <property name="windowModality">
+ <enum>Qt::NonModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>228</width>
+ <height>69</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>VJoy</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="vjoy-protocol.qrc">
+ <normaloff>:/images/vjoy.png</normaloff>:/images/vjoy.png</iconset>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" name="_vertical_layout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>No settings necessary</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <widget class="QPushButton" name="btnOK">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCancel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>btnOK</tabstop>
+ <tabstop>btnCancel</tabstop>
+ </tabstops>
+ <resources>
+ <include location="vjoy-protocol.qrc"/>
+ </resources>
+ <connections/>
+ <slots>
+ <slot>startEngineClicked()</slot>
+ <slot>stopEngineClicked()</slot>
+ <slot>cameraSettingsClicked()</slot>
+ </slots>
+</ui>
diff --git a/proto-vjoy/images/vjoy.png b/proto-vjoy/images/vjoy.png
new file mode 100644
index 00000000..8eb14be8
--- /dev/null
+++ b/proto-vjoy/images/vjoy.png
Binary files differ
diff --git a/proto-vjoy/vjoy-protocol.qrc b/proto-vjoy/vjoy-protocol.qrc
new file mode 100644
index 00000000..7b3741f1
--- /dev/null
+++ b/proto-vjoy/vjoy-protocol.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>images/vjoy.png</file>
+ </qresource>
+</RCC>
diff --git a/proto-vjoy/vjoy.def b/proto-vjoy/vjoy.def
new file mode 100644
index 00000000..aea590a4
--- /dev/null
+++ b/proto-vjoy/vjoy.def
@@ -0,0 +1,5 @@
+LIBRARY vjoy.dll
+IMPORTS
+VJoy_Initialize = _VJoy_Initialize
+VJoy_Shutdown = _VJoy_Shutdown
+VJoy_UpdateJoyState = _VJoy_UpdateJoyState