UnityMol  0.9.6-875
UnityMol viewer / In developement
VRPNGUIController.cs
Go to the documentation of this file.
1 using UnityEngine;
2 using System.Collections;
3 using System.Collections.Generic;
4 using UnityEngine.UI;
5 using System;
6 
7 namespace VRPN
8 {
9  // A GUI controller for the VRPN GUI.
10  // This controller must be instantiated as a component to the top-level canvas/game object of the GUI.
11  public class VRPNGUIController: MonoBehaviour {
12 
13  // The state of the VRPN connections GUI.
14  // It is used during a tool instance selection to restore the GUI widgets values as expected.
16  public string ff_server;
17  public bool ff_server_connected;
18  public string tracker_server;
20  public string buttons_server;
22 
23  public VRPNToolConnections(string ff_server = default(String), bool ff_server_connected = false, string tracker_server = default(String), bool tracker_server_connected = false, string buttons_server = default(String), bool buttons_server_connected = false) {
24  this.ff_server = ff_server;
25  this.ff_server_connected = ff_server_connected;
26  this.tracker_server = tracker_server;
27  this.tracker_server_connected = tracker_server_connected;
28  this.buttons_server = buttons_server;
29  this.buttons_server_connected = buttons_server_connected;
30  }
31  }
32 
33  /*
34  * References to GUI elements.
35  */
38 
39  Dropdown tools_dropdown;
41 
45 
49 
50  // A reference to the globally available VRPN manager.
52 
53  // The index of the currently GUI selected tool.
55 
56  // The list of VRPN connections for each instantiated tool.
57  List<VRPNToolConnections> connections = new List<VRPNToolConnections>();
58 
59  // Find and setup GUI elements in the canvas children.
60  // Set the controller and the associated GUI into the expected state.
61  public void Start() {
62  manager = UnityMolMain.getVRPNManager();
63  current_tool_index = 0;
64 
65  tool_types_dropdown = transform.Find("Tools Canvas/Tools Dropdown").gameObject.GetComponent<Dropdown>();
66  tool_addition_button = transform.Find("Tools Canvas/Tools Addition Button").gameObject.GetComponent<Button>();
67 
68  tools_dropdown = transform.Find("Tools Canvas/Tool Instances Dropdown").gameObject.GetComponent<Dropdown>();
69  tool_deletion_button = transform.Find("Tools Canvas/Tool Deletion Button").gameObject.GetComponent<Button>();
70 
71  tool_ff_server_field = transform.Find("Connections Canvas/FF Server Field").gameObject.GetComponent<InputField>();
72  tool_tracker_server_field = transform.Find("Connections Canvas/Tracker Server Field").gameObject.GetComponent<InputField>();
73  tool_buttons_server_field = transform.Find("Connections Canvas/Buttons Server Field").gameObject.GetComponent<InputField>();
74 
75  tool_ff_server_field.onValueChanged.AddListener(delegate{ResetFieldColorBlock(tool_ff_server_field);});
76  tool_tracker_server_field.onValueChanged.AddListener(delegate{ResetFieldColorBlock(tool_tracker_server_field);});
77  tool_buttons_server_field.onValueChanged.AddListener(delegate{ResetFieldColorBlock(tool_buttons_server_field);});
78 
79  tool_addition_button.onClick.AddListener(() => CreateTool());
80  tools_dropdown.onValueChanged.AddListener((int tool_index) => SelectTool(tool_index));
81  tool_deletion_button.onClick.AddListener(() => DeleteTool());
82 
83  tool_ff_server_toggle = transform.Find("Connections Canvas/FF Server Toggle").gameObject.GetComponent<Toggle>();
84  tool_tracker_server_toggle = transform.Find("Connections Canvas/Tracker Server Toggle").gameObject.GetComponent<Toggle>();
85  tool_buttons_server_toggle = transform.Find("Connections Canvas/Buttons Server Toggle").gameObject.GetComponent<Toggle>();
86 
87  tool_ff_server_toggle.isOn = false;
88  tool_tracker_server_toggle.isOn = false;
89  tool_buttons_server_toggle.isOn = false;
90 
91  tool_ff_server_toggle.onValueChanged.AddListener(ToggleFFServer);
92  tool_tracker_server_toggle.onValueChanged.AddListener(ToggleTrackerServer);
93  tool_buttons_server_toggle.onValueChanged.AddListener(ToggleButtonsServer);
94 
96  }
97 
98  void ResetFieldColorBlock(InputField f) {
99  f.colors = ColorBlock.defaultColorBlock;
100  }
101 
102  void Update() {
103  this.manager.DeviceLoop();
104  }
105 
106  //
107  // Where most of the magic happens.
108  // You will find here a few procedures setting the GUI state as expected and the widget callbacks.
109  // See the "Start()" procedure to find callbacks associations.
110  //
111 
113  tool_ff_server_field.text = c.ff_server;
114  tool_ff_server_toggle.isOn = c.ff_server_connected;
115 
116  tool_tracker_server_field.text = c.tracker_server;
117  tool_tracker_server_toggle.isOn = c.tracker_server_connected;
118 
119  tool_buttons_server_field.text = c.buttons_server;
120  tool_buttons_server_toggle.isOn = c.buttons_server_connected;
121 
122  tool_ff_server_field.interactable = !c.ff_server_connected;
123  tool_tracker_server_field.interactable = !c.tracker_server_connected;
124  tool_buttons_server_field.interactable = !c.buttons_server_connected;
125  }
126 
128  tool_ff_server_field.interactable = true;
129  tool_ff_server_toggle.interactable = true;
130  tool_tracker_server_field.interactable = true;
131  tool_tracker_server_toggle.interactable = true;
132  tool_buttons_server_field.interactable = true;
133  tool_buttons_server_toggle.interactable = true;
134  }
135 
137  tool_ff_server_field.interactable = false;
138  tool_ff_server_toggle.interactable = false;
139  tool_tracker_server_field.interactable = false;
140  tool_tracker_server_toggle.interactable = false;
141  tool_buttons_server_field.interactable = false;
142  tool_buttons_server_toggle.interactable = false;
143  }
144 
146  tool_ff_server_field.text = "";
147  tool_tracker_server_field.text = "";
148  tool_buttons_server_field.text = "";
149  tool_ff_server_toggle.isOn = false;
150  tool_tracker_server_toggle.isOn = false;
151  tool_buttons_server_toggle.isOn = false;
152  }
153 
154  void CreateTool() {
155  VRPNToolType tool_type = (VRPNToolType)Enum.ToObject(typeof(VRPNToolType), tool_types_dropdown.value);
156 
157  int index = manager.InstantiateTool(tool_type);
158 
159  Dropdown.OptionData od = new Dropdown.OptionData();
160  od.text = tool_type.ToString();
161 
162  List<Dropdown.OptionData> lod = new List<Dropdown.OptionData>();
163  lod.Add(od);
164 
165  VRPNToolConnections connection_strings_instance = new VRPNToolConnections(String.Empty, false, String.Empty, false, String.Empty, false);
166  connections.Add(connection_strings_instance);
167 
168  tools_dropdown.AddOptions(lod);
169 
170  tool_deletion_button.interactable = true;
171 
173 
174  SelectTool(index);
175 
176  tools_dropdown.value = index;
177  }
178 
179  void DeleteTool() {
180  int current_tool = tools_dropdown.value;
181 
182  tools_dropdown.options.RemoveAt(current_tool);
183 
184  connections.RemoveAt(current_tool);
185 
186  tools_dropdown.value = 0;
187 
188  if (tools_dropdown.options.Count == 0)
189  {
192  tools_dropdown.ClearOptions();
193  tool_deletion_button.interactable = false;
194  }
195 
196  manager.RemoveTool(current_tool);
197  }
198 
199  void SelectTool(int tool_index) {
200  Debug.Log("Tool Selection Callback");
201  Debug.Log("Selected tool: " + tool_index);
202 
203  current_tool_index = tool_index;
204 
205  VRPNToolConnections c = connections[tool_index];
206 
207  tool_ff_server_field.text = c.ff_server;
208  tool_tracker_server_field.text = c.tracker_server;
209  tool_buttons_server_field.text = c.buttons_server;
210 
212 
214  }
215 
216  void ToggleFFServer(bool isOn) {
217  // This callback gets called even when setting the GUI state programmatically.
218  // It thus can be executed when there is no tool instance, so no connections.
219  VRPNToolConnections current_c;
220  try {
221  current_c = connections[current_tool_index];
222  }
223  catch (ArgumentOutOfRangeException) {
224  return;
225  }
226 
227  if (isOn) {
228  current_c.ff_server = tool_ff_server_field.text;
229  current_c.ff_server_connected = true;
230 
231  connections[current_tool_index] = current_c;
232 
233  ConnectToFFServer(current_tool_index);
234  }
235  else {
236  current_c.ff_server_connected = false;
237 
238  connections[current_tool_index] = current_c;
239 
240  DisconnectFromFFServer(current_tool_index);
241  }
242  }
243 
244  void ToggleTrackerServer(bool isOn) {
245  // This callback gets called even when setting the GUI state programmatically.
246  // It thus can be executed when there is no tool instance, so no connections.
247  VRPNToolConnections current_c;
248  try {
249  current_c = connections[current_tool_index];
250  }
251  catch (ArgumentOutOfRangeException) {
252  return;
253  }
254 
255  if (isOn) {
256  current_c.tracker_server = tool_tracker_server_field.text;
257  current_c.tracker_server_connected = true;
258 
259  connections[current_tool_index] = current_c;
260 
261  ConnectToTrackerServer(current_tool_index);
262  }
263  else {
264  current_c.tracker_server_connected = false;
265 
266  connections[current_tool_index] = current_c;
267 
268  DisconnectFromTrackerServer(current_tool_index);
269  }
270  }
271 
272  void ToggleButtonsServer(bool isOn) {
273  // This callback gets called even when setting the GUI state programmatically.
274  // It thus can be executed when there is no tool instance, so no connections.
275  VRPNToolConnections current_c;
276  try {
277  current_c = connections[current_tool_index];
278  }
279  catch (ArgumentOutOfRangeException) {
280  return;
281  }
282 
283  if (isOn) {
284  current_c.buttons_server = tool_buttons_server_field.text;
285  current_c.tracker_server_connected = true;
286 
287  connections[current_tool_index] = current_c;
288 
289  ConnectToButtonsServer(current_tool_index);
290  }
291  else {
292  current_c.tracker_server_connected = false;
293 
294  connections[current_tool_index] = current_c;
295 
296  DisconnectFromButtonsServer(current_tool_index);
297  }
298  }
299 
300  void ConnectToFFServer(int tool_index) {
301  Debug.Log("ConnectToFFServer");
302  bool result = manager.ConnectToolToForceFeedback(tool_index, tool_ff_server_field.text);
303  if (result == false) {
304  ColorBlock cb = tool_ff_server_field.colors;
305  cb.normalColor = new Color(1f, 0.4f, 0.4f);
306  cb.highlightedColor = new Color(1f, 0.4f, 0.4f);
307  tool_ff_server_field.colors = cb;
308  tool_ff_server_toggle.isOn = false;
309  } else {
310  tool_ff_server_field.interactable = false;
311  }
312  }
313 
314  void ConnectToTrackerServer(int tool_index) {
315  Debug.Log("ConnectToTrackerServer");
316  bool result = manager.ConnectToolToTracker(tool_index, tool_tracker_server_field.text);
317  if (result == false) {
318  ColorBlock cb = tool_tracker_server_field.colors;
319  cb.normalColor = new Color(1f, 0.4f, 0.4f);
320  cb.highlightedColor = new Color(1f, 0.4f, 0.4f);
321  tool_tracker_server_field.colors = cb;
322  tool_tracker_server_toggle.isOn = false;
323  } else {
324  tool_tracker_server_field.interactable = false;
325  }
326  }
327 
328  void ConnectToButtonsServer(int tool_index) {
329  Debug.Log("ConnectToButtonServer");
330  bool result = manager.ConnectToolToButtons(tool_index, tool_buttons_server_field.text);
331  if (result == false) {
332  ColorBlock cb = tool_buttons_server_field.colors;
333  cb.normalColor = new Color(1f, 0.4f, 0.4f);
334  cb.highlightedColor = new Color(1f, 0.4f, 0.4f);
335  tool_buttons_server_field.colors = cb;
336  tool_buttons_server_toggle.isOn = false;
337  } else {
338  tool_buttons_server_field.interactable = false;
339  }
340  }
341 
342  void DisconnectFromFFServer(int tool_index) {
343  Debug.Log("DisconnectFromFFServer");
344  tool_ff_server_field.interactable = true;
345  manager.DisconnectToolFromForceFeedback(tool_index);
346  }
347 
348  void DisconnectFromTrackerServer(int tool_index) {
349  Debug.Log("DisconnectFromTrackerServer");
350  tool_tracker_server_field.interactable = true;
351  Debug.Log(manager.DisconnectToolFromTracker(tool_index));
352  }
353 
354  void DisconnectFromButtonsServer(int tool_index) {
355  Debug.Log("DisconnectFromButtonsServer");
356  tool_buttons_server_field.interactable = true;
357  manager.DisconnectToolFromButtons(tool_index);
358  }
359  }
360 
361 }
void ToggleFFServer(bool isOn)
bool DisconnectToolFromTracker(int tool_instance_index)
Definition: VRPNManager.cs:458
InputField tool_tracker_server_field
bool ConnectToolToTracker(int tool_instance_index, string vrpn_device)
Definition: VRPNManager.cs:366
void ToggleTrackerServer(bool isOn)
void DisconnectFromTrackerServer(int tool_index)
static VRPN.VRPNManager getVRPNManager()
Definition: UnityMolMain.cs:58
void ResetFieldColorBlock(InputField f)
void ConnectToButtonsServer(int tool_index)
bool ConnectToolToForceFeedback(int tool_instance_index, string vrpn_device)
Definition: VRPNManager.cs:333
bool RemoveTool(int tool_instance_index)
Definition: VRPNManager.cs:272
void ToggleButtonsServer(bool isOn)
VRPNToolType
Definition: VRPNManager.cs:16
List< VRPNToolConnections > connections
bool DisconnectToolFromButtons(int tool_instance_index)
Definition: VRPNManager.cs:478
void ConnectToFFServer(int tool_index)
int InstantiateTool(VRPNToolType tool_type)
Definition: VRPNManager.cs:223
void DisconnectFromFFServer(int tool_index)
bool ConnectToolToButtons(int tool_instance_index, string vrpn_device)
Definition: VRPNManager.cs:401
void SelectTool(int tool_index)
VRPNToolConnections(string ff_server=default(String), bool ff_server_connected=false, string tracker_server=default(String), bool tracker_server_connected=false, string buttons_server=default(String), bool buttons_server_connected=false)
bool DisconnectToolFromForceFeedback(int tool_instance_index)
Definition: VRPNManager.cs:436
void RestoreToolConnectionsState(VRPNToolConnections c)
InputField tool_buttons_server_field
void ConnectToTrackerServer(int tool_index)
void DisconnectFromButtonsServer(int tool_index)