blob: ed4150c2de7f4bbf37a7dedc969105cde1dd2f4f (
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
|
#!/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
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,
controller: vr.ETrackedControllerRole = vr.TrackedControllerRole_LeftHand,
button: vr.EVRButtonId = vr.k_EButton_Axis0
) -> int:
lh_idx = session_state.system.getTrackedDeviceIndexForControllerRole(vr.TrackedControllerRole_LeftHand)
#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.5
# This is the ID of event for the joystick being clicked.
joy_click = vr.k_EButton_Axis0
joy_click_mask = (1 << joy_click)
ret = EVENT_NONE
if (state.ulButtonPressed & joy_click_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)
if event == EVENT_RISING_EDGE:
print("rising edge")
elif event == EVENT_FALLING_EDGE:
print("falling edge")
|