29950badbd7e0508f37b8b3557efa0e0e68968e8
[WebKit-https.git] / Source / WebCore / platform / gamepad / cocoa / GameControllerGamepad.mm
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 #include "config.h"
26 #include "GameControllerGamepad.h"
27
28 #if ENABLE(GAMEPAD) && (defined(__LP64__) || PLATFORM(IOS))
29 #include "GameControllerGamepadProvider.h"
30 #include <GameController/GameController.h>
31 #include <wtf/CurrentTime.h>
32
33 namespace WebCore {
34
35 GameControllerGamepad::GameControllerGamepad(GCController *controller, unsigned index)
36     : PlatformGamepad(index)
37     , m_gcController(controller)
38 {
39     ASSERT(index < 4);
40     controller.playerIndex = (GCControllerPlayerIndex)(GCControllerPlayerIndex1 + index);
41
42     m_extendedGamepad = controller.extendedGamepad;
43     if (!m_extendedGamepad)
44         m_gamepad = controller.gamepad;
45
46     ASSERT(m_extendedGamepad || m_gamepad);
47
48     if (m_extendedGamepad)
49         setupAsExtendedGamepad();
50     else
51         setupAsGamepad();
52 }
53
54 void GameControllerGamepad::setupAsExtendedGamepad()
55 {
56     ASSERT(m_extendedGamepad);
57
58     m_id = makeString(String(m_gcController.get().vendorName), ASCIILiteral(" Extended Gamepad"));
59
60     m_extendedGamepad.get().valueChangedHandler = ^(GCExtendedGamepad *, GCControllerElement *) {
61         m_lastUpdateTime = monotonicallyIncreasingTime();
62         GameControllerGamepadProvider::singleton().gamepadHadInput(*this, m_hadButtonPresses);
63         m_hadButtonPresses = false;
64     };
65
66     m_buttonValues.resize(8);
67     m_buttonValues[0] = m_extendedGamepad.get().buttonA.value;
68     m_buttonValues[1] = m_extendedGamepad.get().buttonB.value;
69     m_buttonValues[2] = m_extendedGamepad.get().buttonX.value;
70     m_buttonValues[3] = m_extendedGamepad.get().buttonY.value;
71     m_buttonValues[4] = m_extendedGamepad.get().leftShoulder.value;
72     m_buttonValues[5] = m_extendedGamepad.get().rightShoulder.value;
73     m_buttonValues[6] = m_extendedGamepad.get().leftTrigger.value;
74     m_buttonValues[7] = m_extendedGamepad.get().rightTrigger.value;
75
76     m_axisValues.resize(6);
77     m_axisValues[0] = m_extendedGamepad.get().leftThumbstick.xAxis.value;
78     m_axisValues[1] = m_extendedGamepad.get().leftThumbstick.yAxis.value;
79     m_axisValues[2] = m_extendedGamepad.get().rightThumbstick.xAxis.value;
80     m_axisValues[3] = m_extendedGamepad.get().rightThumbstick.yAxis.value;
81     m_axisValues[4] = m_extendedGamepad.get().dpad.xAxis.value;
82     m_axisValues[5] = m_extendedGamepad.get().dpad.yAxis.value;
83
84     m_extendedGamepad.get().buttonA.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
85         m_buttonValues[0] = value;
86         if (pressed)
87             m_hadButtonPresses = true;
88     };
89     m_extendedGamepad.get().buttonB.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
90         m_buttonValues[1] = value;
91         if (pressed)
92             m_hadButtonPresses = true;
93     };
94     m_extendedGamepad.get().buttonX.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
95         m_buttonValues[2] = value;
96         if (pressed)
97             m_hadButtonPresses = true;
98     };
99     m_extendedGamepad.get().buttonY.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
100         m_buttonValues[3] = value;
101         if (pressed)
102             m_hadButtonPresses = true;
103     };
104     m_extendedGamepad.get().leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
105         m_buttonValues[4] = value;
106         if (pressed)
107             m_hadButtonPresses = true;
108     };
109     m_extendedGamepad.get().rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
110         m_buttonValues[5] = value;
111         if (pressed)
112             m_hadButtonPresses = true;
113     };
114     m_extendedGamepad.get().leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
115         m_buttonValues[6] = value;
116         if (pressed)
117             m_hadButtonPresses = true;
118     };
119     m_extendedGamepad.get().rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
120         m_buttonValues[7] = value;
121         if (pressed)
122             m_hadButtonPresses = true;
123     };
124
125     m_extendedGamepad.get().leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
126         m_axisValues[0] = value;
127     };
128     m_extendedGamepad.get().leftThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
129         m_axisValues[1] = value;
130     };
131     m_extendedGamepad.get().rightThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
132         m_axisValues[2] = value;
133     };
134     m_extendedGamepad.get().rightThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
135         m_axisValues[3] = value;
136     };
137     m_extendedGamepad.get().dpad.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
138         m_axisValues[4] = value;
139     };
140     m_extendedGamepad.get().dpad.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
141         m_axisValues[5] = value;
142     };
143 }
144
145 void GameControllerGamepad::setupAsGamepad()
146 {
147     ASSERT(m_gamepad);
148
149     m_id = makeString(String(m_gcController.get().vendorName), ASCIILiteral(" Gamepad"));
150
151     m_gamepad.get().valueChangedHandler = ^(GCGamepad *, GCControllerElement *) {
152         m_lastUpdateTime = monotonicallyIncreasingTime();
153         GameControllerGamepadProvider::singleton().gamepadHadInput(*this, m_hadButtonPresses);
154         m_hadButtonPresses = false;
155     };
156
157     m_buttonValues.resize(6);
158     m_buttonValues[0] = m_extendedGamepad.get().buttonA.value;
159     m_buttonValues[1] = m_extendedGamepad.get().buttonB.value;
160     m_buttonValues[2] = m_extendedGamepad.get().buttonX.value;
161     m_buttonValues[3] = m_extendedGamepad.get().buttonY.value;
162     m_buttonValues[4] = m_extendedGamepad.get().leftShoulder.value;
163     m_buttonValues[5] = m_extendedGamepad.get().rightShoulder.value;
164
165     m_axisValues.resize(2);
166     m_axisValues[0] = m_extendedGamepad.get().dpad.xAxis.value;
167     m_axisValues[1] = m_extendedGamepad.get().dpad.yAxis.value;
168
169     m_extendedGamepad.get().buttonA.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
170         m_buttonValues[0] = value;
171         if (pressed)
172             m_hadButtonPresses = true;
173     };
174     m_extendedGamepad.get().buttonB.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
175         m_buttonValues[1] = value;
176         if (pressed)
177             m_hadButtonPresses = true;
178     };
179     m_extendedGamepad.get().buttonX.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
180         m_buttonValues[2] = value;
181         if (pressed)
182             m_hadButtonPresses = true;
183     };
184     m_extendedGamepad.get().buttonY.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
185         m_buttonValues[3] = value;
186         if (pressed)
187             m_hadButtonPresses = true;
188     };
189     m_extendedGamepad.get().leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
190         m_buttonValues[4] = value;
191         if (pressed)
192             m_hadButtonPresses = true;
193     };
194     m_extendedGamepad.get().rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
195         m_buttonValues[5] = value;
196         if (pressed)
197             m_hadButtonPresses = true;
198     };
199
200     m_extendedGamepad.get().leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
201         m_axisValues[0] = value;
202     };
203     m_extendedGamepad.get().leftThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
204         m_axisValues[1] = value;
205     };
206 }
207
208 } // namespace WebCore
209
210 #endif // ENABLE(GAMEPAD) && (defined(__LP64__) || PLATFORM(IOS))