AR Design
UBC EML collab with UBC SALA - visualizing IoT data in AR
XboxControllerHandlerBase.cs
Go to the documentation of this file.
1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // Licensed under the MIT License. See LICENSE in the project root for license information.
3 
4 using System;
5 using System.Collections;
6 using UnityEngine;
7 
8 namespace HoloToolkit.Unity.InputModule
9 {
11  {
12  protected enum GestureState
13  {
14  SelectButtonUnpressed,
15  SelectButtonPressed,
16  NavigationStarted,
17  HoldStarted
18  }
19 
20  [SerializeField]
21  [Tooltip("Elapsed time for hold started gesture in seconds.")]
22  protected float HoldStartedInterval = 2.0f;
23 
24  [SerializeField]
25  [Tooltip("Elapsed time for hold completed gesture in seconds.")]
26  protected float HoldCompletedInterval = 3.0f;
27 
28  [SerializeField]
29  [Tooltip("The action button that is used to select. Analogous to air tap on HoloLens and trigger press with motion controllers.")]
31 
32  [SerializeField]
33  [Tooltip("The Horizontal Axis that navigation events take place")]
34  protected XboxControllerMappingTypes HorizontalNavigationAxis = XboxControllerMappingTypes.XboxLeftStickHorizontal;
35 
36  [Tooltip("The Vertical Axis that navigation events take place")]
37  protected XboxControllerMappingTypes VerticalNavigationAxis = XboxControllerMappingTypes.XboxLeftStickVertical;
38 
39  protected GestureState CurrentGestureState = GestureState.SelectButtonUnpressed;
40 
41  protected Vector3 NormalizedOffset;
42 
43  protected Coroutine HoldStartedRoutine;
44 
45  public virtual void OnXboxInputUpdate(XboxControllerEventData eventData)
46  {
47  if (string.IsNullOrEmpty(GamePadName))
48  {
49  GamePadName = eventData.GamePadName;
50  }
51 
52  if (XboxControllerMapping.GetButton_Down(SelectButton, eventData))
53  {
54  CurrentGestureState = GestureState.SelectButtonPressed;
55 
56  InputManager.Instance.RaiseSourceDown(eventData.InputSource, eventData.SourceId, InteractionSourcePressInfo.Select);
57 
58  HoldStartedRoutine = StartCoroutine(HandleHoldStarted(eventData));
59  }
60 
61  if (XboxControllerMapping.GetButton_Pressed(SelectButton, eventData))
62  {
63  HandleNavigation(eventData);
64  }
65 
66  if (XboxControllerMapping.GetButton_Up(SelectButton, eventData))
67  {
68  HandleSelectButtonReleased(eventData);
69  }
70 
71  // Consume this event
72  eventData.Use();
73  }
74 
75  protected virtual void HandleSelectButtonReleased(XboxControllerEventData eventData)
76  {
77  InputManager.Instance.RaiseSourceUp(eventData.InputSource, eventData.SourceId, InteractionSourcePressInfo.Select);
78 
79  if (HoldStartedRoutine != null)
80  {
81  StopCoroutine(HoldStartedRoutine);
82  }
83 
84  switch (CurrentGestureState)
85  {
86  case GestureState.NavigationStarted:
87  InputManager.Instance.RaiseNavigationCompleted(eventData.InputSource, eventData.SourceId, Vector3.zero);
88  break;
89  case GestureState.HoldStarted:
90  InputManager.Instance.RaiseHoldCompleted(eventData.InputSource, eventData.SourceId);
91  break;
92  default:
93  InputManager.Instance.RaiseInputClicked(eventData.InputSource, eventData.SourceId, InteractionSourcePressInfo.Select, 1);
94  break;
95  }
96 
97  CurrentGestureState = GestureState.SelectButtonUnpressed;
98  }
99 
100  protected virtual IEnumerator HandleHoldStarted(XboxControllerEventData eventData)
101  {
102  yield return new WaitForSeconds(HoldStartedInterval);
103 
104  if (CurrentGestureState == GestureState.HoldStarted || CurrentGestureState == GestureState.NavigationStarted)
105  {
106  yield break;
107  }
108 
109  CurrentGestureState = GestureState.HoldStarted;
110 
111  InputManager.Instance.RaiseHoldStarted(eventData.InputSource, eventData.SourceId);
112  }
113 
114  protected virtual void HandleNavigation(XboxControllerEventData eventData)
115  {
116  float displacementAlongX = XboxControllerMapping.GetAxis(HorizontalNavigationAxis, eventData);
117  float displacementAlongY = XboxControllerMapping.GetAxis(VerticalNavigationAxis, eventData);
118 
119  if (displacementAlongX == 0.0f && displacementAlongY == 0.0f && CurrentGestureState != GestureState.NavigationStarted) { return; }
120 
121  NormalizedOffset.x = displacementAlongX;
122  NormalizedOffset.y = displacementAlongY;
123  NormalizedOffset.z = 0f;
124 
125  if (CurrentGestureState != GestureState.NavigationStarted)
126  {
127  if (CurrentGestureState == GestureState.HoldStarted)
128  {
129  InputManager.Instance.RaiseHoldCanceled(eventData.InputSource, eventData.SourceId);
130  }
131 
132  CurrentGestureState = GestureState.NavigationStarted;
133 
134  // Raise navigation started event.
135  InputManager.Instance.RaiseNavigationStarted(eventData.InputSource, eventData.SourceId);
136  }
137  else
138  {
139  // Raise navigation updated event.
140  InputManager.Instance.RaiseNavigationUpdated(eventData.InputSource, eventData.SourceId, NormalizedOffset);
141  }
142  }
143 
144  [Obsolete("Use XboxControllerMapping.GetButton_Up")]
145  protected static bool OnButton_Up(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
146  {
147  return XboxControllerMapping.GetButton_Up(buttonType, eventData);
148  }
149 
150  [Obsolete("Use XboxControllerMapping.GetButton_Pressed")]
151  protected static bool OnButton_Pressed(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
152  {
153  return XboxControllerMapping.GetButton_Pressed(buttonType, eventData);
154  }
155 
156  [Obsolete("Use XboxControllerMapping.GetButton_Down")]
157  protected static bool OnButton_Down(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
158  {
159  return XboxControllerMapping.GetButton_Down(buttonType, eventData);
160  }
161  }
162 }
virtual void HandleNavigation(XboxControllerEventData eventData)
Input Manager is responsible for managing input sources and dispatching relevant events to the approp...
Definition: InputManager.cs:19
uint SourceId
The id of the source the event is from, for instance the hand id.
Defines the controller mapping for the input source.
static float GetAxis(XboxControllerMappingTypes axisType, XboxControllerEventData eventData)
static bool GetButton_Pressed(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
static bool GetButton_Down(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
IInputSource InputSource
The source the input event originates from.
static bool OnButton_Pressed(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
virtual void HandleSelectButtonReleased(XboxControllerEventData eventData)
static T Instance
Returns the Singleton instance of the classes type. If no instance is found, then we search for an in...
Definition: Singleton.cs:26
static bool OnButton_Up(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
virtual void OnXboxInputUpdate(XboxControllerEventData eventData)
static bool OnButton_Down(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
XboxControllerMappingTypes
Xbox Controller axis and button types.
static bool GetButton_Up(XboxControllerMappingTypes buttonType, XboxControllerEventData eventData)
virtual IEnumerator HandleHoldStarted(XboxControllerEventData eventData)