summaryrefslogtreecommitdiffstats
path: root/Scripts/steamvr.py
blob: c23118455211a0b5ea0875c97dcee97290a2e161 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env python3

# python3 -m pip install openvr
# License: BSD-3.0 (requires showing notice in binary distributions)
import openvr as vr
import time

EVENT_NONE = 0
EVENT_RISING_EDGE = 1
EVENT_FALLING_EDGE = 2

hands = {}
hands["left"] = vr.TrackedControllerRole_LeftHand
hands["right"] = vr.TrackedControllerRole_RightHand

buttons = {}
buttons["a"] = vr.k_EButton_IndexController_A
buttons["b"] = vr.k_EButton_IndexController_B
buttons["joystick"] = vr.k_EButton_Axis0

class SessionState:
    def __init__(self):
        self.system = vr.init(vr.VRApplication_Background)
        self.last_packet = 0
        # Whether the configured input event is high or low.
        self.event_high = False

# Checks if the given button on the given controller is pressed.
# Defaults to joystick click / left hand.
# Returns three values:
#   0 - button not pressed
#   1 - button rising edge
#   2 - button falling edge
def pollButtonPress(
        session_state: SessionState,
        hand_id: vr.ETrackedControllerRole = hands["left"],
        button_id: vr.EVRButtonId = buttons["joystick"],
        ) -> int:
    lh_idx = session_state.system.getTrackedDeviceIndexForControllerRole(hand_id)
    #print("left hand device idx: {}".format(lh_idx))

    got_state, state = session_state.system.getControllerState(lh_idx)
    if not got_state:
        return EVENT_NONE

    if state.unPacketNum == session_state.last_packet:
        return EVENT_NONE

    # Clicking joysticks and moving joysticks fire the same events. To
    # differentiate movement from clicking, we create a dead zone: if the event
    # fires while the stick isn't moved far from center, we assume it's a
    # click, not movement.
    dead_zone_radius = 0.7

    button_mask = (1 << button_id)
    ret = EVENT_NONE
    if (state.ulButtonPressed & button_mask) != 0 and\
            (state.rAxis[0].x**2 + state.rAxis[0].y**2 < dead_zone_radius**2):
        #print("button pressed: %016x" % state.ulButtonPressed)
        #for i in range(0, 5):
        #    print("axis {} x: {} y: {}".format(i, state.rAxis[i].x, state.rAxis[i].y))
        if not session_state.event_high:
            ret = EVENT_RISING_EDGE
        session_state.event_high = True
    elif session_state.event_high:
        session_state.event_high = False
        ret = EVENT_FALLING_EDGE
    return ret

if __name__ == "__main__":
    session_state = SessionState()
    while True:
        time.sleep(0.1)

        event = pollButtonPress(session_state, hand_id = hands["left"], button_id = buttons["joystick"])
        if event == EVENT_RISING_EDGE:
            print("rising edge")
        elif event == EVENT_FALLING_EDGE:
            print("falling edge")