diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..d56d911
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,9 @@
+
+
+Copyright 2025 Hartmut Seichter
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b5ddebe
--- /dev/null
+++ b/README.md
@@ -0,0 +1,23 @@
+# gdvrpn
+
+A native GDScript implementation of the [VRPN](https://vrpn.github.io/) client protocol.
+
+# TOC
+
+# Background
+
+Various VR tools even today in use are providing an interface for tracking data by implementing a VPRN server. Binding a the actual VRPN library into an extension is proven and working but is quite a burden if the main aim of usage is receiving tracking data. Hence, this project was born to allow for easy integration of VRPN tracking in Godot.
+
+This project does not implement any server components and is only tested with a limited number of devices in our lab.
+
+# Install
+
+Install the project from the AssetLib in Godot or directly from the repository.
+
+# Usage
+
+TBW
+
+# License
+
+This project is licensed under the terms of the [MIT License](https://opensource.org/license/mit)
diff --git a/addons/vrpn/assets/axis.blend b/addons/vrpn/assets/axis.blend
new file mode 100644
index 0000000..6ed72dd
Binary files /dev/null and b/addons/vrpn/assets/axis.blend differ
diff --git a/addons/vrpn/assets/axis.blend.import b/addons/vrpn/assets/axis.blend.import
new file mode 100644
index 0000000..393c9be
--- /dev/null
+++ b/addons/vrpn/assets/axis.blend.import
@@ -0,0 +1,62 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://b426fy7d6jw2d"
+path="res://.godot/imported/axis.blend-64f5b0cb53b3b69c5a0ce687708e9ae2.scn"
+
+[deps]
+
+source_file="res://addons/vrpn/assets/axis.blend"
+dest_files=["res://.godot/imported/axis.blend-64f5b0cb53b3b69c5a0ce687708e9ae2.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+nodes/import_as_skeleton_bones=false
+nodes/use_node_type_suffixes=true
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=1
+meshes/lightmap_texel_size=0.2
+meshes/force_disable_compression=false
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+animation/trimming=false
+animation/remove_immutable_tracks=true
+animation/import_rest_as_RESET=false
+import_script/path=""
+_subresources={
+"nodes": {
+"PATH:Camera": {
+"import/skip_import": true
+},
+"PATH:Light": {
+"import/skip_import": true
+}
+}
+}
+blender/nodes/visible=0
+blender/nodes/active_collection_only=false
+blender/nodes/punctual_lights=true
+blender/nodes/cameras=true
+blender/nodes/custom_properties=true
+blender/nodes/modifiers=1
+blender/meshes/colors=false
+blender/meshes/uvs=true
+blender/meshes/normals=true
+blender/meshes/export_geometry_nodes_instances=false
+blender/meshes/tangents=true
+blender/meshes/skins=2
+blender/meshes/export_bones_deforming_mesh_only=false
+blender/materials/unpack_enabled=true
+blender/materials/export_materials=1
+blender/animation/limit_playback=true
+blender/animation/always_sample=true
+blender/animation/group_tracks=true
diff --git a/addons/vrpn/docs/Notes.md b/addons/vrpn/docs/Notes.md
new file mode 100644
index 0000000..9854ae2
--- /dev/null
+++ b/addons/vrpn/docs/Notes.md
@@ -0,0 +1,24 @@
+# Resources
+
+Reference for implementing this library are from here [vrpn-rs description of VRPN protocol](https://github.com/vrpn/vrpn-rs/blob/main/Protocol.md)
+Unfortunately, there are some mistakes in the document, most notably it presumes that
+Quaternion in VRPN (quat library) are w,x,y,z - which is incorrect.
+
+# Design
+
+Allow for a session based design - data needs to be collected per block
+and immediatly made available. Minimal or no internal state keeping!
+
+- first collect names and ids of message_types and senders (stored in session)
+- register listeners in session
+- listeners inject captured data with signals
+
+- keep naming "classic" ??? ... above session is a tracker with a sender with sensors
+
+# Todo
+- [x] Testset for Quaternion rotations
+- [x] Axis as subscene
+
+# Internal Notes
+
+- Graphics Interaction Lab OptiTrack system is at 212.201.64.122
diff --git a/addons/vrpn/examples/optitrack.tscn b/addons/vrpn/examples/optitrack.tscn
new file mode 100644
index 0000000..c86662b
--- /dev/null
+++ b/addons/vrpn/examples/optitrack.tscn
@@ -0,0 +1,45 @@
+[gd_scene load_steps=5 format=3 uid="uid://en7tpf1d6yak"]
+
+[ext_resource type="Script" uid="uid://dmq3i7qmo1qe0" path="res://addons/vrpn/scripts/VRPN.gd" id="1_jrm7s"]
+[ext_resource type="Script" uid="uid://dpj1wrvfsiq4v" path="res://addons/vrpn/scripts/VRPN_Receiver.gd" id="2_fp2uy"]
+[ext_resource type="PackedScene" uid="uid://b426fy7d6jw2d" path="res://addons/vrpn/assets/axis.blend" id="3_73ywu"]
+
+[sub_resource type="PlaneMesh" id="PlaneMesh_24d08"]
+size = Vector2(6, 2)
+
+[node name="Node3D" type="Node3D"]
+
+[node name="Camera3D" type="Camera3D" parent="."]
+transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0.355791, -1.59348)
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(-0.878275, 0.266876, -0.396749, -7.71365e-11, 0.829749, 0.558137, 0.478155, 0.490197, -0.728748, 0, 0.631436, 0)
+shadow_enabled = true
+
+[node name="Root" type="Node3D" parent="."]
+
+[node name="VRPN" type="Node3D" parent="Root" node_paths=PackedStringArray("tracker_receivers")]
+script = ExtResource("1_jrm7s")
+tracker_receivers = [NodePath("RB1"), NodePath("RB2")]
+vrpn_server = "212.201.64.122"
+
+[node name="RB1" type="Node3D" parent="Root/VRPN"]
+script = ExtResource("2_fp2uy")
+tracker_name = "RB1"
+
+[node name="axis" parent="Root/VRPN/RB1" instance=ExtResource("3_73ywu")]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0)
+
+[node name="RB2" type="Node3D" parent="Root/VRPN"]
+script = ExtResource("2_fp2uy")
+tracker_name = "RB2"
+
+[node name="axis" parent="Root/VRPN/RB2" instance=ExtResource("3_73ywu")]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0)
+
+[node name="Floor" type="MeshInstance3D" parent="Root"]
+mesh = SubResource("PlaneMesh_24d08")
+
+[node name="Wall" type="MeshInstance3D" parent="Root"]
+transform = Transform3D(-1, 8.74228e-08, -3.82137e-15, 0, -4.37114e-08, -1, -8.74228e-08, -1, 4.37114e-08, 0, 0.93633, 1.06259)
+mesh = SubResource("PlaneMesh_24d08")
diff --git a/addons/vrpn/examples/spin_tracker.tscn b/addons/vrpn/examples/spin_tracker.tscn
new file mode 100644
index 0000000..c10d3bf
--- /dev/null
+++ b/addons/vrpn/examples/spin_tracker.tscn
@@ -0,0 +1,74 @@
+[gd_scene load_steps=5 format=3 uid="uid://bj5ykdjle10tt"]
+
+[ext_resource type="Script" uid="uid://dmq3i7qmo1qe0" path="res://addons/vrpn/scripts/VRPN.gd" id="2_24d08"]
+[ext_resource type="Script" uid="uid://dpj1wrvfsiq4v" path="res://addons/vrpn/scripts/VRPN_Receiver.gd" id="2_170dk"]
+[ext_resource type="PackedScene" uid="uid://b426fy7d6jw2d" path="res://addons/vrpn/assets/axis.blend" id="3_170dk"]
+
+[sub_resource type="PlaneMesh" id="PlaneMesh_24d08"]
+size = Vector2(6, 2)
+
+[node name="Node3D" type="Node3D"]
+
+[node name="Camera3D" type="Camera3D" parent="."]
+transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0.355791, -1.59348)
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(-0.878275, 0.266876, -0.396749, -7.71365e-11, 0.829749, 0.558137, 0.478155, 0.490197, -0.728748, 0, 0.631436, 0)
+shadow_enabled = true
+
+[node name="Root" type="Node3D" parent="."]
+
+[node name="VRPN" type="Node3D" parent="Root" node_paths=PackedStringArray("tracker_receivers")]
+script = ExtResource("2_24d08")
+tracker_receivers = [NodePath("../SpinTracker/Offset0/Tracker0"), NodePath("../SpinTracker/Tracker1"), NodePath("../SpinTracker/Offset2/Tracker2")]
+
+[node name="Floor" type="MeshInstance3D" parent="Root"]
+mesh = SubResource("PlaneMesh_24d08")
+
+[node name="Wall" type="MeshInstance3D" parent="Root"]
+transform = Transform3D(-1, 8.74228e-08, -3.82137e-15, 0, -4.37114e-08, -1, -8.74228e-08, -1, 4.37114e-08, 0, 0.93633, 1.06259)
+mesh = SubResource("PlaneMesh_24d08")
+
+[node name="SpinTracker" type="Node3D" parent="Root"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.764802, 0)
+
+[node name="Tracker1" type="Node3D" parent="Root/SpinTracker"]
+script = ExtResource("2_170dk")
+tracker_name = "Tracker1"
+tracker_use_position = false
+
+[node name="Axis" parent="Root/SpinTracker/Tracker1" instance=ExtResource("3_170dk")]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0)
+
+[node name="Label-Y-Axis" type="Label3D" parent="Root/SpinTracker/Tracker1"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.759683, 0)
+text = "Y-Axis"
+
+[node name="Offset2" type="Node3D" parent="Root/SpinTracker"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0)
+
+[node name="Tracker2" type="Node3D" parent="Root/SpinTracker/Offset2"]
+script = ExtResource("2_170dk")
+tracker_name = "Tracker2"
+tracker_use_position = false
+
+[node name="Axis" parent="Root/SpinTracker/Offset2/Tracker2" instance=ExtResource("3_170dk")]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0)
+
+[node name="Label-Z-Axis" type="Label3D" parent="Root/SpinTracker/Offset2/Tracker2"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.764205, 0)
+text = "Z-Axis"
+
+[node name="Offset0" type="Node3D" parent="Root/SpinTracker"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0)
+
+[node name="Tracker0" type="Node3D" parent="Root/SpinTracker/Offset0"]
+script = ExtResource("2_170dk")
+tracker_use_position = false
+
+[node name="axis" parent="Root/SpinTracker/Offset0/Tracker0" instance=ExtResource("3_170dk")]
+transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0)
+
+[node name="Label3D" type="Label3D" parent="Root/SpinTracker/Offset0/Tracker0"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.769847, 0)
+text = "X-Axis"
diff --git a/addons/vrpn/icons/icon.svg b/addons/vrpn/icons/icon.svg
new file mode 100644
index 0000000..9d8b7fa
--- /dev/null
+++ b/addons/vrpn/icons/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/vrpn/icons/icon.svg.import b/addons/vrpn/icons/icon.svg.import
new file mode 100644
index 0000000..3f3be88
--- /dev/null
+++ b/addons/vrpn/icons/icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdprcmtx102rp"
+path="res://.godot/imported/icon.svg-bbc889e9147eb1676401b9ec3d05066e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/vrpn/icons/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-bbc889e9147eb1676401b9ec3d05066e.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/vrpn/scripts/VRPN.gd b/addons/vrpn/scripts/VRPN.gd
new file mode 100644
index 0000000..ca0f056
--- /dev/null
+++ b/addons/vrpn/scripts/VRPN.gd
@@ -0,0 +1,194 @@
+extends Node
+class_name VRPN
+
+# tracking associated data
+enum TrackingData { POS_QUAT, VELOCITY, ACCELERATION }
+
+# magic cookie
+const magic_cookie_start : String = "vrpn: ver."
+# kinda redundant as we take the seq number as well
+static var header_size : int = aligned_size(20)
+
+
+var sensors : Dictionary[int,String] = {}
+var messages : Dictionary[int,String] = {}
+
+signal connected(s:StreamPeerTCP)
+signal data(data:Array)
+signal disconnected
+signal error
+
+
+@onready var _stream: StreamPeerTCP = StreamPeerTCP.new()
+
+@export var tracker_receivers : Array[VRPN_Receiver] = []
+
+@export var vrpn_server : String = "127.0.0.1"
+@export var vrpn_port : int = 3883
+
+func _ready() -> void:
+
+ self.connect_to_host(vrpn_server,vrpn_port)
+
+ if not connected.has_connections():
+ connected.connect(self._on_connected)
+ if not data.has_connections():
+ data.connect(self._on_data)
+ if not disconnected.has_connections():
+ disconnected.connect(self._on_disconnected)
+ if not error.has_connections():
+ error.connect(self._on_error)
+
+func _process(delta: float) -> void:
+ var old_status = _stream.get_status()
+ _stream.poll()
+ var new_status = _stream.get_status()
+ if old_status != new_status:
+ match new_status:
+ _stream.STATUS_NONE:
+ emit_signal("disconnected")
+ _stream.STATUS_CONNECTING:
+ print("Connecting.")
+ _stream.STATUS_CONNECTED:
+ print("Connected.")
+ _stream.poll()
+ emit_signal("connected",_stream)
+ _stream.STATUS_ERROR:
+ print("Error with socket stream.")
+ emit_signal("error")
+
+ if new_status == _stream.STATUS_CONNECTED:
+ var available_bytes: int = _stream.get_available_bytes()
+ if available_bytes > 0:
+ var res = _stream.get_partial_data(available_bytes)
+ if res[0] != OK:
+ emit_signal("error")
+ else:
+ emit_signal("data", res[1])
+
+func connect_to_host(host: String, port: int) -> void:
+ print("Connecting to %s:%d" % [host, port])
+ if _stream.connect_to_host(host, port) != OK:
+ print("Error connecting to host.")
+ emit_signal("error")
+
+func send(data: PackedByteArray) -> bool:
+ if _stream.get_status() != _stream.STATUS_CONNECTED:
+ print("Error: Stream is not currently connected.")
+ return false
+ var error: int = _stream.put_data(data)
+ if error != OK:
+ print("Error writing to stream: ", error)
+ return false
+ return true
+
+
+func _on_data(data : Array):
+ var bytes = PackedByteArray(data)
+ var as_cookie = bytes.get_string_from_ascii()
+
+ # Cookie Hack!
+ if as_cookie.begins_with(VRPN.magic_cookie_start): #
+ # kaboom we just send back the same cookie :)
+ self.send(bytes)
+ else:
+ VRPN.marshall_block(bytes,self)
+
+
+func _on_connected(s : StreamPeerTCP):
+ print("Connected to",s.get_connected_host()) # Replace with function body.
+
+func _on_disconnected():
+ print("Disconnected") # Replace with function body.
+
+func _on_error():
+ print("Error") # Replace with function body.
+
+
+static func marshall_block(data : PackedByteArray,session : VRPN) -> void:
+
+ # need to fix that
+ var block_offset : int = 0
+
+ while data.size() > block_offset:
+ # reader for stream
+ var header := StreamPeerBuffer.new()
+ # get block addresses
+ header.data_array = data.slice(block_offset,block_offset+header_size)
+ # make sure we read as big endian
+ header.big_endian = true
+
+ # read header
+ var length := header.get_32() as int # length of message
+ var time_sec := header.get_32() as int # datetime sec
+ var time_msec := header.get_32() as int # datetime micro sec
+ var sender_id := header.get_32() as int # sender id
+ var message_type := header.get_32() as int # type of message (payload)
+ var sequence_num := header.get_32() as int # inofficial sequence number (padding)
+
+ # for debugging
+ #print("length '%d'" % length)
+ #print("time_sec '%d'" % time_sec)
+ #print("time_msec '%d'" % time_msec)
+ #print("sender_id '%d'" % sender_id)
+ #print("message_type '%d'" % message_type)
+ #print("sequence_num '%d'" % sequence_num)
+
+ marshall_body(data.slice(block_offset+header_size,block_offset+length),message_type,sender_id,session)
+
+ # next datablock
+ block_offset += aligned_size(length)
+
+static func decode_string(stream : StreamPeerBuffer) -> String:
+ var len = stream.get_32()
+ return stream.get_string(len)
+
+
+static func marshall_body(data : PackedByteArray,message_type : int, sender_id: int, session : VRPN):
+ var body := StreamPeerBuffer.new()
+ body.data_array = data
+ body.big_endian = true
+
+ # only take message_type directly for negative (-1,-2)
+ # messages that provide dynamic descriptors
+ if message_type < 0:
+ # message and sender descriptions
+ match message_type:
+ -1: # sensor names
+ var name = decode_string(body)
+ print("sensor name is '%s' with '%d" % [name,sender_id])
+ session.sensors[sender_id] = name
+ -2: # message names
+ var name = decode_string(body)
+ print("message name is '%s' for message_type '%d'" % [name,sender_id])
+ session.messages[sender_id] = name
+ return
+
+ # now we use the string identifiers
+ # because they are supposedly dynamically assigned
+ match session.messages[message_type]:
+ 'vrpn_Tracker Pos_Quat': # quat pos
+ # get id
+ var sensor_id = body.get_32()
+ var padding = body.get_32() # padding
+ # position
+ var pos = Vector3(body.get_double(),body.get_double(),body.get_double())
+ # 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_pos_quat({
+ "tracker" : session.sensors[sender_id],
+ "sensor" : sensor_id,
+ "position" : pos,
+ "rotation" : quat
+ })
+ 'vrpn_Tracker Velocity':
+ pass
+ _:
+ pass
+ #print("unhandled message type {0}".format([message_type]))
+
+
+static func aligned_size(actual_size : int, alignment : int = 8) -> int:
+ return (actual_size + alignment - 1) & ~(alignment - 1)
diff --git a/addons/vrpn/scripts/VRPN.gd.uid b/addons/vrpn/scripts/VRPN.gd.uid
new file mode 100644
index 0000000..06400fa
--- /dev/null
+++ b/addons/vrpn/scripts/VRPN.gd.uid
@@ -0,0 +1 @@
+uid://dmq3i7qmo1qe0
diff --git a/addons/vrpn/scripts/VRPN_Receiver.gd b/addons/vrpn/scripts/VRPN_Receiver.gd
new file mode 100644
index 0000000..5e6dc23
--- /dev/null
+++ b/addons/vrpn/scripts/VRPN_Receiver.gd
@@ -0,0 +1,17 @@
+extends Node3D
+
+class_name VRPN_Receiver
+
+@export var tracker_name : String = "Tracker0"
+@export var tracker_sensor : int = 0
+@export var tracker_use_position : bool = true
+@export var tracker_use_rotation : bool = true
+
+func _on_pos_quat(tracker_data : Dictionary):
+
+ if tracker_data['tracker'] == tracker_name and tracker_data['sensor'] == tracker_sensor:
+ if tracker_use_position:
+ self.global_position = tracker_data['position']
+ if tracker_use_rotation:
+ var rotation := tracker_data['rotation'] as Quaternion
+ self.global_basis = Basis(rotation)
diff --git a/addons/vrpn/scripts/VRPN_Receiver.gd.uid b/addons/vrpn/scripts/VRPN_Receiver.gd.uid
new file mode 100644
index 0000000..fcbe47b
--- /dev/null
+++ b/addons/vrpn/scripts/VRPN_Receiver.gd.uid
@@ -0,0 +1 @@
+uid://dpj1wrvfsiq4v
diff --git a/addons/vrpn/tests/vrpn.test.cfg b/addons/vrpn/tests/vrpn.test.cfg
new file mode 100644
index 0000000..92639fb
--- /dev/null
+++ b/addons/vrpn/tests/vrpn.test.cfg
@@ -0,0 +1,3480 @@
+# vrpn.cfg SAMPLE for VRPN version 07.35
+
+################################################################################
+################################################################################
+# This file provides comments and examples for the vrpn.cfg file that is read
+# by the vrpn_server application when it starts up. This is a generic server
+# application that can start up many but maybe not all servers.
+#
+# This has sample lines for a vrpn.cfg file. If you get a new device working,
+# add a line for it here. DO NOT remove lines from this file (unless
+# devices are declared obsolete) - just change the actual vrpn.cfg to match
+# your application.
+#
+# All examples in the file are preceded by comment characters (#). To actually
+# use one of these examples, remove that character from the beginning of all the
+# examples that you want to use, and edit those lines to suit your environment.
+################################################################################
+
+################################################################################
+# NULL Tracker. This is a "device" that reports the Identity transformation for
+# each of its sensors at the specified rate. It can be used to verify
+# connections are working and for other tests of VRPN.
+# There are three arguments:
+# char name_of_this_device[]
+# int number_of_sensors
+# float rate_at_which_to_report_updates
+
+# vrpn_Tracker_NULL Tracker0 2 2.0
+
+################################################################################
+# Spin Tracker. This is a "device" that reports a spinning rotation at the
+# origin for each of its sensors at the specified rate. It can be used to
+# provide smooth motion to debug rendering systems.
+# There are seven arguments:
+# char name_of_this_device[]
+# int number_of_sensors
+# float rate_at_which_to_report_updates
+# float x_of_axis_to_spin_around
+# float y_of_axis_to_spin_around
+# float z_of_axis_to_spin_around
+# float rotation_rate_around_axis_in_Hz
+
+vrpn_Tracker_Spin Tracker0 1 200.0 1.0 0.0 0.0 0.1
+vrpn_Tracker_Spin Tracker1 1 200.0 0.0 1.0 0.0 0.2
+vrpn_Tracker_Spin Tracker2 1 200.0 0.0 0.0 1.0 0.3
+
+################################################################################
+# WintrackerIII from VR SPace
+# Emiliano Pastorelli - Institute of Cybernetics, Tallinn (Estonia)
+#
+# Several other commands are available to control the device, a future version of the server will implement them too
+#
+# char name_of_the_device[]
+# activate sensor0 activate (1=activated, 0=deactivated)
+# activate sensor1 activate (1=activated, 0=deactivated)
+# activate sensor2 (1=activated, 0=deactivated)
+# activate range extender (1=activated, 0=deactivated)
+# hemisphere of operation (X = front hemisphere with X>0; Z = upper hemisphere with Z<0 )
+#
+
+#vrpn_Tracker_Wintracker Wintracker0 1 0 0 0 X
+
+################################################################################
+# Example Button server. This is a "device" that reports on and off for
+# each of its buttons at the specified rate. It can be used to verify connections
+# are working and for other tests of VRPN. There are three arguments:
+# char name_of_this_device[]
+# int number_of_buttons
+# float rate_at_which_the_buttons_toggle (transitions/second)
+
+#vrpn_Button_Example Button0 2 2.0
+
+################################################################################
+# Example Dial server. This is a "device" that reports constant rotations for
+# each of its dials at the specified rate. It can be used to verify connections
+# are working and for other tests of VRPN. There are four arguments:
+# char name_of_this_device[]
+# int number_of_dials
+# float rate_at_which_the_dials_spin (revolutions/second)
+# float rate_at_which_to_report_updates (updates/second)
+
+#vrpn_Dial_Example Dial0 2 2.0 10.0
+
+################################################################################
+# Flock-of-birds Tracker. Runs an Ascension Flock of Birds tracker that is
+# attached to a serial port on this machine. Note that there is another driver
+# (listed below) that runs the Flock when each sensor is connected to its own
+# serial line. Arguments:
+# char name_of_this_device[]
+# int number_of_sensors
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+# int invert_quaternion (0 = no, 1 = yes)
+# char useERT (OPTIONAL; defaults to yes)
+# char[2] active_hemisphere (OPTIONAL; defaults to +z)
+#
+# NOTE: for useERT: use nothing, y or Y if you have an extended range
+# transmitter, use N or n if not (added by David Nahon for Virtools
+# VRPack/SAS Cube.
+# NOTE: The "invert_quaternion" parameter was added because there was a
+# conflict between the code that had been around since VRPN started and
+# the Flock documentation -- it looks like most people had been using the
+# Flock in the "wrong" hemisphere, which inverted the orientation relative
+# to the position. The old behavior is obtained by specifying "1". Not
+# inverting it is specified using "0".
+# NOTE: active hemisphere is one of "+x", "-x", "+y", "-y", "+z", "-z"
+# If "active_hemisphere" is not specified, it defaults to +z.
+
+
+#vrpn_Tracker_Flock Tracker0 4 /dev/ttyS0 115200 1
+
+# If you have to FOB, with no Extended Range ctrler/transmitter, on Windows,
+# with -x as the active hemisphere, use
+
+#vrpn_Tracker_Flock Tracker0 2 COM1 38400 1 N -x
+
+# Watch: be sure that the serial baud rate dip switches (the 3 on the left)
+# of your master flock are properly set.
+# You should try baud rates like 38400 before trying to go higher
+# In normal address mode - less than 14 fob units - your switch should be:
+# 0 1 2 3 4 5 6 7
+# 0 0 1 X X X X 0 2400
+# 0 1 0 X X X X 0 4800
+# 0 1 1 X X X X 0 9600
+# 1 0 0 X X X X 0 19200
+# 1 0 1 X X X X 0 38400
+# 1 1 0 X X X X 0 57600
+# 1 1 1 X X X X 0 115200
+#
+# X X X X are used for coding the FOB address, they must be set correctly,
+# even if you are only using 1 unit (standalone mode)
+# the settings should be (in normal address mode):
+# 3 4 5 6
+# 0 0 0 1 for the first unit
+# 0 0 1 0 for the second unit
+# 0 0 1 1 for the third
+# 0 1 0 0 for the fourth
+# 0 1 0 1 for the fifth
+# ...
+#
+############################################################################
+# WATCH WATCH WATCH WATCH WATCH WATCH WATCH WATCH WATCH WATCH WATCH WATCH
+###################
+#
+# On windows at least, it might be necessary to cut your serial cable so as
+# to only have Transmit, Receive and Ground pins. Even if CBIRDS or WINBIRDS
+# are fine with a cable, it doesn't mean that this cable will please vrpn.
+# This limitation should have been fixed with version 06.05.
+#
+###################
+
+################################################################################
+# Flock-of-birds in parallel Tracker. Runs an Ascension Flock of Birds tracker
+# that has its source and each sensor plugged into its own serial port on this
+# machine (perhaps through a Cyclades multi-port serial card). This mode of
+# operation increases the throughput and decreases the latency of tracker reports.
+# The arguments match those of the Flock-of-birds tracker from above, with the
+# addition of the name of the serial ports for each of the sensors added at the
+# end. Arguments (all on the same line):
+# char name_of_this_device[]
+# int number_of_sensors
+# char name_of_serial_device_for_controller[]
+# int baud_rate_of_serial_device
+# int invert_quaternion (0 = no, 1 = yes)
+# [one for each sensor] char name_of_serial_device_for_sensor[]
+#
+# NOTE: The "invert_quaternion" parameter was added because there was a
+# conflict between the code that had been around since VRPN started and
+# the Flock documentation -- it looks like most people had been using the
+# Flock in the "wrong" hemisphere, which inverted the orientation relative
+# to the position. The old behavior is obtained by specifying "1". Not
+# inverting it is specified using "0".
+
+#vrpn_Tracker_Flock_Parallel Tracker0 4 /dev/ttyC4 115200 1 /dev/ttyC0 /dev/ttyC1 /dev/ttyC2 /dev/ttyC3
+#vrpn_Tracker_Flock_Parallel Tracker0 2 COM1 115200 1 COM2 COM3
+
+################################################################################
+# Fastrak Tracker. Runs a Polhemus Fastrak tracker that is attached to a serial
+# port on this machine. This driver will also run an InterSense IS600 or IS900
+# tracker, but you will want to include extra initialization code (as described
+# below) to set up the ultrasonic pip information, wand devices, stylus devices
+# and so forth. Arguments that go on the first line:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+#
+# It is possible to add additional commands that will be sent to the tracker
+# by putting the backslash character (\) at the end of the config line. This
+# will cause the following line to be read in and sent to the Fastrak during
+# the reset routine. You can add additional lines by putting a slash at the
+# end of each command line but the last. Each line will be sent to the Fastrak
+# with a newline at the end of it. If a line starts with an asterisk (*), then
+# it is treated as a line telling how long to sleep, with the integer number of
+# seconds following the *.
+#
+# If one or more sensors on the Fastrak have a stylus button on them, use
+# the "FTStylus" command after the reset command lines (if any). There should
+# be a front-slash "/" character at the end of the line before the FTStylus
+# command. The command takes two arguments: the name of the button device
+# that will report the buttons and the sensor number to which the button is
+# attached (the first sensor is sensor 0).
+#
+# Commands to add Joysticks (2 buttons) or Wands (5 buttons and 2 analogs) to
+# the various sensors on the Isense900 are done by adding Stylus and
+# Wand command lines after the reset command lines. Each of these lines
+# takes two arguments: the name of the button (for Stylus) or button and
+# analog (for Wand) servers, and the sensor number (starting from 0). The
+# Wand line takes eight additional parameters, which specify the scaling
+# and clipping behavior of the two directions on the analog joystick. Each
+# set of for is the min, lowzero, hizero, and max values: these are mapped
+# to -1, 0,0, and 1 (all values between lowzero and hizero are mapped to 0).
+# Start with these at -1,0,0,1 and use the 'printcereal' program or some other
+# method to read them and see what the range of acheivable values is. Then,
+# set them to slightly conservative values so that the whole range is covered
+# and the analogs will report zero when the joystick is centered. The
+# presence of these lines is indicated by placing them after any additional
+# reset command lines, by ending the line preceding them with the front slash
+# "/" character.
+#
+# Remember that the "remote" button object is not the same as the the tracking
+# device, so be sure to use a remote button object that connects to the button
+# rather than the tracker. The button device name is defined on the stylus or
+# wand line in the config file, and should not be the same as the tracker. In
+# the case described by the example configuration below, if the name of the
+# machine running the server is "myis900server" you would connect to the tracker
+# as "Isense900@myis900server" and to the buttons on the stylus as
+# "Stylus0@myis900server":
+#
+# Note that this frontslash and backslash-notation can only be used for the
+# Fastrak/Isense tracker, not to extend the line for any other type of device
+# listed in this configuration file.
+
+# Vanilla Fastrak on on a Unix box
+#vrpn_Tracker_Fastrak Fastrak0 /dev/ttyS0 19200
+
+# Fastrak with a stylus on sensor zero on a Windows box
+#vrpn_Tracker_Fastrak Tracker0 COM1 115200 /
+#FTStylus Stylus0 0
+
+# IS600 and its pip settings
+#vrpn_Tracker_Fastrak Isense600 /dev/ttyS0 19200 \
+#MCc\
+#*5\
+#MCM1,1,0.0900,0.0000,-0.2210,0.00,0.00,-1.00,89\
+#MCM1,2,-0.0566,0.0000,-0.2210,0.00,0.00,-1.00,87\
+#MCM2,1,0.0900,0.0000,-0.2210,0.00,0.00,-1.00,66\
+#MCM2,2,-0.0566,0.0000,-0.2210,0.00,0.00,-1.00,71\
+#MCM3,1,0.1237,-0.0762,-0.0424,0.00,0.00,-1.00,82\
+#MCM3,2,0.1237,0.0762,-0.0424,0.00,0.00,-1.00,77\
+#MCe\
+#*10
+
+# IS900 with a wand on the first sensor and a stylus on the third:
+#vrpn_Tracker_Fastrak Isense900 COM1 115200 /
+#Wand Wand0 0 -1.0 0.0 0.0 1.0 -1.0 0.0 0.0 1.0 /
+#Stylus Stylus0 2
+
+################################################################################
+# Isotrak Tracker. Runs a Polhemus Isotrak tracker that is attached to a serial
+# port on this machine. Arguments that go on the first line:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+#
+# It is possible to add additional commands that will be sent to the tracker
+# by putting the backslash character (\) at the end of the config line. This
+# will cause the following line to be read in and sent to the Isotrak during
+# the reset routine. You can add additional lines by putting a slash at the
+# end of each command line but the last. Each line will be sent to the Isotrak
+# with a newline at the end of it. If a line starts with an asterisk (*), then
+# it is treated as a line telling how long to sleep, with the integer number of
+# seconds following the *.
+
+#vrpn_Tracker_Isotrak TrackerIsotrak /dev/ttyS0 115200 \
+#H1,0,1,0
+
+################################################################################
+# Liberty Tracker. Runs a Polhemus Liberty tracker that is attached to a serial
+# port (perhaps a USB-to-RS232 adapter) on this machine. Arguments that go on
+# the first line.
+# char name_of_this_device[]
+# char name_of_serial_or_usb_device[]
+# int baud_rate_of_serial_device (not used when the device is USB)
+# int number_of_chars_in_whoami_response (optional)
+#
+# It is possible to add additional commands that will be sent to the tracker
+# by putting the backslash character (\) at the end of the config line. This
+# will cause the following line to be read in and sent to the Liberty during
+# the reset routine. You can add additional lines by putting a slash at the
+# end of each command line but the last. Each line will be sent to the Fastrak
+# with a newline at the end of it. If a line starts with an asterisk (*), then
+# it is treated as a line telling how long to sleep, with the integer number of
+# seconds following the *.
+#
+# If one or more sensors on the Liberty have a stylus button on them, use
+# the "Stylus" command after the reset command lines (if any). There should
+# be a front-slash "/" character at the end of the line before the Stylus
+# command. The command takes two arguments: the name of the button device
+# that will report the buttons and the sensor number to which the button is
+# attached (the first sensor is sensor 0).
+#
+
+# -------------------------------------------
+# Example when Liberty is attached via USB
+# The BAUD Rate is needed, although it is not used
+
+#vrpn_Tracker_Liberty Liberty /dev/usb/ttyUSB0 115200
+
+#--------------------------------------------
+# Example when Liberty is attached via Serial
+
+#vrpn_Tracker_Liberty Liberty /dev/ttyS0 115200
+
+#--------------------------------------------
+# Example when Liberty is attached via Serial with a non-standard whoami length
+
+#vrpn_Tracker_Liberty Liberty /dev/ttyS0 115200 247
+
+#--------------------------------------------
+# Liberty attached via Serial with styluses on sensors zero and three
+#vrpn_Tracker_Liberty Tracker0 /dev/ttyS0 115200 /
+#Stylus Stylus0 0 /
+#Stylus Stylus1 3
+
+################################################################################
+# High Speed Liberty Latus Tracker. Runs a Polhemus Liberty Latus tracker that
+# is attached to a USB port on this machine. Arguments that go on the first line
+# char name_of_this_device[]
+# int number_of_markers_to_detect
+# int baud_rate_of_usb_device
+# int number_of_chars_in_whoami_response (optional)
+#
+# It is possible to add additional commands that will be sent to the tracker
+# by putting the backslash character (\) at the end of the config line. This
+# will cause the following line to be read in and sent to the Liberty during
+# the reset routine. You can add additional lines by putting a slash at the
+# end of each command line but the last. Each line will be sent to the Fastrak
+# with a newline at the end of it. If a line starts with an asterisk (*), then
+# it is treated as a line telling how long to sleep, with the integer number of
+# seconds following the *.
+
+# -------------------------------------------
+# Example when Liberty Latus is attached via USB
+# The BAUD Rate is needed, although it is not used
+
+#vrpn_Tracker_LibertyHS LibertyHS 3 115200
+
+################################################################################
+# InterSense tracker using the Intersense-provided library to communicate
+# with the tracker. This device type is not compiled by default, since it uses
+# a proprietary library. However, you can get it to compile by defining
+# VRPN_INCLUDE_INTERSENSE when compiling. Note that the Fastrak driver will
+# run IS-600 and IS-900 trackers without the proprietary library, so you might
+# try that as well.
+#
+# You can include extra initialization code (as described
+# below) to set up the ultrasonic pip information, wand devices, stylus devices
+# and so forth. Arguments that go on the first line:
+# char name_of_this_device[]
+# char name_of_serial_device[] - this can be COM1-4 or AUTO
+# AUTO will automatically find USB and
+# serial trackers. Use COM1-4 only if you
+# have more than one serial tracker.
+# You should use COM1-4 on unix as well,
+# as these just tell the isense library
+# to look in serial port 1-4.
+# I guess you can't have >1 USB trackers.
+# char "IS900time" - use the IS900 timestamps (optional)
+# char "ResetAtStartup" - resets all boresight and heading, on intertrax,
+# equivalent to push the reset button
+#
+# It is possible to add additional commands that will be sent to the tracker
+# by putting the backslash character (\) at the end of the config line. This
+# will cause the following line to be read in and sent to the InterSense during
+# the reset routine. You can add additional lines by putting a slash at the
+# end of each command line but the last. Each line will be sent to the InterSense
+# with a newline at the end of it. If a line starts with an asterisk (*), then
+# it is treated as a line telling how long to sleep, with the integer number of
+# seconds following the *.
+#
+# Commands to add Joysticks (2 buttons) or Wands (5 buttons and 2 analogs) to
+# the various sensors on the Isense900 are done by adding Stylus and
+# Wand command lines after the reset command lines. Each of these lines
+# takes two arguments: the name of the button (for Stylus) or button and
+# analog (for Wand) servers, and the sensor number (starting from 0). The
+# Wand line takes eight additional parameters, which specify the scaling
+# and clipping behavior of the two directions on the analog joystick. Each
+# set of for is the min, lowzero, hizero, and max values: these are mapped
+# to -1, 0,0, and 1 (all values between lowzero and hizero are mapped to 0).
+# Start with these at -1,0,0,1 and use the 'printcereal' program or some other
+# method to read them and see what the range of acheivable values is. Then,
+# set them to slightly conservative values so that the whole range is covered
+# and the analogs will report zero when the joystick is centered. The
+# presence of these lines is indicated by placing them after any additional
+# reset command lines, by ending the line preceding them with the front slash
+# "/" character.
+#
+# Remember that the "remote" button object is not the same as the the tracking
+# device, so be sure to use a remote button object that connects to the button
+# rather than the tracker. The button device name is defined on the stylus or
+# wand line in the config file, and should not be the same as the tracker. In
+# the case described by the example configuration below, if the name of the
+# machine running the server is "myis900server" you would connect to the tracker
+# as "Isense900@myis900server" and to the buttons on the stylus as
+# "Stylus0@myis900server":
+#
+# Note that this frontslash and backslash-notation can only be used for the
+# Fastrak and InterSense tracker, not to extend the line for any other
+# type of device
+# listed in this configuration file.
+#
+# Note that this driver expects the device to be set to output centimeters, and will convert
+# the positions to meters. It is recommanded to permanently set the units in the eeprom of your device.
+# If this is not possible, you should add in this file the "u" reset command so as to have vrpn
+# tell your device to use centimeters
+#
+#Vanilla InterSense
+#vrpn_Tracker_InterSense Tracker0 AUTO IS900time
+
+# Vanilla InterSense using IS900 timing, with wand in port B (and possibly head tracker in port A)
+#vrpn_Tracker_InterSense Tracker0 AUTO IS900time /
+#Wand Wand0 1 -1.0 0.0 0.0 1.0 -1.0 0.0 0.0 1.0
+
+# IS600 and its pip settings
+#vrpn_Tracker_InterSense Isense600 COM1 \
+#MCc\
+#*5\
+#MCM1,1,0.0900,0.0000,-0.2210,0.00,0.00,-1.00,89\
+#MCM1,2,-0.0566,0.0000,-0.2210,0.00,0.00,-1.00,87\
+#MCM2,1,0.0900,0.0000,-0.2210,0.00,0.00,-1.00,66\
+#MCM2,2,-0.0566,0.0000,-0.2210,0.00,0.00,-1.00,71\
+#MCM3,1,0.1237,-0.0762,-0.0424,0.00,0.00,-1.00,82\
+#MCM3,2,0.1237,0.0762,-0.0424,0.00,0.00,-1.00,77\
+#MCe\
+#*10
+
+# IS900 with a wand on the first sensor and a stylus on the third:
+#vrpn_Tracker_InterSense Isense900 COM1 /
+#Wand Wand0 0 -1.0 0.0 0.0 1.0 -1.0 0.0 0.0 1.0 /
+#Stylus Stylus0 2
+
+# Intertrax2 on USB, With automatic reset at startup
+#vrpn_Tracker_InterSense Tracker0 AUTO ResetAtStartup
+
+################################################################################
+# Dynasight Tracker. Runs an Origin System's DynaSight tracker connected to a
+# serial port on this machine. arguments:
+# char name_of_this_device[]
+# int number_of_sensors
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+
+#vrpn_Tracker_Dyna Tracker0 1 /dev/ttyS0 19200
+
+#vrpn_Tracker_Dyna Tracker0 1 COM1 19200
+
+################################################################################
+# Crossbow Tracker. Runs a Crossbow Technology RGA300-series tracker that is
+# attached to a serial port on this machine. There are four arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device (should be 38400)
+# float linear_acceleration_sensitivity (Gs; default is 2.0)
+# float angular_rate_sensitivity (degrees per second; default is 100)
+
+#vrpn_Tracker_Crossbow Tracker0 COM1: 38400 2.0 100
+
+###############################################################################
+# 3d Microscribe is a mechanical tracker the nesseccary params are
+# name port baudrate
+# additional params are offsetx offsety offsetz scale
+# offsets are in meters. Scale is an abomination in VRPN; all
+# trackers report in meters.
+#
+
+#vrpn_3DMicroscribe Microscribe COM1 19200 0.3 -0.1 -0.2 1
+
+################################################################################
+# Serial 5DT glove with 16 sensors. This driver reports the 16 channels as analog
+# devices. If you want to treat them as buttons, then also add the entry
+# for the vrpn_Button_5DT_Server below, connecting it to the output of this
+# server.
+#
+# This server does not work with the previous version of the glove.
+# For other variations of 5DT datagloves, see vrpn_5dt and vrpn_Analog_5dtUSB
+#
+# arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+
+#vrpn_5dt16 glove_5dt16 COM1 19200
+
+################################################################################
+#
+# Use the 5dtglove16 as button device. Use in conjunction with the vrpn_5dt16
+# device above to turn the analog reports into button press/release when the
+# sensors cross the threshold.
+#
+# arguments:
+# char name_of_this_device[]
+# char name_of_the_glove device[]
+# double threshold_toggle_point_between_pressed_and_unpressed[16]
+
+#vrpn_Button_5DT_Server glove_5dt_button glove_5dt16 1794 2171 2110 2610 1707 2673 2459 1493 3029 2301 1936 3007 2302 1635 0 0
+
+################################################################################
+# AnalogFly Tracker. This is a tracker that is intended to be used on top of
+# a joystick or motion tracker of some kind to turn it into a moving or flying
+# device. It could be used on top of any analog device, in fact.
+# This device basically takes in analog signals and puts out transformation
+# matrices. It should supercede the JoyFly tracker, since it is more general.
+# There are two kinds of JoyFly's: absolute ones and differential ones. For
+# absolute ones, the analog value is mapped directly to position or orientation
+# on each axis. For differential ones, the values are used to create a
+# "change" matrix that is applied once per interval, accumulating changes as
+# it goes; this enables the user to "fly" along by holding a joystick forward,
+# for example.
+# One analog channel is associated with each axis (X, Y, Z) and rotation about
+# each axis (RX, RY, RZ). For each axis, the value is converted to a position
+# (meters) or speed (meters/second) for absolute trackers; or into an
+# orientation (revolutions) or angular velocity (revolutions/second) by first
+# subtracting an offset, then thresholding it to see if it is far enough from
+# zero, then (if it is) scaling it and taking it to a power (to allow nonlinear
+# speedup as the stick is pushed far from center).
+# A button can be associated with a reset function, which will take the
+# device back to center (identity transformation). The device will also recenter
+# when the first connection is made to the server it is running on. (Centering
+# has no effect on absolute AnalogFlys).
+# A button can be associated with a clutch function, which will mean that
+# the device will not move unless the clutch is pressed, so you can use it
+# like a mouse and continue to move by pulling to the right with the button
+# down and then to the left with the button up. For differential analogflys,
+# clutching makes the tracker not move unless the button is pressed. For
+# absolute ones, it only moves when the button is pressed and the mouse is
+# moving; it offsets to enable long-range motions in a finite tracking area,
+# as with a mouse.
+# Any axis or the reset button can be disabled by setting the name of its
+# associated device to the string "NULL".
+# Note that you could have multiple of these devices running simultaneously,
+# each with a different name and interaction metaphor. The user could then
+# connect to their favorite one. Arguments:
+# char name_of_this_device[]
+# float update_rate_to_send_tracker_reports
+# char type[] = "absolute" or "differential"
+# [six lines follow, one for X Y Z RX RY RZ, each with:
+# char axis_name[] (X Y Z RX RY RZ in that order)
+# char name_of_analog_device[] (start with * for local)
+# int channel_of_analog_device
+# float offset
+# float threshold
+# float scale
+# float power
+# ]
+# [New line to describe reset button, with:
+# char "RESET"
+# char name_of_button_device[] (start with * for local)
+# int which_button_to_use
+# ]
+# [New line to describe clutch button, with:
+# char "CLUTCH"
+# char name_of_button_device[] (start with * for local)
+# int which_button_to_use
+# ]
+# [New line to indicate use of world frame for translation and rotation,
+# instead of local frame. Useful for a simulated wand when doing desktop
+# testing of immersive apps - easier to keep under control.
+# char "WORLDFRAME"
+# ]
+
+#vrpn_Tracker_AnalogFly Tracker0 60.0 absolute
+#X *Mouse0 0 0.5 0.0 2.0 1.0
+#Y *Mouse0 1 0.5 0.0 2.0 1.0
+#Z NULL 2 0.0 0.0 1.0 1.0
+#RX NULL 3 0.0 0.0 1.0 1.0
+#RY NULL 4 0.0 0.0 1.0 1.0
+#RZ NULL 5 0.0 0.0 1.0 1.0
+#RESET NULL 0
+#CLUTCH *Mouse0 0
+
+#vrpn_Tracker_AnalogFly Tracker0 60.0 absolute
+#X *CerealBox0 4 0.0 0.021 1.0 1.0
+#Y *CerealBox0 5 0.0 0.021 1.0 1.0
+#Z *CerealBox0 6 0.0 0.021 3.0 1.0
+#RX *CerealBox0 0 0.0 0.021 1.0 1.0
+#RY *CerealBox0 1 0.0 0.021 1.0 1.0
+#RZ *CerealBox0 2 0.0 0.021 3.0 1.0
+#RESET *CerealBox 3
+#CLUTCH NULL 0
+
+#vrpn_Tracker_AnalogFly Tracker0 60.0 differential
+#X *Magellan0 0 0.0 0.0 2.0 1.0
+#Y *Magellan0 1 0.0 0.0 2.0 1.0
+#Z *Magellan0 2 0.0 0.0 2.0 1.0
+#RX *Magellan0 3 0.0 0.0 2.0 1.0
+#RY *Magellan0 4 0.0 0.0 2.0 1.0
+#RZ *Magellan0 5 0.0 0.0 2.0 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+# For a good simulated wand for testing VR Juggler applications with a SpaceMouse:
+#vrpn_Tracker_AnalogFly Tracker0 60.0 differential
+#X *Magellan0 0 0.0 0.0 20.0 1
+#Y *Magellan0 1 0.0 0.0 20.0 1
+#Z *Magellan0 2 0.0 0.0 20.0 1
+#RX *Magellan0 3 0.0 0.01 -5 1.0
+#RY *Magellan0 4 0.0 0.01 -5 1.0
+#RZ *Magellan0 5 0.0 0.01 -5 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+#WORLDFRAME
+
+#vrpn_Tracker_AnalogFly Tracker0 60.0 absolute
+#X NULL 0 0.0 0.0 1.0 1.0
+#Y NULL 0 0.0 0.0 1.0 1.0
+#Z NULL 0 0.0 0.0 1.0 1.0
+#RX *Radamec0 1 0.0 0.0 -0.0027777777 1.0
+#RY NULL 0 0.0 0.0 1.0 1.0
+#RZ *Radamec0 0 0.0 0.0 0.0027777777 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+#vrpn_Tracker_AnalogFly Tracker0 60.0 absolute
+#X *Joystick0 0 0.0 0.0 1.0 1.0
+#Y *Joystick0 1 0.0 0.0 -1.0 1.0
+#Z *Joystick0 6 0.0 0.0 1.0 1.0
+#RX NULL 3 0.0 0.0 1.0 1.0
+#RY NULL 4 0.0 0.0 1.0 1.0
+#RZ *Joystick0 5 0.0 0.0 0.5 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+# Using a joystick to emulate a Phantom for the
+# nanoManipulator, the throttle maps to Z.
+#vrpn_Tracker_AnalogFly Phantom 60.0 absolute
+#X *Phantom 0 0.0 0.0 0.125 1.0
+#Y *Phantom 1 0.0 0.0 -0.125 1.0
+#Z *Phantom 6 0.0 0.0 0.25 1.0
+#RX NULL 3 0.0 0.0 1.0 1.0
+#RY NULL 4 0.0 0.0 1.0 1.0
+#RZ *Phantom 5 0.0 0.0 0.06 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+# For DTU/MIC optical nanoHand stage motion, moving over full 300 micron range
+# of motion, using the Logitech joystick for the analog
+# server and the tracker_to_poser program.
+#vrpn_Tracker_AnalogFly Tracker0 60.0 absolute
+#X *Joystick0 0 -0.03 0.0 2.53 1.0
+#Y *Joystick0 1 -0.04 0.0 2.53 1.0
+#Z *Joystick0 6 -0.10 0.0 -1.75 1.0
+#RX NULL 3 0.0 0.0 1.0 1.0
+#RY NULL 4 0.0 0.0 1.0 1.0
+#RZ *Joystick0 5 0.0 0.0 0.5 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+# To drive a Tektronix 4662 full range (Z, RZ ignored)
+#vrpn_Tracker_AnalogFly Tracker0 60.0 absolute
+#X *Joystick0 0 -1.0 0.0 0.19 1.0
+#Y *Joystick0 1 1.0 0.0 -0.13 1.0
+#Z *Joystick0 6 0.0 0.0 1.0 1.0
+#RX NULL 3 0.0 0.0 1.0 1.0
+#RY NULL 4 0.0 0.0 1.0 1.0
+#RZ *Joystick0 5 0.0 0.0 0.5 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+# For UNC Mad City Labs stage motion, moving over full 100 micron range
+# of motion, using the Microsoft FF joystick for the analog
+# server and the tracker_to_poser program.
+#vrpn_Tracker_AnalogFly Tracker0 60.0 absolute
+#X *Joystick0 0 -1 0.0 50 1.0
+#Y *Joystick0 1 -1 0.0 50 1.0
+#Z *Joystick0 6 -1 0.0 50 1.0
+#RX NULL 3 0.0 0.0 1.0 1.0
+#RY NULL 4 0.0 0.0 1.0 1.0
+#RZ *Joystick0 5 0.0 0.0 0.5 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+# For Artemis or Hercules (mad-city-labs) stages
+# Maps 0-10 from the voltage into the range 0-100 microns.
+#vrpn_Tracker_AnalogFly StageTracker 60.0 absolute
+#X *MCLXYZIN 4 0 0.0 10 1.0
+#Y *MCLXYZIN 5 0 0.0 10 1.0
+#Z *MCLXYZIN 6 0 0.0 10 1.0
+#RX NULL 3 0.0 0.0 1.0 1.0
+#RY NULL 4 0.0 0.0 1.0 1.0
+#RZ NULL 5 0.0 0.0 1.0 1.0
+#RESET NULL 0
+#CLUTCH NULL 0
+
+# For a 3DConnexion Traveler named device0
+# You should scale the values for translation w.r.t.
+# rotation to suit your preferences.
+#vrpn_Tracker_AnalogFly Tracker0 60.0 differential
+#X *device0 0 0.0 0.0 2.0 1.0
+#Y *device0 1 0.0 0.0 -2.0 1.0
+#Z *device0 2 0.0 0.0 -2.0 1.0
+#RX *device0 3 0.0 0.0 -0.2 1.0
+#RY *device0 4 0.0 0.0 0.2 1.0
+#RZ *device0 5 0.0 0.0 0.2 1.0
+#RESET *device0 0
+#CLUTCH NULL 0
+
+################################################################################
+# XXX This device is superceded by the more-general vrpn_Tracker_AnalogFly.
+# JoyFly Tracker. A vrpn_Tracker that translates the vrpn_Joystick into
+# Walkthrough- convention tracker reports. This is part of a two-part setup
+# that allows you to use a joystick as a flying device. First, a joystick
+# device has to be created (named joybox in our example) that will produce
+# the analog inputs that the JoyFly tracker uses to determine the transformation.
+# Then, the JoyFly device needs to be started and will listen to the device
+# and produce tracker reports. If these are both run on the same server, then
+# the JoyFly needs to use the "server" connection to hear from the Joystick
+# device, which is indicated by placing a '*' in front of the name of the
+# joystick device that it is to use. If the joystick device is remote from
+# this server, then the full name of it should be used (joystick@foo.cs.unc.edu).
+# XXX This device is superceded by the more-general vrpn_Tracker_AnalogFly
+# Arguments:
+# char name_of_this_device[]
+# char source_joystick_name[] (Start with * for one sharing a connection)
+# char joystick_configuration_file_name[]
+
+#vrpn_JoyFly walk-joybox *joybox vrpn_Joyfly.cfg
+
+################################################################################
+# ButtonFly Tracker. This is a tracker that is intended to be used on top of
+# a Global Haptics Orb or other buttond device to turn it into a moving or
+# flying device. It basically takes in button signals and puts out
+# transformation matrices.
+# There are two kinds of Buttons: absolute ones and differential ones. For
+# absolute ones, pressing it causes the position or orientation associated with
+# it to be stored directly into the transformation. This enables the user to
+# "teleport" to given locations by pressing buttons. For differential ones,
+# the position or orientation are treated as deltas and are used to create a
+# "change" matrix that is applied once per interval, accumulating changes as
+# it goes; this enables the user to "fly" along by holding a button down,
+# for example.
+# Each button is associated with either a position (meters) or speed
+# (meters/second) for absolute buttons; or an orientation (revolutions)
+# or angular velocity (revolutions/second).
+# An analog channel can be associated with a scale function that scales the
+# velocity or angular velocity terms uniformly. The entry specifies an
+# offset to be applied to the analog channel, a scale to be applied to it,
+# and a power to which the result should be taken; the end result is used
+# to scale all velocity or angular velocity terms. This channel has no
+# effect on the effects of absolute buttons.
+# The device will recenter (set itself to the identity transform) when the
+# first connection is made to the server it is running on.
+# Note that you could have multiple of these devices running simultaneously,
+# each with a different name and interaction metaphor. The user could then
+# connect to their favorite one. Arguments:
+# char name_of_this_device[]
+# float update_rate_to_send_tracker_reports
+# [one or more lines follow, each of one of two types
+# (1) char [] = "absolute"
+# char name_of_button_device[] (start with * for local)
+# int which_button_on_device
+# float X_to_translate_to
+# float Y_to_translate_to
+# float Z_to_translate_to
+# float rotation_about_X
+# float rotation_about_Y
+# float rotation_about_Z
+# (2) char [] = "differential"
+# char name_of_button_device[] (start with * for local)
+# int which_button_on_device
+# float X_translation_meters_per_second
+# float Y_translation_meters_per_second
+# float Z_translation_meters_per_second
+# float spin_about_X_revolutions_per_second
+# float spin_about_Y_revolutions_per_second
+# float spin_about_Z_revolutions_per_second
+# ]
+# [An optional line describing an analog to scale the velocity
+# char [] = "vel_scale"
+# char name_of_button_device[] (start with * for local)
+# int which_button_on_device
+# float offset
+# float scale
+# float power
+# ]
+# [An optional line describing an analog to scale the rotation
+# char [] = "rot_scale"
+# char name_of_button_device[] (start with * for local)
+# int which_button_on_device
+# float offset
+# float scale
+# float power
+# ]
+# [one more line, consisting of the word "end"]
+# Note that the same button can cause more than one action to take place,
+# and the same analog can cause scaling of both the velocity and rotation.
+
+# This example for a Global Haptics Orb pushes the transformation away
+# from the button that is pressed
+# for all of the standard buttons. It rotates around the Y axis when the
+# rocker switch is rocked up and down. It resets to the origin when one
+# of the pushbuttons is pressed. Both the velocity and angular velocity
+# are controlled by the thumbwheel.
+
+#vrpn_Tracker_ButtonFly Tracker0 60.0
+#differential *Orb0 0 0 1 0 0 0 0
+#differential *Orb0 1 0.707 0.707 0 0 0 0
+#differential *Orb0 2 1 0 0 0 0 0
+#differential *Orb0 3 0.707 -0.707 0 0 0 0
+#differential *Orb0 4 0 -1 0 0 0 0
+#differential *Orb0 5 -0.707 -0.707 0 0 0 0
+#differential *Orb0 6 -1 0 0 0 0 0
+#differential *Orb0 7 -0.707 0.707 0 0 0 0
+#differential *Orb0 8 0 0.707 -0.707 0 0 0
+#differential *Orb0 9 0.577 0.577 -0.577 0 0 0
+#differential *Orb0 10 0.707 0 -0.707 0 0 0
+#differential *Orb0 11 0.577 -0.577 -0.577 0 0 0
+#differential *Orb0 12 0 -0.707 -0.707 0 0 0
+#differential *Orb0 13 -0.577 -0.577 -0.577 0 0 0
+#differential *Orb0 14 -0.707 0 -0.707 0 0 0
+#differential *Orb0 15 -0.577 0.577 -0.577 0 0 0
+#differential *Orb0 16 0 0.707 0.707 0 0 0
+#differential *Orb0 17 0.577 0.577 0.577 0 0 0
+#differential *Orb0 18 0.707 0 0.707 0 0 0
+#differential *Orb0 19 0.577 -0.577 0.577 0 0 0
+#differential *Orb0 20 0 -0.707 0.707 0 0 0
+#differential *Orb0 21 -0.577 -0.577 0.577 0 0 0
+#differential *Orb0 22 -0.707 0 0.707 0 0 0
+#differential *Orb0 23 -0.577 0.577 0.577 0 0 0
+#differential *Orb0 24 0 0 -1 0 0 0
+#differential *Orb0 25 0 0 1 0 0 0
+#differential *Orb0 28 0 0 0 0 -0.1 0
+#differential *Orb0 29 0 0 0 0 0.1 0
+#absolute *Orb0 27 0 0 0 0 0 0
+#vel_scale *Orb0 0 -1.0 0.5 1.0
+#rot_scale *Orb0 0 -1.0 0.5 1.0
+#end
+
+################################################################################
+# 3Space Tracker. Runs a Polhemus 3Space (not Fastrak) tracker that is attached
+# to a serial port on this machine. Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+
+#vrpn_Tracker_3Space Tracker0 /dev/ttyS0 19200
+
+################################################################################
+# Logitech 3DMouse tracker attached to a serial port on this machine.
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+# int filtering_count (this parameter is optional)
+
+#vrpn_Tracker_3DMouse Tracker0 /dev/ttyS0 19200
+
+################################################################################
+# NDI Polaris Spectra or Vectra, attached to a serial or USB port
+# This server works with the NDI Polaris Spectra and Polaris Vectra
+# trackers. It doesn't work with the Optitrak or Aurora. It only
+# handles rigid bodies made from passive sphere markers, and does
+# not yet support active led markers nor single "stray" passive
+# spheres.
+#
+# Each vrpn "sensor" is a single rigid body (or "tool" in NDI
+# terminology), which consists of 3 or more passive spheres in a
+# particular geometric arrangement. In order to define a custom
+# rigid body (one that didn't come from NDI), you must use the NDI
+# Architect software. That software produces .rom files for each
+# rigid body. This vrpn tracker class will load those files during
+# initialization.
+#
+# Before configuring the vrpn server here, you should first run
+# the NDI software to track the rigid bodies using the NDI's
+# interactive GUI. Only after you have configured and tested the
+# tracker and rigid bodies to your satisfaction, should you try
+# this vrpn server.
+#
+# This currently only handles an IR strobe rate of 60Hz, not
+# 20Hz or 30Hz.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int number of sensors (i.e. num of rigid bodies)
+#
+# char rigidBody 0's .rom filename
+# char rigidBody 1's .rom filename
+# char rigidBody 2's ...
+
+# vrpn_Tracker_NDI_Polaris Tracker0 COM1 2
+# hello.rom
+# ../world.rom
+
+################################################################################
+# CerealBox dial/button/analog. Runs a BG Systems CerealBox device that attaches
+# to a serial port on this machine. As of VRPN version 04.07, 19200 is the
+# only supported baud rate. The driver has been tested on an LV824-F-8e device.
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+# int number_of_buttons_to_read (starting from 0)
+# int number_of_analogs_to_read
+# int number_of_encoders_to_read
+
+#vrpn_CerealBox Cereal0 /dev/cua0 19200 8 8 8
+
+################################################################################
+# Magellan button/analog. Runs a Logitech Magellan device that attaches
+# to a serial port on this machine. As of VRPN version 04.12, 9600 is the
+# only supported baud rate.
+#
+# The Magellan is also known in some instances as the Magellan SpaceMouse,
+# not to be confused with the 3DConnexion SpaceMouse (later version of the
+# same product).
+# 3DConnexion Magellan/SpaceMouse Plus XT Serial -
+# works with vrpn_Magellan without "altreset" for some.
+# requires "altreset" to avoid lots of beeping at startup for others.
+#
+# Note that if you want to use the Magellan as a tracking device, you will
+# need to run a vrpn_Tracker_AnalogFly device that listens to its analog
+# outputs and converts them into tracker reports
+#
+# John Stone added support for the SpaceBalls in version 06.03, an example
+# startup is shown below.
+#
+# Julien Brisset discovered how to make this work with a slightly older version
+# of the Magellan. If the example Magellan line doesn't work, add 'altreset' to
+# the line to use the alternative reset string for the device.
+#
+# If your Magellan is connected through a usb-serial cable on Mac OS X, use
+# /dev/tty.usbserial, on Linux you may want to try /dev/ttyUSB0 instead.
+#
+# NOTE: You should NOT run the driver that comes with the Magellan, since the
+# VRPN driver opens the serial port and communicates with the device directly.
+# If the Magellan driver from the manufacturer is running, then VRPN may not
+# be able to open the port.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+# char "altreset" {Optional, for older Magellans}
+
+#vrpn_Magellan Magellan0 COM1 9600
+#vrpn_Magellan Magellan0 /dev/ttyS0 9600 altreset
+#vrpn_Spaceball Spaceball0 /dev/ttyS0 9600
+#vrpn_Magellan Magellan0 /dev/tty.usbserial 9600 altreset
+
+################################################################################
+# NRL Immersion Box dial/button/analog. Runs a Immersion Interface Box device
+# attached to a serial port. As of March 28, 2000 code to read the analog and
+# angle encoders has not been implemented. Also, baud rate on many SGI's is
+# limited to 38400, but I have run the ibox at 115200 on PCs.
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+# int number_of_buttons_to_read (i.e. 4 ==> 0,1,2,3)
+# int number_of_analogs_to_read
+# int number_of_encoders_to_read
+
+#vrpn_ImmersionBox ibox /dev/ttyd2 38400 4 0 0
+#vrpn_ImmersionBox ibox com1 115200 4 0 0
+
+################################################################################
+# Wands button/analog, driver from Brown University. Runs a Wanda device
+# attached to a serial port.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_port_to_use[]
+# int baud_rate_of_serial_device
+# float minimum_update_rate
+
+#vrpn_Wanda Wanda /dev/ttyd2 1200 60.0
+#vrpn_Wanda Wanda COM2 1200 60.0
+
+################################################################################
+# Radamec Serial Position Interface analog. Camera tracker that attaches
+# to a serial port on this machine. Note that for normal operation, 38400 is the
+# only supported baud rate.
+#
+# Note that if you want to use the Radamec SPI as a tracking device, you will
+# need to run a vrpn_Tracker_AnalogFly device (of the absolute variety)
+# that listens to its analog outputs and converts them into tracker reports.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_port[]
+# int baud_rate_of_serial_port
+
+#vrpn_Radamec_SPI Analog0 /dev/ttyS16 38400
+
+################################################################################
+# Zaber linear positioning element analog/out that attaches
+# to a serial port on this machine.
+#
+# Note that if you want to use the Zaber as a tracking device, you will
+# need to run a vrpn_Tracker_AnalogFly device (of the absolute variety)
+# that listens to its analog outputs and converts them into tracker reports.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_port[]
+
+#vrpn_Zaber Analog0 COM1
+
+################################################################################
+# Biosciences Tools temperature control unit, analog/out that attaches
+# to a serial port on this machine.
+#
+# This instrument also has a button device that reports whether the
+# temperature control is turned on.
+#
+# Analog channels: (read by client)
+# 0 Reading from stage 1 in degrees Celcius
+# 1 Reading from bath 1 in degrees Celcius
+# 2 Reading external 1 or Setpoint for control in degrees Celcius
+# 3 Reading from stage 2 in degrees Celcius
+# 4 Reading from bath 2 in degrees Celcius
+# 5 Reading external 2 or Setpoint for control in degrees Celcius
+# Button channels: (read by client)
+# 0 Temperature control is on or off
+# Analog_Output channels: (set by client)
+# 0 Reference temperature for channel 1
+# 1 Reference temperature for channel 2
+# 2 Turn temperature control on/off (0 = off, otherwise on)
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_port[]
+# float Temperature to set for channel 1 in degrees Celcius
+# float Temperature to set for channel 2 in degrees Celcius
+# int Do we turn on temperature control (0 = no, 1 = yes)
+
+#vrpn_BiosciencesTools Analog0 COM1 37.0 37.0 0
+
+################################################################################
+# Omega temperature control unit, analog/out that attaches
+# to a serial port on this machine.
+#
+# This instrument also has a button device that reports whether the
+# temperature control is turned on.
+#
+# XXX Figure out the settings once the code has been finished.
+
+#vrpn_OmegaTemerature Analog0 COM1 XXX
+
+################################################################################
+# IDEA-drive linear positioning element analog that attaches
+# to a serial port on this machine.
+#
+# Note that if you want to use the IDEA as a tracking device, you will
+# need to run a vrpn_Tracker_AnalogFly device (of the absolute variety)
+# that listens to its analog outputs and converts them into tracker reports.
+#
+# If the drive does not have a limit switch to calibrate against and you need to
+# drive it to one rail to find a zero location, use a nonzero initial_move
+# value to cause a move. To keep it from getting stuck against that limit,
+# change the fractional_c_a value to be less than one -- this will lower
+# both the current and the acceleration/deceleration by this fraction for
+# this initial move. The location of the device is reset to 0 after the
+# move is done.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_port[]
+# int run_speed_tics_sec
+# int start_speed_tics_sec
+# int end_speed_tics_sec
+# int accel_rate_tics_sec_sec
+# int decel_rate_tics_sec_sec
+# int run_current
+# int hold_current
+# int accel_current
+# int decel_current
+# int delay
+# int step
+# int high_limit_index (-1 for none)
+# int low_limit_index (-1 for none)
+# int output_1_value (0 for off, 1 for on, -1 for don't change)
+# int output_2_value (0 for off, 1 for on, -1 for don't change)
+# int output_3_value (0 for off, 1 for on, -1 for don't change)
+# int output_4_value (0 for off, 1 for on, -1 for don't change)
+# double initial_move (0 for no move)
+# double fractional_c_a (Fraction of full current and acceleration)
+# double reset_location (Where to set location on reset in full ticks)
+
+#vrpn_IDEA Analog0 COM1 3200 1200 2000 40000 100000 290 0 290 290 50 8 1 -1 0 0 0 0 0 1.0 -60.0
+#vrpn_IDEA Analog1 COM2 3200 1200 2000 40000 100000 290 0 290 290 50 8 1 -1 0 0 0 0 0 1.0 -60.0
+#vrpn_IDEA Analog2 COM3 3200 1200 2000 40000 100000 290 0 290 290 50 8 1 -1 0 0 0 0 0 1.0 -60.0
+#vrpn_IDEA Analog0 /dev/ttyUSB1 3200 1200 2000 40000 100000 290 0 290 290 50 8 -1 -1 0 0 0 0 10000 0.2 -60.0
+#vrpn_IDEA Analog1 /dev/ttyUSB2 3200 1200 2000 40000 100000 290 0 290 290 50 8 -1 -1 0 0 0 0 10000 0.2 -60.0
+#vrpn_IDEA Analog2 /dev/ttyUSB3 3200 1200 2000 40000 100000 290 0 290 290 50 8 -1 -1 0 0 0 0 10000 0.2 -60.0
+
+################################################################################
+# SGI Dial and Button box, raw interface. Runs a dial-and-button box from SGI,
+# talking to it through the raw serial interface (not using the GL interface
+# supplied by SGI). This allows the box to be opened even if there is nobody
+# logged on at the console. Note that to use this on an SGI, you will need to
+# configure the port as a serial device, not as a button device, to get it to
+# run. Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# [list of buttons to treat as toggles] int button_to_toggle
+
+#vrpn_raw_SGIBox Sgibox0 /dev/ttyS0 0 1 2 3
+
+################################################################################
+# SGI Dial and Button box, cooked interface. Runs a dial-and-button box from SGI,
+# talking to it through the GL interface supplied by SGI. Note that this can
+# only be used on an SGI, and the serial port must be configured as a dial/button
+# device and the dial/button server from SGI must be running to use it. Arguments:
+# char name_of_this_device[]
+# [list of buttons to treat as toggles] int button_to_toggle
+
+#vrpn_SGIBOX Sgibox0 1 2
+
+################################################################################
+# UNC Python button device. UNC has developed a custom button input device, which
+# is a 5-button controller that attaches to a parallel port and uses the sense
+# lines to return the state of the buttons. This runs the device. Note that on
+# Windows NT, you need to have installed the GiveIO driver for this code to
+# work. It also works on Linux (no extra drivers needed), but on no other
+# architecture. Arguments:
+# char name_of_this_device[]
+# int parallel_port_to_use_starting_with_1
+# int hexadecimal_io_base_number (default address used if left off)
+
+#vrpn_Button_Python Button0 1
+
+################################################################################
+# UNC Joystick driver. UNC has developed a custom-build joybox, with 7 analog
+# and 2 button inputs (two 3-axis joysticks and a slider, with a button on top
+# of each joystick). This will drive one of these devices, which attaches to
+# a serial port on this computer. I'm not sure what the baud rate should be;
+# David Harrison might know.
+# This driver can be used in conjunction with the JoyFly driver to produce a
+# tracker that uses the joystick to fly around. Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+# float minimum_update_rate_from_analogs_even_if_they_dont_move
+
+#vrpn_Joystick Joybox0 /dev/ttyd1 19200 10.0
+
+################################################################################
+# Linux Joystick. Interface to the Linux Joystick driver by Vojtech Pavlik
+# included in several Linux distributions. The server code has been tested
+# with Linux Joystick driver version 1.2.14. Yet, there is no way how to
+# map a typical joystick's zillion buttons and axes on few buttons and axes
+# really used. Unfortunately, even joysticks of the same kind can have
+# different button mappings from one to another.
+# Arguments:
+# char name_of_this_device[]
+# char name_of_joystick_device[]
+
+#vrpn_Joylin Joylin0 /dev/input/js0
+
+################################################################################
+# Fakespace Pinch Glove. Drives a Fakespace Pinch Glove device connected to a
+# serial port on this machine. This device has ten buttons-two hands and five
+# fingers on each hand. Buttons 0-4 are fingers for the right hand-thumb first
+# and pinkie last- while buttons 5-9 are for the left hand-thumb first. The
+# Button is ON when it is touching another finger. Therefore there cannot
+# be just one Button ON. Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+
+#vrpn_Button_PinchGlove PinchGlove0 COM1 9600
+
+################################################################################
+# Adrienne Electronics Corporation PCI time code driver. The PCI-VITC board
+# for which this driver was developed reads in VITC time codes from an input
+# signal. This will drive one of these devices.
+# Arguments:
+# char name_of_this_device[]
+
+#vrpn_TimeCode_Generator TimeGen0
+
+################################################################################
+# 5DT glove (5 sensors plus optional tilt sensors).
+# Drive a 5dt glove connected on a serial Port. This device uses
+# optical fiber to get the finger position.
+#
+# See also vrpn_5DT16 (16-sensor serial) and vrpn_Analog_5dtUSB (5 or 14-sensor
+# "Ultra" USB/wireless)
+#
+# 2 modes are driven: the first one let the driver get data from the glove
+# when requested (we advise this mode). The second one makes the glove send
+# data continuously. This mode may saturate the input buffer.
+#
+# The manual states that there will be 9 bytes per report, but one group
+# has found that they get an extra one: 0x55 at the end of each report.
+# So, you can choose whether to use 9 (the default) or 10 now.
+# Gesture management is not implemented yet nor the mouse emulation mode
+#
+# The standard baud rate for the "wired" glove is 19200. For a "wireless"
+# glove (which is send-only), even if directly connected, use baud rate
+# 9600. The driver detects this and will adjust its behavior accordingly
+# (forcing on continuous mode and 10-bytes-per-report, ignoring the settings
+# you specify here). If you aren't sure what kind of glove you have, use the
+# Glove Manager app in
+# "5DT Data Glove Series: Full Package for Windows 95/98/NT/2000" downloaded from
+# http://5dt.com/downloads.html and try to connect, it will tell you.
+# Their Glove Manager worked for me on Linux 64-bit with WINE, and is probably the
+# easiest way to find out this info if you don't know it. (Or, just try 9600 if
+# 19200 doesn't work.)
+#
+# Reports the digit bend values in order, channels 1-5, in the range 0.0-1.0,
+# and the tilt sensors in channels 6 and 7 in the range 0 to 180, if available
+#
+# arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+# int mode_of_data_reporting (1 = on request, 2 = continuously)
+# int ten_bytes_per_report (0 = no, use 9; 1 = yes)
+
+#vrpn_5dt glove_5dt /dev/ttyS0 19200 1 0
+#vrpn_5dt glove_5dt COM1 19200 1 0
+#vrpn_5dt glove_5dt_wireless /dev/ttyS1 9600 2 1
+
+################################################################################
+# NRL Serial Mouse. A device made by wiring buttons in parallel with the buttons
+# on a serial mouse. Both mousesystems or microsoft mouse protocols are
+# supported. Note that the server code makes the connection at the standard
+# 1200 baud. The mouse can be plugged into any serial port -- this driver goes
+# directly through the raw port and does not use the built-in mouse drivers.
+# NOTE: The middle button on the 3button type is toggled by moving the mouse
+# on a surface while not toggling the other two buttons, strange as this may
+# seem. The motion of the mouse is not reported, only the buttons.
+
+#vrpn_Button_SerialMouse Button0 /dev/ttyd1 mousesystems
+#vrpn_Button_SerialMouse Button0 COM1 mousesystems
+#vrpn_Button_SerialMouse Button0 COM1 3button
+# For a Linux box with a mouse on port 0
+#vrpn_Button_SerialMouse Button0 /dev/ttyS0 3button
+# For a mac with a Keyspan 4-port serial-to-USB converter
+#vrpn_Button_SerialMouse Button0 /dev/tty.USA49W3b12P1.1 3button
+
+################################################################################
+# ReliaSolve Streaming Arduino.
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int number_of_analogs_to_read
+
+#vrpn_Streaming_Arduino sa0 /dev/ttyd2 4
+#vrpn_Streaming_Arduino sa0 COM5 4
+
+################################################################################
+# NRL TNG3. (Totally Neat Gadget) A device made by mindtel, available from
+# pulsar.org. Powered off the serial port control lines, the TNG3 has 8 digital
+# and 8 analog inputs. Analog resolution is 8 bits. Baud rate fixed internally
+# at 19200.
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int number_of_buttons_to_read (i.e. 8 ==> 0,1,2,3,4,5,6,7)
+# int number_of_analogs_to_read
+
+#vrpn_Tng3 tng3name /dev/ttyd2 4 0
+#vrpn_Tng3 tng3name com1 8 8
+#vrpn_Tng3 tng3name com1 1 1
+
+################################################################################
+# Microsoft DirectX compatible force-feedback joystick (or non-force-feedback
+# joystick).
+# char name_of_this_device[]
+# int number of times per second to read from the device
+# int number of times per second to update force (0 for non-force device)
+
+#vrpn_DirectXFFJoystick Joystick0 60 200
+#vrpn_DirectXFFJoystick Joystick0 60 0
+
+
+################################################################################
+# Microsoft DirectX compatible rumble-pad (e.g. Wingman)
+# char name_of_this_device[]
+
+#vrpn_DirectXRumblePad RumblePad0
+
+################################################################################
+# Microsoft XInput compatible controller (e.g. Xbox 360 gamepad)
+# char name_of_this_device[]
+# int userIndex (0 for "Player 1", 1 for "Player 2", etc.)
+
+#vrpn_XInputGamepad XInput0 0
+
+
+################################################################################
+# Manager for joysticks under windows using standard win32 calls.
+# for force feedback support, see DirectX joystick above
+#
+# Arguments:
+# char name_of_this_device[]
+# int joystick Id
+# (1 for first joystick JOYSTICKID1 or 2 for second JOYSTICKID2 only)
+# int number of times per second to read from the device
+# int readmode : 0 = raw data;
+# 1 = 0,1 normalized data;
+# 2=-1,1 normalized data
+# int percentage (0 to 100) of deadzone (used mode 1 and 2 only)
+
+#vrpn_Joywin32 joyWin32 1 60 2 35
+
+################################################################################
+# Global Haptics GeoOrb serial-line device that contains a number of buttons,
+# a thumbwheel, and a trackball. For current devices, only 19200 baud works.
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+
+#vrpn_GlobalHapticsOrb Orb0 COM1 19200
+
+################################################################################
+# SensAble Technologies Phantom force-feedback device opened using the
+# GHOST software developer's kit. For Phantom Desktop systems, you don't
+# need to have the user establish the reset position. For the Premium models,
+# you do.
+# Arguments:
+# char name_of_this_device[]
+# int establish_reset_position (0 or 1)
+# float rate_to_send_tracker_reports
+# char Name of the Phantom in the configuration control panel
+
+#vrpn_Phantom Phantom 0 60.0 Default PHANToM
+
+##############################################################################
+# Virtual Presence Joystick tracker device. (http://www.vrweb.com)
+# Use this driver to read the button states,
+# use Flock-of-Birds driver for the position/orientation state
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+
+#vrpn_VPJoystick VPJoystick0 /dev/ttyS0 9600
+
+################################################################################
+# Advanced Realtime Tracking GmbH (http://www.ar-tracking.de) DTrack client
+#
+# creates as many vrpn_Tracker as there are bodies or Flysticks, starting with the bodies
+# creates 2 analogs per Flystick
+# creates 8 buttons per Flystick
+#
+# NOTE: when using DTrack's older output format for Flystick data ('6df'), the numbering
+# of Flystick buttons differs from DTrack documentation (for compatibility with
+# older vrpn releases)
+#
+# Arguments:
+# char name_of_this_device[]
+# int udp_port (DTrack sends data to this UDP port)
+#
+# Optional arguments:
+# float time_to_reach_joy (in seconds; see below)
+# int number_of_bodies, number_of_flysticks (fixed numbers of bodies and Flysticks)
+# int renumbered_ids[] (vrpn_Tracker IDs of bodies and Flysticks)
+# char "3d" (activates 3dof marker output if available;
+# always last argument if "-" is not present)
+# char "-" (activates tracing; always last argument)
+#
+# NOTE: time_to_reach_joy is the time needed to reach the maximum value (1.0 or -1.0) of the
+# joystick of older 'Flystick' devices when the corresponding button is pressed
+# (one of the last buttons amongst the 8); not necessary for newer 'Flystick2' devices
+# with its analog joystick
+#
+# NOTE: if fixed numbers of bodies and Flysticks should be used, both arguments
+# number_of_bodies and number_of_flysticks have to be set
+#
+# NOTE: renumbering of tracker IDs is only possible, if fixed numbers of bodies and
+# Flysticks are set; there has to be an argument present for each body/Flystick
+
+#vrpn_Tracker_DTrack DTrack 5000
+#vrpn_Tracker_DTrack DTrack 5000 -
+#vrpn_Tracker_DTrack DTrack 5000 3d
+#vrpn_Tracker_DTrack DTrack 5000 3d -
+#vrpn_Tracker_DTrack DTrack 5000 0.5
+#vrpn_Tracker_DTrack DTrack 5000 0.5 2 2
+#vrpn_Tracker_DTrack DTrack 5000 0.5 2 2 2 1 0 3
+#vrpn_Tracker_DTrack DTrack 5000 0.5 2 2 2 1 0 3 3d -
+
+################################################################################
+# National Instruments Analog Output server. This will open the board whose
+# name is specified, configure the number of channels specified, and set the
+# polarity and maximum voltage range at which to drive the channels.
+#
+# XXX This server is deprecated, please use the vrpn_National_Instruments
+# server listed below.
+#
+# Arguments:
+# char vrpn_name_for_this_device[]
+# char name_of_NI_board[]
+# int number_of_channels
+# int polarity : 0 = unipolar, 1 = bipolar
+# float min_voltage
+# float max_voltage
+
+#vrpn_NI_Analog_Output Analog_XY DAQCard-6036E 2 0 -10.0 10.0
+#vrpn_NI_Analog_Output Analog_ZTweeze DAQCard-6036E 2 0 -10.0 10.0
+#vrpn_NI_Analog_Output Analog_XYZ PCI-6733 3 0 -10.0 10.0
+
+################################################################################
+# National Instruments A/D, D/A Analog and Analog Output server. This will open
+# the board whose name is specified, configure the number of channels specified,
+# and set the polarity and maximum voltage range at which to read and
+# drive the channels.
+##
+# Arguments:
+# char vrpn_name_for_this_device[]
+# char name_of_NationalInstruments_board[]
+# int number_of_input_channels (can be zero)
+# float mininum_delay_between_Analog_Reports (zero for fastest)
+# int input_polarity : 0 = unipolar, 1 = bipolar
+# int input_mode : 0 = differential, 1 = ref single-end, 2 = non-ref SE
+# int input_range : 5 = 5v, 10 = 10v, 20 = 20v
+# int input_drive_ais : 0 = no, 1 = yes
+# int input_gain
+# int number_of_output_channels (can be zero)
+# int output_polarity : 0 = unipolar, 1 = bipolar
+# float min_out_voltage (used to guard against overdriving devices)
+# float max_out_voltage (used to guard against overdriving devices)
+
+# Input example
+#vrpn_National_Instruments MCLXYZIN PCI-6052E 7 0 0 0 10 0 1 0 0 -10.0 10.0
+# Output examples
+#vrpn_National_Instruments MCLXYZOUT PCI-6733 0 0 0 0 10 0 1 3 0 0.0 10.0
+#vrpn_National_Instruments Analog_XY DAQCard-6036E 0 0 0 0 10 0 1 2 1 -10.0 10.0
+
+################################################################################
+# Analog Poser. This is a poser that is intended to be used on top of
+# an analog output (perhaps a National Instruments board), whose outputs
+# directly drive the position of some actuated stage. It could be used on top
+# of any analog output device, in fact. This device basically takes in poses
+# and puts out analog outputs.
+# One analog channel is associated with each axis (X, Y, Z) and rotation about
+# each axis (RX, RY, RZ). For each axis, the position (meters) is converted into
+# a voltage; the orientation is mapped from a quaternion into Euler angles and
+# each of the Euler angles is converted into a voltage (XXX Orientation is not yet
+# implemented; the RX,RY, and RZ values must be specified but they are not used).
+# XXX Velocity and orientation velocity are not yet supported.
+# Any axis can be disabled by setting the name of its associated device to the
+# string "NULL".
+#
+# Arguments:
+# char vrpn_name_for_this_device[]
+# int send_tracker_reports
+# [six lines follow, one for X Y Z RX RY RZ, each with:
+# char axis_name[] (X Y Z RX RY RZ in that order)
+# char vrpn_name_of_the_analog_output_to_use[]
+# (Preface with a * if it uses the same connection)
+# int channel_of_analog_output_device (First channel is channel 0)
+# float offset
+# float scale
+# float min_value of workspace
+# float max_value of workspace
+# ]
+
+#vrpn_Poser_Analog Poser0 1
+#X *Analog_XY 0 0.0 1.0 -10 10
+#Y *Analog_XY 1 0.0 1.0 -10 10
+#Z *Analog_ZTweeze 0 0.0 1.0 -10 10
+#RX NULL 0 0.0 1.0 -10 10
+#RY NULL 0 0.0 1.0 -10 10
+#RZ NULL 0 0.0 1.0 -10 10
+
+# Poser to drive Mad City Labs stage from an input value of
+# 0 to 100 microns to an output (through a National Instruments
+# D/A card) of 0-10 volts.
+#vrpn_Poser_Analog Poser0 1
+#X *MCLXYZOUT 0 0.0 0.1 0 100
+#Y *MCLXYZOUT 1 0.0 0.1 0 100
+#Z *MCLXYZOUT 2 0.0 0.1 0 100
+#RX NULL 0 0.0 1.0 -10 10
+#RY NULL 0 0.0 1.0 -10 10
+#RZ NULL 0 0.0 1.0 -10 10
+
+################################################################################
+# Nikon microscope connected to PC via serial port. Currently only controls
+# the focus of the microscope using an analogout and reads the focus position
+# using an analog.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+
+#vrpn_nikon_controls nikon COM1
+
+################################################################################
+# Tektronix 4662 plotter. Attaches to a serial port. Acts as both a poser and
+# a tracker. Reports positions 4x per second plus when a move command completes.
+# Multiple move commands issued before they complete will result in only the last
+# one being executed.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_serial_device[]
+# int baud_rate_of_serial_device
+
+#vrpn_Tek4662 Tek4662 COM1 1200
+
+###############################################################################
+# keyboard and mouse button is a tracker with button system
+# XXX These have been removed and replaced with vrpn_Mouse
+# and vrpn_Keyboard. Use the clutch option on vrpn_AnalogFly to
+# replicate the mouse behavior. The vrpn_Keyboard does not
+# enable key mapping, just sends all of the keys' scancodes
+# through.
+
+################################################################################
+# US Digital A2 Absolute Encoder Analog Input server. This will open the COM
+# port specified, configure the number of channels specified, and report
+# Absolute Encoder values in tenths of a degree from 0 to 3599.
+#
+# Arguments:
+# char name_of_this_device[]
+# int COM_port. If 0, search for correct COM port.
+# int number_of_channels
+# int 0 to report always, 1 to report on change only (optional, default=0)
+
+#vrpn_Analog_USDigital_A2 Analog0 1 2
+
+################################################################################
+# This is a driver for National Instruments DAQCard-
+# DIO-24, a PCMCIA card, which provides 24-bit digital I/O.
+#
+# Arguments:
+# char name_of_this_device[]
+# int number_of_channls to read: 1-24 (optional. default=24).
+
+#vrpn_Button_NI_DIO24 Button0 1
+
+##############################################################################
+# PhaseSpace Impulse system. This device type is not compiled by default, since
+# it uses a proprietary library. However, you can get it to compile by
+# defining VRPN_INCLUDE_PHASESPACE and including the appropriate libraries
+# and headers when compiling (See vrpn_Configure.h).
+#
+# Arguments:
+# char tracker_name[] # Tracker0, Tracker1, ... etc
+# [Additional lines specifying tracker configuration]
+#
+# The section following the Tracker declaration is a tag delimited set of
+# lines which specify system configuration and vrpn sensors. The section begins
+# with an tag and ends with a tag. Each tag must be on a separate
+# line. (see below)
+#
+# Each line in the specification section is a white-space separated set of
+# key-value pairs. At most one sensor is defined per line. The sensor and type
+# keys are mandatory. Other keys are are required based on the type.
+#
+# Comments can be embedded with the '#' character.
+#
+# Example:
+#
+# vrpn_Tracker_PhaseSpace Tracker0
+#
+# device="192.168.1.1"
+# frequency=960
+# slave=0
+# drop_frames=0
+# scale=0.001
+# debug=0
+#
+# sensor=0 type=point tracker=0 led=0 # this is a comment
+# sensor=1 type=point tracker=0 led=1 # map sensor 1 to led 1 on tracker 0
+#
+# sensor=2 type=rigid_body tracker=1 # designate tracker 1 as a rigid body on sensor 2
+# sensor=3 type=point tracker=1 led=2 pos=0,0,0 # add led 2 to rigid body on tracker 1
+# sensor=4 type=point tracker=1 led=3 pos=100,0,0 # add led 3 to rigid body on tracker 1
+# sensor=5 type=point tracker=1 led=4 pos=0,100,0 # add led 4 to rigid body on tracker 1
+# sensor=6 type=point tracker=1 led=5 pos=0,0,100 # add led 5 to rigid body on tracker 1
+#
+#
+# Key Definitions
+# ======================
+#
+# device
+# A string specifying the IP address of the Impulse server to connect to.
+#
+# frequency
+# A floating-point number specifying the system streaming frequency.
+# Usually 480 or 960.
+#
+# slave
+# An integer specifying whether to enable slave mode.
+# Set to 0 to disable, 1 to enable. If slave mode is enabled, unspecified
+# markers are assigned an arbitrary sensor number.
+#
+# drop_frames
+# An integer. Set to zero to disable. Specifying 1 for drop_frames will
+# cause the server to drop frames in order to get the most recent data on
+# every run through the mainloop. This may be desirable for most VR
+# applications and for slower machines.
+#
+# debug
+# An integer. Zero to disable. Specifying 1 for debug will cause the server
+# to print out verbose debugging output.
+#
+# scale
+# The floating-point factor to scale incoming positional data by. The default
+# is 0.001.
+#
+# sensor
+# The vrpn sensor number.
+#
+# type
+# A string which specifies what type the sensor is. Required if sensor is
+# specified. The following types are supported:
+# point
+# rigid
+# rigid_body (deprecated)
+#
+# tracker
+# An integer which specifies The Impulse tracker id of an led or rigid body.
+# Required if type is "point" or "rigid".
+#
+# led
+# An integer which specifies the led id of a sensor.
+# Required if type is "point".
+#
+# pos
+# An optional comma-separated list of three floating-point numbers specifying
+# the 3D position of a marker on a rigid body. No spaces. Valid if type is
+# "point". Specifying positions is only valid if the tracker number is set
+# to a rigid body. The units MUST be in millimeters, regardless of scale
+# setting.
+#
+# init
+# An optional comma-separated list of four floating-point numbers specifying
+# kalman parameters for a rigid body. Valid if type is "rigid_body".
+#
+#
+# For support, questions, comments, or bug reports please send emails
+# to: support@phasespace.com
+#
+#vrpn_Tracker_PhaseSpace Tracker0
+#
+#device="192.168.1.230"
+#frequency=480
+#slave=0
+#drop_frames=0
+#scale=0.001
+#sensor=0 type=point led=0
+#sensor=1 type=point led=1
+#sensor=2 type=point led=2
+#sensor=3 type=point led=3
+#sensor=4 type=point led=4
+#sensor=5 type=point led=5
+#sensor=6 type=point led=6
+#sensor=7 type=point led=7
+#
+
+################################################################################
+# Generic Auxiliary Logger. This is a server that will listen for requests to
+# produce additional log files and the name of the connection it should make the
+# log files for. It can only have one set of such logs open (can be more than
+# one log but all for the same connection). There are two arguments:
+# char name_of_this_device[]
+# char name_of_connection_to_log
+
+#vrpn_Auxiliary_Logger_Server_Generic Logger0 localhost
+
+################################################################################
+# Imager Stream Buffer. This is a server that will listen for requests to
+# produce additional log files and the name of the connection it should make the
+# log files for. It can only have one set of such logs open (can be more than
+# one log but all for the same connection). The "local" log files are with
+# respect to the machine where this server is running, and the "remote" ones
+# are with respect to the vrpn_Imager_Server it has connected to (which may
+# be on yet a third machine compared to the client machine).
+# There are two arguments:
+# char name_of_this_device[]
+# char name_of_imager_server_to_log
+
+#vrpn_Imager_Stream_Buffer ImageStream0 TestImage@localhost
+
+################################################################################
+# controllers from Futaba. There is one device we have
+# drivers for. The only argument is the name of the device to open.
+#
+# For Interlink Elite:
+# Analog channel assignments:
+# 0=rudder (left joy X)
+# 1=throttle (left joy Y)
+# 2=aileron (right joy X)
+# 3=elevator (right joy Y)
+# 4=Ch6 Flaps Gain
+# Button number assignments:
+# 0=Ch5 fwd
+# 1=Ch7 fwd
+# 2=reset
+# 3=Ch8 down
+# 4=Ch8 up
+# 5=
+# 6=menu/select
+# 7=cancel
+# Next eight are for the trim buttons
+# 8=aileron right
+# 9=aileron left
+# 10=elevator up
+# 11=elevator down
+# 12=rudder right
+# 13=rudder left
+# 14=throttle up
+# 15=throttle down
+# Next two are options button
+# 16=up
+# 17=down
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Futaba_InterLink_Elite futaba0
+
+################################################################################
+# controllers from Griffin Technology. There is one device we have
+# drivers for. The only argument is the name of the device to open.
+#
+# For PowerMate:
+# Analog channel assignments:
+# none
+# Button number assignments:
+# 0=only button
+# Dial assignments:
+# 0=only dial
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Griffin_PowerMate griffin0
+
+################################################################################
+# controllers from Retrolink. There is one device we have
+# drivers for. The only argument is the name of the device to open.
+#
+# For GameCube:
+# Analog channel assignments:
+# 0=Left joystick X axis; -1 = left, 1 = right
+# 1=Left joystick Y axis; -1 = up, 1 = down
+# 2=Right joystick X axis; -1 = left, 1 = right
+# 3=Right joystick Y axis; -1 = up, 1 = down
+# 4=Left rocker switch angle in degrees (-1 if nothing is pressed)
+# Button number assignments:
+# 0=Y
+# 1=X
+# 2=A
+# 3=B
+# 4=left trigger
+# 5=right trigger
+# 6=Z
+# 7=Start/pause
+# Buttons 8-11 are duplicate mappings for the rocker-switch; both
+# these and the analog angle in degrees will change as they are pressed
+# 8 = up
+# 9 = right
+# 10 = down
+# 11 = left
+#
+# For Genesis:
+# Analog channel assignments:
+# 0=Rocker switch angle in degrees (-1 if nothing is pressed)
+# Button number assignments:
+# 0=A
+# 1=B
+# 2=C
+# 3=X
+# 4=Y
+# 5=Z
+# 6=Mode
+# 7=Start
+# Buttons 8-11 are duplicate mappings for the rocker-switch; both
+# these and the analog angle in degrees will change as they are pressed
+# 8 = up
+# 9 = right
+# 10 = down
+# 11 = left
+#
+# There is one argument:
+# char name_of_this_device[]
+
+# vrpn_Retrolink_GameCube retrolink0
+# vrpn_Retrolink_Genesis retrolink0
+
+################################################################################
+# Controllers from Contour Design. There are two devices we have
+# drivers for. The only argument is the name of the device to open.
+#
+# Dial: Moves in 0.1-revolution steps.
+#
+# Analogs:
+# analog[0] is the shuttle, which goes from -1 to 1
+# analog[1] integrates the dial, with 1 meaning a full revolution
+#
+# Buttons on the ShuttlePROv2:
+# Top row, left to right: buttons 0-3
+# Second row: Buttons 4-8
+# Four grey buttons below, left to right (two rows): 9-10, 11-12
+# Black buttons, left to right: 13-14
+#
+# For ShuttleXpress and ShuttlePROv2:
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Contour_ShuttleXpress contour0
+#vrpn_Contour_ShuttlePROv2 contour0
+
+################################################################################
+# controllers from Microsoft. The devices we have drivers for are listed below.
+# The only argument is the name of the device to open.
+#
+# These show up as JoyLin devices under Linux and cannot be opened raw when
+# that interface is running.
+#
+# These do not provide any raw inputs when run on a Mac with OS 11.6.5.
+#
+# For SideWinder Precision 2 joystick
+# Analog channel assignments:
+# 0=joystick X
+# 1=joystick Y
+# 2=Z rotate
+# 3=slider
+# 4=Point of View Hat heading (-1=nothing, 0=North, 45=Northeast, etc.)
+# Button number assignments
+# 0=1
+# 1=2
+# 2=3
+# 3=4
+# 4=5
+# 5=6
+# 6=7
+# 7=8
+# Next four are point of view hat buttons
+# 8=Up
+# 9=Right
+# 10=Down
+# 11=Left
+#
+# For SideWinder joystick
+# Analog channel assignments:
+# 0=joystick X
+# 1=joystick Y
+# 2=slider
+# Button number assignments
+# 0=1
+# 1=2
+# 2=3
+# 3=4
+# 4=5
+# 5=6
+# 6=7
+# 7=8
+#
+# For Xbox Controller S:
+# Requires USB cable and special driver.
+# Analog channel assignments:
+# 0=left joystick X
+# 1=left joystick Y
+# 2=right joystick X
+# 3=right joystick Y
+# 4=Point of View Hat heading (-1=nothing, 0=North, 45=Northeast, etc.)
+# Button number assignments
+# 0=A
+# 1=B
+# 2=X
+# 3=Y
+# 4=Black
+# 5=White
+# 6=Start
+# 7=Back
+# 8=left joystick
+# 9=right joytick
+# 10=left trigger
+# 11=right trigger
+# Next four are point of view hat buttons
+# 12=Up
+# 13=Right
+# 14=Down
+# 15=Left
+#
+# For Xbox 360 Controller:
+# Analog channel assignments:
+# 0=left joystick X
+# 1=left joystick Y
+# 2=right joystick X
+# 3=right joystick Y
+# 4=triggers (left goes positive, right goes negative)
+# 5=Point of View Hat heading (-1=nothing, 0=North, 45=Northeast, etc.)
+# Button number assignments
+# 0=A
+# 1=B
+# 2=X
+# 3=Y
+# 4=left bump
+# 5=right bump
+# 6=Back
+# 7=Start
+# 8=left joystick
+# 9=right joytick
+# Next four are point of view hat buttons
+# 10=Up
+# 11=Right
+# 12=Down
+# 13=Left
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Microsoft_SideWinder_Precision_2 microsoft0
+#vrpn_Microsoft_SideWinder microsoft0
+#vrpn_Microsoft_Controller_Raw_Xbox_S microsoft0
+#vrpn_Microsoft_Controller_Raw_Xbox_360 microsoft0
+#vrpn_Microsoft_Controller_Raw_Xbox_360_Wireless microsoft0
+#vrpn_Afterglow_Ax1_For_Xbox_360 microsoft0
+
+################################################################################
+# X-Keys devices from P.I. Engineering. There are several devices we have
+# drivers for. The only argument is the name of the device to open. The Pro
+# and Joystick models have not been tested. The XK3 is a 3-button foot pedal.
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Xkeys_Desktop xkeys0
+#vrpn_Xkeys_Pro xkeys0
+#vrpn_Xkeys_Joystick xkeys0
+#vrpn_Xkeys_Joystick12 xkeys0
+#vrpn_Xkeys_Jog_And_Shuttle xkeys0
+#vrpn_Xkeys_Jog_And_Shuttle12 xkeys0
+#vrpn_Xkeys_Jog_And_Shuttle68 xkeys0
+#vrpn_Xkeys_XK3 xkeys0
+
+################################################################################
+# controllers from Logitech other than 3Dconnexion which is listed separately.
+# The devices we have drivers for are listed below.
+# The only argument is the name of the device to open.
+#
+# For Extreme 3D Pro joystick
+# Analog channel assignments:
+# 0=joystick X
+# 1=joystick Y
+# 2=Z rotate
+# 3=slider
+# 4=Point of View Hat heading (-1=nothing, 0=North, 45=Northeast, etc.)
+# Button number assignments
+# 0=1
+# 1=2
+# 2=3
+# 3=4
+# 4=5
+# 5=6
+# 6=7
+# 7=8
+# 8=9
+# 9=10
+# 10=11
+# 11=12
+# Next four are point of view hat buttons
+# 12=Up
+# 13=Right
+# 14=Down
+# 15=Left
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Logitech_Extreme_3D_Pro logitech0
+
+################################################################################
+# controllers from Saitek.
+# The devices we have drivers for are listed below.
+# The only argument is the name of the device to open.
+#
+# For ST290 Pro joystick
+# Analog channel assignments:
+# 0=joystick X
+# 1=joystick Y
+# 2=Z rotate
+# 3=slider
+# 4=Point of View Hat heading (-1=nothing, 0=North, 45=Northeast, etc.)
+# Button number assignments
+# 0=1
+# 1=2
+# 2=3
+# 3=4
+# 4=5
+# 5=6
+# 6=7
+# Next four are point of view hat buttons
+# 7=Up
+# 8=Right
+# 9=Down
+# 10=Left
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Saitek_ST290_Pro saitek0
+
+################################################################################
+# controllers from CH products.
+# The devices we have drivers for are listed below.
+# The only argument is the name of the device to open.
+#
+# For Fighterstick USB joystick
+# Analog channel assignments:
+# 0=joystick X
+# 1=joystick Y
+# 2=throttle wheel
+# 3=Point of View Hat heading (buttons 4-7: -1=nothing, 0=North, 45=Northeast, etc.)
+# 4=Hat heading (buttons 8-11: -1=nothing, 0=North, 90=East, etc.)
+# 5=Hat heading (buttons 12-15: -1=nothing, 0=North, 90=East, etc.)
+# 6=Mode (buttons 2, 16-18): 0=unknown, 1=red, 2=yellow, 3=green)
+# 7=Hat heading (buttons 20-23: -1=nothing, 0=North, 90=East, etc.)
+#
+# Button number assignments
+# 0=trigger
+# 1=top red button
+# 2=red button using index finger (see 16, 17, & 18)
+# 3=pinky red button
+# Next four are on 8-way POV hat: upper right on top
+# 4=up
+# 5=right
+# 6=down
+# 7=left
+# Next four are on 4-way hat #2: lower right on top
+# 8=up
+# 9=right
+# 10=down
+# 11=left
+# Next four are on 4-way hat #1: left on top
+# 12=up
+# 13=right
+# 14=down
+# 15=left
+# Next three are modes triggered by button 2.
+# Mode LEDs show the color listed below when pressed, but releasing with advance the color to the next in the series.
+# These "buttons" are all released when unknown. Once the mode is known, one button will always be considered pressed.
+# 16=green
+# 17=red
+# 18=yellow
+# 19=
+# Next four are on 4-way hat #3: thumb
+# 20=Up
+# 21=Right
+# 22=Down
+# 23=Left
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_CHProducts_Fighterstick_USB chproducts0
+
+################################################################################
+# Space Navigator, Space Traveler, and Space Mouse devices from 3DConnexion.
+# 3Dconnexion is actually made by Logitech.
+# Not to be confused with the Magellan Space Mouse, for which there is
+# a Magellan driver.
+# The only argument is the name of the device to open.
+#
+# There is one argument:
+# char name_of_this_device[]
+#
+# For the SpaceMouse Pro:
+# Analog channel assignments:
+# 0=x
+# 1=y
+# 2=z
+# 3=pitch
+# 4=roll
+# 5=yaw
+# Button number assignments:
+# (the ones similar to have a graphic on the button and are referred to the text enclosed text in the help)
+# 0=Menu
+# 1=Fit
+# 2=
+# 4=
+# 5=
+# 8=
+# 12=1
+# 13=2
+# 14=3
+# 15=4
+# 22=Esc
+# 23=Alt
+# 24=Shift
+# 25=Ctrl
+# 26=
+#
+# On Linux, make sure the HID and evdev drivers are running so that these
+# devices will be recognized:
+# Start a separate Root shell:
+# cd .../vrpn/server_src/pc_linux
+# lsmod
+# modprobe evdev
+# modprobe hid
+# lsmod
+# (check that evdev and hid are running)
+# On RedHat Linux, you need the have libusb1-devel installed and configure
+# the system for VRPN_USE_LOCAL_HIDAPI to get these to work.
+
+#vrpn_3DConnexion_Navigator device0
+#vrpn_3DConnexion_Navigator_for_Notebooks device0
+#vrpn_3DConnexion_Traveler device0
+#vrpn_3DConnexion_SpaceMouse device0
+#vrpn_3DConnexion_SpaceMousePro device0
+#vrpn_3DConnexion_SpaceMouseCompact device0
+#vrpn_3DConnexion_SpaceMouseWireless device0
+#vrpn_3DConnexion_SpaceMouseProWireless device0
+#vrpn_3DConnexion_SpaceExplorer device0
+#vrpn_3DConnexion_SpaceBall5000 device0
+#vrpn_3DConnexion_SpacePilot spacepilot
+#vrpn_3DConnexion_SpacePilotPro spacepilotpro
+
+################################################################################
+# Open the mouse as an analog and button devices. There is an implementation
+# under Windows and another under Linux (using GPM). There are two analog
+# channels, reporting in the range [0..1] as the mouse moves across the screen.
+# There are 3 button channels: left, middle, right.
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Mouse Mouse0
+
+################################################################################
+# Open the keyboard as a button device. There is an implementation
+# under Windows. There are 256 buttons, and they are triggered according
+# to the scan code that they represent.
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Keyboard Keyboard0
+
+################################################################################
+# WARNING : LINUX ONLY !
+# Open the /dev/input devices and treat them as mouse events
+# There is as many as available channel (kernel 2.6.38 : 10 channels)
+#
+# There is three argument:
+# char name_of_this_device[]
+# char "name of the hardware device"
+# char type of the device (must be one of "keyboard", "absolute" and "relative"
+# int in case of keyboard : the total number of keys ; in case of absolute mouse : size of the window (ie. to normalize the result)
+# The "name of the hardware device" is the Name entry of the device
+# from /proc/bus/input/devices
+# Due to hardware access through /dev/input/*, there is no notion of window.
+# Thus, you must specify the window size. If '-1' is provided, then, this device
+# only provide relative displacement of the channel
+#
+# Keyboard are standard keyboard (ie : the one on which you type elements
+# Absolute are pointing devices such as touchpad : the position of the pointer is absolute regarding the size of the touch pad
+# Relative are pointing devices such as mouse : the position of the pointer is a relative displacement regarding previous position
+#
+# BEWARE that you must have read access to the wanted device
+
+#vrpn_DevInput Input0 "AT Translated keyboard" keyboard 255
+#vrpn_DevInput Input0 "USB Optical Mouse" relative -1
+
+################################################################################
+# MotionNode inertial tracking system.
+#
+# There are four arguments:
+# char name_of_this_device[]
+# int num_sensors
+# char address
+# int port
+
+#vrpn_Tracker_MotionNode Tracker0 1 127.0.0.1 32079
+
+################################################################################
+# GPS device.
+# This driver reads a GPS connected to the serial port at a given baud rate, and looks for
+# the NMEA message providing long/lat/alt, which get copied into x/y/z
+# respectively (of the position). Should do a lot more (e.g., get velocity,
+# bearing, perhaps convert to UTM). But, for now, this is all it does.
+
+# Open a GPS on MACOSX at 4800 baud
+
+#vrpn_Tracker_GPS Tracker0 /dev/tty.KeySerial1 4800
+#vrpn_Tracker_GPS Tracker0 /dev/tty.HOLUXGPSlim236-SPPslave-1 4800
+
+#on windows
+#vrpn_Tracker_GPS Tracker0 COM1 4800
+
+################################################################################
+# Nintendo Wii Remote Controller
+# char name_of_this_device[]
+# int userIndex (1 for "Player 1", 2 for "Player 2", etc.)
+# int useMotionSensing
+# int useIR
+# int reorderButtons (set to make button ids somewhat more sensible)
+# char bluetooth_address[] (optional, only supported on Linux - upper case,
+# include colons)
+
+#vrpn_WiiMote WiiMote0 1 0 0 1
+
+################################################################################
+# Two-LED head tracking using Wii Remote Controller
+# char name_of_this_device[]
+# char name_of_vrpn_WiiMote_device[]
+# float min_update_rate (default=60)
+# float led_distance (default=0.205)
+#
+# Note: The WiiMote device must have useMotionSensing = 1 and useIR = 1
+
+#vrpn_WiiMote WiiMote0 1 1 1 1
+#vrpn_Tracker_WiimoteHead Tracker0 WiiMote0@localhost
+
+################################################################################
+# Novint Falcon attached to USB.
+# Arguments:
+# char name_of_this_device[]
+# int device index (starts at 0)
+# char name_of_grip (optional, default and only one supported now = "4-button")
+# char kinematic_model (optional, default and only one supported now ="stamper")
+# float damping_factor (optional, range 1.0-1000.0, default=10.0)
+#vrpn_Tracker_NovintFalcon Tracker0 0 4-button stamper 10.0
+
+################################################################################
+# Hillcrest Labs Freespace device
+# char name_of_this_device[]
+# int Index (0 for device 1, 1 for device 2, ...)
+# int Send body frames (0 = no, 1 = yes)
+# int Send user frames (0 = no, 1 = yes)
+
+#vrpn_Freespace FreeSpace0 0 1 1
+
+################################################################################
+# Dream Cheeky devices, of which only the USB Roll-Up Drum Kit is implemented.
+#
+# There is one argument:
+# char name_of_this_device[]
+
+#vrpn_Dream_Cheeky_USB_roll_up_drums drums0
+
+################################################################################
+# (OBSOLETE) Trivisio Colibri device. This is an inertial tracker that gives
+# orientation information, no position (the tracker reports (0, 0, 0) for position).
+#
+# Arguments:
+# char name_of_this_device[]
+# int number_of_sensors (Number of connected devices to connect to)
+# int Hz (Update rate)
+# int bufLen (From the reference manual:
+# An short buffer (0) ensures minimal delay until the sensor
+# measurement is available at the risk of lost measurements.
+# A long buffer guarantees that no data is dropped, at
+# the same time if data is not read fast enough there is a
+# potential risk of a bufLen frequency before the measurement
+# becomes available.)
+
+#vrpn_Tracker_TrivisioColibri Colibri 1 60 0
+
+################################################################################
+# Trivisio ColibriAPI support. This is an inertial tracker that gives orientation
+# information, no position (the tracker reports (0, 0, 0) for position).
+# If wireless Colibri do not answer, dongle scans for them automatically (20 seconds).
+# Wireless Colibri must be in scanning mode (button pushed for 2 seconds,
+# LED flashing fast).
+#
+# Arguments:
+# char name_of_this_device[]
+# char conf_file_name[] : xml-file with sensor network configuration.
+# Use Colibri GUI to create the file. Settings must be set
+# and saved in sensors' non-volatile memory using Colibri GUI.
+# * - to use all connected devices. Default settings will be
+# applied to sensors.
+# int Hz : Update rate.
+# int report_a_w : 0 = orientation only,
+# 1 = orientation + angular velocity + acceleration.
+
+#vrpn_Tracker_Colibri Colibri * 100 0
+
+################################################################################
+# LUDL USBMAC6000 device. This is a vrpn_Analog and a vrpn_Analog_Output device
+# that lets you both move the stage by command and get a response when it has
+# finished moving.
+#
+# Arguments:
+# char name_of_this_device[]
+# int Perform recentering on device (0 = no, 1 = yes)
+
+#vrpn_LUDL_USBMAC6000 Analog0 1
+
+################################################################################
+# GameTrak tracker
+# Reports 2 sensors with positions only
+# This device uses another joystick device that needs to be configured (PC
+# version of GameTrak shows up as a joystick device with 6 axes and a button)
+# If the name of the joystick device starts with '*', it will take another
+# one on this server, otherwise it will attempt a remote connection
+# char name_of_this_device[]
+# char name of the joystick device[]
+#vrpn_Joylin RawGametrak /dev/input/js1
+#vrpn_Tracker_GameTrak GameTrak0 *RawGametrak
+
+
+################################################################################
+# PNI SpacePoint Fusion 3DOF rotation tracker
+# Reports 1 sensor as quaternion.
+# The device index can be specified in order to open multiple identical devices,
+# if not specified, 0 is assumed.
+# char name_of_this_device[]
+# [int device index]
+
+#vrpn_Tracker_SpacePoint SpacePoint0 0
+
+################################################################################
+# 5DT DataGlove "Ultra" USB/USB Wireless support (based on HID)
+#
+# Reports 5 or 14 sensors' raw values as analogs 0-4 or 0-13, in range 0.0 - 1.0
+# Note that your code will probably need to perform some scaling/calibration:
+# see vrpn_Analog_5dtUSB.h for more info
+#
+# Four device types as shown in examples below: the server will connect to the
+# first device available of that type.
+#
+# For serial (non-"Ultra") gloves, see vrpn_5dt and vrpn_5DT16
+#
+# Arguments:
+# char name_of_this_device[]
+
+#vrpn_Analog_5dtUSB_Glove5Right Glove5Right
+#vrpn_Analog_5dtUSB_Glove5Left Glove5Left
+#vrpn_Analog_5dtUSB_Glove14Right Glove14Right
+#vrpn_Analog_5dtUSB_Glove14Left Glove14Left
+
+################################################################################
+# JsonNet devices
+#
+# Any device that send updates formatted as JSON messages over UDP, including
+# Vrpn Widgets for Android
+#
+# Messages are:
+# for a tracker:
+# {
+# 'type': 1,
+# 'id': sensor number,
+# 'quat': quaternion,
+# 'pos': position
+# }
+#
+# for a button:
+# {
+# 'type': 2,
+# 'button': button number,
+# 'state': the boolean state
+# }
+#
+# for an analog:
+# {
+# 'type': 3,
+# 'num': channel number,
+# 'data': the analog value
+# }
+# for a text message:
+# {
+# 'type': 4,
+# 'data': the text value
+# }
+#
+# Arguments:
+# char name_of_this_device[]
+# int udp_port (Device send JSON messages to this port)
+
+#vrpn_Tracker_JsonNet Jsonnet 7777
+
+################################################################################
+# One-Euro Filter Tracker. This is a tracker that is intended to be used on top of
+# another tracker to provide filtered output for it. This was originally designed
+# for the Razer Hydra, but can be used along with any tracker.
+#
+# Arguments:
+# char name_of_this_device[]
+# char name_of_tracker_to_filter[] (start with * for local)
+# int number_of_sensors_to_filter
+# float vecMinCutoff
+# float vecBeta
+# float vecDerivativeCutoff
+# float quatMinCutoff
+# float quatBeta
+# float quatDerivativeCutoff
+
+#vrpn_Tracker_FilterOneEuro Filter0 *Tracker0 2 1.15 1.0 1.2 1.5 5.0 1.2
+
+################################################################################
+# Razer Hydra (Sixense TrueMotion) tracker (HID-based driver)
+#
+# The left wand (the one with LB and LT on its "end" buttons - look from above)
+# is sensor 0, and the right wand (with RB and RT on it) is sensor 1.
+# The "front" of the base is the side opposite the cables: there's a small
+# logo on it. You can have the base in any orientation you want, but the info
+# that follows assumes you have the base sitting on a desk, with the front toward you.
+# If you have the base in a different coordinate frame in the world, please make
+# the appropriate mental transformations yourself. :)
+#
+# When starting the VRPN server, make sure that the left wand is somewhere to
+# the left of the base, and the right wand somewhere right of the base -
+# they do not need to be placed on the base or any more complicated homing/calibration
+# procedure. This is for the hemisphere tracking: it needs to have an "initial state"
+# that is roughly known, so it uses the sign of the X coordinate position.
+#
+# The base coordinate system is right-handed with the axes:
+# X - out the right of the base
+# Y - out the front of the base
+# Z - down
+#
+# The wands are also right-handed, with the tracked point somewhere near
+# the cable entry to the controller . When held with the joystick vertical,
+# the axes are:
+# X - to the right
+# Y - out the front of the controller (trigger buttons)
+# Z - Up, along the joystick
+#
+# Buttons are as follows, with the right controller's button channels starting
+# at 8 instead of 0:
+# 0 - "middle" button below joystick
+# 1-4 - numbered buttons
+# 5 - "bumper" button (above trigger)
+# 6 - joystick button (if you push straight down on the joystick)
+# There is no button 7 on any controller; the offset of 8 per controller
+# was done to make similar buttons differ by a power of 2.
+#
+# Analog channels are as follows, with the right controller starting at 3
+# instead of 0:
+# 0 - joystick left/right: centered at 0, right is positive, in [-1, 1]
+# 1 - joystick up/down: centered at 0, up is positive, in [-1, 1]
+# 2 - analog trigger, in range 0 (not pressed) to 1 (fully pressed).
+#
+# Arguments:
+# char name_of_this_device[]
+#
+# NOTE: If using the Hydra on Windows, the server will work with or without the official
+# Razer Hydra drivers installed. If you are only using the device with VRPN, don't
+# install the official drivers. However, if you do have them installed, make sure that
+# the "Hydra Configurator" and the Hydra system tray icon are closed to avoid unexpected
+# failure (their software can switch the device out of the mode that VRPN uses). You
+# probably want to make sure that the tray icon doesn't auto-run on startup, since it
+# can get even messier with Windows 7's "switch users" if you let it auto-run for each
+# user.
+#
+# Works great on Linux (regardless of endianness) - no drivers needed, thanks to USB HID.
+#
+# NOTE: Because of the jitter in the tracker, you may want to add a
+# filter to it and then read the filtered location values; you still read
+# the buttons and analogs from the original device.
+#
+
+#vrpn_Tracker_RazerHydra Tracker0
+#vrpn_Tracker_FilterOneEuro Filter0 *Tracker0 2 1.15 1.0 1.2 1.5 5.0 1.2
+
+################################################################################
+# Sensics zSight HMD with built-in tracker. This is an inertial tracker that
+# gives orientation information, but no position (the tracker reports
+# (0, 0, 0) for position).
+#
+# Arguments:
+# char name_of_this_device[]
+
+#vrpn_Tracker_zSight zSight
+
+################################################################################
+# Arrington Research ViewPoint EyeTracker.
+#
+# The VRPN server connects to the eye tracker using the VPX_InterApp DLL.
+# Whatever other control software is being used to connect to the eye tracker
+# (e.g. the ViewPoint software that comes with the tracker) to perform
+# calibration, etc. should link to the same copy of the DLL, so they can share
+# information.
+#
+#-------------------------------------------------------------------------------
+#
+# Tracker:
+#
+# The tracker has two sensors, as the ViewPoint can optionally have binocular
+# tracking. In the case of monocular tracking, only sensor 0 (EYE_A) will have
+# valid information. Retrieving smoothed or raw tracking data is controlled by
+# the smoothedData parameter.
+#
+# Position: The (x,y) gaze point in gaze space (smoothed or raw).
+#
+# Rotation: The (x,y) gaze angle as a quaternion (smoothed or raw).
+#
+# Velocity: The x- and y- components of the eye movement velocity in gaze space
+# (always smoothed).
+#
+#-------------------------------------------------------------------------------
+#
+# Analog:
+#
+# There are a lot of additional data that can be retrieved from the tracker.
+# These values are always calculated from the smoothed gaze point. Currently,
+# the following are sent as analog values, but more can be added as needed.
+# Please see the ViewPoint documentation regarding what other data are available.
+#
+# Because each channel needs to be duplicated in the case of a binocular tracker,
+# the first n/2 values are for EYE_A, and the second n/2 values are for EYE_B.
+#
+# EYE_A:
+#
+# Channel 0: The pupil aspect ratio, from 0.0 to 1.0. Can be used to detect
+# blinks when it falls below a given threshold.
+#
+# Channel 1: The total velocity (magnitude of eye movement velocity). Can be
+# used to detect saccades.
+#
+# Channel 2: The fixation seconds (length of time below the velocity criterion
+# used to detect saccades). 0 if saccade is occurring.
+#
+# EYE_B:
+#
+# Channels 3-5: See EYE_A.
+#
+#-------------------------------------------------------------------------------
+#
+# Arguments:
+# char name_of_this_device[]
+# int smoothedData
+
+# vrpn_Tracker_ViewPoint ViewPoint 1
+
+################################################################################
+# vrpn_inertiamouse
+# (Need a description of how to run this and an example commented-out line.)
+
+###############################################################################
+# To access Polhemus G4 on Windows using the Polhemus PDI library,
+# use vrpn_Tracker_G4.
+#
+# The vrpn_Tracker_G4 tracker definition requires the tracker name and
+# the vrpn server name for the tracker, followed by an optional Server Poll rate,
+# and on the next line, the file path to the .g4c configuration file:
+#
+# vrpn_Tracker_G4 G4 \
+# C:\filepath\source_config_file.g4c
+#
+# The Server Poll Rate is optional.
+# If it is not specified, the VRPN server will poll for new data at a rate of 120 frames per second.
+# (120 frames per second is the default output rate of G4 hardware.)
+#
+# If you wish to poll at a slower rate than the tracker, you may specify any number. For example, if
+# you wish to poll 20 times per second, then specify a poll rate of 20.
+#
+# The '\' at the end of the first line, after the server name, is optional and
+# will be disregarded. A '\' on a subsequent line means that further commands
+# are to be input. The format is to have one command per line after the file
+# path. Each line that isn't the final line must end in a '\'.
+# The final line should not have a '\' on the end.
+#
+# Supported G4 Configuration Commands:
+# 'B' Set/Reset Boresight
+# 'X' Set/Reset Position Filter
+# 'Y' Set/Reset Attitude Filter
+# 'T' Set/Reset G4 Translation Frame of Reference
+# 'R' Set/Reset G4 Rotation Frame of Reference
+# 'I' Set/Reset Sensor Increment/Auto-Increment
+# 'N' Set/Reset Sensor Tip Offset
+#
+# The following commands are not G4 configuration commands but are used to
+# create VRPN button server objects for G4 button devices:
+#
+# 'G4PowerTrak' Creates VRPN button server object with 4 buttons
+# 'G4DigIO' Creates VRPN button server object with a configurable button count
+#
+# Command Syntax:
+#------------------------------------------------------------------------------
+# 'B' Boresight Command 'B':
+#
+# Syntax: Baction,hub,sensor,[x,y,z,w]
+#
+# Arguments:
+# action:
+# 1 = Boresight
+# 2 = Unboresight
+#
+# hub: HubID. (0-based.) To apply Boresight/Unboresight to all hubs & sensors, set to * or -1.
+# sensor: Sensor Num. (0-based.) To apply Boresight/Unboresight to all sensors on a hub, set to *
+# Note: If hub is *, set sensor to * also.
+# [x,y,z,w]: Optional Quaternion XYZW Boresight Reference Orientation.
+# All 4 values must be set.
+# N/A for action=2
+#
+# Examples:
+# B2,-1,-1 Un-Boresights all sensors on all hubs
+# B1,-1,-1 Boresights all sensors on all hubs
+# B1,1,-1,
+#------------------------------------------------------------------------------
+# 'X' Position Filter Command 'X':
+# 'Y' Attitude Filter Command 'Y':
+#
+# Syntax: Xaction,hub,flevel,[F,FLow,FHigh,Factor]
+# Yaction,hub,flevel,[F,FLow,FHigh,Factor]
+#
+# Arguments:
+# action:
+# 1 = Set
+# 2 = Reset
+#
+# hub: HubID. (0-based.) To apply filter to all hubs, set to *
+# flevel: Filter Level
+# 0=None
+# 1=Light
+# 2=Medium
+# 3=Heavy
+# 4=Custom
+# [F,FLow,FHigh,Factor]: Optional Floating-point Parameters used only if flevel=Custom.
+# If custom parameters are used, it is assumed that all four custom parameters are present.
+# See Tracker User manual for meaning of Custom Filter Values.
+# Examples:
+# X*,1 Sets Position Filtering to LIGHT on all hubs
+# Y2,0 Sets Attitude Filtering to NONE on hub 2
+# X1,4,0.2,0.2,0.8,0.95 Sets Custom Filter on hub 1
+#------------------------------------------------------------------------------
+# 'T' Translation Frame of Reference Command 'T':
+#
+# Syntax: Taction,x,y,z
+#
+# Arguments:
+# action:
+# 1 = Set
+# 2 = Reset
+#
+# x,y,z: Position Offset, measured in Meters
+# All arguments must be present
+#
+# Examples:
+# T1,1.0,1.5,1.0 Sets Translation Frame of Reference to (1.0, 1.5, 1.0) meters
+# Y2 Resets Translation Frame of Reference
+#
+# Note: Frame of Reference commands apply to all G4 output.
+#------------------------------------------------------------------------------
+# 'R' Rotation Frame of Reference Command 'R':
+#
+# Syntax: Raction,hub,x,y,z,w
+#
+# Arguments:
+# action:
+# 1 = Set
+# 2 = Reset
+#
+# x,y,z,w: Rotation Quaternion XYZW
+# All arguments must be present
+#
+# Examples:
+# R1,0,0,0.707107,0.707107 Sets Rotation Frame of Reference
+# R2 Resets Rotation Frame of Reference
+#
+# Note: Frame of Reference commands apply to all G4 output.
+#------------------------------------------------------------------------------
+# 'I' Increment/AutoIncrement Command 'I':
+#
+# Syntax: Iaction,hub,sensor,fPosIncr,fOriIncr
+#
+# Arguments:
+# action:
+# 1 = Set
+# 2 = Reset
+#
+# hub: HubID. (0-based.) To apply command to all hubs & sensors, set to * or -1
+# sensor: Sensor Num. (0-based.) To apply command to all sensors on a hub, set to * or -1
+# Note: If hub is *, set sensor to * also.
+#
+# posIncr: Position Threshold, Meters
+# 0 Disables
+# -1 Enables Auto-Increment
+#
+# oriIncr: Orientation Threshold, DEGREES
+# 0 Disables
+# -1 Enables Auto-Increment
+#
+# Examples:
+# I1,*,*,0.01,5.0 For all hubs/sensors, sets position increment to 10 cm,
+# rotation increment to 5 degrees
+# I1,*,*,-1,-1 For all hubs/sensors, enables position and rotation auto-increment
+# I2,0,2 For hub0, sensor2, resets/disables increment
+#
+#------------------------------------------------------------------------------
+# 'N' Tip Offset Command 'N':
+#
+# Syntax: Iaction,hub,sensor,x,y,z
+#
+# Arguments:
+# action:
+# 1 = Set
+# 2 = Reset
+#
+# hub: HubID. (0-based.) To apply command to all hubs & sensors, set to * or -1
+# sensor: Sensor Num. (0-based.) To apply command to all sensors on a hub, set to * or -1
+# Note: If hub is *, set sensor to * also.
+#
+# x,y,z: Position Offset, measured in Meters
+# All arguments must be present
+#
+# Examples:
+# N1,0,0,0.005,0.001,0.001 For hub0,sensor0, sets tip offset to (5,1,1)cm
+# N2,*,* For all hubs/sensors, resets tip offset
+#
+#
+#------------------------------------------------------------------------------
+# 'G4PowerTrak' Command :
+# If one or more hubs in the polhemus g4 system supports a Polhemus PowerTrak360, use this
+# command to create a vrpn button object with 4 buttons.
+#
+# Syntax: G4PowerTrak name hub
+#
+# Arguments:
+# name: Button Server Name
+# hub: HubID. (0-based) Identifier of the hub to which the PowerTrak360 is connected.
+#
+# Examples:
+# G4PowerTrak ptrak0 0 For 4-button server named ptrak0 plugged into Hub 0.
+#
+# Remember that the "remote" button object is not the same as the the tracking device, so be sure
+# to use a remote button object that connects to the button rather than the tracker.
+# In this example configuration, if the name of the machine running the server is "mytrackerserver"
+# you would connect to the tracker as "myg4@mytrackerserver" and to the powertrak configured
+# here as "ptrak0@mytrackerserver"
+#
+# Note: It is possible to have >1 G4PowerTrak configured on a vrpn_Tracker_G4, but they must be
+# on different hubs.
+# It is also possible to have a combination of G4PowerTrak and G4DigIO commands, but they
+# must be on different hubs.
+#
+#------------------------------------------------------------------------------
+# 'G4DigIO' Command:
+# If one or more hubs in the polhemus g4 system supports a custom digital IO accessory, use this
+# command to create a vrpn button object with a configurable number of buttons
+#
+# Syntax: G4DigIO name hub inputs
+#
+# Arguments:
+# name: Button Server Name
+# hub: HubID. (0-based) Identifier of the hub to which the digital IO device is connected.
+# inputs: Number of digital inputs (buttons) to capture.
+# The G4 Digital I/O interface supports up to 8 digital inputs. The 'inputs'
+# argument must be between 1 and 8, inclusive.
+#
+# Examples:
+# G4DigIO 2btn0 0 For 2-button server named 2btnio0 plugged into Hub 0.
+# G4DigIO 8sig4 8 For an 8-button server named 8sig4 plugged into Hub 4.
+#
+# Remember that the "remote" button object is not the same as the the tracking device, so be sure
+# to use a remote button object that connects to the button rather than the tracker.
+# In this example configuration, if the name of the machine running the server is "mytrackerserver"
+# you would connect to the tracker as "myg4@mytrackerserver" and to the G4DigIO configured
+# here as "2btn0@mytrackerserver" or "8btn4@mytrackerserver".
+#
+# Note: It is possible to have >1 G4DigIO configured on a vrpn_Tracker_G4, but they must be
+# on different hubs.
+# It is also possible to have a combination of G4PowerTrak and G4DigIO commands, but they
+# must be on different hubs.
+#
+#------------------------------------------------------------------------------
+# Example command for setup of a G4
+#
+# vrpn_Tracker_G4 G4\
+# C:\Program Files (x86)\Polhemus\G4\G4 Files\mysourceconfig.g4c \
+# G4PowerTrak myptraka 1
+# G4PowerTrak myptrakb 2
+# B1,-1,-1\
+# X1,*,1\
+# Y1,*,4,0.2,0.2,0.8,0.95\
+# T1, 10.0, 10.0, 10.0, 10.0\
+# R1,0,0,0,1\
+# I1,*,*,0.01,5.0\
+# N1,0,*,0.005,0.002,0.001\
+# N2,*,*
+
+###############################################################################
+# To access Polhemus FasTrak on Windows using the Polhemus PDI library,
+# use vrpn_Tracker_FastrakPDI.
+#
+# The vrpn_Tracker_FastrakPDI tracker definition requires the tracker name and
+# the vrpn server name for the tracker, followed by an optional Server Poll rate:
+#
+# vrpn_Tracker_FastrakPDI myFastrak4 30\ <-valid
+# vrpn_Tracker_FastrakPDI myFastrak2 60\ <-valid
+# vrpn_Tracker_FastrakPDI myFastrak1 \ <-valid
+#
+# The Server Poll Rate is optional.
+# If it is not specified, the VRPN server will poll for new data at a rate of 120 frames per second.
+# (120 frames per second is the default output rate of FasTrak hardware with ONE sensor connected.)
+#
+# For FasTrak trackers the update rate depends on the number of sensors connected to the device:
+# Number of Sensors Update Rate
+# ----------------- -----------
+# 1 120 frames/sec
+# 2 60 frames/sec
+# 3 40 frames/sec
+# 4 30 frames/sec
+#
+# If you wish to poll at the same rate as the tracker output, then you must specify the poll rate
+# to match the update rate in the table above.
+#
+# If you wish to poll at a slower rate than the tracker, you may specify any number. For example, if
+# you wish to poll 20 times per second, then specify and update rate of 20.
+#
+# The '\' at the end of the first line, after the server name, is optional and will be disregarded.
+# a '\' on a subsequent line means that further commands are to be input. The format is to have
+# one command per line. Each line that isn't the final line must end in a '\'. The final line should not
+# have a '\' on the end.
+#
+# Supported Fastrak Configuration Commands:
+# All commands are exposed, except C and c for continuous pno which would conflict with VRPN directly.
+# Take note that O<> should be avoided, though it will be sent to the tracker. VRPN clients expect position
+# x,y,z and quaternion q,r,s,t by default, so changing the frame structure could result in an overflow.
+# The format commands ('F' for ASCII, f for binary) are especially useful since the tracker can mark
+# syntax errors in ASCII mode. The tracker must be in binary mode for VRPN to gather data, so if you issue
+# an F command at some point in this file (to troubleshoot syntax errors), be sure to issue an f<>
+# command later. Not all fastrak commands have a response: boresight, for example. You can confirm
+# such settings by requesting a single frame in ASCII mode with the command P (note, P requires no <>).
+# Read the fastrak manual for a full list of commands.
+#
+# Command Syntax:
+# Many commands, much like P (gather single pno frame), require no carriage return on the end. Carriage
+# returns are represented by '<>'. Control commands, noted as ^$ (where $ is any capitol letter) in the
+# manual require a '^' followed by the capital letter for the command. Syntax is precisely as given in
+# examples in the fastrak manual. Note that all commands are case sensitive.
+# Examples:
+# F <-Sets the response frame format to ASCII
+# f <-Sets the response frame format to binary
+# b*<> <-Removes the boresight setting for all sensors
+# B1<> <-Sets the boresight to 0,0,0 as a default or whatever G<> was set to
+# G1,0,0,0<> <-Sets the boresight reference angles of station 1 to 0,0,0
+# ^Y <-Sends a reset command to the tracker, note that VRPN defaults for pno will be loaded on
+# reconnect
+#
+# If a sensor on the FasTrak device is a Polhemus FasTrak Stylus, use the "PDIStylus"
+# command. This command takes one argument: the station number of the stylus device. Remember that
+# the station number is a 1-based index of sensors/'stations' on the Polhemus equipment.
+# PDIStylus command syntax:
+#
+# PDIStylus [station-num]
+#
+# Use of the PDIStylus command will
+# - Cause the Stylus Button Flag to be configured into the output of all stations.
+# - Cause the creation of vrpn button device. The name of this device will be a concatenation of
+# the server name for the tracker + "Stylus" + the specified station number.
+# E.g:
+# vrpn_Tracker_FasTrakPDI myFT \
+# PDIStylus 1
+#
+# Will produce a button device named "myFTStylus1"
+#
+# Remember that the "remote" button object is not the same as the the tracking device, so be sure
+# to use a remote button object that connects to the button rather than the tracker.
+# In this example configuration, if the name of the machine running the server is "mytrackerserver"
+# you would connect to the tracker as "myFT@mytrackerserver" and to the button on the stylus as
+# "myFTStylus1@mytrackerserver"
+#
+# NOTE: The FasTrak tracker will only detect stylus input if the stylus is plugged into Station 1!
+# However, the stylus flag can be output onto any station on the device. Therefore, it is
+# possible to specify station 2 as your PDIStylus button, and the stylus output will be collected
+# from the Station 2 output. BUT the actual Stylus device must be plugged into Station 1.
+# This means that only one Stylus can be plugged into a FasTrak at any time, but up to 4 vrpn
+# button objects can be created/accessed from that Stylus.
+#
+#------------------------------------------------------------------------------
+# The following example config:
+# -specifies that station 1 is a FasTrak Stylus Device
+# -sets the tracker to ASCII responses (F),
+# -sets the boresight reference on sensor one to 0,0,0, (G1,0,0,0<>)
+# -writes this reference to the system with B1<>,
+# -confirms the change by collecting a single pno with P,
+# -removes the boresight setting (^b1<>),
+# -collects a second single pno to confirm this removal (P) and
+# -finally returns to binary mode before passing control to VRPN (F1<>).
+# The trackers name is TrackerJoe.
+# The server poll rate is 120 Hz.
+
+# vrpn_Tracker_FastrakPDI TrackerJoe 120\
+# PDIStylus 1\
+# F\
+# G1,0,0,0<>\
+# B1<>\
+# P\
+# b1<>\
+# P\
+# f
+
+#------------------------------------------------------------------------------
+# The default config is below.
+# -Assumes that one sensor is connected to FasTrak, and polls at 120 Hz
+
+# vrpn_Tracker_FastrakPDI myFasTrak
+
+###############################################################################
+# To access Polhemus Liberty or Patriot on Windows using the Polhemus PDI library,
+# use vrpn_Tracker_LibertyPDI.
+#
+# The vrpn_Tracker_LibertyPDI tracker definition requires the tracker name and
+# the vrpn server name for the tracker, followed by an optional Server Poll rate:
+#
+# vrpn_Tracker_LibertyPDI MyLiberty 240\ <-valid
+# vrpn_Tracker_LibertyPDI MyPatriot \ <-valid
+# vrpn_Tracker_LibertyPDI MyPolhemus 120\ <-valid
+#
+# Note that "Tracker_LibertyPDI" is used for both Polhemus Patriot and Liberty tracker hardware!
+#
+# The Server Poll Rate is optional.
+# If it is not specified, the VRPN server will poll for new data at a rate of 60 frames per second.
+# (60 frames per second is the default output rate of Patriot tracker hardware.)
+#
+# For Liberty trackers, the default rate is 240 frames per second. If you wish for the server to poll
+# at this rate, then you must specify 240!
+#
+# If you wish to poll at a slower rate than the tracker, you may specify any number. For example, if
+# you wish to poll 20 times per second, then specify and update rate of 20.
+#
+# The '\' at the end of the first line, after the server name, is optional and will be disregarded.
+# a '\' on a subsequent line means that further commands are to be input. The format is to have
+# one command per line. Each line that isn't the final line must end in a '\'. The final line should not
+# have a '\' on the end.
+#
+# Supported Liberty/Patriot Configuration Commands:
+# All commands are accepted, except C<> for continuous pno output which would conflict with VRPN directly.
+# Take note that O<> should be avoided, though it will be sent to the tracker. VRPN clients expect position
+# x,y,z and quaternion q,r,s,t by default, so changing the frame structure could result in an overflow.
+# The format command (F0<> for ASCII, F1<> for binary) is especially useful since the tracker can mark
+# syntax errors in ASCII mode. The tracker must be in binary mode for VRPN to gather data, so if you issue
+# an F0<> command at the beginning of this file (to troubleshoot syntax errors), be sure to issue an F1<>
+# command later. Not all liberty/patriot commands have a response: boresight, for example. You can confirm
+# these settings by requesting a single frame in ASCII mode with the command P (note, P requires no <>).
+# Read the patriot or liberty manual for a full list of commands.
+#
+# Note: The R command is used to set the Liberty tracker update rate. This command has no effect on Patriot.
+# For Liberty, if you use the R command to change the update rate, remember to change the Server Poll Rate
+# specification in the tracker definition (like "MyPolhemus" example above).
+
+# Command Syntax:
+# Every command, except P (gather single pno frame), requires a carriage return on the end. Carriage
+# returns are represented by '<>'. Control commands, noted as ^X (where X is any capitol letter) in the
+# manual require a '^' followed by the capital letter for the command. Syntax is precisely as given in
+# examples in the patriot/liberty manuals.
+# Examples:
+# ^V<> <-This command sends a 'whoami' request to the tracker. Requires ascii mode for response
+# F<> <-Queries format mode of tracker (binary or ascii)
+# F0<> <-Sets the response frame format to ASCII
+# F1<> <-Sets the response frame format to binary
+# ^B*<> <-Removes the boresight setting for all sensors
+# B1<> <-Queries the boresight setting for sensor one
+# B1,0,0,0,0 <-Sets the boresight to 0,0,0 without a reset for sensor one
+# ^Y<> <-Sends a reset command to the tracker, note that VRPN defaults for pno will be loaded on
+# reconnect
+#
+# If one or more sensors on the polhemus device is a Polhemus Stylus, use the "PDIStylus"
+# command. This command takes one argument: the station number of the stylus device. Remember that
+# the station number is a 1-based index of sensors/'stations' on the Polhemus equipment.
+# PDIStylus command syntax:
+#
+# PDIStylus [station-num]
+#
+# Use of the PDIStylus command will
+# - Cause the Stylus Button Flag to be configured into the output of all stations.
+# - Cause the creation of vrpn button device. The name of this device will be a concatenation of
+# the server name for the tracker + "Stylus" + the specified station number.
+# E.g:
+# vrpn_Tracker_LibertyPDI myliberty \
+# PDIStylus 2
+#
+# Will produce a button device named "mylibertyStylus2"
+#
+# Remember that the "remote" button object is not the same as the the tracking device, so be sure
+# to use a remote button object that connects to the button rather than the tracker.
+# In this example configuration, if the name of the machine running the server is "mytrackerserver"
+# you would connect to the tracker as "myliberty@mytrackerserver" and to the button on this stylus as
+# "mylibertyStylus2@mytrackerserver"
+#
+# NOTE: The Liberty and Patriots tracker will detect stylus button input on any station, and there is
+# no limit on the number of Stylus devices that can be connected to the tracker. Only one vrpn
+# button object can be created per stylus.
+#
+#------------------------------------------------------------------------------
+# The following example config for a Liberty tracker:
+# -specifies that stations 1 and 2 are Polhemus Stylus Devices
+# -sets the tracker to ASCII responses (F0<>),
+# -sends the tracker a whoami (^V<>),
+# -sets the boresight on sensor one (B1,0,0,0,0<>) to an arbitrary value,
+# -confirms the boresight setting with P to collect a single pno,
+# -removes the boresight setting (^B1<>),
+# -collects a second single pno to confirm (P),
+# -enters an invalid command to demonstrate the advantage of ASCII mode (^ZX<>) and finally,
+# -most importantly, returns to binary mode before passing control to VRPN (F1<>).
+# The tracker server name is myLiberty.
+# The server poll rate is 240 Hz
+#
+# vrpn_Tracker_LibertyPDI myLiberty 240\
+# PDIStylus 1\
+# PDIStylus 2\
+# F0<>\
+# ^V<>\
+# B1,0,0,0,0<>\
+# P\
+# ^B1<>\
+# P\
+# ^ZX<>\
+# F1<>
+#
+#-----------------------------------------------------------------------------
+# Finally the default config below:
+# -May be used for a Liberty or a Patriot tracker
+# -Polls the tracker 60 times per second
+# -Sets tracker output to ASCII
+# -Queries the tracker for WhoAmI information
+# -Sets the output back to Binary
+##############################################################################
+
+# vrpn_Tracker_LibertyPDI defaultPolhemus\
+# F0<>\
+# ^V<>\
+# F1<>
+
+###############################################################################
+# This YEI 3Space_Sensor driver is used even for a wireless-capable sensor
+# when it is plugged directly into the computer via USB. The Wireless
+# driver (see next driver description) is used when the wireless unit is
+# plugged into the computer.
+#
+# On Windows, the driver for the YEI 3-Space Sensor Suite requires installation
+# of the device driver that comes with the system, which presents a serial-port
+# interface to the device (as a COM port on Windows). On Mac and Linux, you
+# can just plug in the device and it will show up as a new port. On Linux, the
+# default permissions for the port only allow read access, so you'll need to
+# either change the permissions or run vrpn_server as root.
+# If the gyroscopes are calibrated at startup, the device should remain still
+# while the server is started.
+# If the device is set to tare at startup, it should be facing in the correct
+# direction when the server is started. This is usually a manufacturing-time
+# operation if the tracker is integrated into a larger device.
+#
+# This device exposes a Tracker interface, with the following inputs. Only the
+# orientation portion of the pose is valid; the position is always reported as
+# (0,0,0). Sensor 1 also reports linear acceleration.
+# 0: Untared orientation
+# 1: Tared orientation
+#
+# This device exports an Analog interface, with the following channels:
+# 0: Corrected Gyro rate vector X component (radians/second)
+# 1: Corrected Gyro rate vector Y component (radians/second)
+# 2: Corrected Gyro rate vector Z component (radians/second)
+# 3: Corrected Gravity vector X component (in fraction of g)
+# 4: Corrected Gravity vector Y component (in fraction of g)
+# 5: Corrected Gravity vector Z component (in fraction of g)
+# 6: Corrected Compass vector X component (in Gauss)
+# 7: Corrected Compass vector Y component (in Gauss)
+# 8: Corrected Compass vector Z component (in Gauss)
+# 9: Temperature Celsius
+# 10: Confidence factor (1 if completely stationary down to 0 with motion)
+#
+# This device exports a Button_Filter interface, with the following channels:
+# 0: First button (external button on the units in cases)
+# 1: Second button (external button on the units in cases)
+# 2-7: Other buttons (not installed at the factory)
+#
+# The device description for a wired device:
+# vrpn_YEI_3Space_Sensor
+# char name_of_this_device[]
+# char port_name
+# int baud_rate_of_serial_device
+# int calibrate_gyros_on_startup (0 = no, 1 = yes)
+# int tare_on_startup (0 = no, 1 = yes)
+# double frames_per_second
+# float red_LED_color to set (0-1)
+# float green_LED_color to set (0-1)
+# float blue_LED_color to set (0-1)
+# int LED_mode (0 = standard, 1 = static)
+#
+# If the line ends with a backslash character '\', then the following
+# line is an additional ASCII command to send to the tracker every
+# time it is reset. There can be more than one such line, so long as
+# each previous line ends with backslash. The commands should not include
+# the beginning colon ':' character; it will be prepended automatically.
+# Note that the decimal command number is used, with commas and then
+# additional commands following. Also note that there must not be any
+# spaces in the commands, and that there must be a space between the
+# command and any trailing backslash.
+#
+# Note that this slash and backslash notation can only be used for the
+# YEI tracker, not to extend the line for all other type of device
+# listed in this configuration file.
+#
+# The device description for the first wireless device using a
+# dongle includes the following arguments:
+# vrpn_YEI_3Space_Sensor_Wireless
+# char name_of_this_device[]
+# int logical_id_on_wireless (0-14)
+# char port_name
+# int baud_rate_of_serial_device
+# int calibrate_gyros_on_startup (0 = no, 1 = yes)
+# int tare_on_startup (0 = no, 1 = yes)
+# double frames_per_second
+# float red_LED_color to set (0-1)
+# float green_LED_color to set (0-1)
+# float blue_LED_color to set (0-1)
+# int LED_mode (0 = standard, 1 = static)
+#
+# If the line ends with a slash character '/', then the following line
+# starts a description of an additional wireless device sharing the
+# same dongle.
+# The device description for an additional wireless device using the
+# same dongle includes the following arguments:
+# vrpn_YEI_3Space_Sensor_Wireless
+# char name_of_this_device[]
+# int logical_id_on_wireless (0-14)
+# int calibrate_gyros_on_startup (0 = no, 1 = yes)
+# int tare_on_startup (0 = no, 1 = yes)
+# double frames_per_second
+# float red_LED_color to set (0-1)
+# float green_LED_color to set (0-1)
+# float blue_LED_color to set (0-1)
+# int LED_mode (0 = standard, 1 = static)
+#
+# Windows example, then mac example, then Linux example. Note: Ports may vary
+# Note: The parser handles converting Windows ports greater than 9 into
+# the correct format, so you can just put the name as COM14 without adding the
+# backslashes.
+# Final example shows how to use an ASCII reset command to set the
+# LED color (it actually just sets it to three different colors,
+# the last being yellow).
+###############################################################################
+
+#vrpn_YEI_3Space_Sensor YEI0 COM7 115200 0 0 200.0 0 0 1 0
+#vrpn_YEI_3Space_Sensor YEI0 /dev/cu.usbmodemfa131 115200 0 0 200.0 0 0 1 0
+#vrpn_YEI_3Space_Sensor YEI0 /dev/ttyACM0 115200 0 0 200.0 0 0 1 0
+
+# Example with extra commands sent. These examples change the LED color
+# to multiple differene ones, ending with yellow.
+#vrpn_YEI_3Space_Sensor YEI0 COM7 115200 0 0 200.0 0 0 1 0 \
+#238,1,1,1 \
+#238,1,0,1 \
+#238,1,1,0
+
+# One sensor on a wireless connection.
+#vrpn_YEI_3Space_Sensor_Wireless YEI0 0 COM5 115200 0 0 200.0 0 0 1 1
+
+# Two sensors on the same wireless transmitter. Note the slash at the end of the
+# final line for the first unit, which indicates that we're talking with the
+# same base unit for a second wireless tracker (which we then don't specify the
+# serial-port name for).
+#vrpn_YEI_3Space_Sensor_Wireless YEI0 0 COM5 115200 0 0 200.0 0 0 1 1 \
+#238,1,1,0 /
+#vrpn_YEI_3Space_Sensor_Wireless YEI1 1 0 0 200.0 0 1 0 1 \
+#238,0,1,1
+
+################################################################################
+# Tracker that does dead-reckoning on orientation based on either reports of
+# angular velocity (if received) or on successive orientation reports.
+# It sends a new prediction report whenever it receives either a tracker pose
+# update or a tracker velocity update.
+# char name_of_this_device[]
+# char name_of_device_to_predict_for[] (start with * for local)
+# int number_of_sensors
+# float how_far_to_predict_in_seconds
+
+#vrpn_Tracker_DeadReckoning_Rotation Tracker1 *Tracker0 2 0.0333
+
+################################################################################
+# OSVR Hacker Dev Kit inertial measurement unit. This is an inertial tracker that
+# gives orientation information, but no position. Position values are always
+# 0. Version 1 of this device sends only poses. Version 2 also sends velocity
+# reports.
+#
+# Arguments:
+# char name_of_this_device[]
+
+#vrpn_Tracker_OSVRHackerDevKit Tracker0
+
+################################################################################
+# Oculus Rift DK1 and DK2. There are two versions of the DK2 driver, which use the
+# same hardware but in two different modes.
+#
+# vrpn_Oculus_DK2_inertial: Oculus DK2 inertial measurement unit only. This
+# provides access to the magnetometer readings on the unit and has a different
+# set of exported values.
+#
+# The LEDs device exports an Analog interface, with the following channels:
+# 0: Uncalibrated temperature (degrees Celsius?)
+# 1: Report ID counter that goes up to 65535 and then cycles back to 0
+# 2: Uncalibrated accelerometer X component (positive to left ear) (m/s/s)
+# 3: Uncalibrated accelerometer Y component (positive down to feet) (m/s/s)
+# 4: Uncalibrated accelerometer Z component (positive forward) (m/s/s)
+# 5: Uncalibrated gyro X component (positive rotating head up) (radians/sec?)
+# 6: Uncalibrated gyro Y component (positive rotating head left) (radians/sec?)
+# 7: Uncalibrated gyro Z component (positive tilting head left) (radians/sec?)
+# 8: Uncalibrated Magnetometer X component (positive to left ear) (varied, asymmetric range)
+# 9: Uncalibrated Magnetometer Y component (positive down to feet) (varied, asymmetric range)
+# 10: Uncalibrated Magnetometer Z component (positive forward) (varied, asymmetric range)
+#
+# vrpn_Oculus_DK2_LEDs: Oculus with LEDs enabled, which would enable reading
+# from its camera to determine position. Note that the program reading from
+# the camera will have to put the camera into synchronous mode using a
+# special command before its results will line up with the LED flashing.
+# NOTE: The VRPN driver does not yet read from the camera, so will not produce
+# position reports with the DK2 in this mode, but an external program could
+# read from the camera to do this (after putting it into synchronous mode).
+#
+# The LEDs device exports an Analog interface, with the following channels:
+# 0: Uncalibrated temperature (degrees Celsius?)
+# 1: Report ID counter that goes up to 65535 and then cycles back to 0
+# 2: Uncalibrated accelerometer X component (positive to left ear) (m/s/s)
+# 3: Uncalibrated accelerometer Y component (positive down to feet) (m/s/s)
+# 4: Uncalibrated accelerometer Z component (positive forward) (m/s/s)
+# 5: Uncalibrated gyro X component (positive rotating head up) (radians/sec?)
+# 6: Uncalibrated gyro Y component (positive rotating head left) (radians/sec?)
+# 7: Uncalibrated gyro Z component (positive tilting head left) (radians/sec?)
+# 8: Uncalibrated Magnetometer X component (positive to left ear) (varied, asymmetric range)
+# 9: Uncalibrated Magnetometer Y component (positive down to feet) (varied, asymmetric range)
+# 10: Uncalibrated Magnetometer Z component (positive forward) (varied, asymmetric range)
+# 11: Time since device power-on (seconds)
+#
+# NOTE: The Oculus drivers may interfere with this raw driver if they are
+# installed on the system.
+#
+# NOTE: A side effect of running this driver is that the HMDI output for the
+# DK2 will become visible to the system if it is plugged in. If it is
+# in DirectMode, it will not appear as a system display. If it is not,
+# it will show up as another display.
+#
+# NOTE: The magnetometer ranges on each axis are different, and they are not
+# symmetric around 0 for any of the axes, so the device needs to have been
+# rotated around a lot to really have an idea of which way is North. A
+# tracker based on this value needs to keep track of the extrema.
+# Also, the magnetic North vector does not point straight along the
+# plane of the ground, but rather into the Earth. Finally, even with a
+# careful calibration there can still be drift/wobble caused by using
+# the magnetometer, so it is recommended to not use it unless true north
+# is needed. The system seems stable in rotation without it.
+#
+# Arguments:
+# char name_of_this_device[]
+
+#vrpn_Oculus_DK1 Oculus0
+#vrpn_Oculus_DK2_inertial Oculus0
+#vrpn_Oculus_DK2_LEDs Oculus0
+
+################################################################################
+# Magnetometer. This is an analog that is intended to be used on top of
+# an analog that reads values from a 3-axis magnetometer.
+# It could be used on top of any analog device, in fact.
+# This device basically takes in analog signals and puts out analog
+# values that are a unit vector.
+# One analog channel is associated with each axis (X, Y, Z)
+# For each axis, the value is scaled to a the correct orientation but the
+# magnitude will be normalized and offset to fit the largest range of values
+# ever received for that axis (self-calibrated).
+# NOTE: The vector will not point perpendicular to gravity.
+# NOTE: The examples below map the axes to the OSVR coordinate system,
+# which has +X pointing from the center of the eyes through the right eye,
+# the +Y axis pointing straight up, and the +Z axis pointing out the back of
+# the user's head.
+#
+# The device exports an Analog interface, with the following channels:
+# 0: X component of normalized, autocalibrated vector
+# 1: Y component of normalized, autocalibrated vector
+# 2: Z component of normalized, autocalibrated vector
+#
+# Arguments:
+# char name_of_this_device[]
+# float update_rate_to_send_analog_reports
+# [one lines follows, describing the X Y Z, with:
+# char name_of_analog_device[] (start with * for local)
+# int x_channel_of_analog_device
+# float x_offset (value ignored)
+# float x_scale
+# int y_channel_of_analog_device
+# float y_offset (value ignored)
+# float y_scale
+# int z_channel_of_analog_device
+# float z_offset (value ignored)
+# float z_scale
+# ]
+
+#vrpn_IMU_Magnetometer Magnetometer0 100.0
+#*Oculus0 8 0 -1.0 9 0 -1.0 10 0 -1.0
+
+#vrpn_IMU_Magnetometer Magnetometer0 100.0
+#*Vality0 6 0 1.0 7 0 1.0 8 0 1.0
+
+################################################################################
+# Inertial-measurement combiner. This is a tracker that combines
+# analog values from inertial measurement units and reports orientation
+# and orientation velocity.
+# The accelerometer scale parameter should be set to produce values that
+# are in meters/second/second. The rotational input scale parameters should
+# be set to produce values that are in radians/second. The magnetometer
+# scale should be set to produce a unit normal vector.
+# One analog device is associated with an accelerometer, one with
+# a rotational linear measurement device, and (optionally) one with
+# a magnetometer.
+# NOTE: The examples below map the axes to the OSVR coordinate system,
+# which has +X pointing from the center of the eyes through the right eye,
+# the +Y axis pointing straight up, and the +Z axis pointing out the back of
+# the user's head.
+#
+# The device exports a Tracker interface with one sensor.
+#
+# Arguments:
+# char name_of_this_device[]
+# float update_rate_to_send_reports
+# [two lines follow, describing the accelerometer and rotational inputs:
+# char name_of_analog_device[] (start with * for local)
+# int x_channel_of_analog_device
+# float x_offset
+# float x_scale
+# int y_channel_of_analog_device
+# float y_offset
+# float y_scale
+# int z_channel_of_analog_device
+# float z_offset
+# float z_scale
+# ]
+# A third following line gives the name of the magnetometer, or the
+# name NULL if one is not used. The name starts with * for a device
+# that should be connected to on the same VRPN connection object
+# being used for the output. For some systems, the magnetometer
+# adds drift/wobble to the orientation estimates, so should not be
+# used unless true north is required.
+
+#vrpn_IMU_SimpleCombiner Tracker0 400.0
+#*Oculus0 2 0 -1.0 3 0 -1.0 4 0 -1.0
+#*Oculus0 5 0 1.0 6 0 1.0 7 0 1.0
+#NULL
+
+#vrpn_IMU_SimpleCombiner Tracker0 400.0
+#*Oculus0 2 0 -1.0 3 0 -1.0 4 0 -1.0
+#*Oculus0 5 0 1.0 6 0 1.0 7 0 1.0
+#*Magnetometer0
+
+#vrpn_IMU_SimpleCombiner Tracker0 400.0
+#*Vality0 1 0 -1.0 0 0 1.0 2 0 1.0
+#*Vality0 4 0 -1.0 3 0 1.0 5 0 1.0
+#NULL
+
+#vrpn_IMU_SimpleCombiner Tracker0 400.0
+#*Vality0 1 0 -1.0 0 0 1.0 2 0 1.0
+#*Vality0 4 0 -1.0 3 0 1.0 5 0 1.0
+#*Magnetometer0
+
+################################################################################
+# nVidia Shield controllers. The only argument is the name of the device to open.
+#
+# The vrpn_nVidia_shield_USB is the original Shield controller, which has a
+# touch-pad mouse, plugged into a USB port.
+# The vrpn_nVidia_shield_stealth_USB is the newer model, which has a tesselated
+# exterior and no touch pad.
+#
+# Note: On a mac, the shield controller sometimes requests shutdown on the machine
+# when it is plugged in, and the volume controls control the volume,
+# and the shield emblem causes it to sleep. The events are still
+# passed through to VRPN. Also on a Mac, the Stealth controller does
+# not present reports to VPRN, so is not useful.
+# On the latest MacOS (11.6.5) the shield controller also does not pass
+# events to VRPN, so it is not useful.
+# Note: On Windows 8.1, this controller's touch pad controls the mouse and
+# its analog events are not passed on to VRPN.
+# On Linux, there are no system controls and all of the events are passed through
+# to VRPN.
+# Note: The rumble outputs are not yet implemented on the Stealth.
+# Note: The mappings are the same for both devices, but the Stealth does
+# not report some (which remain 0/off).
+#
+# Analogs:
+# analog[0] is the left joystick X, -1 to left and 1 to right.
+# analog[1] is the left joystick Y, -1 up and 1 down.
+# analog[2] is the right joystick X, -1 to left and 1 to right.
+# analog[3] is the right joystick Y, -1 up and 1 down.
+# analog[4] is the left finger bumper, 0 unpressed and 1 pressed fully.
+# analog[5] is the right finger bumper, 0 unpressed and 1 pressed fully.
+# analog[6] is the touch pad X axis, lower to left and higher to right
+# (Missing on the stealth)
+# analog[7] is the touch pad Y axis, lower to top and higher to bottom
+# (Missing on the stealth)
+# analog[8] is the hi-hat X position (-1 left, 0 center, 1 right)
+# analog[9] is the hi-hat Y position (-1 up, 0 center, 1 down)
+#
+# Buttons:
+# button[0] A
+# button[1] B
+# button[2] X
+# button[3] Y
+# button[4] Left finger trigger
+# button[5] Right finger trigger
+# button[6] Left joystick pushed down
+# button[7] Right joystick pushed down
+# button[8] Touch pad assembly (including volume control) pressed down
+# (Missing on the stealth)
+# button[9] Play/pause icon touched
+# button[10] Unknown
+# button[11] Right volume control (+) pressed
+# (Left arrow on the stealth)
+# button[12] Left volume control (-) pressed
+# (Circle on the stealth)
+# button[13] Shield emblem touched
+# button[14] Back icon touched
+# button[15] Home icon touched
+# button[16] Hi-hat up pressed (may chord with left/right)
+# button[17] Hi-hat right pressed (may chord with up/down)
+# button[18] Hi-hat down pressed (may chord with left/right)
+# button[19] Hi-hat left pressed (may chord with up/down)
+# button[20] Touch pad touched
+#
+
+#vrpn_nVidia_shield_USB shield0
+#vrpn_nVidia_shield_stealth_USB shield0
+
+################################################################################
+# Adafruit 10DOF IMU I2C controller driver for Raspberry Pi.
+# char name_of_this_device[]
+# char name_of_system_device_to_open[]
+# float update_interval_in_seconds
+#
+# Analogs:
+# analog[0] is the X axis for the accelerometer, in meters/second/second
+# analog[1] is the Y axis for the accelerometer, in meters/second/second
+# analog[2] is the Z axis for the accelerometer, in meters/second/second
+# analog[3] is the X axis for the rate gyro, in radians/second
+# analog[4] is the Y axis for the rate gyro, in radians/second
+# analog[5] is the Z axis for the rate gyro, in radians/second
+# analog[6] is the X axis for the magnetometer, in XXX
+# analog[7] is the Y axis for the magnetometer, in XXX
+# analog[8] is the Z axis for the magnetometer, in XXX
+# analog[9] will be the temperature in Celcius (not impl. as of 7/2016)
+# analog[10] will be the pressure in Pascal (not impl. as of 7/2016)
+# NOTE: This class is not completely implemented as of 7/2016.
+# The accelerometer and gyro may be reading, but they are raw readings.
+
+#vrpn_Adafruit_10DOF Analog0 /dev/i2c-1 10e-3
+
+################################################################################
+# OzzMaker BerryIMUIMU I2C controller driver for Raspberry Pi.
+# char name_of_this_device[]
+# char name_of_system_device_to_open[]
+# float update_interval_in_seconds
+#
+# Analogs:
+# analog[0] is the X axis for the accelerometer, in meters/second/second
+# analog[1] is the Y axis for the accelerometer, in meters/second/second
+# analog[2] is the Z axis for the accelerometer, in meters/second/second
+# analog[3] is the X axis for the rate gyro, in radians/second
+# analog[4] is the Y axis for the rate gyro, in radians/second
+# analog[5] is the Z axis for the rate gyro, in radians/second
+# analog[6] is the X axis for the magnetometer, in Gauss
+# analog[7] is the Y axis for the magnetometer, in Gauss
+# analog[8] is the Z axis for the magnetometer, in Gauss
+# analog[9] will be the temperature in Celcius (not impl. as of 7/2016)
+# analog[10] will be the pressure in Pascal (not impl. as of 7/2016)
+
+#vrpn_OzzMaker_BerryIMU Analog0 /dev/i2c-1 10e-3
+
+# Laputa VR HMD inertial measurement unit. This driver only provides IMU reports
+# via analog and will need to use IMU combiner to get an orientation out of it.
+#
+# Arguments:
+# char name_of_this_device[]
+
+#vrpn_Laputa Laputa0
+
+################################################################################
+# vGlass Vality vGlass head-mounted display.
+# char name_of_this_device[]
+#
+# Analogs:
+# analog[0] is the X axis for the accelerometer, in meters/second/second
+# analog[1] is the Y axis for the accelerometer, in meters/second/second
+# analog[2] is the Z axis for the accelerometer, in meters/second/second
+# analog[3] is the X axis for the rate gyro, in radians/second
+# analog[4] is the Y axis for the rate gyro, in radians/second
+# analog[5] is the Z axis for the rate gyro, in radians/second
+# (As of 7/11/2019, the magnetometer readings are not parsed.)
+# analog[6] is the X axis for the magnetometer, in microTesla
+# analog[7] is the Y axis for the magnetometer, in microTesla
+# analog[8] is the Z axis for the magnetometer, in microTesla
+
+#vrpn_Vality_vGlass Vality0