[WTF] Move currentCPUTime and sleep(Seconds) to CPUTime.h and Seconds.h respectively
[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
32 namespace WebCore {
33
34 GameControllerGamepad::GameControllerGamepad(GCController *controller, unsigned index)
35     : PlatformGamepad(index)
36     , m_gcController(controller)
37 {
38     ASSERT(index < 4);
39     controller.playerIndex = (GCControllerPlayerIndex)(GCControllerPlayerIndex1 + index);
40
41     m_extendedGamepad = controller.extendedGamepad;
42     if (!m_extendedGamepad)
43         m_gamepad = controller.gamepad;
44
45     ASSERT(m_extendedGamepad || m_gamepad);
46
47     if (m_extendedGamepad)
48         setupAsExtendedGamepad();
49     else
50         setupAsGamepad();
51 }
52
53 void GameControllerGamepad::setupAsExtendedGamepad()
54 {
55     ASSERT(m_extendedGamepad);
56
57     m_id = makeString(String(m_gcController.get().vendorName), ASCIILiteral(" Extended Gamepad"));
58
59     m_extendedGamepad.get().valueChangedHandler = ^(GCExtendedGamepad *, GCControllerElement *) {
60         m_lastUpdateTime = MonotonicTime::now();
61         GameControllerGamepadProvider::singleton().gamepadHadInput(*this, m_hadButtonPresses);
62         m_hadButtonPresses = false;
63     };
64
65     m_buttonValues.resize(8);
66     m_buttonValues[0] = m_extendedGamepad.get().buttonA.value;
67     m_buttonValues[1] = m_extendedGamepad.get().buttonB.value;
68     m_buttonValues[2] = m_extendedGamepad.get().buttonX.value;
69     m_buttonValues[3] = m_extendedGamepad.get().buttonY.value;
70     m_buttonValues[4] = m_extendedGamepad.get().leftShoulder.value;
71     m_buttonValues[5] = m_extendedGamepad.get().rightShoulder.value;
72     m_buttonValues[6] = m_extendedGamepad.get().leftTrigger.value;
73     m_buttonValues[7] = m_extendedGamepad.get().rightTrigger.value;
74
75     m_axisValues.resize(6);
76     m_axisValues[0] = m_extendedGamepad.get().leftThumbstick.xAxis.value;
77     m_axisValues[1] = m_extendedGamepad.get().leftThumbstick.yAxis.value;
78     m_axisValues[2] = m_extendedGamepad.get().rightThumbstick.xAxis.value;
79     m_axisValues[3] = m_extendedGamepad.get().rightThumbstick.yAxis.value;
80     m_axisValues[4] = m_extendedGamepad.get().dpad.xAxis.value;
81     m_axisValues[5] = m_extendedGamepad.get().dpad.yAxis.value;
82
83     m_extendedGamepad.get().buttonA.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
84         m_buttonValues[0] = value;
85         if (pressed)
86             m_hadButtonPresses = true;
87     };
88     m_extendedGamepad.get().buttonB.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
89         m_buttonValues[1] = value;
90         if (pressed)
91             m_hadButtonPresses = true;
92     };
93     m_extendedGamepad.get().buttonX.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
94         m_buttonValues[2] = value;
95         if (pressed)
96             m_hadButtonPresses = true;
97     };
98     m_extendedGamepad.get().buttonY.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
99         m_buttonValues[3] = value;
100         if (pressed)
101             m_hadButtonPresses = true;
102     };
103     m_extendedGamepad.get().leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
104         m_buttonValues[4] = value;
105         if (pressed)
106             m_hadButtonPresses = true;
107     };
108     m_extendedGamepad.get().rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
109         m_buttonValues[5] = value;
110         if (pressed)
111             m_hadButtonPresses = true;
112     };
113     m_extendedGamepad.get().leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
114         m_buttonValues[6] = value;
115         if (pressed)
116             m_hadButtonPresses = true;
117     };
118     m_extendedGamepad.get().rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
119         m_buttonValues[7] = value;
120         if (pressed)
121             m_hadButtonPresses = true;
122     };
123
124     m_extendedGamepad.get().leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
125         m_axisValues[0] = value;
126     };
127     m_extendedGamepad.get().leftThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
128         m_axisValues[1] = value;
129     };
130     m_extendedGamepad.get().rightThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
131         m_axisValues[2] = value;
132     };
133     m_extendedGamepad.get().rightThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
134         m_axisValues[3] = value;
135     };
136     m_extendedGamepad.get().dpad.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
137         m_axisValues[4] = value;
138     };
139     m_extendedGamepad.get().dpad.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
140         m_axisValues[5] = value;
141     };
142 }
143
144 void GameControllerGamepad::setupAsGamepad()
145 {
146     ASSERT(m_gamepad);
147
148     m_id = makeString(String(m_gcController.get().vendorName), ASCIILiteral(" Gamepad"));
149
150     m_gamepad.get().valueChangedHandler = ^(GCGamepad *, GCControllerElement *) {
151         m_lastUpdateTime = MonotonicTime::now();
152         GameControllerGamepadProvider::singleton().gamepadHadInput(*this, m_hadButtonPresses);
153         m_hadButtonPresses = false;
154     };
155
156     m_buttonValues.resize(6);
157     m_buttonValues[0] = m_extendedGamepad.get().buttonA.value;
158     m_buttonValues[1] = m_extendedGamepad.get().buttonB.value;
159     m_buttonValues[2] = m_extendedGamepad.get().buttonX.value;
160     m_buttonValues[3] = m_extendedGamepad.get().buttonY.value;
161     m_buttonValues[4] = m_extendedGamepad.get().leftShoulder.value;
162     m_buttonValues[5] = m_extendedGamepad.get().rightShoulder.value;
163
164     m_axisValues.resize(2);
165     m_axisValues[0] = m_extendedGamepad.get().dpad.xAxis.value;
166     m_axisValues[1] = m_extendedGamepad.get().dpad.yAxis.value;
167
168     m_extendedGamepad.get().buttonA.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
169         m_buttonValues[0] = value;
170         if (pressed)
171             m_hadButtonPresses = true;
172     };
173     m_extendedGamepad.get().buttonB.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
174         m_buttonValues[1] = value;
175         if (pressed)
176             m_hadButtonPresses = true;
177     };
178     m_extendedGamepad.get().buttonX.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
179         m_buttonValues[2] = value;
180         if (pressed)
181             m_hadButtonPresses = true;
182     };
183     m_extendedGamepad.get().buttonY.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
184         m_buttonValues[3] = value;
185         if (pressed)
186             m_hadButtonPresses = true;
187     };
188     m_extendedGamepad.get().leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
189         m_buttonValues[4] = value;
190         if (pressed)
191             m_hadButtonPresses = true;
192     };
193     m_extendedGamepad.get().rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
194         m_buttonValues[5] = value;
195         if (pressed)
196             m_hadButtonPresses = true;
197     };
198
199     m_extendedGamepad.get().leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
200         m_axisValues[0] = value;
201     };
202     m_extendedGamepad.get().leftThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
203         m_axisValues[1] = value;
204     };
205 }
206
207 } // namespace WebCore
208
209 #endif // ENABLE(GAMEPAD) && (defined(__LP64__) || PLATFORM(IOS))