diff options
Diffstat (limited to 'proto-vjoy')
| -rw-r--r-- | proto-vjoy/CMakeLists.txt | 14 | ||||
| -rw-r--r-- | proto-vjoy/ftnoir_protocol_vjoy.cpp | 33 | ||||
| -rw-r--r-- | proto-vjoy/ftnoir_protocol_vjoy.h | 91 | ||||
| -rw-r--r-- | proto-vjoy/ftnoir_protocol_vjoy_dialog.cpp | 22 | ||||
| -rw-r--r-- | proto-vjoy/ftnoir_vjoy_controls.ui | 113 | ||||
| -rw-r--r-- | proto-vjoy/images/vjoy.png | bin | 0 -> 694 bytes | |||
| -rw-r--r-- | proto-vjoy/vjoy-protocol.qrc | 5 | ||||
| -rw-r--r-- | proto-vjoy/vjoy.def | 5 | 
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.pngBinary files differ new file mode 100644 index 00000000..8eb14be8 --- /dev/null +++ b/proto-vjoy/images/vjoy.png 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 | 
