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
|
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <assert.h>
#include <string.h>
#include <emscripten.h>
int result = 1;
void assertJoystickEvent(int expectedGamepad, int expectedType, int expectedIndex, int expectedValue) {
SDL_Event event;
while(1) {
// Loop ends either when assertion fails (we run out of events), or we find
// the event we're looking for.
assert(SDL_PollEvent(&event) == 1);
if (event.type != expectedType) {
continue;
}
switch(event.type) {
case SDL_JOYAXISMOTION: {
assert(event.jaxis.which == expectedGamepad);
assert(event.jaxis.axis == expectedIndex);
assert(event.jaxis.value == expectedValue);
break;
}
case SDL_JOYBUTTONUP: case SDL_JOYBUTTONDOWN: {
assert(event.jbutton.which == expectedGamepad);
assert(event.jbutton.button == expectedIndex);
assert(event.jbutton.state == expectedValue);
break;
}
}
// Break out of while loop.
break;
}
}
void assertNoJoystickEvent() {
SDL_Event event;
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: case SDL_JOYAXISMOTION: {
// Fail.
assert(0);
}
}
}
}
void main_2(void* arg);
int main() {
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK);
SDL_Surface *screen = SDL_SetVideoMode(600, 450, 32, SDL_HWSURFACE);
emscripten_async_call(main_2, NULL, 3000); // avoid startup delays and intermittent errors
return 0;
}
void main_2(void* arg) {
// TODO: At the moment, we only support joystick support through polling.
emscripten_run_script("window.addNewGamepad('Pad Thai', 4, 16)");
emscripten_run_script("window.addNewGamepad('Pad Kee Mao', 0, 4)");
// Check that the joysticks exist properly.
assert(SDL_NumJoysticks() == 2);
assert(!SDL_JoystickOpened(0));
assert(!SDL_JoystickOpened(1));
SDL_Joystick* pad1 = SDL_JoystickOpen(0);
assert(SDL_JoystickOpened(0));
assert(SDL_JoystickIndex(pad1) == 0);
assert(strncmp(SDL_JoystickName(0), "Pad Thai", 9) == 0);
assert(strncmp(SDL_JoystickName(1), "Pad Kee Mao", 12) == 0);
assert(SDL_JoystickNumAxes(pad1) == 4);
assert(SDL_JoystickNumButtons(pad1) == 16);
// By default, SDL will automatically process events. Test this behavior, and then disable it.
assert(SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE);
SDL_JoystickEventState(SDL_DISABLE);
assert(SDL_JoystickEventState(SDL_QUERY) == SDL_DISABLE);
// Button events.
emscripten_run_script("window.simulateGamepadButtonDown(0, 1)");
// We didn't tell SDL to automatically update this joystick's state.
assertNoJoystickEvent();
SDL_JoystickUpdate();
assertJoystickEvent(0, SDL_JOYBUTTONDOWN, 1, SDL_PRESSED);
assert(SDL_JoystickGetButton(pad1, 1) == 1);
// Enable automatic updates.
SDL_JoystickEventState(SDL_ENABLE);
assert(SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE);
emscripten_run_script("window.simulateGamepadButtonUp(0, 1)");
assertJoystickEvent(0, SDL_JOYBUTTONUP, 1, SDL_RELEASED);
assert(SDL_JoystickGetButton(pad1, 1) == 0);
// No button change: Should not result in a new event.
emscripten_run_script("window.simulateGamepadButtonUp(0, 1)");
assertNoJoystickEvent();
// Joystick 1 is not opened; should not result in a new event.
emscripten_run_script("window.simulateGamepadButtonDown(1, 1)");
assertNoJoystickEvent();
// Joystick wiggling
emscripten_run_script("window.simulateAxisMotion(0, 0, 1)");
assertJoystickEvent(0, SDL_JOYAXISMOTION, 0, 32767);
assert(SDL_JoystickGetAxis(pad1, 0) == 32767);
emscripten_run_script("window.simulateAxisMotion(0, 0, 0)");
assertJoystickEvent(0, SDL_JOYAXISMOTION, 0, 0);
assert(SDL_JoystickGetAxis(pad1, 0) == 0);
emscripten_run_script("window.simulateAxisMotion(0, 1, -1)");
assertJoystickEvent(0, SDL_JOYAXISMOTION, 1, -32768);
assert(SDL_JoystickGetAxis(pad1, 1) == -32768);
emscripten_run_script("window.simulateAxisMotion(0, 1, -1)");
// No joystick change: Should not result in a new event.
assertNoJoystickEvent();
// Joystick 1 is not opened; should not result in a new event.
emscripten_run_script("window.simulateAxisMotion(1, 1, -1)");
assertNoJoystickEvent();
SDL_JoystickClose(pad1);
assert(!SDL_JoystickOpened(0));
// Joystick 0 is closed; we should not process any new gamepad events from it.
emscripten_run_script("window.simulateGamepadButtonDown(0, 1)");
assertNoJoystickEvent();
// End test.
result = 2;
printf("Test passed!\n");
REPORT_RESULT();
}
|