Refactor out duplicate PTT logic into a shared controller.
This commit is contained in:
@@ -23,7 +23,8 @@ SOURCES += src/main.cpp\
|
|||||||
src/tabcontrollers/SteamVRTabController.cpp \
|
src/tabcontrollers/SteamVRTabController.cpp \
|
||||||
src/tabcontrollers/ReviveTabController.cpp \
|
src/tabcontrollers/ReviveTabController.cpp \
|
||||||
src/tabcontrollers/UtilitiesTabController.cpp \
|
src/tabcontrollers/UtilitiesTabController.cpp \
|
||||||
src/tabcontrollers/audiomanager/AudioManagerWindows.cpp
|
src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \
|
||||||
|
src/tabcontrollers/PttController.cpp
|
||||||
|
|
||||||
HEADERS += src/overlaycontroller.h \
|
HEADERS += src/overlaycontroller.h \
|
||||||
src/logging.h \
|
src/logging.h \
|
||||||
@@ -37,7 +38,8 @@ HEADERS += src/overlaycontroller.h \
|
|||||||
src/tabcontrollers/ReviveTabController.h \
|
src/tabcontrollers/ReviveTabController.h \
|
||||||
src/tabcontrollers/UtilitiesTabController.h \
|
src/tabcontrollers/UtilitiesTabController.h \
|
||||||
src/tabcontrollers/AudioManager.h \
|
src/tabcontrollers/AudioManager.h \
|
||||||
src/tabcontrollers/audiomanager/AudioManagerWindows.h
|
src/tabcontrollers/audiomanager/AudioManagerWindows.h \
|
||||||
|
src/tabcontrollers/PttController.h
|
||||||
|
|
||||||
INCLUDEPATH += third-party/openvr/include \
|
INCLUDEPATH += third-party/openvr/include \
|
||||||
third-party/easylogging++
|
third-party/easylogging++
|
||||||
|
|||||||
@@ -30,147 +30,9 @@ MyStackViewPage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyDialogOkCancelPopup {
|
PttControllerConfigDialog {
|
||||||
id: pttControllerConfigDialog
|
id: pttControllerConfigDialog
|
||||||
property int controllerIndex: -1
|
pttControllerConfigClass: AudioTabController
|
||||||
dialogTitle: "Controller Configuration"
|
|
||||||
dialogWidth: 600
|
|
||||||
dialogHeight: 620
|
|
||||||
dialogContentItem: ColumnLayout {
|
|
||||||
MyText {
|
|
||||||
text: "Buttons"
|
|
||||||
}
|
|
||||||
Rectangle {
|
|
||||||
color: "#cccccc"
|
|
||||||
height: 1
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigGripButtonToggle
|
|
||||||
text: "Grip"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigMenuButtonToggle
|
|
||||||
text: "Menu"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigTriggerButtonToggle
|
|
||||||
text: "Trigger"
|
|
||||||
}
|
|
||||||
|
|
||||||
MyText {
|
|
||||||
Layout.topMargin: 32
|
|
||||||
text: "Touchpad"
|
|
||||||
}
|
|
||||||
Rectangle {
|
|
||||||
color: "#cccccc"
|
|
||||||
height: 1
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
spacing: 64
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadLeftToggle
|
|
||||||
text: "Left"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadRightToggle
|
|
||||||
text: "Right"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
spacing: 64
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadTopToggle
|
|
||||||
text: "Top"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadBottomToggle
|
|
||||||
text: "Bottom"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
MyText {
|
|
||||||
text: "Mode:"
|
|
||||||
}
|
|
||||||
MyComboBox {
|
|
||||||
id: pttControllerConfigPadModeCombo
|
|
||||||
Layout.preferredWidth: 250
|
|
||||||
model: ["Disabled", "Touched", "Pressed"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onClosed: {
|
|
||||||
if (okClicked) {
|
|
||||||
var buttons = []
|
|
||||||
if (pttControllerConfigGripButtonToggle.checked) {
|
|
||||||
buttons.push(2)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigMenuButtonToggle.checked) {
|
|
||||||
buttons.push(1)
|
|
||||||
}
|
|
||||||
var triggerMode = 0
|
|
||||||
if (pttControllerConfigTriggerButtonToggle.checked) {
|
|
||||||
triggerMode = 1
|
|
||||||
}
|
|
||||||
var padAreas = 0
|
|
||||||
if (pttControllerConfigPadLeftToggle.checked) {
|
|
||||||
padAreas |= (1 << 0)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigPadTopToggle.checked) {
|
|
||||||
padAreas |= (1 << 1)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigPadRightToggle.checked) {
|
|
||||||
padAreas |= (1 << 2)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigPadBottomToggle.checked) {
|
|
||||||
padAreas |= (1 << 3)
|
|
||||||
}
|
|
||||||
AudioTabController.setPttControllerConfig(controllerIndex, buttons, triggerMode, pttControllerConfigPadModeCombo.currentIndex, padAreas);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function openPopup(controller) {
|
|
||||||
if (controller === 0) {
|
|
||||||
dialogTitle = "Left Controller Configuration"
|
|
||||||
controllerIndex = 0
|
|
||||||
} else {
|
|
||||||
dialogTitle = "Right Controller Configuration"
|
|
||||||
controllerIndex = 1
|
|
||||||
}
|
|
||||||
pttControllerConfigGripButtonToggle.checked = false
|
|
||||||
pttControllerConfigMenuButtonToggle.checked = false
|
|
||||||
pttControllerConfigTriggerButtonToggle.checked = false
|
|
||||||
pttControllerConfigPadLeftToggle.checked = false
|
|
||||||
pttControllerConfigPadTopToggle.checked = false
|
|
||||||
pttControllerConfigPadRightToggle.checked = false
|
|
||||||
pttControllerConfigPadBottomToggle.checked = false
|
|
||||||
pttControllerConfigPadModeCombo.currentIndex = AudioTabController.pttTouchpadMode(controllerIndex)
|
|
||||||
var buttons = AudioTabController.pttDigitalButtons(controllerIndex)
|
|
||||||
for (var i = 0; i < buttons.length; i++) {
|
|
||||||
if (buttons[i] == 1) {
|
|
||||||
pttControllerConfigMenuButtonToggle.checked = true
|
|
||||||
} else if (buttons[i] == 2) {
|
|
||||||
pttControllerConfigGripButtonToggle.checked = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (AudioTabController.pttTriggerMode(controllerIndex) > 0) {
|
|
||||||
pttControllerConfigTriggerButtonToggle.checked = true
|
|
||||||
}
|
|
||||||
var padAreas = AudioTabController.pttTouchpadArea(controllerIndex)
|
|
||||||
if (padAreas & (1 << 0)) {
|
|
||||||
pttControllerConfigPadLeftToggle.checked = true
|
|
||||||
}
|
|
||||||
if (padAreas & (1 << 1)) {
|
|
||||||
pttControllerConfigPadTopToggle.checked = true
|
|
||||||
}
|
|
||||||
if (padAreas & (1 << 2)) {
|
|
||||||
pttControllerConfigPadRightToggle.checked = true
|
|
||||||
}
|
|
||||||
if (padAreas & (1 << 3)) {
|
|
||||||
pttControllerConfigPadBottomToggle.checked = true
|
|
||||||
}
|
|
||||||
open()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MyDialogOkCancelPopup {
|
MyDialogOkCancelPopup {
|
||||||
|
|||||||
@@ -8,147 +8,9 @@ import matzman666.advsettings 1.0
|
|||||||
MyStackViewPage {
|
MyStackViewPage {
|
||||||
headerText: "Play Space Settings"
|
headerText: "Play Space Settings"
|
||||||
|
|
||||||
MyDialogOkCancelPopup {
|
PttControllerConfigDialog {
|
||||||
id: pttControllerConfigDialog
|
id: pttControllerConfigDialog
|
||||||
property int controllerIndex: -1
|
pttControllerConfigClass: MoveCenterTabController
|
||||||
dialogTitle: "Controller Configuration"
|
|
||||||
dialogWidth: 600
|
|
||||||
dialogHeight: 620
|
|
||||||
dialogContentItem: ColumnLayout {
|
|
||||||
MyText {
|
|
||||||
text: "Buttons"
|
|
||||||
}
|
|
||||||
Rectangle {
|
|
||||||
color: "#cccccc"
|
|
||||||
height: 1
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigGripButtonToggle
|
|
||||||
text: "Grip"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigMenuButtonToggle
|
|
||||||
text: "Menu"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigTriggerButtonToggle
|
|
||||||
text: "Trigger"
|
|
||||||
}
|
|
||||||
|
|
||||||
MyText {
|
|
||||||
Layout.topMargin: 32
|
|
||||||
text: "Touchpad"
|
|
||||||
}
|
|
||||||
Rectangle {
|
|
||||||
color: "#cccccc"
|
|
||||||
height: 1
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
spacing: 64
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadLeftToggle
|
|
||||||
text: "Left"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadRightToggle
|
|
||||||
text: "Right"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
spacing: 64
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadTopToggle
|
|
||||||
text: "Top"
|
|
||||||
}
|
|
||||||
MyToggleButton {
|
|
||||||
id: pttControllerConfigPadBottomToggle
|
|
||||||
text: "Bottom"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
MyText {
|
|
||||||
text: "Mode:"
|
|
||||||
}
|
|
||||||
MyComboBox {
|
|
||||||
id: pttControllerConfigPadModeCombo
|
|
||||||
Layout.preferredWidth: 250
|
|
||||||
model: ["Disabled", "Touched", "Pressed"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onClosed: {
|
|
||||||
if (okClicked) {
|
|
||||||
var buttons = []
|
|
||||||
if (pttControllerConfigGripButtonToggle.checked) {
|
|
||||||
buttons.push(2)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigMenuButtonToggle.checked) {
|
|
||||||
buttons.push(1)
|
|
||||||
}
|
|
||||||
var triggerMode = 0
|
|
||||||
if (pttControllerConfigTriggerButtonToggle.checked) {
|
|
||||||
triggerMode = 1
|
|
||||||
}
|
|
||||||
var padAreas = 0
|
|
||||||
if (pttControllerConfigPadLeftToggle.checked) {
|
|
||||||
padAreas |= (1 << 0)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigPadTopToggle.checked) {
|
|
||||||
padAreas |= (1 << 1)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigPadRightToggle.checked) {
|
|
||||||
padAreas |= (1 << 2)
|
|
||||||
}
|
|
||||||
if (pttControllerConfigPadBottomToggle.checked) {
|
|
||||||
padAreas |= (1 << 3)
|
|
||||||
}
|
|
||||||
MoveCenterTabController.setPttControllerConfig(controllerIndex, buttons, triggerMode, pttControllerConfigPadModeCombo.currentIndex, padAreas);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function openPopup(controller) {
|
|
||||||
if (controller === 0) {
|
|
||||||
dialogTitle = "Left Controller Configuration"
|
|
||||||
controllerIndex = 0
|
|
||||||
} else {
|
|
||||||
dialogTitle = "Right Controller Configuration"
|
|
||||||
controllerIndex = 1
|
|
||||||
}
|
|
||||||
pttControllerConfigGripButtonToggle.checked = false
|
|
||||||
pttControllerConfigMenuButtonToggle.checked = false
|
|
||||||
pttControllerConfigTriggerButtonToggle.checked = false
|
|
||||||
pttControllerConfigPadLeftToggle.checked = false
|
|
||||||
pttControllerConfigPadTopToggle.checked = false
|
|
||||||
pttControllerConfigPadRightToggle.checked = false
|
|
||||||
pttControllerConfigPadBottomToggle.checked = false
|
|
||||||
pttControllerConfigPadModeCombo.currentIndex = MoveCenterTabController.pttTouchpadMode(controllerIndex)
|
|
||||||
var buttons = MoveCenterTabController.pttDigitalButtons(controllerIndex)
|
|
||||||
for (var i = 0; i < buttons.length; i++) {
|
|
||||||
if (buttons[i] == 1) {
|
|
||||||
pttControllerConfigMenuButtonToggle.checked = true
|
|
||||||
} else if (buttons[i] == 2) {
|
|
||||||
pttControllerConfigGripButtonToggle.checked = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (MoveCenterTabController.pttTriggerMode(controllerIndex) > 0) {
|
|
||||||
pttControllerConfigTriggerButtonToggle.checked = true
|
|
||||||
}
|
|
||||||
var padAreas = MoveCenterTabController.pttTouchpadArea(controllerIndex)
|
|
||||||
if (padAreas & (1 << 0)) {
|
|
||||||
pttControllerConfigPadLeftToggle.checked = true
|
|
||||||
}
|
|
||||||
if (padAreas & (1 << 1)) {
|
|
||||||
pttControllerConfigPadTopToggle.checked = true
|
|
||||||
}
|
|
||||||
if (padAreas & (1 << 2)) {
|
|
||||||
pttControllerConfigPadRightToggle.checked = true
|
|
||||||
}
|
|
||||||
if (padAreas & (1 << 3)) {
|
|
||||||
pttControllerConfigPadBottomToggle.checked = true
|
|
||||||
}
|
|
||||||
open()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
content: ColumnLayout {
|
content: ColumnLayout {
|
||||||
|
|||||||
@@ -0,0 +1,148 @@
|
|||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.0
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
import matzman666.advsettings 1.0
|
||||||
|
|
||||||
|
MyDialogOkCancelPopup {
|
||||||
|
id: pttControllerConfigDialog
|
||||||
|
property var pttControllerConfigClass
|
||||||
|
property int controllerIndex: -1
|
||||||
|
dialogTitle: "Controller Configuration"
|
||||||
|
dialogWidth: 600
|
||||||
|
dialogHeight: 620
|
||||||
|
dialogContentItem: ColumnLayout {
|
||||||
|
MyText {
|
||||||
|
text: "Buttons"
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
color: "#cccccc"
|
||||||
|
height: 1
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
MyToggleButton {
|
||||||
|
id: pttControllerConfigGripButtonToggle
|
||||||
|
text: "Grip"
|
||||||
|
}
|
||||||
|
MyToggleButton {
|
||||||
|
id: pttControllerConfigMenuButtonToggle
|
||||||
|
text: "Menu"
|
||||||
|
}
|
||||||
|
MyToggleButton {
|
||||||
|
id: pttControllerConfigTriggerButtonToggle
|
||||||
|
text: "Trigger"
|
||||||
|
}
|
||||||
|
|
||||||
|
MyText {
|
||||||
|
Layout.topMargin: 32
|
||||||
|
text: "Touchpad"
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
color: "#cccccc"
|
||||||
|
height: 1
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
spacing: 64
|
||||||
|
MyToggleButton {
|
||||||
|
id: pttControllerConfigPadLeftToggle
|
||||||
|
text: "Left"
|
||||||
|
}
|
||||||
|
MyToggleButton {
|
||||||
|
id: pttControllerConfigPadRightToggle
|
||||||
|
text: "Right"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
spacing: 64
|
||||||
|
MyToggleButton {
|
||||||
|
id: pttControllerConfigPadTopToggle
|
||||||
|
text: "Top"
|
||||||
|
}
|
||||||
|
MyToggleButton {
|
||||||
|
id: pttControllerConfigPadBottomToggle
|
||||||
|
text: "Bottom"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
MyText {
|
||||||
|
text: "Mode:"
|
||||||
|
}
|
||||||
|
MyComboBox {
|
||||||
|
id: pttControllerConfigPadModeCombo
|
||||||
|
Layout.preferredWidth: 250
|
||||||
|
model: ["Disabled", "Touched", "Pressed"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onClosed: {
|
||||||
|
if (okClicked) {
|
||||||
|
var buttons = []
|
||||||
|
if (pttControllerConfigGripButtonToggle.checked) {
|
||||||
|
buttons.push(2)
|
||||||
|
}
|
||||||
|
if (pttControllerConfigMenuButtonToggle.checked) {
|
||||||
|
buttons.push(1)
|
||||||
|
}
|
||||||
|
var triggerMode = 0
|
||||||
|
if (pttControllerConfigTriggerButtonToggle.checked) {
|
||||||
|
triggerMode = 1
|
||||||
|
}
|
||||||
|
var padAreas = 0
|
||||||
|
if (pttControllerConfigPadLeftToggle.checked) {
|
||||||
|
padAreas |= (1 << 0)
|
||||||
|
}
|
||||||
|
if (pttControllerConfigPadTopToggle.checked) {
|
||||||
|
padAreas |= (1 << 1)
|
||||||
|
}
|
||||||
|
if (pttControllerConfigPadRightToggle.checked) {
|
||||||
|
padAreas |= (1 << 2)
|
||||||
|
}
|
||||||
|
if (pttControllerConfigPadBottomToggle.checked) {
|
||||||
|
padAreas |= (1 << 3)
|
||||||
|
}
|
||||||
|
pttControllerConfigClass.setPttControllerConfig(controllerIndex, buttons, triggerMode, pttControllerConfigPadModeCombo.currentIndex, padAreas);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function openPopup(controller) {
|
||||||
|
if (controller === 0) {
|
||||||
|
dialogTitle = "Left Controller Configuration"
|
||||||
|
controllerIndex = 0
|
||||||
|
} else {
|
||||||
|
dialogTitle = "Right Controller Configuration"
|
||||||
|
controllerIndex = 1
|
||||||
|
}
|
||||||
|
pttControllerConfigGripButtonToggle.checked = false
|
||||||
|
pttControllerConfigMenuButtonToggle.checked = false
|
||||||
|
pttControllerConfigTriggerButtonToggle.checked = false
|
||||||
|
pttControllerConfigPadLeftToggle.checked = false
|
||||||
|
pttControllerConfigPadTopToggle.checked = false
|
||||||
|
pttControllerConfigPadRightToggle.checked = false
|
||||||
|
pttControllerConfigPadBottomToggle.checked = false
|
||||||
|
pttControllerConfigPadModeCombo.currentIndex = pttControllerConfigClass.pttTouchpadMode(controllerIndex)
|
||||||
|
var buttons = pttControllerConfigClass.pttDigitalButtons(controllerIndex)
|
||||||
|
for (var i = 0; i < buttons.length; i++) {
|
||||||
|
if (buttons[i] == 1) {
|
||||||
|
pttControllerConfigMenuButtonToggle.checked = true
|
||||||
|
} else if (buttons[i] == 2) {
|
||||||
|
pttControllerConfigGripButtonToggle.checked = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pttControllerConfigClass.pttTriggerMode(controllerIndex) > 0) {
|
||||||
|
pttControllerConfigTriggerButtonToggle.checked = true
|
||||||
|
}
|
||||||
|
var padAreas = pttControllerConfigClass.pttTouchpadArea(controllerIndex)
|
||||||
|
if (padAreas & (1 << 0)) {
|
||||||
|
pttControllerConfigPadLeftToggle.checked = true
|
||||||
|
}
|
||||||
|
if (padAreas & (1 << 1)) {
|
||||||
|
pttControllerConfigPadTopToggle.checked = true
|
||||||
|
}
|
||||||
|
if (padAreas & (1 << 2)) {
|
||||||
|
pttControllerConfigPadRightToggle.checked = true
|
||||||
|
}
|
||||||
|
if (padAreas & (1 << 3)) {
|
||||||
|
pttControllerConfigPadBottomToggle.checked = true
|
||||||
|
}
|
||||||
|
open()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -97,241 +97,6 @@ namespace advsettings {
|
|||||||
return m_micMuted;
|
return m_micMuted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool AudioTabController::pttEnabled() const {
|
|
||||||
return m_pttEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AudioTabController::pttActive() const {
|
|
||||||
return m_pttActive;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AudioTabController::pttShowNotification() const {
|
|
||||||
return m_pttShowNotification;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AudioTabController::pttLeftControllerEnabled() const {
|
|
||||||
return m_pttLeftControllerEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AudioTabController::pttRightControllerEnabled() const {
|
|
||||||
return m_pttRightControllerEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::setPttControllerConfig(unsigned controller, QVariantList buttons, unsigned triggerMode, unsigned padMode, unsigned padAreas) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (controller < 2) {
|
|
||||||
uint64_t buttonMask = 0;
|
|
||||||
for (auto b : buttons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
m_pttControllerConfigs[controller].digitalButtons = buttons;
|
|
||||||
m_pttControllerConfigs[controller].digitalButtonMask = buttonMask;
|
|
||||||
m_pttControllerConfigs[controller].triggerMode = triggerMode;
|
|
||||||
m_pttControllerConfigs[controller].touchpadMode = padMode;
|
|
||||||
m_pttControllerConfigs[controller].touchpadAreas = padAreas;
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::reloadPttProfiles() {
|
|
||||||
pttProfiles.clear();
|
|
||||||
auto settings = OverlayController::appSettings();
|
|
||||||
settings->beginGroup("audioSettings");
|
|
||||||
auto profileCount = settings->beginReadArray("pttProfiles");
|
|
||||||
for (int i = 0; i < profileCount; i++) {
|
|
||||||
settings->setArrayIndex(i);
|
|
||||||
pttProfiles.emplace_back();
|
|
||||||
auto& entry = pttProfiles[i];
|
|
||||||
entry.profileName = settings->value("profileName").toString().toStdString();
|
|
||||||
entry.showNotification = settings->value("showNotification", true).toBool();
|
|
||||||
entry.leftControllerEnabled = settings->value("leftControllerEnabled", false).toBool();
|
|
||||||
entry.rightControllerEnabled = settings->value("rightControllerEnabled", false).toBool();
|
|
||||||
entry.controllerConfigs[0].digitalButtons = settings->value("digitalButtons_0").toList();
|
|
||||||
uint64_t buttonMask = 0;
|
|
||||||
for (auto b : entry.controllerConfigs[0].digitalButtons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
entry.controllerConfigs[0].digitalButtonMask = buttonMask;
|
|
||||||
entry.controllerConfigs[0].triggerMode = settings->value("triggerMode_0", 0).toUInt();
|
|
||||||
entry.controllerConfigs[0].touchpadMode = settings->value("touchpadMode_0", 0).toUInt();
|
|
||||||
entry.controllerConfigs[0].touchpadAreas = settings->value("touchPadAreas_0", 0).toUInt();
|
|
||||||
entry.controllerConfigs[1].digitalButtons = settings->value("digitalButtons_1").toList();
|
|
||||||
buttonMask = 0;
|
|
||||||
for (auto b : entry.controllerConfigs[1].digitalButtons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
entry.controllerConfigs[1].digitalButtonMask = buttonMask;
|
|
||||||
entry.controllerConfigs[1].triggerMode = settings->value("triggerMode_1", 0).toUInt();
|
|
||||||
entry.controllerConfigs[1].touchpadMode = settings->value("touchpadMode_1", 0).toUInt();
|
|
||||||
entry.controllerConfigs[1].touchpadAreas = settings->value("touchPadAreas_1", 0).toUInt();
|
|
||||||
}
|
|
||||||
settings->endArray();
|
|
||||||
settings->endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::savePttProfiles() {
|
|
||||||
auto settings = OverlayController::appSettings();
|
|
||||||
settings->beginGroup("audioSettings");
|
|
||||||
settings->beginWriteArray("pttProfiles");
|
|
||||||
unsigned i = 0;
|
|
||||||
for (auto& p : pttProfiles) {
|
|
||||||
settings->setArrayIndex(i);
|
|
||||||
settings->setValue("profileName", QString::fromStdString(p.profileName));
|
|
||||||
settings->setValue("showNotification", p.showNotification);
|
|
||||||
settings->setValue("leftControllerEnabled", p.leftControllerEnabled);
|
|
||||||
settings->setValue("rightControllerEnabled", p.rightControllerEnabled);
|
|
||||||
settings->setValue("digitalButtons_0", p.controllerConfigs[0].digitalButtons);
|
|
||||||
settings->setValue("triggerMode_0", p.controllerConfigs[0].triggerMode);
|
|
||||||
settings->setValue("touchpadMode_0", p.controllerConfigs[0].touchpadMode);
|
|
||||||
settings->setValue("touchPadAreas_0", p.controllerConfigs[0].touchpadAreas);
|
|
||||||
settings->setValue("digitalButtons_1", p.controllerConfigs[1].digitalButtons);
|
|
||||||
settings->setValue("triggerMode_1", p.controllerConfigs[1].triggerMode);
|
|
||||||
settings->setValue("touchpadMode_1", p.controllerConfigs[1].touchpadMode);
|
|
||||||
settings->setValue("touchPadAreas_1", p.controllerConfigs[1].touchpadAreas);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
settings->endArray();
|
|
||||||
settings->endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AudioTabController::reloadPttConfig() {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
auto settings = OverlayController::appSettings();
|
|
||||||
settings->beginGroup("audioSettings");
|
|
||||||
setPttEnabled(settings->value("pttEnabled", false).toBool(), true, false);
|
|
||||||
setPttLeftControllerEnabled(settings->value("pttLeftControllerEnabled", false).toBool(), true, false);
|
|
||||||
setPttRightControllerEnabled(settings->value("pttRightControllerEnabled", false).toBool(), true, false);
|
|
||||||
setPttShowNotification(settings->value("pttShowNotification", true).toBool(), true, false);
|
|
||||||
m_pttControllerConfigs[0].digitalButtons = settings->value("pttDigitalButtons_0").toList();
|
|
||||||
uint64_t buttonMask = 0;
|
|
||||||
for (auto b : m_pttControllerConfigs[0].digitalButtons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
m_pttControllerConfigs[0].digitalButtonMask = buttonMask;
|
|
||||||
m_pttControllerConfigs[0].triggerMode = settings->value("pttTriggerMode_0", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[0].touchpadMode = settings->value("pttTouchpadMode_0", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[0].touchpadAreas = settings->value("pttTouchPadAreas_0", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[1].digitalButtons = settings->value("pttDigitalButtons_1").toList();
|
|
||||||
buttonMask = 0;
|
|
||||||
for (auto b : m_pttControllerConfigs[0].digitalButtons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
m_pttControllerConfigs[1].digitalButtonMask = buttonMask;
|
|
||||||
m_pttControllerConfigs[1].triggerMode = settings->value("pttTriggerMode_1", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[1].touchpadMode = settings->value("pttTouchpadMode_1", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[1].touchpadAreas = settings->value("pttTouchPadAreas_1", 0).toUInt();
|
|
||||||
settings->endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::savePttConfig() {
|
|
||||||
auto settings = OverlayController::appSettings();
|
|
||||||
settings->beginGroup("audioSettings");
|
|
||||||
settings->setValue("pttEnabled", pttEnabled());
|
|
||||||
settings->setValue("pttLeftControllerEnabled", pttLeftControllerEnabled());
|
|
||||||
settings->setValue("pttRightControllerEnabled", pttRightControllerEnabled());
|
|
||||||
settings->setValue("pttShowNotification", pttShowNotification());
|
|
||||||
settings->setValue("pttDigitalButtons_0", m_pttControllerConfigs[0].digitalButtons);
|
|
||||||
settings->setValue("pttTriggerMode_0", m_pttControllerConfigs[0].triggerMode);
|
|
||||||
settings->setValue("pttTouchpadMode_0", m_pttControllerConfigs[0].touchpadMode);
|
|
||||||
settings->setValue("pttTouchPadAreas_0", m_pttControllerConfigs[0].touchpadAreas);
|
|
||||||
settings->setValue("pttDigitalButtons_1", m_pttControllerConfigs[1].digitalButtons);
|
|
||||||
settings->setValue("pttTriggerMode_1", m_pttControllerConfigs[1].triggerMode);
|
|
||||||
settings->setValue("pttTouchpadMode_1", m_pttControllerConfigs[1].touchpadMode);
|
|
||||||
settings->setValue("pttTouchPadAreas_1", m_pttControllerConfigs[1].touchpadAreas);
|
|
||||||
settings->endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void logControllerState(const vr::VRControllerState_t& state, const std::string& prefix) {
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_ApplicationMenu) << " pressed";
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_ApplicationMenu) << " touched";
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Grip)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Grip) << " pressed";
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Grip)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Grip) << " touched";
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Left)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Left) << " pressed";
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Left)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Left) << " touched";
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Up)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Up) << " pressed";
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Up)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Up) << " touched";
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Right)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Right) << " pressed";
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Right)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Right) << " touched";
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Down)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Down) << " pressed";
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Down)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Down) << " touched";
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_A)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_A) << " pressed";
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_A)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_A) << " touched";
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis0)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " pressed";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " x: " << state.rAxis[0].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis0)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " touched";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " x: " << state.rAxis[0].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis1)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " pressed";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " x: " << state.rAxis[1].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis1)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " touched";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " x: " << state.rAxis[1].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis2)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " pressed";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " x: " << state.rAxis[2].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis2)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " touched";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " x: " << state.rAxis[2].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis3)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " pressed";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " x: " << state.rAxis[3].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis3)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " touched";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " x: " << state.rAxis[3].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis4)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " pressed";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " x: " << state.rAxis[4].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis4)) {
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " touched";
|
|
||||||
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " x: " << state.rAxis[4].x << " y: " << state.rAxis[0].y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::eventLoopTick() {
|
void AudioTabController::eventLoopTick() {
|
||||||
if (!eventLoopMutex.try_lock()) {
|
if (!eventLoopMutex.try_lock()) {
|
||||||
return;
|
return;
|
||||||
@@ -370,191 +135,28 @@ namespace advsettings {
|
|||||||
} else {
|
} else {
|
||||||
settingsUpdateCounter++;
|
settingsUpdateCounter++;
|
||||||
}
|
}
|
||||||
static auto handleControllerState = [](const vr::VRControllerState_t& state, PttControllerConfig* config) -> bool {
|
checkPttStatus();
|
||||||
if (state.ulButtonPressed & config->digitalButtonMask) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (config->triggerMode) {
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger)
|
|
||||||
|| state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (config->touchpadMode) {
|
|
||||||
if (((config->touchpadMode & 1) && (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Touchpad)))
|
|
||||||
|| ((config->touchpadMode & 2) && (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Touchpad)))) {
|
|
||||||
if (config->touchpadAreas == (PAD_AREA_LEFT + PAD_AREA_TOP + PAD_AREA_RIGHT + PAD_AREA_BOTTOM)) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
float x = state.rAxis[0].x;
|
|
||||||
float y = state.rAxis[0].y;
|
|
||||||
if (std::abs(x) >= 0.2 || std::abs(y) >= 0.2) { // deadzone in the middle
|
|
||||||
if (x < 0 && std::abs(y) < -x && (config->touchpadAreas & PAD_AREA_LEFT)) {
|
|
||||||
return true;
|
|
||||||
} else if (y > 0 && std::abs(x) < y && (config->touchpadAreas & PAD_AREA_TOP)) {
|
|
||||||
return true;
|
|
||||||
} else if (x > 0 && std::abs(y) < x && (config->touchpadAreas & PAD_AREA_RIGHT)) {
|
|
||||||
return true;
|
|
||||||
} else if (y < 0 && std::abs(x) < -y && (config->touchpadAreas & PAD_AREA_BOTTOM)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
if (m_pttEnabled) {
|
|
||||||
bool newState = false;
|
|
||||||
if (m_pttLeftControllerEnabled) {
|
|
||||||
auto leftId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_LeftHand);
|
|
||||||
if (leftId != vr::k_unTrackedDeviceIndexInvalid) {
|
|
||||||
vr::VRControllerState_t state;
|
|
||||||
if (vr::VRSystem()->GetControllerState(leftId, &state, sizeof(vr::VRControllerState_t))) {
|
|
||||||
//logControllerState(state, "Left ");
|
|
||||||
newState |= handleControllerState(state, m_pttControllerConfigs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (m_pttRightControllerEnabled) {
|
|
||||||
auto rightId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand);
|
|
||||||
if (rightId != vr::k_unTrackedDeviceIndexInvalid) {
|
|
||||||
vr::VRControllerState_t state;
|
|
||||||
if (vr::VRSystem()->GetControllerState(rightId, &state, sizeof(vr::VRControllerState_t))) {
|
|
||||||
//logControllerState(state, "Right ");
|
|
||||||
newState |= handleControllerState(state, m_pttControllerConfigs + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (newState && !m_pttActive) {
|
|
||||||
if (audioManager && audioManager->isMicValid()) {
|
|
||||||
m_pttActive = true;
|
|
||||||
setMicMuted(false);
|
|
||||||
if (m_pttShowNotification && m_ulNotificationOverlayHandle != vr::k_ulOverlayHandleInvalid) {
|
|
||||||
vr::VROverlay()->ShowOverlay(m_ulNotificationOverlayHandle);
|
|
||||||
}
|
|
||||||
emit pttActiveChanged(m_pttActive);
|
|
||||||
}
|
|
||||||
} else if (!newState && m_pttActive) {
|
|
||||||
if (audioManager && audioManager->isMicValid()) {
|
|
||||||
m_pttActive = false;
|
|
||||||
setMicMuted(true);
|
|
||||||
if (m_pttShowNotification && m_ulNotificationOverlayHandle != vr::k_ulOverlayHandleInvalid) {
|
|
||||||
vr::VROverlay()->HideOverlay(m_ulNotificationOverlayHandle);
|
|
||||||
}
|
|
||||||
emit pttActiveChanged(m_pttActive);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
eventLoopMutex.unlock();
|
eventLoopMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioTabController::addPttProfile(QString name) {
|
bool AudioTabController::pttChangeValid() {
|
||||||
PttProfile* profile = nullptr;
|
return audioManager && audioManager->isMicValid();
|
||||||
for (auto& p : pttProfiles) {
|
|
||||||
if (p.profileName.compare(name.toStdString()) == 0) {
|
|
||||||
profile = &p;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!profile) {
|
|
||||||
auto i = pttProfiles.size();
|
|
||||||
pttProfiles.emplace_back();
|
|
||||||
profile = &pttProfiles[i];
|
|
||||||
}
|
|
||||||
profile->profileName = name.toStdString();
|
|
||||||
profile->showNotification = m_pttShowNotification;
|
|
||||||
profile->leftControllerEnabled = m_pttLeftControllerEnabled;
|
|
||||||
profile->rightControllerEnabled = m_pttRightControllerEnabled;
|
|
||||||
profile->controllerConfigs[0].digitalButtons = m_pttControllerConfigs[0].digitalButtons;
|
|
||||||
profile->controllerConfigs[0].digitalButtonMask = m_pttControllerConfigs[0].digitalButtonMask;
|
|
||||||
profile->controllerConfigs[0].triggerMode = m_pttControllerConfigs[0].triggerMode;
|
|
||||||
profile->controllerConfigs[0].touchpadMode = m_pttControllerConfigs[0].touchpadMode;
|
|
||||||
profile->controllerConfigs[0].touchpadAreas = m_pttControllerConfigs[0].touchpadAreas;
|
|
||||||
profile->controllerConfigs[1].digitalButtons = m_pttControllerConfigs[1].digitalButtons;
|
|
||||||
profile->controllerConfigs[1].digitalButtonMask = m_pttControllerConfigs[1].digitalButtonMask;
|
|
||||||
profile->controllerConfigs[1].triggerMode = m_pttControllerConfigs[1].triggerMode;
|
|
||||||
profile->controllerConfigs[1].touchpadMode = m_pttControllerConfigs[1].touchpadMode;
|
|
||||||
profile->controllerConfigs[1].touchpadAreas = m_pttControllerConfigs[1].touchpadAreas;
|
|
||||||
savePttProfiles();
|
|
||||||
OverlayController::appSettings()->sync();
|
|
||||||
emit pttProfilesUpdated();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioTabController::applyPttProfile(unsigned index) {
|
void AudioTabController::onPttStart() {
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
setMicMuted(false);
|
||||||
if (index < pttProfiles.size()) {
|
|
||||||
auto& profile = pttProfiles[index];
|
|
||||||
setPttShowNotification(profile.showNotification);
|
|
||||||
setPttLeftControllerEnabled(profile.leftControllerEnabled);
|
|
||||||
setPttRightControllerEnabled(profile.rightControllerEnabled);
|
|
||||||
m_pttControllerConfigs[0].digitalButtons = profile.controllerConfigs[0].digitalButtons;
|
|
||||||
m_pttControllerConfigs[0].digitalButtonMask = profile.controllerConfigs[0].digitalButtonMask;
|
|
||||||
m_pttControllerConfigs[0].triggerMode = profile.controllerConfigs[0].triggerMode;
|
|
||||||
m_pttControllerConfigs[0].touchpadMode = profile.controllerConfigs[0].touchpadMode;
|
|
||||||
m_pttControllerConfigs[0].touchpadAreas = profile.controllerConfigs[0].touchpadAreas;
|
|
||||||
m_pttControllerConfigs[1].digitalButtons = profile.controllerConfigs[1].digitalButtons;
|
|
||||||
m_pttControllerConfigs[1].digitalButtonMask = profile.controllerConfigs[1].digitalButtonMask;
|
|
||||||
m_pttControllerConfigs[1].triggerMode = profile.controllerConfigs[1].triggerMode;
|
|
||||||
m_pttControllerConfigs[1].touchpadMode = profile.controllerConfigs[1].touchpadMode;
|
|
||||||
m_pttControllerConfigs[1].touchpadAreas = profile.controllerConfigs[1].touchpadAreas;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioTabController::deletePttProfile(unsigned index) {
|
void AudioTabController::onPttEnabled() {
|
||||||
if (index < pttProfiles.size()) {
|
setMicMuted(true);
|
||||||
auto pos = pttProfiles.begin() + index;
|
|
||||||
pttProfiles.erase(pos);
|
|
||||||
savePttProfiles();
|
|
||||||
OverlayController::appSettings()->sync();
|
|
||||||
emit pttProfilesUpdated();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantList AudioTabController::pttDigitalButtons(unsigned controller) {
|
void AudioTabController::onPttStop() {
|
||||||
if (controller < 2) {
|
setMicMuted(true);
|
||||||
return m_pttControllerConfigs[controller].digitalButtons;
|
|
||||||
}
|
|
||||||
return QVariantList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long AudioTabController::pttDigitalButtonMask(unsigned controller) {
|
void AudioTabController::onPttDisabled() {
|
||||||
if (controller < 2) {
|
setMicMuted(false);
|
||||||
return m_pttControllerConfigs[controller].digitalButtonMask;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned AudioTabController::pttTouchpadMode(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].touchpadMode;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned AudioTabController::pttTriggerMode(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].triggerMode;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned AudioTabController::pttTouchpadArea(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].touchpadAreas;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned AudioTabController::getPttProfileCount() {
|
|
||||||
return (unsigned)pttProfiles.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AudioTabController::getPttProfileName(unsigned index) {
|
|
||||||
if (index < pttProfiles.size()) {
|
|
||||||
return QString::fromStdString(pttProfiles[index].profileName);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioTabController::setMirrorVolume(float value, bool notify) {
|
void AudioTabController::setMirrorVolume(float value, bool notify) {
|
||||||
@@ -609,64 +211,6 @@ namespace advsettings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioTabController::setPttEnabled(bool value, bool notify, bool save) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (value != m_pttEnabled) {
|
|
||||||
m_pttEnabled = value;
|
|
||||||
if (value) {
|
|
||||||
setMicMuted(true);
|
|
||||||
} else {
|
|
||||||
setMicMuted(false);
|
|
||||||
}
|
|
||||||
if (notify) {
|
|
||||||
emit pttEnabledChanged(value);
|
|
||||||
}
|
|
||||||
if (save) {
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::setPttShowNotification(bool value, bool notify, bool save) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (value != m_pttShowNotification) {
|
|
||||||
m_pttShowNotification = value;
|
|
||||||
if (notify) {
|
|
||||||
emit pttShowNotificationChanged(value);
|
|
||||||
}
|
|
||||||
if (save) {
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::setPttLeftControllerEnabled(bool value, bool notify, bool save) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (value != m_pttLeftControllerEnabled) {
|
|
||||||
m_pttLeftControllerEnabled = value;
|
|
||||||
if (notify) {
|
|
||||||
emit pttLeftControllerEnabledChanged(value);
|
|
||||||
}
|
|
||||||
if (save) {
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioTabController::setPttRightControllerEnabled(bool value, bool notify, bool save) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (value != m_pttRightControllerEnabled) {
|
|
||||||
m_pttRightControllerEnabled = value;
|
|
||||||
if (notify) {
|
|
||||||
emit pttRightControllerEnabledChanged(value);
|
|
||||||
}
|
|
||||||
if (save) {
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AudioTabController::onNewRecordingDevice() {
|
void AudioTabController::onNewRecordingDevice() {
|
||||||
if (audioManager->isMicValid()) {
|
if (audioManager->isMicValid()) {
|
||||||
if (!m_micPresent) {
|
if (!m_micPresent) {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "AudioManager.h"
|
#include "AudioManager.h"
|
||||||
|
#include "PttController.h"
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
@@ -17,32 +18,8 @@ namespace advsettings {
|
|||||||
// forward declaration
|
// forward declaration
|
||||||
class OverlayController;
|
class OverlayController;
|
||||||
|
|
||||||
enum TouchPadArea {
|
|
||||||
PAD_AREA_LEFT = (1 << 0),
|
|
||||||
PAD_AREA_TOP = (1 << 1),
|
|
||||||
PAD_AREA_RIGHT = (1 << 2),
|
|
||||||
PAD_AREA_BOTTOM = (1 << 3),
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PttControllerConfig {
|
class AudioTabController : public PttController {
|
||||||
QVariantList digitalButtons;
|
|
||||||
uint64_t digitalButtonMask = 0;
|
|
||||||
unsigned triggerMode = 0; // 0 .. disabled, 1 .. enabled
|
|
||||||
unsigned touchpadMode = 0; // 0 .. disabled, 1 .. only touch, 2 .. only press, 3 .. both
|
|
||||||
unsigned touchpadAreas = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PttProfile {
|
|
||||||
std::string profileName;
|
|
||||||
|
|
||||||
bool showNotification = false;
|
|
||||||
bool leftControllerEnabled = false;
|
|
||||||
bool rightControllerEnabled = false;
|
|
||||||
PttControllerConfig controllerConfigs[2];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class AudioTabController : public QObject {
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool mirrorPresent READ mirrorPresent NOTIFY mirrorPresentChanged)
|
Q_PROPERTY(bool mirrorPresent READ mirrorPresent NOTIFY mirrorPresentChanged)
|
||||||
Q_PROPERTY(QString mirrorDevName READ mirrorDevName NOTIFY mirrorDevNameChanged)
|
Q_PROPERTY(QString mirrorDevName READ mirrorDevName NOTIFY mirrorDevNameChanged)
|
||||||
@@ -52,11 +29,6 @@ namespace advsettings {
|
|||||||
Q_PROPERTY(QString micDevName READ micDevName NOTIFY micDevNameChanged)
|
Q_PROPERTY(QString micDevName READ micDevName NOTIFY micDevNameChanged)
|
||||||
Q_PROPERTY(float micVolume READ micVolume WRITE setMicVolume NOTIFY micVolumeChanged)
|
Q_PROPERTY(float micVolume READ micVolume WRITE setMicVolume NOTIFY micVolumeChanged)
|
||||||
Q_PROPERTY(bool micMuted READ micMuted WRITE setMicMuted NOTIFY micMutedChanged)
|
Q_PROPERTY(bool micMuted READ micMuted WRITE setMicMuted NOTIFY micMutedChanged)
|
||||||
Q_PROPERTY(bool pttEnabled READ pttEnabled WRITE setPttEnabled NOTIFY pttEnabledChanged)
|
|
||||||
Q_PROPERTY(bool pttActive READ pttActive NOTIFY pttActiveChanged)
|
|
||||||
Q_PROPERTY(bool pttShowNotification READ pttShowNotification WRITE setPttShowNotification NOTIFY pttShowNotificationChanged)
|
|
||||||
Q_PROPERTY(bool pttLeftControllerEnabled READ pttLeftControllerEnabled WRITE setPttLeftControllerEnabled NOTIFY pttLeftControllerEnabledChanged)
|
|
||||||
Q_PROPERTY(bool pttRightControllerEnabled READ pttRightControllerEnabled WRITE setPttRightControllerEnabled NOTIFY pttRightControllerEnabledChanged)
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OverlayController* parent;
|
OverlayController* parent;
|
||||||
@@ -74,21 +46,18 @@ namespace advsettings {
|
|||||||
float m_micVolume = 1.0;
|
float m_micVolume = 1.0;
|
||||||
bool m_micMuted = false;
|
bool m_micMuted = false;
|
||||||
|
|
||||||
bool m_pttEnabled = false;
|
|
||||||
bool m_pttActive = false;
|
|
||||||
bool m_pttShowNotification = false;
|
|
||||||
bool m_pttLeftControllerEnabled = false;
|
|
||||||
bool m_pttRightControllerEnabled = false;
|
|
||||||
PttControllerConfig m_pttControllerConfigs[2];
|
|
||||||
|
|
||||||
unsigned settingsUpdateCounter = 0;
|
unsigned settingsUpdateCounter = 0;
|
||||||
|
|
||||||
std::vector<PttProfile> pttProfiles;
|
|
||||||
|
|
||||||
std::unique_ptr<AudioManager> audioManager;
|
std::unique_ptr<AudioManager> audioManager;
|
||||||
std::string lastMirrorDevId;
|
std::string lastMirrorDevId;
|
||||||
|
|
||||||
std::recursive_mutex eventLoopMutex;
|
QString getSettingsName() override { return "audioSettings"; }
|
||||||
|
void onPttStart() override;
|
||||||
|
void onPttStop() override;
|
||||||
|
void onPttEnabled() override;
|
||||||
|
void onPttDisabled() override;
|
||||||
|
bool pttChangeValid() override;
|
||||||
|
virtual vr::VROverlayHandle_t getNotificationOverlayHandle() override { return m_ulNotificationOverlayHandle; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void initStage1();
|
void initStage1();
|
||||||
@@ -106,28 +75,8 @@ namespace advsettings {
|
|||||||
float micVolume() const;
|
float micVolume() const;
|
||||||
bool micMuted() const;
|
bool micMuted() const;
|
||||||
|
|
||||||
bool pttEnabled() const;
|
|
||||||
bool pttActive() const;
|
|
||||||
bool pttShowNotification() const;
|
|
||||||
bool pttLeftControllerEnabled() const;
|
|
||||||
bool pttRightControllerEnabled() const;
|
|
||||||
|
|
||||||
void reloadPttProfiles();
|
|
||||||
void reloadPttConfig();
|
|
||||||
void savePttProfiles();
|
|
||||||
void savePttConfig();
|
|
||||||
|
|
||||||
void onNewRecordingDevice();
|
void onNewRecordingDevice();
|
||||||
|
|
||||||
Q_INVOKABLE QVariantList pttDigitalButtons(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned long pttDigitalButtonMask(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned pttTouchpadMode(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned pttTriggerMode(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned pttTouchpadArea(unsigned controller);
|
|
||||||
|
|
||||||
Q_INVOKABLE unsigned getPttProfileCount();
|
|
||||||
Q_INVOKABLE QString getPttProfileName(unsigned index);
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setMirrorVolume(float value, bool notify = true);
|
void setMirrorVolume(float value, bool notify = true);
|
||||||
void setMirrorMuted(bool value, bool notify = true);
|
void setMirrorMuted(bool value, bool notify = true);
|
||||||
@@ -135,17 +84,6 @@ namespace advsettings {
|
|||||||
void setMicVolume(float value, bool notify = true);
|
void setMicVolume(float value, bool notify = true);
|
||||||
void setMicMuted(bool value, bool notify = true);
|
void setMicMuted(bool value, bool notify = true);
|
||||||
|
|
||||||
void setPttEnabled(bool value, bool notify = true, bool save = true);
|
|
||||||
void setPttShowNotification(bool value, bool notify = true, bool save = true);
|
|
||||||
void setPttLeftControllerEnabled(bool value, bool notify = true, bool save = true);
|
|
||||||
void setPttRightControllerEnabled(bool value, bool notify = true, bool save = true);
|
|
||||||
|
|
||||||
void setPttControllerConfig(unsigned controller, QVariantList buttons, unsigned triggerMode, unsigned padMode, unsigned padAreas);
|
|
||||||
|
|
||||||
void addPttProfile(QString name);
|
|
||||||
void applyPttProfile(unsigned index);
|
|
||||||
void deletePttProfile(unsigned index);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void mirrorPresentChanged(bool value);
|
void mirrorPresentChanged(bool value);
|
||||||
void mirrorDevNameChanged(QString value);
|
void mirrorDevNameChanged(QString value);
|
||||||
@@ -156,14 +94,6 @@ namespace advsettings {
|
|||||||
void micDevNameChanged(QString value);
|
void micDevNameChanged(QString value);
|
||||||
void micVolumeChanged(float value);
|
void micVolumeChanged(float value);
|
||||||
void micMutedChanged(bool value);
|
void micMutedChanged(bool value);
|
||||||
|
|
||||||
void pttEnabledChanged(bool value);
|
|
||||||
void pttActiveChanged(bool value);
|
|
||||||
void pttShowNotificationChanged(bool value);
|
|
||||||
void pttLeftControllerEnabledChanged(bool value);
|
|
||||||
void pttRightControllerEnabledChanged(bool value);
|
|
||||||
|
|
||||||
void pttProfilesUpdated();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace advsettings
|
} // namespace advsettings
|
||||||
|
|||||||
@@ -137,70 +137,20 @@ void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MoveCenterTabController::pttEnabled() const {
|
void MoveCenterTabController::onPttStart() {
|
||||||
return m_pttEnabled;
|
m_toggleOffsetY = m_offsetY;
|
||||||
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -m_toggleOffsetY, m_adjustChaperone);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveCenterTabController::setPttEnabled(bool value, bool notify, bool save) {
|
void MoveCenterTabController::onPttStop() {
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, m_toggleOffsetY, m_adjustChaperone);
|
||||||
if (value != m_pttEnabled) {
|
|
||||||
m_pttEnabled = value;
|
|
||||||
if (notify) {
|
|
||||||
emit pttEnabledChanged(value);
|
|
||||||
}
|
|
||||||
if (save) {
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveCenterTabController::offsetYToggle(bool enabled) {
|
void MoveCenterTabController::onPttDisabled() {
|
||||||
float delta;
|
if (pttActive()) {
|
||||||
if (enabled) {
|
stopPtt();
|
||||||
m_toggleOffsetY = m_offsetY;
|
|
||||||
delta = -m_toggleOffsetY;
|
|
||||||
} else {
|
|
||||||
delta = m_toggleOffsetY;
|
|
||||||
}
|
|
||||||
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, delta, m_adjustChaperone);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MoveCenterTabController::pttActive() const {
|
|
||||||
return m_pttActive;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MoveCenterTabController::pttLeftControllerEnabled() const {
|
|
||||||
return m_pttLeftControllerEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MoveCenterTabController::setPttLeftControllerEnabled(bool value, bool notify, bool save) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (value != m_pttLeftControllerEnabled) {
|
|
||||||
m_pttLeftControllerEnabled = value;
|
|
||||||
if (notify) {
|
|
||||||
emit pttLeftControllerEnabledChanged(value);
|
|
||||||
}
|
|
||||||
if (save) {
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MoveCenterTabController::pttRightControllerEnabled() const {
|
|
||||||
return m_pttRightControllerEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MoveCenterTabController::setPttRightControllerEnabled(bool value, bool notify, bool save) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (value != m_pttRightControllerEnabled) {
|
|
||||||
m_pttRightControllerEnabled = value;
|
|
||||||
if (notify) {
|
|
||||||
emit pttRightControllerEnabledChanged(value);
|
|
||||||
}
|
|
||||||
if (save) {
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
m_toggleOffsetY = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveCenterTabController::modOffsetX(float value, bool notify) {
|
void MoveCenterTabController::modOffsetX(float value, bool notify) {
|
||||||
@@ -244,6 +194,7 @@ void MoveCenterTabController::modOffsetZ(float value, bool notify) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MoveCenterTabController::reset() {
|
void MoveCenterTabController::reset() {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
vr::VRChaperoneSetup()->RevertWorkingCopy();
|
vr::VRChaperoneSetup()->RevertWorkingCopy();
|
||||||
parent->RotateUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, -m_rotation * 2 * M_PI / 360.0, m_adjustChaperone, false);
|
parent->RotateUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, -m_rotation * 2 * M_PI / 360.0, m_adjustChaperone, false);
|
||||||
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, -m_offsetX, m_adjustChaperone, false);
|
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, -m_offsetX, m_adjustChaperone, false);
|
||||||
@@ -271,170 +222,8 @@ void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe
|
|||||||
} else {
|
} else {
|
||||||
settingsUpdateCounter++;
|
settingsUpdateCounter++;
|
||||||
}
|
}
|
||||||
static auto handleControllerState = [](const vr::VRControllerState_t& state, PttControllerConfig* config) -> bool {
|
checkPttStatus();
|
||||||
if (state.ulButtonPressed & config->digitalButtonMask) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (config->triggerMode) {
|
|
||||||
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger)
|
|
||||||
|| state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (config->touchpadMode) {
|
|
||||||
if (((config->touchpadMode & 1) && (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Touchpad)))
|
|
||||||
|| ((config->touchpadMode & 2) && (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Touchpad)))) {
|
|
||||||
if (config->touchpadAreas == (PAD_AREA_LEFT + PAD_AREA_TOP + PAD_AREA_RIGHT + PAD_AREA_BOTTOM)) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
float x = state.rAxis[0].x;
|
|
||||||
float y = state.rAxis[0].y;
|
|
||||||
if (std::abs(x) >= 0.2 || std::abs(y) >= 0.2) { // deadzone in the middle
|
|
||||||
if (x < 0 && std::abs(y) < -x && (config->touchpadAreas & PAD_AREA_LEFT)) {
|
|
||||||
return true;
|
|
||||||
} else if (y > 0 && std::abs(x) < y && (config->touchpadAreas & PAD_AREA_TOP)) {
|
|
||||||
return true;
|
|
||||||
} else if (x > 0 && std::abs(y) < x && (config->touchpadAreas & PAD_AREA_RIGHT)) {
|
|
||||||
return true;
|
|
||||||
} else if (y < 0 && std::abs(x) < -y && (config->touchpadAreas & PAD_AREA_BOTTOM)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
if (m_pttEnabled) {
|
|
||||||
bool newState = false;
|
|
||||||
if (m_pttLeftControllerEnabled) {
|
|
||||||
auto leftId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_LeftHand);
|
|
||||||
if (leftId != vr::k_unTrackedDeviceIndexInvalid) {
|
|
||||||
vr::VRControllerState_t state;
|
|
||||||
if (vr::VRSystem()->GetControllerState(leftId, &state, sizeof(vr::VRControllerState_t))) {
|
|
||||||
newState |= handleControllerState(state, m_pttControllerConfigs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (m_pttRightControllerEnabled) {
|
|
||||||
auto rightId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand);
|
|
||||||
if (rightId != vr::k_unTrackedDeviceIndexInvalid) {
|
|
||||||
vr::VRControllerState_t state;
|
|
||||||
if (vr::VRSystem()->GetControllerState(rightId, &state, sizeof(vr::VRControllerState_t))) {
|
|
||||||
newState |= handleControllerState(state, m_pttControllerConfigs + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (newState && !m_pttActive) {
|
|
||||||
m_pttActive = true;
|
|
||||||
offsetYToggle(true);
|
|
||||||
emit pttActiveChanged(m_pttActive);
|
|
||||||
} else if (!newState && m_pttActive) {
|
|
||||||
m_pttActive = false;
|
|
||||||
offsetYToggle(false);
|
|
||||||
emit pttActiveChanged(m_pttActive);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
eventLoopMutex.unlock();
|
eventLoopMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveCenterTabController::setPttControllerConfig(unsigned controller, QVariantList buttons, unsigned triggerMode, unsigned padMode, unsigned padAreas) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
if (controller < 2) {
|
|
||||||
uint64_t buttonMask = 0;
|
|
||||||
for (auto b : buttons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
m_pttControllerConfigs[controller].digitalButtons = buttons;
|
|
||||||
m_pttControllerConfigs[controller].digitalButtonMask = buttonMask;
|
|
||||||
m_pttControllerConfigs[controller].triggerMode = triggerMode;
|
|
||||||
m_pttControllerConfigs[controller].touchpadMode = padMode;
|
|
||||||
m_pttControllerConfigs[controller].touchpadAreas = padAreas;
|
|
||||||
savePttConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MoveCenterTabController::reloadPttConfig() {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
|
||||||
auto settings = OverlayController::appSettings();
|
|
||||||
settings->beginGroup("playspaceSettings");
|
|
||||||
setPttEnabled(settings->value("pttEnabled", false).toBool(), true, false);
|
|
||||||
setPttLeftControllerEnabled(settings->value("pttLeftControllerEnabled", false).toBool(), true, false);
|
|
||||||
setPttRightControllerEnabled(settings->value("pttRightControllerEnabled", false).toBool(), true, false);
|
|
||||||
m_pttControllerConfigs[0].digitalButtons = settings->value("pttDigitalButtons_0").toList();
|
|
||||||
uint64_t buttonMask = 0;
|
|
||||||
for (auto b : m_pttControllerConfigs[0].digitalButtons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
m_pttControllerConfigs[0].digitalButtonMask = buttonMask;
|
|
||||||
m_pttControllerConfigs[0].triggerMode = settings->value("pttTriggerMode_0", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[0].touchpadMode = settings->value("pttTouchpadMode_0", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[0].touchpadAreas = settings->value("pttTouchPadAreas_0", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[1].digitalButtons = settings->value("pttDigitalButtons_1").toList();
|
|
||||||
buttonMask = 0;
|
|
||||||
for (auto b : m_pttControllerConfigs[0].digitalButtons) {
|
|
||||||
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
|
||||||
}
|
|
||||||
m_pttControllerConfigs[1].digitalButtonMask = buttonMask;
|
|
||||||
m_pttControllerConfigs[1].triggerMode = settings->value("pttTriggerMode_1", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[1].touchpadMode = settings->value("pttTouchpadMode_1", 0).toUInt();
|
|
||||||
m_pttControllerConfigs[1].touchpadAreas = settings->value("pttTouchPadAreas_1", 0).toUInt();
|
|
||||||
settings->endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MoveCenterTabController::savePttConfig() {
|
|
||||||
auto settings = OverlayController::appSettings();
|
|
||||||
settings->beginGroup("playspaceSettings");
|
|
||||||
settings->setValue("pttEnabled", pttEnabled());
|
|
||||||
settings->setValue("pttLeftControllerEnabled", pttLeftControllerEnabled());
|
|
||||||
settings->setValue("pttRightControllerEnabled", pttRightControllerEnabled());
|
|
||||||
settings->setValue("pttDigitalButtons_0", m_pttControllerConfigs[0].digitalButtons);
|
|
||||||
settings->setValue("pttTriggerMode_0", m_pttControllerConfigs[0].triggerMode);
|
|
||||||
settings->setValue("pttTouchpadMode_0", m_pttControllerConfigs[0].touchpadMode);
|
|
||||||
settings->setValue("pttTouchPadAreas_0", m_pttControllerConfigs[0].touchpadAreas);
|
|
||||||
settings->setValue("pttDigitalButtons_1", m_pttControllerConfigs[1].digitalButtons);
|
|
||||||
settings->setValue("pttTriggerMode_1", m_pttControllerConfigs[1].triggerMode);
|
|
||||||
settings->setValue("pttTouchpadMode_1", m_pttControllerConfigs[1].touchpadMode);
|
|
||||||
settings->setValue("pttTouchPadAreas_1", m_pttControllerConfigs[1].touchpadAreas);
|
|
||||||
settings->endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QVariantList MoveCenterTabController::pttDigitalButtons(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].digitalButtons;
|
|
||||||
}
|
|
||||||
return QVariantList();
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long MoveCenterTabController::pttDigitalButtonMask(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].digitalButtonMask;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned MoveCenterTabController::pttTouchpadMode(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].touchpadMode;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned MoveCenterTabController::pttTriggerMode(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].triggerMode;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned MoveCenterTabController::pttTouchpadArea(unsigned controller) {
|
|
||||||
if (controller < 2) {
|
|
||||||
return m_pttControllerConfigs[controller].touchpadAreas;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace advconfig
|
} // namespace advconfig
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "AudioTabController.h"
|
#include "AudioTabController.h"
|
||||||
|
#include "PttController.h"
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
#include <openvr.h>
|
#include <openvr.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@@ -15,7 +17,7 @@ namespace advsettings {
|
|||||||
class OverlayController;
|
class OverlayController;
|
||||||
|
|
||||||
|
|
||||||
class MoveCenterTabController : public QObject {
|
class MoveCenterTabController : public PttController {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(int trackingUniverse READ trackingUniverse WRITE setTrackingUniverse NOTIFY trackingUniverseChanged)
|
Q_PROPERTY(int trackingUniverse READ trackingUniverse WRITE setTrackingUniverse NOTIFY trackingUniverseChanged)
|
||||||
Q_PROPERTY(float offsetX READ offsetX WRITE setOffsetX NOTIFY offsetXChanged)
|
Q_PROPERTY(float offsetX READ offsetX WRITE setOffsetX NOTIFY offsetXChanged)
|
||||||
@@ -23,14 +25,8 @@ class MoveCenterTabController : public QObject {
|
|||||||
Q_PROPERTY(float offsetZ READ offsetZ WRITE setOffsetZ NOTIFY offsetZChanged)
|
Q_PROPERTY(float offsetZ READ offsetZ WRITE setOffsetZ NOTIFY offsetZChanged)
|
||||||
Q_PROPERTY(int rotation READ rotation WRITE setRotation NOTIFY rotationChanged)
|
Q_PROPERTY(int rotation READ rotation WRITE setRotation NOTIFY rotationChanged)
|
||||||
Q_PROPERTY(bool adjustChaperone READ adjustChaperone WRITE setAdjustChaperone NOTIFY adjustChaperoneChanged)
|
Q_PROPERTY(bool adjustChaperone READ adjustChaperone WRITE setAdjustChaperone NOTIFY adjustChaperoneChanged)
|
||||||
Q_PROPERTY(bool pttEnabled READ pttEnabled WRITE setPttEnabled NOTIFY pttEnabledChanged)
|
|
||||||
Q_PROPERTY(bool pttActive READ pttActive NOTIFY pttActiveChanged)
|
|
||||||
Q_PROPERTY(bool pttLeftControllerEnabled READ pttLeftControllerEnabled WRITE setPttLeftControllerEnabled NOTIFY pttLeftControllerEnabledChanged)
|
|
||||||
Q_PROPERTY(bool pttRightControllerEnabled READ pttRightControllerEnabled WRITE setPttRightControllerEnabled NOTIFY pttRightControllerEnabledChanged)
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void offsetYToggle(bool enabled);
|
|
||||||
|
|
||||||
OverlayController* parent;
|
OverlayController* parent;
|
||||||
QQuickWindow* widget;
|
QQuickWindow* widget;
|
||||||
|
|
||||||
@@ -42,16 +38,12 @@ private:
|
|||||||
int m_rotation = 0;
|
int m_rotation = 0;
|
||||||
bool m_adjustChaperone = true;
|
bool m_adjustChaperone = true;
|
||||||
|
|
||||||
bool m_pttEnabled = false;
|
|
||||||
bool m_pttActive = false;
|
|
||||||
bool m_pttShowNotification = false;
|
|
||||||
bool m_pttLeftControllerEnabled = false;
|
|
||||||
bool m_pttRightControllerEnabled = false;
|
|
||||||
PttControllerConfig m_pttControllerConfigs[2];
|
|
||||||
|
|
||||||
unsigned settingsUpdateCounter = 0;
|
unsigned settingsUpdateCounter = 0;
|
||||||
|
|
||||||
std::recursive_mutex eventLoopMutex;
|
QString getSettingsName() override { return "playspaceSettings"; }
|
||||||
|
void onPttStart() override;
|
||||||
|
void onPttStop() override;
|
||||||
|
void onPttDisabled() override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void initStage1();
|
void initStage1();
|
||||||
@@ -65,19 +57,6 @@ public:
|
|||||||
int rotation() const;
|
int rotation() const;
|
||||||
bool adjustChaperone() const;
|
bool adjustChaperone() const;
|
||||||
|
|
||||||
bool pttEnabled() const;
|
|
||||||
bool pttActive() const;
|
|
||||||
bool pttLeftControllerEnabled() const;
|
|
||||||
bool pttRightControllerEnabled() const;
|
|
||||||
void reloadPttConfig();
|
|
||||||
void savePttConfig();
|
|
||||||
|
|
||||||
Q_INVOKABLE QVariantList pttDigitalButtons(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned long pttDigitalButtonMask(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned pttTouchpadMode(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned pttTriggerMode(unsigned controller);
|
|
||||||
Q_INVOKABLE unsigned pttTouchpadArea(unsigned controller);
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
int trackingUniverse() const;
|
int trackingUniverse() const;
|
||||||
void setTrackingUniverse(int value, bool notify = true);
|
void setTrackingUniverse(int value, bool notify = true);
|
||||||
@@ -95,12 +74,6 @@ public slots:
|
|||||||
void modOffsetZ(float value, bool notify = true);
|
void modOffsetZ(float value, bool notify = true);
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
void setPttEnabled(bool value, bool notify = true, bool save = true);
|
|
||||||
void setPttLeftControllerEnabled(bool value, bool notify = true, bool save = true);
|
|
||||||
void setPttRightControllerEnabled(bool value, bool notify = true, bool save = true);
|
|
||||||
|
|
||||||
void setPttControllerConfig(unsigned controller, QVariantList buttons, unsigned triggerMode, unsigned padMode, unsigned padAreas);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void trackingUniverseChanged(int value);
|
void trackingUniverseChanged(int value);
|
||||||
void offsetXChanged(float value);
|
void offsetXChanged(float value);
|
||||||
@@ -108,11 +81,6 @@ signals:
|
|||||||
void offsetZChanged(float value);
|
void offsetZChanged(float value);
|
||||||
void rotationChanged(int value);
|
void rotationChanged(int value);
|
||||||
void adjustChaperoneChanged(bool value);
|
void adjustChaperoneChanged(bool value);
|
||||||
|
|
||||||
void pttEnabledChanged(bool value);
|
|
||||||
void pttActiveChanged(bool value);
|
|
||||||
void pttLeftControllerEnabledChanged(bool value);
|
|
||||||
void pttRightControllerEnabledChanged(bool value);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace advsettings
|
} // namespace advsettings
|
||||||
|
|||||||
@@ -0,0 +1,491 @@
|
|||||||
|
#include "PttController.h"
|
||||||
|
#include <QQuickWindow>
|
||||||
|
#include <QApplication>
|
||||||
|
#include "../overlaycontroller.h"
|
||||||
|
|
||||||
|
// application namespace
|
||||||
|
namespace advsettings {
|
||||||
|
|
||||||
|
bool PttController::pttEnabled() const {
|
||||||
|
return m_pttEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PttController::pttActive() const {
|
||||||
|
return m_pttActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PttController::pttShowNotification() const {
|
||||||
|
return m_pttShowNotification;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PttController::pttLeftControllerEnabled() const {
|
||||||
|
return m_pttLeftControllerEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PttController::pttRightControllerEnabled() const {
|
||||||
|
return m_pttRightControllerEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::setPttControllerConfig(unsigned controller, QVariantList buttons, unsigned triggerMode, unsigned padMode, unsigned padAreas) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
|
if (controller < 2) {
|
||||||
|
uint64_t buttonMask = 0;
|
||||||
|
for (auto b : buttons) {
|
||||||
|
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
||||||
|
}
|
||||||
|
m_pttControllerConfigs[controller].digitalButtons = buttons;
|
||||||
|
m_pttControllerConfigs[controller].digitalButtonMask = buttonMask;
|
||||||
|
m_pttControllerConfigs[controller].triggerMode = triggerMode;
|
||||||
|
m_pttControllerConfigs[controller].touchpadMode = padMode;
|
||||||
|
m_pttControllerConfigs[controller].touchpadAreas = padAreas;
|
||||||
|
savePttConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::reloadPttProfiles() {
|
||||||
|
pttProfiles.clear();
|
||||||
|
auto settings = OverlayController::appSettings();
|
||||||
|
settings->beginGroup(getSettingsName());
|
||||||
|
auto profileCount = settings->beginReadArray("pttProfiles");
|
||||||
|
for (int i = 0; i < profileCount; i++) {
|
||||||
|
settings->setArrayIndex(i);
|
||||||
|
pttProfiles.emplace_back();
|
||||||
|
auto& entry = pttProfiles[i];
|
||||||
|
entry.profileName = settings->value("profileName").toString().toStdString();
|
||||||
|
entry.showNotification = settings->value("showNotification", true).toBool();
|
||||||
|
entry.leftControllerEnabled = settings->value("leftControllerEnabled", false).toBool();
|
||||||
|
entry.rightControllerEnabled = settings->value("rightControllerEnabled", false).toBool();
|
||||||
|
entry.controllerConfigs[0].digitalButtons = settings->value("digitalButtons_0").toList();
|
||||||
|
uint64_t buttonMask = 0;
|
||||||
|
for (auto b : entry.controllerConfigs[0].digitalButtons) {
|
||||||
|
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
||||||
|
}
|
||||||
|
entry.controllerConfigs[0].digitalButtonMask = buttonMask;
|
||||||
|
entry.controllerConfigs[0].triggerMode = settings->value("triggerMode_0", 0).toUInt();
|
||||||
|
entry.controllerConfigs[0].touchpadMode = settings->value("touchpadMode_0", 0).toUInt();
|
||||||
|
entry.controllerConfigs[0].touchpadAreas = settings->value("touchPadAreas_0", 0).toUInt();
|
||||||
|
entry.controllerConfigs[1].digitalButtons = settings->value("digitalButtons_1").toList();
|
||||||
|
buttonMask = 0;
|
||||||
|
for (auto b : entry.controllerConfigs[1].digitalButtons) {
|
||||||
|
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
||||||
|
}
|
||||||
|
entry.controllerConfigs[1].digitalButtonMask = buttonMask;
|
||||||
|
entry.controllerConfigs[1].triggerMode = settings->value("triggerMode_1", 0).toUInt();
|
||||||
|
entry.controllerConfigs[1].touchpadMode = settings->value("touchpadMode_1", 0).toUInt();
|
||||||
|
entry.controllerConfigs[1].touchpadAreas = settings->value("touchPadAreas_1", 0).toUInt();
|
||||||
|
}
|
||||||
|
settings->endArray();
|
||||||
|
settings->endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::savePttProfiles() {
|
||||||
|
auto settings = OverlayController::appSettings();
|
||||||
|
settings->beginGroup(getSettingsName());
|
||||||
|
settings->beginWriteArray("pttProfiles");
|
||||||
|
unsigned i = 0;
|
||||||
|
for (auto& p : pttProfiles) {
|
||||||
|
settings->setArrayIndex(i);
|
||||||
|
settings->setValue("profileName", QString::fromStdString(p.profileName));
|
||||||
|
settings->setValue("showNotification", p.showNotification);
|
||||||
|
settings->setValue("leftControllerEnabled", p.leftControllerEnabled);
|
||||||
|
settings->setValue("rightControllerEnabled", p.rightControllerEnabled);
|
||||||
|
settings->setValue("digitalButtons_0", p.controllerConfigs[0].digitalButtons);
|
||||||
|
settings->setValue("triggerMode_0", p.controllerConfigs[0].triggerMode);
|
||||||
|
settings->setValue("touchpadMode_0", p.controllerConfigs[0].touchpadMode);
|
||||||
|
settings->setValue("touchPadAreas_0", p.controllerConfigs[0].touchpadAreas);
|
||||||
|
settings->setValue("digitalButtons_1", p.controllerConfigs[1].digitalButtons);
|
||||||
|
settings->setValue("triggerMode_1", p.controllerConfigs[1].triggerMode);
|
||||||
|
settings->setValue("touchpadMode_1", p.controllerConfigs[1].touchpadMode);
|
||||||
|
settings->setValue("touchPadAreas_1", p.controllerConfigs[1].touchpadAreas);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
settings->endArray();
|
||||||
|
settings->endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PttController::reloadPttConfig() {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
|
auto settings = OverlayController::appSettings();
|
||||||
|
settings->beginGroup(getSettingsName());
|
||||||
|
setPttEnabled(settings->value("pttEnabled", false).toBool(), true, false);
|
||||||
|
setPttLeftControllerEnabled(settings->value("pttLeftControllerEnabled", false).toBool(), true, false);
|
||||||
|
setPttRightControllerEnabled(settings->value("pttRightControllerEnabled", false).toBool(), true, false);
|
||||||
|
setPttShowNotification(settings->value("pttShowNotification", true).toBool(), true, false);
|
||||||
|
m_pttControllerConfigs[0].digitalButtons = settings->value("pttDigitalButtons_0").toList();
|
||||||
|
uint64_t buttonMask = 0;
|
||||||
|
for (auto b : m_pttControllerConfigs[0].digitalButtons) {
|
||||||
|
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
||||||
|
}
|
||||||
|
m_pttControllerConfigs[0].digitalButtonMask = buttonMask;
|
||||||
|
m_pttControllerConfigs[0].triggerMode = settings->value("pttTriggerMode_0", 0).toUInt();
|
||||||
|
m_pttControllerConfigs[0].touchpadMode = settings->value("pttTouchpadMode_0", 0).toUInt();
|
||||||
|
m_pttControllerConfigs[0].touchpadAreas = settings->value("pttTouchPadAreas_0", 0).toUInt();
|
||||||
|
m_pttControllerConfigs[1].digitalButtons = settings->value("pttDigitalButtons_1").toList();
|
||||||
|
buttonMask = 0;
|
||||||
|
for (auto b : m_pttControllerConfigs[0].digitalButtons) {
|
||||||
|
buttonMask |= vr::ButtonMaskFromId((vr::EVRButtonId)b.toInt());
|
||||||
|
}
|
||||||
|
m_pttControllerConfigs[1].digitalButtonMask = buttonMask;
|
||||||
|
m_pttControllerConfigs[1].triggerMode = settings->value("pttTriggerMode_1", 0).toUInt();
|
||||||
|
m_pttControllerConfigs[1].touchpadMode = settings->value("pttTouchpadMode_1", 0).toUInt();
|
||||||
|
m_pttControllerConfigs[1].touchpadAreas = settings->value("pttTouchPadAreas_1", 0).toUInt();
|
||||||
|
settings->endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::savePttConfig() {
|
||||||
|
auto settings = OverlayController::appSettings();
|
||||||
|
settings->beginGroup(getSettingsName());
|
||||||
|
settings->setValue("pttEnabled", pttEnabled());
|
||||||
|
settings->setValue("pttLeftControllerEnabled", pttLeftControllerEnabled());
|
||||||
|
settings->setValue("pttRightControllerEnabled", pttRightControllerEnabled());
|
||||||
|
settings->setValue("pttShowNotification", pttShowNotification());
|
||||||
|
settings->setValue("pttDigitalButtons_0", m_pttControllerConfigs[0].digitalButtons);
|
||||||
|
settings->setValue("pttTriggerMode_0", m_pttControllerConfigs[0].triggerMode);
|
||||||
|
settings->setValue("pttTouchpadMode_0", m_pttControllerConfigs[0].touchpadMode);
|
||||||
|
settings->setValue("pttTouchPadAreas_0", m_pttControllerConfigs[0].touchpadAreas);
|
||||||
|
settings->setValue("pttDigitalButtons_1", m_pttControllerConfigs[1].digitalButtons);
|
||||||
|
settings->setValue("pttTriggerMode_1", m_pttControllerConfigs[1].triggerMode);
|
||||||
|
settings->setValue("pttTouchpadMode_1", m_pttControllerConfigs[1].touchpadMode);
|
||||||
|
settings->setValue("pttTouchPadAreas_1", m_pttControllerConfigs[1].touchpadAreas);
|
||||||
|
settings->endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::checkPttStatus() {
|
||||||
|
static auto handleControllerState = [](const vr::VRControllerState_t& state, PttControllerConfig* config) -> bool {
|
||||||
|
if (state.ulButtonPressed & config->digitalButtonMask) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (config->triggerMode) {
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger)
|
||||||
|
|| state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (config->touchpadMode) {
|
||||||
|
if (((config->touchpadMode & 1) && (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Touchpad)))
|
||||||
|
|| ((config->touchpadMode & 2) && (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Touchpad)))) {
|
||||||
|
if (config->touchpadAreas == (PAD_AREA_LEFT + PAD_AREA_TOP + PAD_AREA_RIGHT + PAD_AREA_BOTTOM)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
float x = state.rAxis[0].x;
|
||||||
|
float y = state.rAxis[0].y;
|
||||||
|
if (std::abs(x) >= 0.2 || std::abs(y) >= 0.2) { // deadzone in the middle
|
||||||
|
if (x < 0 && std::abs(y) < -x && (config->touchpadAreas & PAD_AREA_LEFT)) {
|
||||||
|
return true;
|
||||||
|
} else if (y > 0 && std::abs(x) < y && (config->touchpadAreas & PAD_AREA_TOP)) {
|
||||||
|
return true;
|
||||||
|
} else if (x > 0 && std::abs(y) < x && (config->touchpadAreas & PAD_AREA_RIGHT)) {
|
||||||
|
return true;
|
||||||
|
} else if (y < 0 && std::abs(x) < -y && (config->touchpadAreas & PAD_AREA_BOTTOM)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
if (m_pttEnabled) {
|
||||||
|
bool newState = false;
|
||||||
|
if (m_pttLeftControllerEnabled) {
|
||||||
|
auto leftId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_LeftHand);
|
||||||
|
if (leftId != vr::k_unTrackedDeviceIndexInvalid) {
|
||||||
|
vr::VRControllerState_t state;
|
||||||
|
if (vr::VRSystem()->GetControllerState(leftId, &state, sizeof(vr::VRControllerState_t))) {
|
||||||
|
//logControllerState(state, "Left ");
|
||||||
|
newState |= handleControllerState(state, m_pttControllerConfigs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_pttRightControllerEnabled) {
|
||||||
|
auto rightId = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand);
|
||||||
|
if (rightId != vr::k_unTrackedDeviceIndexInvalid) {
|
||||||
|
vr::VRControllerState_t state;
|
||||||
|
if (vr::VRSystem()->GetControllerState(rightId, &state, sizeof(vr::VRControllerState_t))) {
|
||||||
|
//logControllerState(state, "Right ");
|
||||||
|
newState |= handleControllerState(state, m_pttControllerConfigs + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newState && !m_pttActive && pttChangeValid()) {
|
||||||
|
startPtt();
|
||||||
|
} else if (!newState && m_pttActive && pttChangeValid()) {
|
||||||
|
stopPtt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::startPtt() {
|
||||||
|
m_pttActive = true;
|
||||||
|
onPttStart();
|
||||||
|
if (m_pttShowNotification && getNotificationOverlayHandle() != vr::k_ulOverlayHandleInvalid) {
|
||||||
|
vr::VROverlay()->ShowOverlay(getNotificationOverlayHandle());
|
||||||
|
}
|
||||||
|
emit pttActiveChanged(m_pttActive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::stopPtt() {
|
||||||
|
m_pttActive = false;
|
||||||
|
onPttStop();
|
||||||
|
if (m_pttShowNotification && getNotificationOverlayHandle() != vr::k_ulOverlayHandleInvalid) {
|
||||||
|
vr::VROverlay()->HideOverlay(getNotificationOverlayHandle());
|
||||||
|
}
|
||||||
|
emit pttActiveChanged(m_pttActive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::addPttProfile(QString name) {
|
||||||
|
PttProfile* profile = nullptr;
|
||||||
|
for (auto& p : pttProfiles) {
|
||||||
|
if (p.profileName.compare(name.toStdString()) == 0) {
|
||||||
|
profile = &p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!profile) {
|
||||||
|
auto i = pttProfiles.size();
|
||||||
|
pttProfiles.emplace_back();
|
||||||
|
profile = &pttProfiles[i];
|
||||||
|
}
|
||||||
|
profile->profileName = name.toStdString();
|
||||||
|
profile->showNotification = m_pttShowNotification;
|
||||||
|
profile->leftControllerEnabled = m_pttLeftControllerEnabled;
|
||||||
|
profile->rightControllerEnabled = m_pttRightControllerEnabled;
|
||||||
|
profile->controllerConfigs[0].digitalButtons = m_pttControllerConfigs[0].digitalButtons;
|
||||||
|
profile->controllerConfigs[0].digitalButtonMask = m_pttControllerConfigs[0].digitalButtonMask;
|
||||||
|
profile->controllerConfigs[0].triggerMode = m_pttControllerConfigs[0].triggerMode;
|
||||||
|
profile->controllerConfigs[0].touchpadMode = m_pttControllerConfigs[0].touchpadMode;
|
||||||
|
profile->controllerConfigs[0].touchpadAreas = m_pttControllerConfigs[0].touchpadAreas;
|
||||||
|
profile->controllerConfigs[1].digitalButtons = m_pttControllerConfigs[1].digitalButtons;
|
||||||
|
profile->controllerConfigs[1].digitalButtonMask = m_pttControllerConfigs[1].digitalButtonMask;
|
||||||
|
profile->controllerConfigs[1].triggerMode = m_pttControllerConfigs[1].triggerMode;
|
||||||
|
profile->controllerConfigs[1].touchpadMode = m_pttControllerConfigs[1].touchpadMode;
|
||||||
|
profile->controllerConfigs[1].touchpadAreas = m_pttControllerConfigs[1].touchpadAreas;
|
||||||
|
savePttProfiles();
|
||||||
|
OverlayController::appSettings()->sync();
|
||||||
|
emit pttProfilesUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::applyPttProfile(unsigned index) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
|
if (index < pttProfiles.size()) {
|
||||||
|
auto& profile = pttProfiles[index];
|
||||||
|
setPttShowNotification(profile.showNotification);
|
||||||
|
setPttLeftControllerEnabled(profile.leftControllerEnabled);
|
||||||
|
setPttRightControllerEnabled(profile.rightControllerEnabled);
|
||||||
|
m_pttControllerConfigs[0].digitalButtons = profile.controllerConfigs[0].digitalButtons;
|
||||||
|
m_pttControllerConfigs[0].digitalButtonMask = profile.controllerConfigs[0].digitalButtonMask;
|
||||||
|
m_pttControllerConfigs[0].triggerMode = profile.controllerConfigs[0].triggerMode;
|
||||||
|
m_pttControllerConfigs[0].touchpadMode = profile.controllerConfigs[0].touchpadMode;
|
||||||
|
m_pttControllerConfigs[0].touchpadAreas = profile.controllerConfigs[0].touchpadAreas;
|
||||||
|
m_pttControllerConfigs[1].digitalButtons = profile.controllerConfigs[1].digitalButtons;
|
||||||
|
m_pttControllerConfigs[1].digitalButtonMask = profile.controllerConfigs[1].digitalButtonMask;
|
||||||
|
m_pttControllerConfigs[1].triggerMode = profile.controllerConfigs[1].triggerMode;
|
||||||
|
m_pttControllerConfigs[1].touchpadMode = profile.controllerConfigs[1].touchpadMode;
|
||||||
|
m_pttControllerConfigs[1].touchpadAreas = profile.controllerConfigs[1].touchpadAreas;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::deletePttProfile(unsigned index) {
|
||||||
|
if (index < pttProfiles.size()) {
|
||||||
|
auto pos = pttProfiles.begin() + index;
|
||||||
|
pttProfiles.erase(pos);
|
||||||
|
savePttProfiles();
|
||||||
|
OverlayController::appSettings()->sync();
|
||||||
|
emit pttProfilesUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantList PttController::pttDigitalButtons(unsigned controller) {
|
||||||
|
if (controller < 2) {
|
||||||
|
return m_pttControllerConfigs[controller].digitalButtons;
|
||||||
|
}
|
||||||
|
return QVariantList();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long PttController::pttDigitalButtonMask(unsigned controller) {
|
||||||
|
if (controller < 2) {
|
||||||
|
return m_pttControllerConfigs[controller].digitalButtonMask;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned PttController::pttTouchpadMode(unsigned controller) {
|
||||||
|
if (controller < 2) {
|
||||||
|
return m_pttControllerConfigs[controller].touchpadMode;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned PttController::pttTriggerMode(unsigned controller) {
|
||||||
|
if (controller < 2) {
|
||||||
|
return m_pttControllerConfigs[controller].triggerMode;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned PttController::pttTouchpadArea(unsigned controller) {
|
||||||
|
if (controller < 2) {
|
||||||
|
return m_pttControllerConfigs[controller].touchpadAreas;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned PttController::getPttProfileCount() {
|
||||||
|
return (unsigned)pttProfiles.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString PttController::getPttProfileName(unsigned index) {
|
||||||
|
if (index < pttProfiles.size()) {
|
||||||
|
return QString::fromStdString(pttProfiles[index].profileName);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::setPttEnabled(bool value, bool notify, bool save) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
|
if (value != m_pttEnabled) {
|
||||||
|
m_pttEnabled = value;
|
||||||
|
if (value) {
|
||||||
|
onPttEnabled();
|
||||||
|
} else {
|
||||||
|
onPttDisabled();
|
||||||
|
}
|
||||||
|
if (notify) {
|
||||||
|
emit pttEnabledChanged(value);
|
||||||
|
}
|
||||||
|
if (save) {
|
||||||
|
savePttConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::setPttShowNotification(bool value, bool notify, bool save) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
|
if (value != m_pttShowNotification) {
|
||||||
|
m_pttShowNotification = value;
|
||||||
|
if (notify) {
|
||||||
|
emit pttShowNotificationChanged(value);
|
||||||
|
}
|
||||||
|
if (save) {
|
||||||
|
savePttConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::setPttLeftControllerEnabled(bool value, bool notify, bool save) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
|
if (value != m_pttLeftControllerEnabled) {
|
||||||
|
m_pttLeftControllerEnabled = value;
|
||||||
|
if (notify) {
|
||||||
|
emit pttLeftControllerEnabledChanged(value);
|
||||||
|
}
|
||||||
|
if (save) {
|
||||||
|
savePttConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PttController::setPttRightControllerEnabled(bool value, bool notify, bool save) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
|
||||||
|
if (value != m_pttRightControllerEnabled) {
|
||||||
|
m_pttRightControllerEnabled = value;
|
||||||
|
if (notify) {
|
||||||
|
emit pttRightControllerEnabledChanged(value);
|
||||||
|
}
|
||||||
|
if (save) {
|
||||||
|
savePttConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void logControllerState(const vr::VRControllerState_t& state, const std::string& prefix) {
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_ApplicationMenu) << " pressed";
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_ApplicationMenu) << " touched";
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Grip)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Grip) << " pressed";
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Grip)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Grip) << " touched";
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Left)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Left) << " pressed";
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Left)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Left) << " touched";
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Up)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Up) << " pressed";
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Up)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Up) << " touched";
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Right)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Right) << " pressed";
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Right)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Right) << " touched";
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_DPad_Down)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Down) << " pressed";
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_DPad_Down)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_DPad_Down) << " touched";
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_A)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_A) << " pressed";
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_A)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_A) << " touched";
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis0)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " pressed";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " x: " << state.rAxis[0].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis0)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " touched";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis0) << " x: " << state.rAxis[0].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis1)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " pressed";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " x: " << state.rAxis[1].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis1)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " touched";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis1) << " x: " << state.rAxis[1].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis2)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " pressed";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " x: " << state.rAxis[2].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis2)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " touched";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis2) << " x: " << state.rAxis[2].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis3)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " pressed";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " x: " << state.rAxis[3].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis3)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " touched";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis3) << " x: " << state.rAxis[3].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_Axis4)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " pressed";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " x: " << state.rAxis[4].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
if (state.ulButtonTouched & vr::ButtonMaskFromId(vr::k_EButton_Axis4)) {
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " touched";
|
||||||
|
LOG(INFO) << prefix << vr::VRSystem()->GetButtonIdNameFromEnum(vr::k_EButton_Axis4) << " x: " << state.rAxis[4].x << " y: " << state.rAxis[0].y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace advconfig
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
#include <QVariant>
|
||||||
|
#include <string>
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <openvr.h>
|
||||||
|
|
||||||
|
class QQuickWindow;
|
||||||
|
// application namespace
|
||||||
|
namespace advsettings {
|
||||||
|
|
||||||
|
// forward declaration
|
||||||
|
class OverlayController;
|
||||||
|
|
||||||
|
enum TouchPadArea {
|
||||||
|
PAD_AREA_LEFT = (1 << 0),
|
||||||
|
PAD_AREA_TOP = (1 << 1),
|
||||||
|
PAD_AREA_RIGHT = (1 << 2),
|
||||||
|
PAD_AREA_BOTTOM = (1 << 3),
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PttControllerConfig {
|
||||||
|
QVariantList digitalButtons;
|
||||||
|
uint64_t digitalButtonMask = 0;
|
||||||
|
unsigned triggerMode = 0; // 0 .. disabled, 1 .. enabled
|
||||||
|
unsigned touchpadMode = 0; // 0 .. disabled, 1 .. only touch, 2 .. only press, 3 .. both
|
||||||
|
unsigned touchpadAreas = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PttProfile {
|
||||||
|
std::string profileName;
|
||||||
|
|
||||||
|
bool showNotification = false;
|
||||||
|
bool leftControllerEnabled = false;
|
||||||
|
bool rightControllerEnabled = false;
|
||||||
|
PttControllerConfig controllerConfigs[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class PttController : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(bool pttEnabled READ pttEnabled WRITE setPttEnabled NOTIFY pttEnabledChanged)
|
||||||
|
Q_PROPERTY(bool pttActive READ pttActive NOTIFY pttActiveChanged)
|
||||||
|
Q_PROPERTY(bool pttShowNotification READ pttShowNotification WRITE setPttShowNotification NOTIFY pttShowNotificationChanged)
|
||||||
|
Q_PROPERTY(bool pttLeftControllerEnabled READ pttLeftControllerEnabled WRITE setPttLeftControllerEnabled NOTIFY pttLeftControllerEnabledChanged)
|
||||||
|
Q_PROPERTY(bool pttRightControllerEnabled READ pttRightControllerEnabled WRITE setPttRightControllerEnabled NOTIFY pttRightControllerEnabledChanged)
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_pttEnabled = false;
|
||||||
|
bool m_pttActive = false;
|
||||||
|
bool m_pttShowNotification = false;
|
||||||
|
bool m_pttLeftControllerEnabled = false;
|
||||||
|
bool m_pttRightControllerEnabled = false;
|
||||||
|
PttControllerConfig m_pttControllerConfigs[2];
|
||||||
|
|
||||||
|
std::vector<PttProfile> pttProfiles;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void checkPttStatus();
|
||||||
|
virtual QString getSettingsName() { return "pttSettings"; }
|
||||||
|
virtual void onPttStart() {};
|
||||||
|
virtual void onPttStop() {};
|
||||||
|
virtual void onPttEnabled() {};
|
||||||
|
virtual void onPttDisabled() {};
|
||||||
|
virtual bool pttChangeValid() { return true; }
|
||||||
|
virtual vr::VROverlayHandle_t getNotificationOverlayHandle() { return vr::k_ulOverlayHandleInvalid; }
|
||||||
|
std::recursive_mutex eventLoopMutex;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool pttEnabled() const;
|
||||||
|
bool pttActive() const;
|
||||||
|
bool pttShowNotification() const;
|
||||||
|
bool pttLeftControllerEnabled() const;
|
||||||
|
bool pttRightControllerEnabled() const;
|
||||||
|
|
||||||
|
void startPtt();
|
||||||
|
void stopPtt();
|
||||||
|
|
||||||
|
void reloadPttProfiles();
|
||||||
|
void reloadPttConfig();
|
||||||
|
void savePttProfiles();
|
||||||
|
void savePttConfig();
|
||||||
|
|
||||||
|
|
||||||
|
Q_INVOKABLE QVariantList pttDigitalButtons(unsigned controller);
|
||||||
|
Q_INVOKABLE unsigned long pttDigitalButtonMask(unsigned controller);
|
||||||
|
Q_INVOKABLE unsigned pttTouchpadMode(unsigned controller);
|
||||||
|
Q_INVOKABLE unsigned pttTriggerMode(unsigned controller);
|
||||||
|
Q_INVOKABLE unsigned pttTouchpadArea(unsigned controller);
|
||||||
|
|
||||||
|
Q_INVOKABLE unsigned getPttProfileCount();
|
||||||
|
Q_INVOKABLE QString getPttProfileName(unsigned index);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setPttEnabled(bool value, bool notify = true, bool save = true);
|
||||||
|
void setPttShowNotification(bool value, bool notify = true, bool save = true);
|
||||||
|
void setPttLeftControllerEnabled(bool value, bool notify = true, bool save = true);
|
||||||
|
void setPttRightControllerEnabled(bool value, bool notify = true, bool save = true);
|
||||||
|
|
||||||
|
void setPttControllerConfig(unsigned controller, QVariantList buttons, unsigned triggerMode, unsigned padMode, unsigned padAreas);
|
||||||
|
|
||||||
|
void addPttProfile(QString name);
|
||||||
|
void applyPttProfile(unsigned index);
|
||||||
|
void deletePttProfile(unsigned index);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void pttEnabledChanged(bool value);
|
||||||
|
void pttActiveChanged(bool value);
|
||||||
|
void pttShowNotificationChanged(bool value);
|
||||||
|
void pttLeftControllerEnabledChanged(bool value);
|
||||||
|
void pttRightControllerEnabledChanged(bool value);
|
||||||
|
|
||||||
|
void pttProfilesUpdated();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace advsettings
|
||||||
Reference in New Issue
Block a user