blob: 0ad399763bc93c60eb8686627f50a8893fd4d161 [file] [log] [blame]
/*
* Copyright 2017 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
#define GLFW_INCLUDE_ES2
#include <GLFW/glfw3.h>
GLFWwindow* g_window;
void error_callback(int error, const char* description);
int joy_connected = -1;
void joystick_callback(int joy, int event)
{
if (event == GLFW_CONNECTED) {
printf("Joystick %d was connected: %s\n", joy, glfwGetJoystickName(joy));
joy_connected = joy; // use the most recently connected joystick
} else if (event == GLFW_DISCONNECTED) {
printf("Joystick %d was disconnected\n", joy);
if (joy == joy_connected) joy_connected = -1;
}
}
void main_2(void *arg) {
printf("Testing adding new gamepads\n");
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(glfwJoystickPresent(GLFW_JOYSTICK_1));
assert(glfwJoystickPresent(GLFW_JOYSTICK_2));
assert(strcmp(glfwGetJoystickName(GLFW_JOYSTICK_1), "Pad Thai") == 0);
assert(strcmp(glfwGetJoystickName(GLFW_JOYSTICK_2), "Pad Kee Mao") == 0);
int axes_count = 0;
int buttons_count = 0;
glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
assert(axes_count == 4);
assert(buttons_count == 16);
glfwGetJoystickAxes(GLFW_JOYSTICK_2, &axes_count);
glfwGetJoystickButtons(GLFW_JOYSTICK_2, &buttons_count);
assert(axes_count == 0);
assert(buttons_count == 4);
// Buttons
printf("Testing buttons\n");
const unsigned char *buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
assert(buttons_count == 16);
assert(buttons[0] == 0);
emscripten_run_script("window.simulateGamepadButtonDown(0, 1)");
buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
assert(buttons_count == 16);
assert(buttons[1] == 1);
emscripten_run_script("window.simulateGamepadButtonUp(0, 1)");
buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
assert(buttons_count == 16);
assert(buttons[1] == 0);
emscripten_run_script("window.simulateGamepadButtonDown(1, 0)");
buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_2, &buttons_count);
assert(buttons_count == 4);
assert(buttons[0] == 1);
emscripten_run_script("window.simulateGamepadButtonUp(1, 0)");
buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_2, &buttons_count);
assert(buttons_count == 4);
assert(buttons[1] == 0);
// Joystick wiggling
printf("Testing joystick axes\n");
emscripten_run_script("window.simulateAxisMotion(0, 0, 1)");
const float *axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
assert(axes_count == 4);
assert(axes[0] == 1);
emscripten_run_script("window.simulateAxisMotion(0, 0, 0)");
axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
assert(axes_count == 4);
assert(axes[0] == 0);
emscripten_run_script("window.simulateAxisMotion(0, 1, -1)");
axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
assert(axes_count == 4);
assert(axes[1] == -1);
// End test.
printf("Test passed!\n");
REPORT_RESULT(2);
}
int main() {
if (!glfwInit())
{
printf("Could not create window. Test failed.\n");
#ifdef REPORT_RESULT
REPORT_RESULT(0);
#endif
return -1;
}
glfwWindowHint(GLFW_RESIZABLE , 1);
g_window = glfwCreateWindow(600, 450, "GLFW joystick test", NULL, NULL);
if (!g_window)
{
printf("Could not create window. Test failed.\n");
#ifdef REPORT_RESULT
REPORT_RESULT(0);
#endif
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(g_window);
glfwSetJoystickCallback(joystick_callback);
emscripten_async_call(main_2, NULL, 3000); // avoid startup delays and intermittent errors
#ifndef __EMSCRIPTEN__
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
#endif
glfwTerminate();
return 0;
}