make proper setup for VRPN with buttons and trackers

This commit is contained in:
Hartmut Seichter 2025-07-07 22:43:04 +02:00
parent ea953e92a6
commit 3f823111d1
10 changed files with 115 additions and 39 deletions

View file

@ -3,6 +3,7 @@ extends Node
# tracking associated data
enum TrackingDataType { POS_QUAT, VELOCITY, ACCELERATION }
enum ButtonDataType { BUTTON_STATE, BUTTON_CHANGE }
# magic cookie
const magic_cookie_start : String = "vrpn: ver."
@ -21,7 +22,8 @@ signal error(msg:String)
@export var vrpn_server : String = "127.0.0.1"
@export var vrpn_port : int = 3883
@export var tracker_receivers : Array[VRPN_Receiver] = []
var tracker : Array[VRPN_Tracker] = []
var buttons : Array[VRPN_Button] = []
@onready var _stream: StreamPeerTCP = StreamPeerTCP.new()
@ -174,8 +176,8 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id:
# VRPN quat layout and Godot Quaternion c'tor identical with x,y,z,w
var quat = Quaternion(body.get_double(),body.get_double(),body.get_double(),body.get_double()).normalized()
# submit to listener
for r in session.tracker_receivers:
r._on_tracker({
for r in session.tracker:
r._on_vrpn({
"type" : TrackingDataType.POS_QUAT,
"tracker" : session.sensors[sender_id],
"sensor" : sensor_id,
@ -191,8 +193,8 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id:
# VRPN quat layout and Godot Quaternion c'tor identical with x,y,z,w
var vel_rot = Quaternion(body.get_double(),body.get_double(),body.get_double(),body.get_double()).normalized()
# submit to listener
for r in session.tracker_receivers:
r._on_tracker({
for r in session.tracker:
r._on_vrpn({
"type" : TrackingDataType.VELOCITY,
"tracker" : session.sensors[sender_id],
"sensor" : sensor_id,
@ -210,8 +212,8 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id:
var acc_dt = body.get_double() # padding
# submit to listener
for r in session.tracker_receivers:
r._on_tracker({
for r in session.tracker:
r._on_vrpn({
"type" : TrackingDataType.ACCELERATION,
"tracker" : session.sensors[sender_id],
"sensor" : sensor_id,
@ -219,6 +221,25 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id:
"acceleration_rotation" : acc_rot,
"acceleration_dt" : acc_dt
})
'vrpn_Button Change':
var num_buttons : int = body.get_32()
var button_changes : Dictionary = {}
for i in range(num_buttons):
button_changes[i] = body.get_32()
for button in session.buttons:
button._on_vrpn(
{
"type" : ButtonDataType.BUTTON_CHANGE,
"sensor" : session.sensors[sender_id],
"changes" : button_changes
}
)
'vrpn_Button States':
var num_buttons : int = body.get_32()
for i in range(num_buttons):
var button_state = body.get_32()
#print("button state {0} : {1}".format([i,button_state]))
_:
pass