summaryrefslogtreecommitdiff
path: root/test/testgamecontroller.c
diff options
context:
space:
mode:
authorSam Lantinga <slouken@libsdl.org>2020-11-17 10:30:20 -0800
committerSam Lantinga <slouken@libsdl.org>2020-11-17 10:30:20 -0800
commitd54d5ea3281482bb205a76c7ad6081b06a8e7016 (patch)
tree328845aed5a0c292a7ae07488cf4c0c0376f59c9 /test/testgamecontroller.c
parent32861928a353c272c36154e6b84044d7c4935c79 (diff)
downloadsdl-d54d5ea3281482bb205a76c7ad6081b06a8e7016.tar.gz
Added API for sensors on game controllers
Added support for the PS4 controller gyro and accelerometer on iOS and HIDAPI drivers Also fixed an issue with the accelerometer on iOS having inverted axes
Diffstat (limited to 'test/testgamecontroller.c')
-rw-r--r--test/testgamecontroller.c73
1 files changed, 54 insertions, 19 deletions
diff --git a/test/testgamecontroller.c b/test/testgamecontroller.c
index bc1f66dd5..f484e6c4f 100644
--- a/test/testgamecontroller.c
+++ b/test/testgamecontroller.c
@@ -98,26 +98,48 @@ LoadTexture(SDL_Renderer *renderer, const char *file, SDL_bool transparent)
}
static void
-UpdateWindowTitle()
+InitGameController()
{
const char *name = SDL_GameControllerName(gamecontroller);
- const char *serial = SDL_GameControllerGetSerial(gamecontroller);
- const char *basetitle = "Game Controller Test: ";
- const size_t titlelen = SDL_strlen(basetitle) + SDL_strlen(name) + (serial ? 3 + SDL_strlen(serial) : 0) + 1;
- char *title = (char *)SDL_malloc(titlelen);
-
- retval = SDL_FALSE;
- done = SDL_FALSE;
-
- if (title) {
- SDL_snprintf(title, titlelen, "%s%s", basetitle, name);
- if (serial) {
- SDL_strlcat(title, " (", titlelen);
- SDL_strlcat(title, serial, titlelen);
- SDL_strlcat(title, ")", titlelen);
+
+ SDL_Log("Opened game controller %s\n", name);
+
+ if (SDL_GameControllerHasSensor(gamecontroller, SDL_SENSOR_ACCEL)) {
+ SDL_Log("Enabling accelerometer\n");
+ SDL_GameControllerSetSensorEnabled(gamecontroller, SDL_SENSOR_ACCEL, SDL_TRUE);
+ }
+
+ if (SDL_GameControllerHasSensor(gamecontroller, SDL_SENSOR_GYRO)) {
+ SDL_Log("Enabling gyro\n");
+ SDL_GameControllerSetSensorEnabled(gamecontroller, SDL_SENSOR_GYRO, SDL_TRUE);
+ }
+}
+
+static void
+UpdateWindowTitle()
+{
+ if (gamecontroller) {
+ const char *name = SDL_GameControllerName(gamecontroller);
+ const char *serial = SDL_GameControllerGetSerial(gamecontroller);
+ const char *basetitle = "Game Controller Test: ";
+ const size_t titlelen = SDL_strlen(basetitle) + SDL_strlen(name) + (serial ? 3 + SDL_strlen(serial) : 0) + 1;
+ char *title = (char *)SDL_malloc(titlelen);
+
+ retval = SDL_FALSE;
+ done = SDL_FALSE;
+
+ if (title) {
+ SDL_snprintf(title, titlelen, "%s%s", basetitle, name);
+ if (serial) {
+ SDL_strlcat(title, " (", titlelen);
+ SDL_strlcat(title, serial, titlelen);
+ SDL_strlcat(title, ")", titlelen);
+ }
+ SDL_SetWindowTitle(window, title);
+ SDL_free(title);
}
- SDL_SetWindowTitle(window, title);
- SDL_free(title);
+ } else {
+ SDL_SetWindowTitle(window, "Waiting for controller...");
}
}
@@ -146,10 +168,11 @@ loop(void *arg)
if (!gamecontroller) {
gamecontroller = SDL_GameControllerOpen(event.cdevice.which);
if (gamecontroller) {
- UpdateWindowTitle();
+ InitGameController();
} else {
SDL_Log("Couldn't open controller: %s\n", SDL_GetError());
}
+ UpdateWindowTitle();
}
break;
@@ -159,8 +182,9 @@ loop(void *arg)
SDL_GameControllerClose(gamecontroller);
gamecontroller = SDL_GameControllerOpen(0);
if (gamecontroller) {
- UpdateWindowTitle();
+ InitGameController();
}
+ UpdateWindowTitle();
}
break;
@@ -178,6 +202,15 @@ loop(void *arg)
event.ctouchpad.pressure);
break;
+ case SDL_CONTROLLERSENSORUPDATE:
+ SDL_Log("Controller sensor %s: %.2f, %.2f, %.2f\n",
+ event.csensor.sensor == SDL_SENSOR_ACCEL ? "accelerometer" :
+ event.csensor.sensor == SDL_SENSOR_GYRO ? "gyro" : "unknown",
+ event.csensor.data[0],
+ event.csensor.data[1],
+ event.csensor.data[2]);
+ break;
+
case SDL_CONTROLLERAXISMOTION:
SDL_Log("Controller axis %s changed to %d\n", SDL_GameControllerGetStringForAxis((SDL_GameControllerAxis)event.caxis.axis), event.caxis.value);
break;
@@ -414,6 +447,8 @@ main(int argc, char *argv[])
/* !!! FIXME: */
/*SDL_RenderSetLogicalSize(screen, background->w, background->h);*/
+ UpdateWindowTitle();
+
/* Loop, getting controller events! */
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop_arg(loop, NULL, 0, 1);