AR Design
UBC EML collab with UBC SALA - visualizing IoT data in AR
XboxControllerInputSource.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.Generic;
6 using UnityEngine;
7 
8 namespace HoloToolkit.Unity.InputModule
9 {
16  {
17  [Serializable]
18  private class MappingEntry
19  {
21  public string Value = string.Empty;
22  }
23 
24  private readonly Dictionary<uint, XboxControllerData> gamePadInputDatas = new Dictionary<uint, XboxControllerData>(0);
25 
26  private XboxControllerData controllerData;
27 
28  public XboxControllerMappingTypes HorizontalAxis { get { return horizontalAxis; } }
29  public XboxControllerMappingTypes VerticalAxis { get { return verticalAxis; } }
30  public XboxControllerMappingTypes CancelButton { get { return cancelButton; } }
31  public XboxControllerMappingTypes SubmitButton { get { return submitButton; } }
32 
33  [SerializeField]
34  private XboxControllerMappingTypes horizontalAxis = XboxControllerMappingTypes.XboxDpadHorizontal;
35 
36  [SerializeField]
37  private XboxControllerMappingTypes verticalAxis = XboxControllerMappingTypes.XboxDpadVertical;
38 
39  [SerializeField]
40  private XboxControllerMappingTypes submitButton = XboxControllerMappingTypes.XboxA;
41 
42  [SerializeField]
43  private XboxControllerMappingTypes cancelButton = XboxControllerMappingTypes.XboxB;
44 
45  [SerializeField]
46  private MappingEntry[] mapping = null;
47 
48  private int motionControllerCount = 0;
49 
50  protected override void Awake()
51  {
52  base.Awake();
53 
54  if (mapping != null)
55  {
56  for (var i = 0; i < Enum.GetNames(typeof(XboxControllerMappingTypes)).Length; i++)
57  {
59  }
60  }
61 
62  PreviousForceActiveState = InputModule.forceModuleActive;
63  PreviousHorizontalAxis = InputModule.horizontalAxis;
64  PreviousVerticalAxis = InputModule.verticalAxis;
65  PreviousSubmitButton = InputModule.submitButton;
66  PreviousCancelButton = InputModule.cancelButton;
67  }
68 
69  protected override void Update()
70  {
71  base.Update();
72 
73  // We will only register the first device we find. Input is taken from joystick 1.
74  // If we have motion controllers connected we will not process Xbox controller input.
75  if (gamePadInputDatas.Count != 1 || motionControllerCount > 0) { return; }
76 
77  controllerData.XboxLeftStickHorizontalAxis = Input.GetAxis(XboxControllerMapping.XboxLeftStickHorizontal);
78  controllerData.XboxLeftStickVerticalAxis = Input.GetAxis(XboxControllerMapping.XboxLeftStickVertical);
79  controllerData.XboxRightStickHorizontalAxis = Input.GetAxis(XboxControllerMapping.XboxRightStickHorizontal);
80  controllerData.XboxRightStickVerticalAxis = Input.GetAxis(XboxControllerMapping.XboxRightStickVertical);
81  controllerData.XboxDpadHorizontalAxis = Input.GetAxis(XboxControllerMapping.XboxDpadHorizontal);
82  controllerData.XboxDpadVerticalAxis = Input.GetAxis(XboxControllerMapping.XboxDpadVertical);
83  controllerData.XboxLeftTriggerAxis = Input.GetAxis(XboxControllerMapping.XboxLeftTrigger);
84  controllerData.XboxRightTriggerAxis = Input.GetAxis(XboxControllerMapping.XboxRightTrigger);
85  controllerData.XboxSharedTriggerAxis = Input.GetAxis(XboxControllerMapping.XboxSharedTrigger);
86 
87  controllerData.XboxA_Down = Input.GetButtonDown(XboxControllerMapping.XboxA);
88  controllerData.XboxB_Down = Input.GetButtonDown(XboxControllerMapping.XboxB);
89  controllerData.XboxX_Down = Input.GetButtonDown(XboxControllerMapping.XboxX);
90  controllerData.XboxY_Down = Input.GetButtonDown(XboxControllerMapping.XboxY);
91  controllerData.XboxView_Down = Input.GetButtonDown(XboxControllerMapping.XboxView);
92  controllerData.XboxMenu_Down = Input.GetButtonDown(XboxControllerMapping.XboxMenu);
93  controllerData.XboxLeftBumper_Down = Input.GetButtonDown(XboxControllerMapping.XboxLeftBumper);
94  controllerData.XboxRightBumper_Down = Input.GetButtonDown(XboxControllerMapping.XboxRightBumper);
95  controllerData.XboxLeftStick_Down = Input.GetButtonDown(XboxControllerMapping.XboxLeftStickClick);
96  controllerData.XboxRightStick_Down = Input.GetButtonDown(XboxControllerMapping.XboxRightStickClick);
97 
98  controllerData.XboxA_Pressed = Input.GetButton(XboxControllerMapping.XboxA);
99  controllerData.XboxB_Pressed = Input.GetButton(XboxControllerMapping.XboxB);
100  controllerData.XboxX_Pressed = Input.GetButton(XboxControllerMapping.XboxX);
101  controllerData.XboxY_Pressed = Input.GetButton(XboxControllerMapping.XboxY);
102  controllerData.XboxView_Pressed = Input.GetButton(XboxControllerMapping.XboxView);
103  controllerData.XboxMenu_Pressed = Input.GetButton(XboxControllerMapping.XboxMenu);
104  controllerData.XboxLeftBumper_Pressed = Input.GetButton(XboxControllerMapping.XboxLeftBumper);
105  controllerData.XboxRightBumper_Pressed = Input.GetButton(XboxControllerMapping.XboxRightBumper);
106  controllerData.XboxLeftStick_Pressed = Input.GetButton(XboxControllerMapping.XboxLeftStickClick);
107  controllerData.XboxRightStick_Pressed = Input.GetButton(XboxControllerMapping.XboxRightStickClick);
108 
109  controllerData.XboxA_Up = Input.GetButtonUp(XboxControllerMapping.XboxA);
110  controllerData.XboxB_Up = Input.GetButtonUp(XboxControllerMapping.XboxB);
111  controllerData.XboxX_Up = Input.GetButtonUp(XboxControllerMapping.XboxX);
112  controllerData.XboxY_Up = Input.GetButtonUp(XboxControllerMapping.XboxY);
113  controllerData.XboxView_Up = Input.GetButtonUp(XboxControllerMapping.XboxView);
114  controllerData.XboxMenu_Up = Input.GetButtonUp(XboxControllerMapping.XboxMenu);
115  controllerData.XboxLeftBumper_Up = Input.GetButtonUp(XboxControllerMapping.XboxLeftBumper);
116  controllerData.XboxRightBumper_Up = Input.GetButtonUp(XboxControllerMapping.XboxRightBumper);
117  controllerData.XboxLeftStick_Up = Input.GetButtonUp(XboxControllerMapping.XboxLeftStickClick);
118  controllerData.XboxRightStick_Up = Input.GetButtonUp(XboxControllerMapping.XboxRightStickClick);
119 
120  InputManager.Instance.RaiseXboxInputUpdate(this, SourceId, controllerData);
121  }
122 
123  protected override void RefreshDevices()
124  {
125  var joystickNames = Input.GetJoystickNames();
126 
127  if (joystickNames.Length <= 0) { return; }
128 
129  bool devicesChanged = LastDeviceList == null;
130 
131  if (LastDeviceList != null && joystickNames.Length == LastDeviceList.Length)
132  {
133  for (int i = 0; i < LastDeviceList.Length; i++)
134  {
135  if (!joystickNames[i].Equals(LastDeviceList[i]))
136  {
137  devicesChanged = true;
138  if (LastDeviceList == null)
139  {
140  LastDeviceList = joystickNames;
141  }
142  }
143  }
144  }
145 
146  if (LastDeviceList != null && devicesChanged)
147  {
148  foreach (var gamePadInputSource in gamePadInputDatas)
149  {
150  InputManager.Instance.RaiseSourceLost(this, gamePadInputSource.Key);
151  }
152 
153  gamePadInputDatas.Clear();
154 
155  if (gamePadInputDatas.Count == 0)
156  {
157  // Reset our input module to it's previous state.
158  InputModule.forceModuleActive = PreviousForceActiveState;
159  InputModule.verticalAxis = PreviousVerticalAxis;
160  InputModule.horizontalAxis = PreviousHorizontalAxis;
161  InputModule.submitButton = PreviousSubmitButton;
162  InputModule.cancelButton = PreviousCancelButton;
163  }
164  }
165 
166  motionControllerCount = 0;
167 
168  for (var i = 0; i < joystickNames.Length; i++)
169  {
170  if (joystickNames[i].Contains(MotionControllerLeft) ||
171  joystickNames[i].Contains(MotionControllerRight))
172  {
173  // If we don't have any matching joystick types, continue.
174  // If we have motion controllers connected we override the xbox input.
175  motionControllerCount++;
176  continue;
177  }
178 
179  if (joystickNames[i].Contains(XboxController) ||
180  joystickNames[i].Contains(XboxOneForWindows) ||
181  joystickNames[i].Contains(XboxBluetoothGamePad) ||
182  joystickNames[i].Contains(XboxWirelessController))
183  {
184  // We will only register the first device we find. Input is taken from all joysticks.
185  if (gamePadInputDatas.Count != 0) { return; }
186 
187  SourceId = (uint)i;
188  controllerData = new XboxControllerData { GamePadName = joystickNames[i] };
189  gamePadInputDatas.Add(SourceId, controllerData);
190 
191  InputManager.Instance.RaiseSourceDetected(this, SourceId);
192 
193  // Setup the Input Module to use our custom axis settings.
194  InputModule.forceModuleActive = true;
195 
196  if (verticalAxis != XboxControllerMappingTypes.None)
197  {
198  InputModule.verticalAxis = XboxControllerMapping.GetMapping(verticalAxis);
199  }
200 
201  if (horizontalAxis != XboxControllerMappingTypes.None)
202  {
203  InputModule.horizontalAxis = XboxControllerMapping.GetMapping(horizontalAxis);
204  }
205 
206  if (submitButton != XboxControllerMappingTypes.None)
207  {
208  InputModule.submitButton = XboxControllerMapping.GetMapping(submitButton);
209  }
210 
211  if (cancelButton != XboxControllerMappingTypes.None)
212  {
213  InputModule.cancelButton = XboxControllerMapping.GetMapping(cancelButton);
214  }
215  }
216  }
217 
218  LastDeviceList = joystickNames;
219  LastDeviceUpdateCount = joystickNames.Length;
220  }
221  }
222 }
Input Manager is responsible for managing input sources and dispatching relevant events to the approp...
Definition: InputManager.cs:19
Defines the controller mapping for the input source.
static string GetMapping(XboxControllerMappingTypes type)
Data class that carries the input data for the event handler.
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
XboxControllerMappingTypes
Xbox Controller axis and button types.
static void SetMapping(XboxControllerMappingTypes type, string value)