From 76f596a6c89eefea0c8d7fa2416ef481e6afe975 Mon Sep 17 00:00:00 2001 From: Matthew Twomey Date: Sat, 27 May 2017 21:14:37 -0500 Subject: [PATCH 1/7] Added XinputController class --- OrbiterSteamController/OrbiterSteamController.vcxproj | 4 ++++ .../OrbiterSteamController.vcxproj.filters | 8 ++++++++ OrbiterSteamController/XinputController.cpp | 5 ++++- OrbiterSteamController/XinputController.h | 8 +------- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/OrbiterSteamController/OrbiterSteamController.vcxproj b/OrbiterSteamController/OrbiterSteamController.vcxproj index c4db2ad..dafbe18 100644 --- a/OrbiterSteamController/OrbiterSteamController.vcxproj +++ b/OrbiterSteamController/OrbiterSteamController.vcxproj @@ -118,6 +118,10 @@ + + + + diff --git a/OrbiterSteamController/OrbiterSteamController.vcxproj.filters b/OrbiterSteamController/OrbiterSteamController.vcxproj.filters index d5fe22c..3e9e016 100644 --- a/OrbiterSteamController/OrbiterSteamController.vcxproj.filters +++ b/OrbiterSteamController/OrbiterSteamController.vcxproj.filters @@ -18,5 +18,13 @@ Source Files + + Source Files + + + + + Header Files + \ No newline at end of file diff --git a/OrbiterSteamController/XinputController.cpp b/OrbiterSteamController/XinputController.cpp index 8ca90ce..d14cc85 100644 --- a/OrbiterSteamController/XinputController.cpp +++ b/OrbiterSteamController/XinputController.cpp @@ -1,9 +1,12 @@ #include "XinputController.h" -XinputController::XinputController(int controllerNumber) + + +XinputController::XinputController() { } + XinputController::~XinputController() { } diff --git a/OrbiterSteamController/XinputController.h b/OrbiterSteamController/XinputController.h index 41624de..63f457c 100644 --- a/OrbiterSteamController/XinputController.h +++ b/OrbiterSteamController/XinputController.h @@ -1,14 +1,8 @@ #pragma once -#include - class XinputController { - - //XINPUT_STATE state; public: - XinputController(int controllerNumber); + XinputController(); ~XinputController(); - - }; From cd71aa4affb9e94ce9fab294f8b1853654a03241 Mon Sep 17 00:00:00 2001 From: Matthew Twomey Date: Sat, 27 May 2017 21:47:02 -0500 Subject: [PATCH 2/7] Reworked Xinput stuff into a class --- OrbiterSteamController/XinputController.cpp | 35 +++++++++- OrbiterSteamController/XinputController.h | 11 +++ OrbiterSteamController/main.cpp | 77 ++------------------- 3 files changed, 48 insertions(+), 75 deletions(-) diff --git a/OrbiterSteamController/XinputController.cpp b/OrbiterSteamController/XinputController.cpp index d14cc85..c023d0b 100644 --- a/OrbiterSteamController/XinputController.cpp +++ b/OrbiterSteamController/XinputController.cpp @@ -1,12 +1,41 @@ #include "XinputController.h" +XinputController::XinputController() { + init(); +} + + +XinputController::~XinputController() { -XinputController::XinputController() -{ } +void XinputController::init() { + setControllerNumber(); + updateState(); +} -XinputController::~XinputController() +void XinputController::updateState() { + ZeroMemory(&state, sizeof(XINPUT_STATE)); + XInputGetState(controllerNumber, &state); +} + +int XinputController::getLX() { + updateState(); + XInputGetState(controllerNumber, &state); + return state.Gamepad.sThumbLX; +} + +void XinputController::setControllerNumber() // Sets the controller to the first connected controller +{ + int controllerId = -1; + for (DWORD i = 0; i < XUSER_MAX_COUNT && controllerId == -1; i++) + { + ZeroMemory(&state, sizeof(XINPUT_STATE)); + + if (XInputGetState(i, &state) == ERROR_SUCCESS) + controllerId = i; + } + controllerNumber = controllerId; } diff --git a/OrbiterSteamController/XinputController.h b/OrbiterSteamController/XinputController.h index 63f457c..32e76a5 100644 --- a/OrbiterSteamController/XinputController.h +++ b/OrbiterSteamController/XinputController.h @@ -1,8 +1,19 @@ #pragma once +#include +#include + class XinputController { + int controllerNumber; + XINPUT_STATE state; public: XinputController(); ~XinputController(); + + void init(); + void updateState(); + int getLX(); +private: + void setControllerNumber(); }; diff --git a/OrbiterSteamController/main.cpp b/OrbiterSteamController/main.cpp index daf1b6f..b5fcce0 100644 --- a/OrbiterSteamController/main.cpp +++ b/OrbiterSteamController/main.cpp @@ -2,81 +2,14 @@ #define ORBITER_MODULE #include -#include +#include "XinputController.h" -int getFirstConnectedController(); -int getLX(int controller); - -int firstConnectedController = -1; -XINPUT_STATE state; +XinputController controller; DLLCLBK void InitModule(HINSTANCE hModule) { - firstConnectedController = getFirstConnectedController(); -} - -DLLCLBK void opcPreStep(double simt, double simdt, double mjd) -{ - /*sprintf(oapiDebugString(), "%.2f", oapiGetSimTime());*/ - //firstConnectedController = getFirstConnectedController(); - sprintf(oapiDebugString(), "First Controller: %d", getLX(firstConnectedController)); - - VESSEL* vessel = oapiGetFocusInterface(); - //vessel->SetADCtrlMode(DWORD(0)); - - vessel->SetControlSurfaceLevel(AIRCTRL_ELEVATOR, -1, false); -} - -int getFirstConnectedController() { - int controllerId = -1; - - for (DWORD i = 0; i < XUSER_MAX_COUNT && controllerId == -1; i++) - { - - ZeroMemory(&state, sizeof(XINPUT_STATE)); - - if (XInputGetState(i, &state) == ERROR_SUCCESS) - controllerId = i; - } - return controllerId; + controller = XinputController(); } -/*XINPUT_STATE updateControllerInputState() { - ZeroMemory(&state, sizeof(XINPUT_STATE)); - XInputGetState(firstConnectedController, &state); -}*/ - -int getLX(int controller) { - if (controller > -1) { - ZeroMemory(&state, sizeof(XINPUT_STATE)); - XInputGetState(controller, &state); - return state.Gamepad.sThumbLX; - } - else { - return -1; - } -} -int getLY(int controller) { - if (controller > -1) { - ZeroMemory(&state, sizeof(XINPUT_STATE)); - XInputGetState(controller, &state); - return state.Gamepad.sThumbLY; - } - else { - return -1; - } -} - - -/* -int getLX() { - int controller = getFirstConnectedController(); - if (controller > -1) { - XINPUT_STATE state; - ZeroMemory(&state, sizeof(XINPUT_STATE)); - XInputGetState(controller, &state); - return state.Gamepad.sThumbLX; - } else { - return -1; - } +DLLCLBK void opcPreStep(double simt, double simdt, double mjd) { + sprintf(oapiDebugString(), "X: %d", controller.getLX()); } -*/ From fc9bde2c7a076622060bcd9e685ab90abc9af72c Mon Sep 17 00:00:00 2001 From: Matthew Twomey Date: Sat, 27 May 2017 22:41:39 -0500 Subject: [PATCH 3/7] Added Rudder for RT LT --- OrbiterSteamController/XinputController.cpp | 41 +++++++++++++++++++-- OrbiterSteamController/XinputController.h | 7 ++++ OrbiterSteamController/main.cpp | 7 +++- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/OrbiterSteamController/XinputController.cpp b/OrbiterSteamController/XinputController.cpp index c023d0b..565f843 100644 --- a/OrbiterSteamController/XinputController.cpp +++ b/OrbiterSteamController/XinputController.cpp @@ -20,13 +20,48 @@ void XinputController::updateState() { XInputGetState(controllerNumber, &state); } -int XinputController::getLX() -{ +int XinputController::getLX() { updateState(); - XInputGetState(controllerNumber, &state); return state.Gamepad.sThumbLX; } +int XinputController::getLY() { + updateState(); + return state.Gamepad.sThumbLY; +} + +int XinputController::getRT() { + updateState(); + return state.Gamepad.bRightTrigger; +} + +int XinputController::getLT() { + updateState(); + return state.Gamepad.bLeftTrigger; +} + +double XinputController::getNormLX() { + updateState(); + return max(-1, (double)state.Gamepad.sThumbLX / 32767); +} + +double XinputController::getNormLY() { + updateState(); + return max(-1, (double)state.Gamepad.sThumbLY / 32767); +} + +double XinputController::getNormRT() { + updateState(); + //return max(-1, (double)((state.Gamepad.bRightTrigger - 128) / 127)); + return (double)state.Gamepad.bRightTrigger / 255; +} + +double XinputController::getNormLT() { + updateState(); + //return max(-1, (double)((state.Gamepad.bLeftTrigger - 128) / 127)); + return (double)state.Gamepad.bLeftTrigger / 255; +} + void XinputController::setControllerNumber() // Sets the controller to the first connected controller { int controllerId = -1; diff --git a/OrbiterSteamController/XinputController.h b/OrbiterSteamController/XinputController.h index 32e76a5..566784c 100644 --- a/OrbiterSteamController/XinputController.h +++ b/OrbiterSteamController/XinputController.h @@ -13,6 +13,13 @@ class XinputController void init(); void updateState(); int getLX(); + int getLY(); + int getRT(); + int getLT(); + double getNormLX(); + double getNormLY(); + double getNormRT(); + double getNormLT(); private: void setControllerNumber(); }; diff --git a/OrbiterSteamController/main.cpp b/OrbiterSteamController/main.cpp index b5fcce0..7f70acd 100644 --- a/OrbiterSteamController/main.cpp +++ b/OrbiterSteamController/main.cpp @@ -11,5 +11,10 @@ DLLCLBK void InitModule(HINSTANCE hModule) { } DLLCLBK void opcPreStep(double simt, double simdt, double mjd) { - sprintf(oapiDebugString(), "X: %d", controller.getLX()); + sprintf(oapiDebugString(), "X: %f Y: %f R: %f", controller.getNormLX(), controller.getNormLY(), controller.getNormRT() + (controller.getNormLT() * -1)); + + VESSEL* vessel = oapiGetFocusInterface(); + vessel->SetControlSurfaceLevel(AIRCTRL_ELEVATOR, controller.getNormLY() * -1, false); + vessel->SetControlSurfaceLevel(AIRCTRL_AILERON, controller.getNormLX(), false); + vessel->SetControlSurfaceLevel(AIRCTRL_RUDDER, controller.getNormRT() + (controller.getNormLT() * -1), false); } From 2c32f92f81bf58facef7105777985d0df95a35c5 Mon Sep 17 00:00:00 2001 From: Matthew Twomey Date: Sat, 27 May 2017 23:58:20 -0500 Subject: [PATCH 4/7] Added Xinput right stick for completeness, even though we're not using it (yet) --- .gitignore | 1 + .../OrbiterSteamController.vcxproj | 23 +++++++++++-- OrbiterSteamController/XinputController.cpp | 34 +++++++++++++------ OrbiterSteamController/XinputController.h | 18 ++++++---- 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 956d6ba..f54d7c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ Debug +Release .vs diff --git a/OrbiterSteamController/OrbiterSteamController.vcxproj b/OrbiterSteamController/OrbiterSteamController.vcxproj index dafbe18..359de5d 100644 --- a/OrbiterSteamController/OrbiterSteamController.vcxproj +++ b/OrbiterSteamController/OrbiterSteamController.vcxproj @@ -31,20 +31,20 @@ MultiByte - Application + DynamicLibrary false v140 true MultiByte - Application + DynamicLibrary true v140 MultiByte - Application + DynamicLibrary false v140 true @@ -88,7 +88,14 @@ Level3 Disabled true + C:\Users\Administrator\Desktop\Orbitersdk\include;%(AdditionalIncludeDirectories) + MultiThreaded + + C:\Users\Administrator\Desktop\Orbitersdk\lib;%(AdditionalLibraryDirectories) + msvcirt.lib;msvcrt.lib;%(IgnoreSpecificDefaultLibraries) + orbiter.lib;Orbitersdk.lib;Xinput9_1_0.lib;%(AdditionalDependencies) + @@ -97,10 +104,15 @@ true true true + C:\Users\Administrator\Desktop\Orbitersdk\include;%(AdditionalIncludeDirectories) + MultiThreaded true true + C:\Users\Administrator\Desktop\Orbitersdk\lib;%(AdditionalLibraryDirectories) + msvcirt.lib;msvcrt.lib;%(IgnoreSpecificDefaultLibraries) + orbiter.lib;Orbitersdk.lib;Xinput9_1_0.lib;%(AdditionalDependencies) @@ -110,10 +122,15 @@ true true true + C:\Users\Administrator\Desktop\Orbitersdk\include;%(AdditionalIncludeDirectories) + MultiThreaded true true + C:\Users\Administrator\Desktop\Orbitersdk\lib;%(AdditionalLibraryDirectories) + msvcirt.lib;msvcrt.lib;%(IgnoreSpecificDefaultLibraries) + orbiter.lib;Orbitersdk.lib;Xinput9_1_0.lib;%(AdditionalDependencies) diff --git a/OrbiterSteamController/XinputController.cpp b/OrbiterSteamController/XinputController.cpp index 565f843..e36432d 100644 --- a/OrbiterSteamController/XinputController.cpp +++ b/OrbiterSteamController/XinputController.cpp @@ -30,6 +30,16 @@ int XinputController::getLY() { return state.Gamepad.sThumbLY; } +int XinputController::getRX() { + updateState(); + return state.Gamepad.sThumbRX; +} + +int XinputController::getRY() { + updateState(); + return state.Gamepad.sThumbRY; +} + int XinputController::getRT() { updateState(); return state.Gamepad.bRightTrigger; @@ -41,25 +51,29 @@ int XinputController::getLT() { } double XinputController::getNormLX() { - updateState(); - return max(-1, (double)state.Gamepad.sThumbLX / 32767); + return max(-1, (double)getNormLX() / 32767); // Returns from -1 to 1 } double XinputController::getNormLY() { - updateState(); - return max(-1, (double)state.Gamepad.sThumbLY / 32767); + return max(-1, (double)getNormLY() / 32767); // Returns from -1 to 1 +} + +double XinputController::getNormRX() { + return max(-1, (double)getNormRX() / 32767); // Returns from -1 to 1 +} + +double XinputController::getNormRY() { + return max(-1, (double)getNormRY() / 32767); // Returns from -1 to 1 } double XinputController::getNormRT() { - updateState(); - //return max(-1, (double)((state.Gamepad.bRightTrigger - 128) / 127)); - return (double)state.Gamepad.bRightTrigger / 255; + //return max(-1, (double)((getNormRT() - 128) / 127)); // Returns from -1 to 1 + return (double)getNormRT() / 255; // Returns from 0 to 1 } double XinputController::getNormLT() { - updateState(); - //return max(-1, (double)((state.Gamepad.bLeftTrigger - 128) / 127)); - return (double)state.Gamepad.bLeftTrigger / 255; + //return max(-1, (double)((getNormLT() - 128) / 127)); // Returns from -1 to 1 + return (double)getNormLT() / 255; // Returns from 0 to 1 } void XinputController::setControllerNumber() // Sets the controller to the first connected controller diff --git a/OrbiterSteamController/XinputController.h b/OrbiterSteamController/XinputController.h index 566784c..14274ad 100644 --- a/OrbiterSteamController/XinputController.h +++ b/OrbiterSteamController/XinputController.h @@ -6,21 +6,27 @@ class XinputController { int controllerNumber; XINPUT_STATE state; + public: XinputController(); ~XinputController(); - void init(); - void updateState(); - int getLX(); - int getLY(); - int getRT(); - int getLT(); double getNormLX(); double getNormLY(); + double getNormRX(); + double getNormRY(); double getNormRT(); double getNormLT(); + private: void setControllerNumber(); + void init(); + void updateState(); + int getLX(); + int getLY(); + int getRX(); + int getRY(); + int getRT(); + int getLT(); }; From 8a4df2fdcfc721403858ca8581d75cb6d702bf0a Mon Sep 17 00:00:00 2001 From: Matthew Twomey Date: Sun, 28 May 2017 00:15:17 -0500 Subject: [PATCH 5/7] Fix wrong function call in xinput gets --- OrbiterSteamController/XinputController.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/OrbiterSteamController/XinputController.cpp b/OrbiterSteamController/XinputController.cpp index e36432d..9d46875 100644 --- a/OrbiterSteamController/XinputController.cpp +++ b/OrbiterSteamController/XinputController.cpp @@ -51,29 +51,29 @@ int XinputController::getLT() { } double XinputController::getNormLX() { - return max(-1, (double)getNormLX() / 32767); // Returns from -1 to 1 + return max(-1, (double)getLX() / 32767); // Returns from -1 to 1 } double XinputController::getNormLY() { - return max(-1, (double)getNormLY() / 32767); // Returns from -1 to 1 + return max(-1, (double)getLY() / 32767); // Returns from -1 to 1 } double XinputController::getNormRX() { - return max(-1, (double)getNormRX() / 32767); // Returns from -1 to 1 + return max(-1, (double)getRX() / 32767); // Returns from -1 to 1 } double XinputController::getNormRY() { - return max(-1, (double)getNormRY() / 32767); // Returns from -1 to 1 + return max(-1, (double)getRY() / 32767); // Returns from -1 to 1 } double XinputController::getNormRT() { - //return max(-1, (double)((getNormRT() - 128) / 127)); // Returns from -1 to 1 - return (double)getNormRT() / 255; // Returns from 0 to 1 + //return max(-1, (double)((getRT() - 128) / 127)); // Returns from -1 to 1 + return (double)getRT() / 255; // Returns from 0 to 1 } double XinputController::getNormLT() { - //return max(-1, (double)((getNormLT() - 128) / 127)); // Returns from -1 to 1 - return (double)getNormLT() / 255; // Returns from 0 to 1 + //return max(-1, (double)((getLT() - 128) / 127)); // Returns from -1 to 1 + return (double)getLT() / 255; // Returns from 0 to 1 } void XinputController::setControllerNumber() // Sets the controller to the first connected controller From 18b29a94c501342c0e13756bb0914d826a33487f Mon Sep 17 00:00:00 2001 From: Matthew Twomey Date: Sun, 28 May 2017 01:23:58 -0500 Subject: [PATCH 6/7] Added a debug flag --- OrbiterSteamController/main.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OrbiterSteamController/main.cpp b/OrbiterSteamController/main.cpp index 7f70acd..303b2ec 100644 --- a/OrbiterSteamController/main.cpp +++ b/OrbiterSteamController/main.cpp @@ -1,6 +1,8 @@ #define STRICT #define ORBITER_MODULE +//#define DEBUG + #include #include "XinputController.h" @@ -11,10 +13,15 @@ DLLCLBK void InitModule(HINSTANCE hModule) { } DLLCLBK void opcPreStep(double simt, double simdt, double mjd) { - sprintf(oapiDebugString(), "X: %f Y: %f R: %f", controller.getNormLX(), controller.getNormLY(), controller.getNormRT() + (controller.getNormLT() * -1)); + #ifdef DEBUG + sprintf(oapiDebugString(), "LX: %f LY: %f LT+RT: %f RX: %f RY: %f", controller.getNormLX(), controller.getNormLY(), controller.getNormRT() + (controller.getNormLT() * -1), controller.getNormRX(), controller.getNormRY()); + #endif VESSEL* vessel = oapiGetFocusInterface(); vessel->SetControlSurfaceLevel(AIRCTRL_ELEVATOR, controller.getNormLY() * -1, false); vessel->SetControlSurfaceLevel(AIRCTRL_AILERON, controller.getNormLX(), false); vessel->SetControlSurfaceLevel(AIRCTRL_RUDDER, controller.getNormRT() + (controller.getNormLT() * -1), false); + + // An experiment with controlling the view with the RS directly. Not really needed as you can bind either pad to a mouse with the right button held down + //oapiCameraSetCockpitDir((roundf(controller.getNormRX() * 1000) / 1000) * -1, roundf(controller.getNormRY() * 1000) / 1000, false); } From f6f835557c471ea43f43702520df0b5c46ccaa26 Mon Sep 17 00:00:00 2001 From: Matthew Twomey Date: Sun, 28 May 2017 01:24:31 -0500 Subject: [PATCH 7/7] Added a README --- README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..5916b77 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# OrbiterSteamController + +## Intro + +I love the Steam Controller, however it presents itself to the running process directly as an xinput controller. Unfortunately this means Orbiter can't detect it during launch. + +This plugin detects the xinput controller presented by the Steam Controller and maps the analog inputs to the flight control surfaces. + +## Install + +Unzip the contents into your Orbiter install directory. + +## Setup + +1. Enable OrbiterSteamController in the Orbiter _Modules_ menu +2. Add Orbiter as a non-Steam game +3. Configure the controller in the Steam Overlay + * Configure the analog stick as _Joystick Move_ with Output set to _Left Joystick_ + * For the left and right triggers, configure the Trigger Analog Output as _Left Trigger_ and _Right Trigger_ respectively and disable Full Pull and Soft Pull Actions + +## Use + +The analog stick will now control pitch and roll. The left and right triggers will control yaw. + +## Additional Tips + +* Outside of the analog functions, you can configure almost everything else directly in the Steam Overlay by mapping keys to the Steam Controller. +* You can configure one of the pads as a mouse with a _Touch Binding_ of "RIGHT MOUSE" - and a click action of the _HOME_ key. This will give you a nice touchpad for changing your view, looking around in the cockpit.