Skip to content

Commit

Permalink
Release v0.5.2
Browse files Browse the repository at this point in the history
Releasing OpenGloves Driver v0.5.2!
Small tweaks and fixes include: live configuration updates and quality of life improvements
* small changes to pose calculations
* fixes a rare bug where controllers might not be found
* changes made to configuration are now updated live in steamvr without needing to restart

UI
* Driver can now be fully enabled/disabled within UI
* \\.\COM for serial devices is now not editable
  • Loading branch information
lucas-vrtech committed Jul 14, 2022
2 parents 79481d9 + 763b6e9 commit d3862aa
Show file tree
Hide file tree
Showing 34 changed files with 729 additions and 540 deletions.
13 changes: 3 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,12 @@ execute_process(

find_library(OPENVR_LIB openvr_api HINTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/openvr/lib/${PLATFORM_NAME}${PROCESSOR_ARCH}/" NO_DEFAULT_PATH )

add_subdirectory("overlay")

set(DRIVER_NAME "openglove")
set(OPENGLOVE_PROJECT "driver_${DRIVER_NAME}")

add_subdirectory("overlay")

file(GLOB_RECURSE HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")

Expand All @@ -59,7 +60,7 @@ target_compile_definitions("${OPENGLOVE_PROJECT}" PRIVATE

source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/include" PREFIX "Header Files" FILES ${HEADERS})
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/src" PREFIX "Source Files" FILES ${SOURCES})
set_property(TARGET "${OPENGLOVE_PROJECT}" PROPERTY CXX_STANDARD 17)
set_property(TARGET "${OPENGLOVE_PROJECT}" PROPERTY CXX_STANDARD 20)


# Copy driver assets to output folder
Expand All @@ -78,12 +79,4 @@ add_custom_command(
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:${OPENGLOVE_PROJECT}>
$<TARGET_FILE_DIR:${OPENGLOVE_PROJECT}>/${DRIVER_NAME}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH}/$<TARGET_FILE_NAME:${OPENGLOVE_PROJECT}>
)

add_custom_command(
TARGET ${OPENGLOVE_PROJECT}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
$<TARGET_FILE_DIR:openglove_overlay>
$<TARGET_FILE_DIR:${OPENGLOVE_PROJECT}>/${DRIVER_NAME}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH}
)
9 changes: 4 additions & 5 deletions include/Communication/BTSerialCommunicationManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@

class BTSerialCommunicationManager : public CommunicationManager {
public:
BTSerialCommunicationManager(
std::unique_ptr<EncodingManager> encodingManager, VRBTSerialConfiguration configuration, const VRDeviceConfiguration& deviceConfiguration);
BTSerialCommunicationManager(const VRCommunicationConfiguration& configuration, std::unique_ptr<EncodingManager> encodingManager);

bool IsConnected() override;

Expand All @@ -31,9 +30,9 @@ class BTSerialCommunicationManager : public CommunicationManager {
bool GetPairedDeviceBtAddress(BTH_ADDR* deviceBtAddress);
bool StartupWindowsSocket();

VRBTSerialConfiguration btSerialConfiguration_;
VRCommunicationBTSerialConfiguration btSerialConfiguration_;

std::atomic<bool> isConnected_;
std::atomic<bool> isConnected_ = false;

std::atomic<SOCKET> btClientSocket_;
std::atomic<SOCKET> btClientSocket_ = NULL;
};
6 changes: 3 additions & 3 deletions include/Communication/CommunicationManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@

class CommunicationManager {
public:
explicit CommunicationManager(const VRDeviceConfiguration& deviceConfiguration);
CommunicationManager(std::unique_ptr<EncodingManager> encodingManager, const VRDeviceConfiguration& deviceConfiguration);
explicit CommunicationManager(VRCommunicationConfiguration configuration);
CommunicationManager(VRCommunicationConfiguration configuration, std::unique_ptr<EncodingManager> encodingManager);

virtual void BeginListener(const std::function<void(VRInputData)>& callback);
virtual void Disconnect();
Expand All @@ -34,8 +34,8 @@ class CommunicationManager {
virtual bool ReceiveNextPacket(std::string& buff) = 0;
virtual bool SendMessageToDevice() = 0;

VRCommunicationConfiguration configuration_;
std::unique_ptr<EncodingManager> encodingManager_;
VRDeviceConfiguration deviceConfiguration_;

std::atomic<bool> threadActive_;
std::thread thread_;
Expand Down
7 changes: 3 additions & 4 deletions include/Communication/NamedPipeCommunicationManager.h
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
#pragma once

#include <array>
#include <atomic>
#include <memory>
#include <array>

#include "Communication/CommunicationManager.h"
#include "DeviceConfiguration.h"
#include "Util/NamedPipeListener.h"

class NamedPipeCommunicationManager : public CommunicationManager {
public:
NamedPipeCommunicationManager(VRNamedPipeInputConfiguration configuration, const VRDeviceConfiguration& deviceConfiguration);
NamedPipeCommunicationManager(const VRCommunicationConfiguration& configuration);
bool IsConnected() override;

// no sending for named pipes
Expand All @@ -31,13 +31,12 @@ class NamedPipeCommunicationManager : public CommunicationManager {
return true;
};


private:
std::atomic<bool> isConnected_;

std::function<void(VRInputData)> callback_;

VRNamedPipeInputConfiguration configuration_;
VRCommunicationNamedPipeConfiguration namedPipeConfiguration_;

std::vector<std::unique_ptr<IListener>> namedPipeListeners_;
};
7 changes: 4 additions & 3 deletions include/Communication/SerialCommunicationManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@

class SerialCommunicationManager : public CommunicationManager {
public:
SerialCommunicationManager(
std::unique_ptr<EncodingManager> encodingManager, VRSerialConfiguration configuration, const VRDeviceConfiguration& deviceConfiguration);
SerialCommunicationManager(const VRCommunicationConfiguration& configuration, std::unique_ptr<EncodingManager> encodingManager);

bool IsConnected() override;

Expand All @@ -36,9 +35,11 @@ class SerialCommunicationManager : public CommunicationManager {
unsigned long WriteTotalTimeoutMultiplier,
unsigned long WriteTotalTimeoutConstant);

VRSerialConfiguration serialConfiguration_;
VRCommunicationSerialConfiguration serialConfiguration_;

std::atomic<bool> isConnected_;

std::atomic<HANDLE> hSerial_;

DWORD lastError_;
};
120 changes: 73 additions & 47 deletions include/DeviceConfiguration.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#pragma once

#include <utility>
#include <variant>

// quaternion used for == overloads
#include "Util/Quaternion.h"
#include "openvr_driver.h"

extern const char* c_poseSettingsSection;
Expand All @@ -13,7 +15,7 @@ extern const char* c_lucidGloveDeviceSettingsSection;
extern const char* c_alphaEncodingSettingsSection;
extern const char* c_legacyEncodingSettingsSection;

extern const char* c_deviceDriverManufacturer;
extern const char* c_deviceManufacturer;

enum class VRCommunicationProtocol {
Serial,
Expand All @@ -26,78 +28,102 @@ enum class VREncodingProtocol {
Alpha = 1,
};

enum class VRDeviceDriver {
enum class VRDeviceType {
LucidGloves = 0,
EmulatedKnuckles = 1,
};

struct VRSerialConfiguration {
struct VRAlphaEncodingConfiguration {
bool operator==(const VRAlphaEncodingConfiguration&) const = default;
};

struct VRLegacyEncodingConfiguration {
bool operator==(const VRLegacyEncodingConfiguration&) const = default;
};

struct VREncodingConfiguration {
VREncodingProtocol encodingProtocol;
unsigned int maxAnalogValue;

std::variant<VRAlphaEncodingConfiguration, VRLegacyEncodingConfiguration> configuration;

bool operator==(const VREncodingConfiguration&) const = default;
};

struct VRCommunicationSerialConfiguration {
std::string port;
int baudRate;

VRSerialConfiguration(std::string port, const int baudRate) : port(std::move(port)), baudRate(baudRate) {}
bool operator==(const VRCommunicationSerialConfiguration&) const = default;
};

struct VRBTSerialConfiguration {
struct VRCommunicationBTSerialConfiguration {
std::string name;

explicit VRBTSerialConfiguration(std::string name) : name(std::move(name)) {}
bool operator==(const VRCommunicationBTSerialConfiguration&) const = default;
};

struct VRNamedPipeInputConfiguration {
struct VRCommunicationNamedPipeConfiguration {
std::string pipeName;

VRNamedPipeInputConfiguration(std::string pipeName) : pipeName(std::move(pipeName)) {}
bool operator==(const VRCommunicationNamedPipeConfiguration&) const = default;
};

struct VRCommunicationConfiguration {
VRCommunicationProtocol communicationProtocol;
VREncodingConfiguration encodingConfiguration;

bool feedbackEnabled;

std::variant<VRCommunicationSerialConfiguration, VRCommunicationBTSerialConfiguration, VRCommunicationNamedPipeConfiguration> configuration;

bool operator==(const VRCommunicationConfiguration&) const = default;
};

struct VRPoseConfiguration {
vr::HmdVector3_t offsetVector;
vr::HmdVector3d_t offsetVector;
vr::HmdQuaternion_t angleOffsetQuaternion;
float poseTimeOffset;
int controllerIdOverride;
bool controllerOverrideEnabled;
bool calibrationButtonEnabled;

VRPoseConfiguration(
const vr::HmdVector3_t offsetVector,
const vr::HmdQuaternion_t angleOffsetQuaternion,
const float poseTimeOffset,
const bool controllerOverrideEnabled,
const int controllerIdOverride,
const bool calibrationButtonEnabled)
: offsetVector(offsetVector),
angleOffsetQuaternion(angleOffsetQuaternion),
poseTimeOffset(poseTimeOffset),
controllerIdOverride(controllerIdOverride),
controllerOverrideEnabled(controllerOverrideEnabled),
calibrationButtonEnabled(calibrationButtonEnabled) {}
bool operator==(const VRPoseConfiguration&) const = default;
};

struct VRDeviceKnucklesConfiguration {
bool indexCurlTrigger;
bool approximateThumb;

bool operator==(const VRDeviceKnucklesConfiguration&) const = default;
};

struct VRDeviceLucidglovesConfiguration {
std::string serialNumber;

bool operator==(const VRDeviceLucidglovesConfiguration&) const = default;
};

struct VRDeviceConfiguration {
VRDeviceType deviceType;

std::string serialNumber;
vr::ETrackedControllerRole role;
bool enabled;
bool feedbackEnabled;
bool indexCurlTrigger;

VRPoseConfiguration poseConfiguration;
VREncodingProtocol encodingProtocol;
VRCommunicationProtocol communicationProtocol;
VRDeviceDriver deviceDriver;

VRDeviceConfiguration(
const vr::ETrackedControllerRole role,
const bool enabled,
const bool feedbackEnabled,
const bool indexCurlTrigger,
const VRPoseConfiguration poseConfiguration,
const VREncodingProtocol encodingProtocol,
const VRCommunicationProtocol communicationProtocol,
const VRDeviceDriver deviceDriver)
: role(role),
enabled(enabled),
feedbackEnabled(feedbackEnabled),
indexCurlTrigger(indexCurlTrigger),
poseConfiguration(poseConfiguration),
encodingProtocol(encodingProtocol),
communicationProtocol(communicationProtocol),
deviceDriver(deviceDriver) {}
VRCommunicationConfiguration communicationConfiguration;

std::variant<VRDeviceKnucklesConfiguration, VRDeviceLucidglovesConfiguration> configuration;

bool operator==(const VRDeviceConfiguration&) const = default;
};

struct VRDriverConfiguration {
bool enabled;

VRDeviceConfiguration deviceConfiguration;

bool operator==(const VRDriverConfiguration&) const = default;
};

VRDriverConfiguration GetDriverConfiguration(const vr::ETrackedControllerRole& role);
29 changes: 19 additions & 10 deletions include/DeviceDriver/DeviceDriver.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
#pragma once

#undef _WINSOCKAPI_
#define _WINSOCKAPI_

#include <memory>
#include <string>

#include "Bones.h"
#include "Communication/CommunicationManager.h"
#include "ControllerPose.h"
#include "DeviceConfiguration.h"
#include "openvr_driver.h"
#include "ForceFeedback.h"
#include "openvr_driver.h"

class DeviceDriver : public vr::ITrackedDeviceServerDriver {
public:
DeviceDriver(
std::unique_ptr<CommunicationManager> communicationManager,
std::shared_ptr<BoneAnimator> boneAnimator,
std::string serialNumber,
VRDeviceConfiguration configuration);
DeviceDriver(VRDeviceConfiguration configuration);

vr::EVRInitError Activate(uint32_t unObjectId) override;
void Deactivate() override;
Expand All @@ -32,6 +31,9 @@ class DeviceDriver : public vr::ITrackedDeviceServerDriver {

void OnEvent(vr::VREvent_t vrEvent) const;

void UpdateDeviceConfiguration(VRDeviceConfiguration configuration);
void DisableDevice();

protected:
virtual bool IsRightHand() const;
virtual void StartDevice();
Expand All @@ -42,10 +44,15 @@ class DeviceDriver : public vr::ITrackedDeviceServerDriver {
virtual void StoppingDevice() = 0;
void PoseUpdateThread() const;

private:
void SetupDeviceComponents();
void StopDeviceComponents();

protected:
std::unique_ptr<CommunicationManager> communicationManager_;
std::shared_ptr<BoneAnimator> boneAnimator_;
std::unique_ptr<BoneAnimator> boneAnimator_;

VRDeviceConfiguration configuration_;
std::string serialNumber_;

std::unique_ptr<ControllerPose> controllerPose_;
std::unique_ptr<FFBListener> ffbProvider_;
Expand All @@ -57,6 +64,8 @@ class DeviceDriver : public vr::ITrackedDeviceServerDriver {

std::thread poseUpdateThread_;

std::atomic<bool> hasActivated_;
uint32_t deviceId_;
std::atomic<bool> isRunning_;
std::atomic<bool> isActive_;

int32_t deviceId_;
};
8 changes: 1 addition & 7 deletions include/DeviceDriver/KnuckleDriver.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,7 @@ enum class KnuckleDeviceComponentIndex : int {

class KnuckleDeviceDriver : public DeviceDriver {
public:
KnuckleDeviceDriver(
std::unique_ptr<CommunicationManager> communicationManager,
std::shared_ptr<BoneAnimator> boneAnimator,
std::string serialNumber,
bool approximateThumb,
VRDeviceConfiguration configuration);
KnuckleDeviceDriver(VRDeviceConfiguration configuration);

void HandleInput(VRInputData data) override;
void SetupProps(vr::PropertyContainerHandle_t& props) override;
Expand All @@ -52,5 +47,4 @@ class KnuckleDeviceDriver : public DeviceDriver {

private:
vr::VRInputComponentHandle_t inputComponentHandles_[static_cast<int>(KnuckleDeviceComponentIndex::_Count)];
bool approximateThumb_;
};
Loading

0 comments on commit d3862aa

Please sign in to comment.