summaryrefslogtreecommitdiffstats
path: root/dom/gamepad/GamepadRemapping.h
blob: 0a508fe1349125d79910e682e83e132bc63105c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_GamepadRemapping_h_
#define mozilla_dom_GamepadRemapping_h_

#include "mozilla/dom/GamepadBinding.h"
#include "mozilla/dom/GamepadLightIndicator.h"
#include "mozilla/dom/GamepadPoseState.h"
#include "mozilla/dom/GamepadTouchState.h"

namespace mozilla::dom {

// GamepadId is (vendorId << 16) | productId)
enum class GamepadId : uint32_t {
  // Nexus Player Controller
  kAsusTekProduct4500 = 0x0b054500,
  // 2Axes 8Keys Game Pad
  kDragonRiseProduct0011 = 0x00790011,
  // ADT-1 Controller
  kGoogleProduct2c40 = 0x18d12c40,
  // Stadia Controller
  kGoogleProduct9400 = 0x18d19400,
  // Logitech F310, D-mode
  kLogitechProductc216 = 0x046dc216,
  // Logitech F510, D-mode
  kLogitechProductc218 = 0x046dc218,
  // Logitech F710, D-mode
  kLogitechProductc219 = 0x046dc219,
  // Microsoft Xbox 360
  kMicrosoftProductXbox360 = 0x045e028e,
  // Microsoft Xbox 360 Wireless
  kMicrosoftProductXbox360Wireless = 0x045e028f,
  // Microsoft Xbox 360 Wireless
  kMicrosoftProductXbox360Wireless2 = 0x045e0719,
  // Microsoft Xbox One 2013
  kMicrosoftProductXbox2013 = 0x045e02d1,
  // Microsoft Xbox One (2015 FW)
  kMicrosoftProductXbox2015 = 0x045e02dd,
  // Microsoft Xbox One S
  kMicrosoftProductXboxOneS = 0x045e02ea,
  // Microsoft Xbox One S Wireless
  kMicrosoftProductXboxOneSWireless = 0x045e02e0,
  // Microsoft Xbox One Elite
  kMicrosoftProductXboxOneElite = 0x045e02e3,
  // Microsoft Xbox One Elite 2
  kMicrosoftProductXboxOneElite2 = 0x045e0b00,
  // Microsoft Xbox One Elite 2 Wireless
  kMicrosoftProductXboxOneElite2Wireless = 0x045e0b05,
  // Xbox One S Wireless (2016 FW)
  kMicrosoftProductXboxOneSWireless2016 = 0x045e02fd,
  // Microsoft Xbox Adaptive
  kMicrosoftProductXboxAdaptive = 0x045e0b0a,
  // Microsoft Xbox Adaptive Wireless
  kMicrosoftProductXboxAdaptiveWireless = 0x045e0b0c,
  // Microsoft Xbox Series X Wireless
  kMicrosoftProductXboxSeriesXWireless = 0x045e0b13,
  // Switch Joy-Con L
  kNintendoProduct2006 = 0x057e2006,
  // Switch Joy-Con R
  kNintendoProduct2007 = 0x057e2007,
  // Switch Pro Controller
  kNintendoProduct2009 = 0x057e2009,
  // Switch Charging Grip
  kNintendoProduct200e = 0x057e200e,
  // Nvidia Shield gamepad (2015)
  kNvidiaProduct7210 = 0x09557210,
  // Nvidia Shield gamepad (2017)
  kNvidiaProduct7214 = 0x09557214,
  // iBuffalo Classic
  kPadixProduct2060 = 0x05832060,
  // XSkills Gamecube USB adapter
  kPlayComProduct0005 = 0x0b430005,
  // boom PSX+N64 USB Converter
  kPrototypeVendorProduct0667 = 0x66660667,
  // Analog game controller
  kPrototypeVendorProduct9401 = 0x66669401,
  // Razer Serval Controller
  kRazer1532Product0900 = 0x15320900,
  // Playstation 3 Controller
  kSonyProduct0268 = 0x054c0268,
  // Playstation Dualshock 4
  kSonyProduct05c4 = 0x054c05c4,
  // Dualshock 4 (PS4 Slim)
  kSonyProduct09cc = 0x054c09cc,
  // Dualshock 4 USB receiver
  kSonyProduct0ba0 = 0x054c0ba0,
  // Moga Pro Controller (HID mode)
  kVendor20d6Product6271 = 0x20d66271,
  // OnLive Controller (Bluetooth)
  kVendor2378Product1008 = 0x23781008,
  // OnLive Controller (Wired)
  kVendor2378Product100a = 0x2378100a,
  // OUYA Controller
  kVendor2836Product0001 = 0x28360001,
};

// Follow the canonical ordering recommendation for the "Standard Gamepad"
// from https://www.w3.org/TR/gamepad/#remapping.
enum CanonicalButtonIndex {
  BUTTON_INDEX_PRIMARY,
  BUTTON_INDEX_SECONDARY,
  BUTTON_INDEX_TERTIARY,
  BUTTON_INDEX_QUATERNARY,
  BUTTON_INDEX_LEFT_SHOULDER,
  BUTTON_INDEX_RIGHT_SHOULDER,
  BUTTON_INDEX_LEFT_TRIGGER,
  BUTTON_INDEX_RIGHT_TRIGGER,
  BUTTON_INDEX_BACK_SELECT,
  BUTTON_INDEX_START,
  BUTTON_INDEX_LEFT_THUMBSTICK,
  BUTTON_INDEX_RIGHT_THUMBSTICK,
  BUTTON_INDEX_DPAD_UP,
  BUTTON_INDEX_DPAD_DOWN,
  BUTTON_INDEX_DPAD_LEFT,
  BUTTON_INDEX_DPAD_RIGHT,
  BUTTON_INDEX_META,
  BUTTON_INDEX_COUNT
};

enum CanonicalAxisIndex {
  AXIS_INDEX_LEFT_STICK_X,
  AXIS_INDEX_LEFT_STICK_Y,
  AXIS_INDEX_RIGHT_STICK_X,
  AXIS_INDEX_RIGHT_STICK_Y,
  AXIS_INDEX_COUNT
};

static inline bool AxisNegativeAsButton(double input) { return input < -0.5; }

static inline bool AxisPositiveAsButton(double input) { return input > 0.5; }

class GamepadRemapper {
  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GamepadRemapper)

 public:
  virtual uint32_t GetAxisCount() const = 0;
  virtual uint32_t GetButtonCount() const = 0;
  virtual uint32_t GetLightIndicatorCount() const { return 0; }
  virtual void GetLightIndicators(
      nsTArray<GamepadLightIndicatorType>& aTypes) const {}
  virtual uint32_t GetTouchEventCount() const { return 0; }
  virtual void GetLightColorReport(uint8_t aRed, uint8_t aGreen, uint8_t aBlue,
                                   std::vector<uint8_t>& aReport) const {}
  virtual uint32_t GetMaxInputReportLength() const { return 0; }

  virtual void SetAxisCount(uint32_t aButtonCount) {}
  virtual void SetButtonCount(uint32_t aButtonCount) {}
  virtual GamepadMappingType GetMappingType() const {
    return GamepadMappingType::Standard;
  }
  virtual void ProcessTouchData(GamepadHandle aHandle, void* aInput) {}
  virtual void RemapAxisMoveEvent(GamepadHandle aHandle, uint32_t aAxis,
                                  double aValue) const = 0;
  virtual void RemapButtonEvent(GamepadHandle aHandle, uint32_t aButton,
                                bool aPressed) const = 0;

 protected:
  GamepadRemapper() = default;
  virtual ~GamepadRemapper() = default;
};

struct GamepadRemappingData {
  GamepadId id;
  RefPtr<GamepadRemapper> remapping;
};

already_AddRefed<GamepadRemapper> GetGamepadRemapper(const uint16_t aVendorId,
                                                     const uint16_t aProductId,
                                                     bool& aUsingDefault);

}  // namespace mozilla::dom

#endif  // mozilla_dom_GamepadRemapping_h_