diff options
Diffstat (limited to 'proto-vjoystick')
| -rw-r--r-- | proto-vjoystick/CMakeLists.txt | 16 | ||||
| -rw-r--r-- | proto-vjoystick/images/vjoystick.png | bin | 0 -> 6327 bytes | |||
| -rw-r--r-- | proto-vjoystick/lang/nl_NL.ts | 57 | ||||
| -rw-r--r-- | proto-vjoystick/lang/ru_RU.ts | 57 | ||||
| -rw-r--r-- | proto-vjoystick/lang/stub.ts | 57 | ||||
| -rw-r--r-- | proto-vjoystick/lang/zh_CN.ts | 57 | ||||
| -rw-r--r-- | proto-vjoystick/vjoystick.cpp | 153 | ||||
| -rw-r--r-- | proto-vjoystick/vjoystick.h | 68 | ||||
| -rw-r--r-- | proto-vjoystick/vjoystick.qrc | 5 | ||||
| -rw-r--r-- | proto-vjoystick/vjoystick.ui | 56 | ||||
| -rw-r--r-- | proto-vjoystick/vjoystick_dialog.cpp | 8 | 
11 files changed, 534 insertions, 0 deletions
| diff --git a/proto-vjoystick/CMakeLists.txt b/proto-vjoystick/CMakeLists.txt new file mode 100644 index 00000000..dad21fa4 --- /dev/null +++ b/proto-vjoystick/CMakeLists.txt @@ -0,0 +1,16 @@ +if(WIN32) +    set(SDK_VJOYSTICK "" CACHE PATH "vjoystick SDK path") +    if(SDK_VJOYSTICK) +        #if(opentrack-64bit) +        #    set(arch "amd64/") +        #else() +            set(arch "") +        #endif() +        set(lib "${SDK_VJOYSTICK}/lib/${arch}vJoyInterface.lib") +        set(dll "${SDK_VJOYSTICK}/lib/${arch}vJoyInterface.dll") +        opentrack_boilerplate(opentrack-proto-vjoy) +        target_link_libraries(opentrack-proto-vjoy ${lib}) +        target_include_directories(opentrack-proto-vjoy SYSTEM PUBLIC "${SDK_VJOYSTICK}/inc") +        install(FILES "${dll}" DESTINATION .) +    endif() +endif() diff --git a/proto-vjoystick/images/vjoystick.png b/proto-vjoystick/images/vjoystick.pngBinary files differ new file mode 100644 index 00000000..c3def49f --- /dev/null +++ b/proto-vjoystick/images/vjoystick.png diff --git a/proto-vjoystick/lang/nl_NL.ts b/proto-vjoystick/lang/nl_NL.ts new file mode 100644 index 00000000..46d0398d --- /dev/null +++ b/proto-vjoystick/lang/nl_NL.ts @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="nl_NL"> +<context> +    <name>vjoystick</name> +    <message> +        <source>VJoy</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source><html><head/><body><p>Go to the <a href="http://vjoystick.sourceforge.net/site/"><span style=" text-decoration: underline; color:#0000ff;">vjoystick</span></a> project site or <a href="https://sourceforge.net/projects/vjoystick/files/latest/download"><span style=" text-decoration: underline; color:#0000ff;">download directly</span></a></p></body></html></source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_metadata</name> +    <message> +        <source>Joystick emulation -- vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_proto</name> +    <message> +        <source>vjoystick driver missing</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick won't work without the driver installed.</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Download the driver</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Visit project site</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick not installed or disabled</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>can't initialize vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>unknown error</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Virtual joystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +</TS> diff --git a/proto-vjoystick/lang/ru_RU.ts b/proto-vjoystick/lang/ru_RU.ts new file mode 100644 index 00000000..6a618904 --- /dev/null +++ b/proto-vjoystick/lang/ru_RU.ts @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ru_RU"> +<context> +    <name>vjoystick</name> +    <message> +        <source>VJoy</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source><html><head/><body><p>Go to the <a href="http://vjoystick.sourceforge.net/site/"><span style=" text-decoration: underline; color:#0000ff;">vjoystick</span></a> project site or <a href="https://sourceforge.net/projects/vjoystick/files/latest/download"><span style=" text-decoration: underline; color:#0000ff;">download directly</span></a></p></body></html></source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_metadata</name> +    <message> +        <source>Joystick emulation -- vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_proto</name> +    <message> +        <source>vjoystick driver missing</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick won't work without the driver installed.</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Download the driver</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Visit project site</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick not installed or disabled</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>can't initialize vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>unknown error</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Virtual joystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +</TS> diff --git a/proto-vjoystick/lang/stub.ts b/proto-vjoystick/lang/stub.ts new file mode 100644 index 00000000..c8909cfe --- /dev/null +++ b/proto-vjoystick/lang/stub.ts @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"> +<context> +    <name>vjoystick</name> +    <message> +        <source>VJoy</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source><html><head/><body><p>Go to the <a href="http://vjoystick.sourceforge.net/site/"><span style=" text-decoration: underline; color:#0000ff;">vjoystick</span></a> project site or <a href="https://sourceforge.net/projects/vjoystick/files/latest/download"><span style=" text-decoration: underline; color:#0000ff;">download directly</span></a></p></body></html></source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_metadata</name> +    <message> +        <source>Joystick emulation -- vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_proto</name> +    <message> +        <source>vjoystick driver missing</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick won't work without the driver installed.</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Download the driver</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Visit project site</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick not installed or disabled</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>can't initialize vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>unknown error</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Virtual joystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +</TS> diff --git a/proto-vjoystick/lang/zh_CN.ts b/proto-vjoystick/lang/zh_CN.ts new file mode 100644 index 00000000..c8909cfe --- /dev/null +++ b/proto-vjoystick/lang/zh_CN.ts @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1"> +<context> +    <name>vjoystick</name> +    <message> +        <source>VJoy</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source><html><head/><body><p>Go to the <a href="http://vjoystick.sourceforge.net/site/"><span style=" text-decoration: underline; color:#0000ff;">vjoystick</span></a> project site or <a href="https://sourceforge.net/projects/vjoystick/files/latest/download"><span style=" text-decoration: underline; color:#0000ff;">download directly</span></a></p></body></html></source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_metadata</name> +    <message> +        <source>Joystick emulation -- vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context> +    <name>vjoystick_proto</name> +    <message> +        <source>vjoystick driver missing</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick won't work without the driver installed.</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Download the driver</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Visit project site</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>vjoystick not installed or disabled</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>can't initialize vjoystick</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>unknown error</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <source>Virtual joystick</source> +        <translation type="unfinished"></translation> +    </message> +</context> +</TS> diff --git a/proto-vjoystick/vjoystick.cpp b/proto-vjoystick/vjoystick.cpp new file mode 100644 index 00000000..4ad20599 --- /dev/null +++ b/proto-vjoystick/vjoystick.cpp @@ -0,0 +1,153 @@ +/* Copyright (c) 2016, Stanislaw Halik <sthalik@misaki.pl> + + * 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. + */ +#include "vjoystick.h" + +#include <cmath> +#include <cstring> +#include <QDebug> + +#include <QPushButton> +#include <QMessageBox> +#include <QDesktopServices> +#include <QUrl> + +// required for api headers +#include <windows.h> + +#undef PPJOY_MODE +#include <public.h> +#include <vjoyinterface.h> + +#define OPENTRACK_VJOYSTICK_ID 1 + +static constexpr inline unsigned axis_count = 6; + +static constexpr unsigned char axis_ids[axis_count] = +{ +    HID_USAGE_X, +    HID_USAGE_Y, +    HID_USAGE_Z, +    HID_USAGE_RX, +    HID_USAGE_RY, +    HID_USAGE_RZ, +//    HID_USAGE_SL0, +//    HID_USAGE_SL1, +//    HID_USAGE_WHL, +}; + +static constexpr double val_minmax[axis_count] = +{ +    50, +    50, +    50, +    180, +    180, +    180 +}; + +void handle::init() +{ +    for (unsigned i = 0; i < axis_count; i++) +    { +        if (!GetVJDAxisExist(OPENTRACK_VJOYSTICK_ID, axis_ids[i])) +        { +            // avoid floating point division by zero +            axis_min[i] = 0; +            axis_max[i] = 1; +            continue; +        } +        GetVJDAxisMin(OPENTRACK_VJOYSTICK_ID, axis_ids[i], &axis_min[i]); +        GetVJDAxisMax(OPENTRACK_VJOYSTICK_ID, axis_ids[i], &axis_max[i]); +    } +    (void) ResetVJD(OPENTRACK_VJOYSTICK_ID); +} + +handle::handle() +{ +    const bool ret = AcquireVJD(OPENTRACK_VJOYSTICK_ID); +    if (!ret) +    { +        if (!isVJDExists(OPENTRACK_VJOYSTICK_ID)) +            joy_state = state_notent; +        else +            joy_state = state_fail; +    } +    else +    { +        joy_state = state_success; +        init(); +    } +} + +handle::~handle() +{ +    if (joy_state == state_success) +    { +        (void) RelinquishVJD(OPENTRACK_VJOYSTICK_ID); +        joy_state = state_fail; +    } +} + +LONG handle::to_axis_value(unsigned axis_id, double val) +{ +    const double minmax = val_minmax[axis_id]; +    const double min = axis_min[axis_id]; +    const double max = axis_max[axis_id]; + +    const double x = (val+minmax) * max / (2*minmax) - min; +    return std::fmax(min, std::fmin(x, max)); +} + +vjoystick_proto::vjoystick_proto() +{ +} + +vjoystick_proto::~vjoystick_proto() +{ +} + +bool vjoystick_proto::correct() +{ +    if (h.get_state() != state_success) +    { +        QMessageBox msgbox; +        msgbox.setIcon(QMessageBox::Critical); +        msgbox.setText(tr("vjoystick driver missing")); +        msgbox.setInformativeText(tr("vjoystick won't work without the driver installed.")); + +        QPushButton* driver_button = msgbox.addButton(tr("Download the driver"), QMessageBox::ActionRole); +        QPushButton* project_site_button = msgbox.addButton(tr("Visit project site"), QMessageBox::ActionRole); +        msgbox.addButton(QMessageBox::Close); + +        (void) msgbox.exec(); + +        if (msgbox.clickedButton() == driver_button) +        { +            static const char* download_driver_url = "https://sourceforge.net/projects/vjoystick/files/latest/download"; +            QDesktopServices::openUrl(QUrl(download_driver_url, QUrl::StrictMode)); +        } +        else if (msgbox.clickedButton() == project_site_button) +        { +            static const char* project_site_url = "http://vjoystick.sourceforge.net/site/"; +            QDesktopServices::openUrl(QUrl(project_site_url, QUrl::StrictMode)); +        } +    } + +    return h.get_state() == state_success; +} + +void vjoystick_proto::pose(const double *pose) +{ +    if (h.get_state() != state_success) +        return; + +    for (unsigned i = 0; i < axis_count; i++) +        SetAxis(h.to_axis_value(i, pose[i]), OPENTRACK_VJOYSTICK_ID, axis_ids[i]); +} + +OPENTRACK_DECLARE_PROTOCOL(vjoystick_proto, vjoystick_dialog, vjoystick_metadata) diff --git a/proto-vjoystick/vjoystick.h b/proto-vjoystick/vjoystick.h new file mode 100644 index 00000000..6d4062f0 --- /dev/null +++ b/proto-vjoystick/vjoystick.h @@ -0,0 +1,68 @@ +/* Copyright (c) 2016, Stanislaw Halik <sthalik@misaki.pl> + + * 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_vjoystick.h" +#include "opentrack/plugin-api.hpp" + +#include <QObject> +#include <QString> + +#include <windows.h> + +enum state : signed char +{ +    state_notent = -1, +    state_fail = -2, +    state_success = 1, +}; + +class handle final +{ +    state joy_state; +    LONG axis_min[6] {}; +    LONG axis_max[6] {}; + +    void init(); +public: +    handle(); +    ~handle(); +    state get_state() { return joy_state; } +    LONG to_axis_value(unsigned axis_id, double val); +}; + +class vjoystick_proto : public QObject, public IProtocol +{ +    Q_OBJECT + +    handle h; +public: +    vjoystick_proto(); +    ~vjoystick_proto() override; +    bool correct() override; +    void pose( const double *headpose ) override; +    QString game_name() override { return tr("Virtual joystick"); } +private: +}; + +class vjoystick_dialog final : public IProtocolDialog +{ +    Q_OBJECT +public: + +    vjoystick_dialog(); +    void register_protocol(IProtocol *) override {} +    void unregister_protocol() override {} +private: +    Ui::vjoystick ui; +}; + +class vjoystick_metadata : public Metadata +{ +    QString name() override { return "Joystick emulation -- vjoystick"; } +    QIcon icon() override { return QIcon(":/images/vjoystick.png"); } +}; diff --git a/proto-vjoystick/vjoystick.qrc b/proto-vjoystick/vjoystick.qrc new file mode 100644 index 00000000..9c73169f --- /dev/null +++ b/proto-vjoystick/vjoystick.qrc @@ -0,0 +1,5 @@ +<RCC> +    <qresource prefix="/"> +        <file>images/vjoystick.png</file> +    </qresource> +</RCC> diff --git a/proto-vjoystick/vjoystick.ui b/proto-vjoystick/vjoystick.ui new file mode 100644 index 00000000..6e6a2b33 --- /dev/null +++ b/proto-vjoystick/vjoystick.ui @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>vjoystick</class> + <widget class="QWidget" name="vjoystick"> +  <property name="windowModality"> +   <enum>Qt::NonModal</enum> +  </property> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>283</width> +    <height>66</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>VJoy</string> +  </property> +  <property name="windowIcon"> +   <iconset resource="vjoystick.qrc"> +    <normaloff>:/images/vjoystick.png</normaloff>:/images/vjoystick.png</iconset> +  </property> +  <property name="layoutDirection"> +   <enum>Qt::LeftToRight</enum> +  </property> +  <property name="autoFillBackground"> +   <bool>false</bool> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <widget class="QLabel" name="label"> +     <property name="text"> +      <string><html><head/><body><p>Go to the <a href="http://vjoystick.sourceforge.net/site/"><span style=" text-decoration: underline; color:#0000ff;">vjoystick</span></a> project site or <a href="https://sourceforge.net/projects/vjoystick/files/latest/download"><span style=" text-decoration: underline; color:#0000ff;">download directly</span></a></p></body></html></string> +     </property> +     <property name="alignment"> +      <set>Qt::AlignCenter</set> +     </property> +     <property name="openExternalLinks"> +      <bool>true</bool> +     </property> +    </widget> +   </item> +   <item> +    <widget class="QDialogButtonBox" name="buttonBox"> +     <property name="standardButtons"> +      <set>QDialogButtonBox::Ok</set> +     </property> +    </widget> +   </item> +  </layout> + </widget> + <resources> +  <include location="vjoystick.qrc"/> + </resources> + <connections/> +</ui> diff --git a/proto-vjoystick/vjoystick_dialog.cpp b/proto-vjoystick/vjoystick_dialog.cpp new file mode 100644 index 00000000..136e898b --- /dev/null +++ b/proto-vjoystick/vjoystick_dialog.cpp @@ -0,0 +1,8 @@ +#include "vjoystick.h" +#include "opentrack/plugin-api.hpp" + +vjoystick_dialog::vjoystick_dialog() +{ +    ui.setupUi(this); +    connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &QWidget::close); +} | 
