summaryrefslogtreecommitdiff
path: root/source/3rd-party/SDL2/src/sensor
diff options
context:
space:
mode:
Diffstat (limited to 'source/3rd-party/SDL2/src/sensor')
-rw-r--r--source/3rd-party/SDL2/src/sensor/SDL_sensor.c546
-rw-r--r--source/3rd-party/SDL2/src/sensor/SDL_sensor_c.h44
-rw-r--r--source/3rd-party/SDL2/src/sensor/SDL_syssensor.h105
-rw-r--r--source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.c211
-rw-r--r--source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.h31
-rw-r--r--source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.h30
-rw-r--r--source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.m234
-rw-r--r--source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.c110
-rw-r--r--source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.h23
9 files changed, 1334 insertions, 0 deletions
diff --git a/source/3rd-party/SDL2/src/sensor/SDL_sensor.c b/source/3rd-party/SDL2/src/sensor/SDL_sensor.c
new file mode 100644
index 0000000..5c7a990
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/SDL_sensor.c
@@ -0,0 +1,546 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+#include "../SDL_internal.h"
+
+/* This is the sensor API for Simple DirectMedia Layer */
+
+#include "SDL.h"
+#include "SDL_atomic.h"
+#include "SDL_events.h"
+#include "SDL_syssensor.h"
+#include "SDL_assert.h"
+
+#if !SDL_EVENTS_DISABLED
+#include "../events/SDL_events_c.h"
+#endif
+
+static SDL_SensorDriver *SDL_sensor_drivers[] = {
+#ifdef SDL_SENSOR_ANDROID
+ &SDL_ANDROID_SensorDriver,
+#endif
+#ifdef SDL_SENSOR_COREMOTION
+ &SDL_COREMOTION_SensorDriver,
+#endif
+#if defined(SDL_SENSOR_DUMMY) || defined(SDL_SENSOR_DISABLED)
+ &SDL_DUMMY_SensorDriver
+#endif
+};
+static SDL_Sensor *SDL_sensors = NULL;
+static SDL_bool SDL_updating_sensor = SDL_FALSE;
+static SDL_mutex *SDL_sensor_lock = NULL; /* This needs to support recursive locks */
+static SDL_atomic_t SDL_next_sensor_instance_id;
+
+static void
+SDL_LockSensors(void)
+{
+ if (SDL_sensor_lock) {
+ SDL_LockMutex(SDL_sensor_lock);
+ }
+}
+
+static void
+SDL_UnlockSensors(void)
+{
+ if (SDL_sensor_lock) {
+ SDL_UnlockMutex(SDL_sensor_lock);
+ }
+}
+
+
+int
+SDL_SensorInit(void)
+{
+ int i, status;
+
+ /* Create the sensor list lock */
+ if (!SDL_sensor_lock) {
+ SDL_sensor_lock = SDL_CreateMutex();
+ }
+
+#if !SDL_EVENTS_DISABLED
+ if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0) {
+ return -1;
+ }
+#endif /* !SDL_EVENTS_DISABLED */
+
+ status = -1;
+ for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
+ if (SDL_sensor_drivers[i]->Init() >= 0) {
+ status = 0;
+ }
+ }
+ return status;
+}
+
+/*
+ * Count the number of sensors attached to the system
+ */
+int
+SDL_NumSensors(void)
+{
+ int i, total_sensors = 0;
+ SDL_LockSensors();
+ for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
+ total_sensors += SDL_sensor_drivers[i]->GetCount();
+ }
+ SDL_UnlockSensors();
+ return total_sensors;
+}
+
+/*
+ * Return the next available sensor instance ID
+ * This may be called by drivers from multiple threads, unprotected by any locks
+ */
+SDL_SensorID SDL_GetNextSensorInstanceID()
+{
+ return SDL_AtomicIncRef(&SDL_next_sensor_instance_id);
+}
+
+/*
+ * Get the driver and device index for an API device index
+ * This should be called while the sensor lock is held, to prevent another thread from updating the list
+ */
+static SDL_bool
+SDL_GetDriverAndSensorIndex(int device_index, SDL_SensorDriver **driver, int *driver_index)
+{
+ int i, num_sensors, total_sensors = 0;
+
+ if (device_index >= 0) {
+ for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
+ num_sensors = SDL_sensor_drivers[i]->GetCount();
+ if (device_index < num_sensors) {
+ *driver = SDL_sensor_drivers[i];
+ *driver_index = device_index;
+ return SDL_TRUE;
+ }
+ device_index -= num_sensors;
+ total_sensors += num_sensors;
+ }
+ }
+
+ SDL_SetError("There are %d sensors available", total_sensors);
+ return SDL_FALSE;
+}
+
+/*
+ * Get the implementation dependent name of a sensor
+ */
+const char *
+SDL_SensorGetDeviceName(int device_index)
+{
+ SDL_SensorDriver *driver;
+ const char *name = NULL;
+
+ SDL_LockSensors();
+ if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
+ name = driver->GetDeviceName(device_index);
+ }
+ SDL_UnlockSensors();
+
+ /* FIXME: Really we should reference count this name so it doesn't go away after unlock */
+ return name;
+}
+
+SDL_SensorType
+SDL_SensorGetDeviceType(int device_index)
+{
+ SDL_SensorDriver *driver;
+ SDL_SensorType type = SDL_SENSOR_INVALID;
+
+ SDL_LockSensors();
+ if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
+ type = driver->GetDeviceType(device_index);
+ }
+ SDL_UnlockSensors();
+
+ return type;
+}
+
+SDL_SensorType
+SDL_SensorGetDeviceNonPortableType(int device_index)
+{
+ SDL_SensorDriver *driver;
+ int type = -1;
+
+ SDL_LockSensors();
+ if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
+ type = driver->GetDeviceNonPortableType(device_index);
+ }
+ SDL_UnlockSensors();
+
+ return type;
+}
+
+SDL_SensorID
+SDL_SensorGetDeviceInstanceID(int device_index)
+{
+ SDL_SensorDriver *driver;
+ SDL_SensorID instance_id = -1;
+
+ SDL_LockSensors();
+ if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
+ instance_id = driver->GetDeviceInstanceID(device_index);
+ }
+ SDL_UnlockSensors();
+
+ return instance_id;
+}
+
+/*
+ * Open a sensor for use - the index passed as an argument refers to
+ * the N'th sensor on the system. This index is the value which will
+ * identify this sensor in future sensor events.
+ *
+ * This function returns a sensor identifier, or NULL if an error occurred.
+ */
+SDL_Sensor *
+SDL_SensorOpen(int device_index)
+{
+ SDL_SensorDriver *driver;
+ SDL_SensorID instance_id;
+ SDL_Sensor *sensor;
+ SDL_Sensor *sensorlist;
+ const char *sensorname = NULL;
+
+ SDL_LockSensors();
+
+ if (!SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
+ SDL_UnlockSensors();
+ return NULL;
+ }
+
+ sensorlist = SDL_sensors;
+ /* If the sensor is already open, return it
+ * it is important that we have a single sensor * for each instance id
+ */
+ instance_id = driver->GetDeviceInstanceID(device_index);
+ while (sensorlist) {
+ if (instance_id == sensorlist->instance_id) {
+ sensor = sensorlist;
+ ++sensor->ref_count;
+ SDL_UnlockSensors();
+ return sensor;
+ }
+ sensorlist = sensorlist->next;
+ }
+
+ /* Create and initialize the sensor */
+ sensor = (SDL_Sensor *) SDL_calloc(sizeof(*sensor), 1);
+ if (sensor == NULL) {
+ SDL_OutOfMemory();
+ SDL_UnlockSensors();
+ return NULL;
+ }
+ sensor->driver = driver;
+ sensor->instance_id = instance_id;
+ sensor->type = driver->GetDeviceType(device_index);
+ sensor->non_portable_type = driver->GetDeviceNonPortableType(device_index);
+
+ if (driver->Open(sensor, device_index) < 0) {
+ SDL_free(sensor);
+ SDL_UnlockSensors();
+ return NULL;
+ }
+
+ sensorname = driver->GetDeviceName(device_index);
+ if (sensorname) {
+ sensor->name = SDL_strdup(sensorname);
+ } else {
+ sensor->name = NULL;
+ }
+
+ /* Add sensor to list */
+ ++sensor->ref_count;
+ /* Link the sensor in the list */
+ sensor->next = SDL_sensors;
+ SDL_sensors = sensor;
+
+ SDL_UnlockSensors();
+
+ driver->Update(sensor);
+
+ return sensor;
+}
+
+/*
+ * Find the SDL_Sensor that owns this instance id
+ */
+SDL_Sensor *
+SDL_SensorFromInstanceID(SDL_SensorID instance_id)
+{
+ SDL_Sensor *sensor;
+
+ SDL_LockSensors();
+ for (sensor = SDL_sensors; sensor; sensor = sensor->next) {
+ if (sensor->instance_id == instance_id) {
+ break;
+ }
+ }
+ SDL_UnlockSensors();
+ return sensor;
+}
+
+/*
+ * Checks to make sure the sensor is valid.
+ */
+static int
+SDL_PrivateSensorValid(SDL_Sensor * sensor)
+{
+ int valid;
+
+ if (sensor == NULL) {
+ SDL_SetError("Sensor hasn't been opened yet");
+ valid = 0;
+ } else {
+ valid = 1;
+ }
+
+ return valid;
+}
+
+/*
+ * Get the friendly name of this sensor
+ */
+const char *
+SDL_SensorGetName(SDL_Sensor * sensor)
+{
+ if (!SDL_PrivateSensorValid(sensor)) {
+ return NULL;
+ }
+
+ return sensor->name;
+}
+
+/*
+ * Get the type of this sensor
+ */
+SDL_SensorType
+SDL_SensorGetType(SDL_Sensor * sensor)
+{
+ if (!SDL_PrivateSensorValid(sensor)) {
+ return SDL_SENSOR_INVALID;
+ }
+
+ return sensor->type;
+}
+
+/*
+ * Get the platform dependent type of this sensor
+ */
+int
+SDL_SensorGetNonPortableType(SDL_Sensor * sensor)
+{
+ if (!SDL_PrivateSensorValid(sensor)) {
+ return -1;
+ }
+
+ return sensor->non_portable_type;
+}
+
+/*
+ * Get the instance id for this opened sensor
+ */
+SDL_SensorID
+SDL_SensorGetInstanceID(SDL_Sensor * sensor)
+{
+ if (!SDL_PrivateSensorValid(sensor)) {
+ return -1;
+ }
+
+ return sensor->instance_id;
+}
+
+/*
+ * Get the current state of this sensor
+ */
+int
+SDL_SensorGetData(SDL_Sensor * sensor, float *data, int num_values)
+{
+ if (!SDL_PrivateSensorValid(sensor)) {
+ return -1;
+ }
+
+ num_values = SDL_min(num_values, SDL_arraysize(sensor->data));
+ SDL_memcpy(data, sensor->data, num_values*sizeof(*data));
+ return 0;
+}
+
+/*
+ * Close a sensor previously opened with SDL_SensorOpen()
+ */
+void
+SDL_SensorClose(SDL_Sensor * sensor)
+{
+ SDL_Sensor *sensorlist;
+ SDL_Sensor *sensorlistprev;
+
+ if (!SDL_PrivateSensorValid(sensor)) {
+ return;
+ }
+
+ SDL_LockSensors();
+
+ /* First decrement ref count */
+ if (--sensor->ref_count > 0) {
+ SDL_UnlockSensors();
+ return;
+ }
+
+ if (SDL_updating_sensor) {
+ SDL_UnlockSensors();
+ return;
+ }
+
+ sensor->driver->Close(sensor);
+ sensor->hwdata = NULL;
+
+ sensorlist = SDL_sensors;
+ sensorlistprev = NULL;
+ while (sensorlist) {
+ if (sensor == sensorlist) {
+ if (sensorlistprev) {
+ /* unlink this entry */
+ sensorlistprev->next = sensorlist->next;
+ } else {
+ SDL_sensors = sensor->next;
+ }
+ break;
+ }
+ sensorlistprev = sensorlist;
+ sensorlist = sensorlist->next;
+ }
+
+ SDL_free(sensor->name);
+
+ /* Free the data associated with this sensor */
+ SDL_free(sensor);
+
+ SDL_UnlockSensors();
+}
+
+void
+SDL_SensorQuit(void)
+{
+ int i;
+
+ /* Make sure we're not getting called in the middle of updating sensors */
+ SDL_assert(!SDL_updating_sensor);
+
+ SDL_LockSensors();
+
+ /* Stop the event polling */
+ while (SDL_sensors) {
+ SDL_sensors->ref_count = 1;
+ SDL_SensorClose(SDL_sensors);
+ }
+
+ /* Quit the sensor setup */
+ for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
+ SDL_sensor_drivers[i]->Quit();
+ }
+
+ SDL_UnlockSensors();
+
+#if !SDL_EVENTS_DISABLED
+ SDL_QuitSubSystem(SDL_INIT_EVENTS);
+#endif
+
+ if (SDL_sensor_lock) {
+ SDL_DestroyMutex(SDL_sensor_lock);
+ SDL_sensor_lock = NULL;
+ }
+}
+
+
+/* These are global for SDL_syssensor.c and SDL_events.c */
+
+int
+SDL_PrivateSensorUpdate(SDL_Sensor *sensor, float *data, int num_values)
+{
+ int posted;
+
+ /* Allow duplicate events, for things like steps and heartbeats */
+
+ /* Update internal sensor state */
+ num_values = SDL_min(num_values, SDL_arraysize(sensor->data));
+ SDL_memcpy(sensor->data, data, num_values*sizeof(*data));
+
+ /* Post the event, if desired */
+ posted = 0;
+#if !SDL_EVENTS_DISABLED
+ if (SDL_GetEventState(SDL_JOYAXISMOTION) == SDL_ENABLE) {
+ SDL_Event event;
+ event.type = SDL_SENSORUPDATE;
+ event.sensor.which = sensor->instance_id;
+ num_values = SDL_min(num_values, SDL_arraysize(event.sensor.data));
+ SDL_memset(event.sensor.data, 0, sizeof(event.sensor.data));
+ SDL_memcpy(event.sensor.data, data, num_values*sizeof(*data));
+ posted = SDL_PushEvent(&event) == 1;
+ }
+#endif /* !SDL_EVENTS_DISABLED */
+ return posted;
+}
+
+void
+SDL_SensorUpdate(void)
+{
+ int i;
+ SDL_Sensor *sensor;
+
+ SDL_LockSensors();
+
+ if (SDL_updating_sensor) {
+ /* The sensors are already being updated */
+ SDL_UnlockSensors();
+ return;
+ }
+
+ SDL_updating_sensor = SDL_TRUE;
+
+ /* Make sure the list is unlocked while dispatching events to prevent application deadlocks */
+ SDL_UnlockSensors();
+
+ for (sensor = SDL_sensors; sensor; sensor = sensor->next) {
+ sensor->driver->Update(sensor);
+ }
+
+ SDL_LockSensors();
+
+ SDL_updating_sensor = SDL_FALSE;
+
+ /* If any sensors were closed while updating, free them here */
+ for (sensor = SDL_sensors; sensor; sensor = sensor->next) {
+ if (sensor->ref_count <= 0) {
+ SDL_SensorClose(sensor);
+ }
+ }
+
+ /* this needs to happen AFTER walking the sensor list above, so that any
+ dangling hardware data from removed devices can be free'd
+ */
+ for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
+ SDL_sensor_drivers[i]->Detect();
+ }
+
+ SDL_UnlockSensors();
+}
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/SDL_sensor_c.h b/source/3rd-party/SDL2/src/sensor/SDL_sensor_c.h
new file mode 100644
index 0000000..70974af
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/SDL_sensor_c.h
@@ -0,0 +1,44 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef SDL_sensor_c_h_
+#define SDL_sensor_c_h_
+
+#include "SDL_config.h"
+
+struct _SDL_SensorDriver;
+
+/* Useful functions and variables from SDL_sensor.c */
+#include "SDL_sensor.h"
+
+/* Function to get the next available sensor instance ID */
+extern SDL_SensorID SDL_GetNextSensorInstanceID(void);
+
+/* Initialization and shutdown functions */
+extern int SDL_SensorInit(void);
+extern void SDL_SensorQuit(void);
+
+/* Internal event queueing functions */
+extern int SDL_PrivateSensorUpdate(SDL_Sensor *sensor, float *data, int num_values);
+
+#endif /* SDL_sensor_c_h_ */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/SDL_syssensor.h b/source/3rd-party/SDL2/src/sensor/SDL_syssensor.h
new file mode 100644
index 0000000..210577a
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/SDL_syssensor.h
@@ -0,0 +1,105 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef SDL_syssensor_c_h_
+#define SDL_syssensor_c_h_
+
+#include "SDL_config.h"
+
+/* This is the system specific header for the SDL sensor API */
+
+#include "SDL_sensor.h"
+#include "SDL_sensor_c.h"
+
+/* The SDL sensor structure */
+struct _SDL_Sensor
+{
+ SDL_SensorID instance_id; /* Device instance, monotonically increasing from 0 */
+ char *name; /* Sensor name - system dependent */
+ SDL_SensorType type; /* Type of the sensor */
+ int non_portable_type; /* Platform dependent type of the sensor */
+
+ float data[16]; /* The current state of the sensor */
+
+ struct _SDL_SensorDriver *driver;
+
+ struct sensor_hwdata *hwdata; /* Driver dependent information */
+
+ int ref_count; /* Reference count for multiple opens */
+
+ struct _SDL_Sensor *next; /* pointer to next sensor we have allocated */
+};
+
+typedef struct _SDL_SensorDriver
+{
+ /* Function to scan the system for sensors.
+ * sensor 0 should be the system default sensor.
+ * This function should return 0, or -1 on an unrecoverable fatal error.
+ */
+ int (*Init)(void);
+
+ /* Function to return the number of sensors available right now */
+ int (*GetCount)(void);
+
+ /* Function to check to see if the available sensors have changed */
+ void (*Detect)(void);
+
+ /* Function to get the device-dependent name of a sensor */
+ const char *(*GetDeviceName)(int device_index);
+
+ /* Function to get the type of a sensor */
+ SDL_SensorType (*GetDeviceType)(int device_index);
+
+ /* Function to get the platform dependent type of a sensor */
+ int (*GetDeviceNonPortableType)(int device_index);
+
+ /* Function to get the current instance id of the sensor located at device_index */
+ SDL_SensorID (*GetDeviceInstanceID)(int device_index);
+
+ /* Function to open a sensor for use.
+ The sensor to open is specified by the device index.
+ It returns 0, or -1 if there is an error.
+ */
+ int (*Open)(SDL_Sensor * sensor, int device_index);
+
+ /* Function to update the state of a sensor - called as a device poll.
+ * This function shouldn't update the sensor structure directly,
+ * but instead should call SDL_PrivateSensorUpdate() to deliver events
+ * and update sensor device state.
+ */
+ void (*Update)(SDL_Sensor * sensor);
+
+ /* Function to close a sensor after use */
+ void (*Close)(SDL_Sensor * sensor);
+
+ /* Function to perform any system-specific sensor related cleanup */
+ void (*Quit)(void);
+
+} SDL_SensorDriver;
+
+/* The available sensor drivers */
+extern SDL_SensorDriver SDL_ANDROID_SensorDriver;
+extern SDL_SensorDriver SDL_COREMOTION_SensorDriver;
+extern SDL_SensorDriver SDL_DUMMY_SensorDriver;
+
+#endif /* SDL_syssensor_c_h_ */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.c b/source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.c
new file mode 100644
index 0000000..117c18d
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.c
@@ -0,0 +1,211 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "SDL_config.h"
+
+#ifdef SDL_SENSOR_ANDROID
+
+/* This is the system specific header for the SDL sensor API */
+#include <android/sensor.h>
+
+#include "SDL_error.h"
+#include "SDL_sensor.h"
+#include "SDL_androidsensor.h"
+#include "../SDL_syssensor.h"
+#include "../SDL_sensor_c.h"
+//#include "../../core/android/SDL_android.h"
+
+#ifndef LOOPER_ID_USER
+#define LOOPER_ID_USER 3
+#endif
+
+typedef struct
+{
+ ASensorRef asensor;
+ SDL_SensorID instance_id;
+} SDL_AndroidSensor;
+
+static ASensorManager* SDL_sensor_manager;
+static ALooper* SDL_sensor_looper;
+static SDL_AndroidSensor *SDL_sensors;
+static int SDL_sensors_count;
+
+static int
+SDL_ANDROID_SensorInit(void)
+{
+ int i, sensors_count;
+ ASensorList sensors;
+
+ SDL_sensor_manager = ASensorManager_getInstance();
+ if (!SDL_sensor_manager) {
+ return SDL_SetError("Couldn't create sensor manager");
+ }
+
+ SDL_sensor_looper = ALooper_forThread();
+ if (!SDL_sensor_looper) {
+ SDL_sensor_looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
+ if (!SDL_sensor_looper) {
+ return SDL_SetError("Couldn't create sensor event loop");
+ }
+ }
+
+ /* FIXME: Is the sensor list dynamic? */
+ sensors_count = ASensorManager_getSensorList(SDL_sensor_manager, &sensors);
+ if (sensors_count > 0) {
+ SDL_sensors = (SDL_AndroidSensor *)SDL_calloc(sensors_count, sizeof(*SDL_sensors));
+ if (!SDL_sensors) {
+ return SDL_OutOfMemory();
+ }
+
+ for (i = 0; i < sensors_count; ++i) {
+ SDL_sensors[i].asensor = sensors[i];
+ SDL_sensors[i].instance_id = SDL_GetNextSensorInstanceID();
+ }
+ SDL_sensors_count = sensors_count;
+ }
+ return 0;
+}
+
+static int
+SDL_ANDROID_SensorGetCount(void)
+{
+ return SDL_sensors_count;
+}
+
+static void
+SDL_ANDROID_SensorDetect(void)
+{
+}
+
+static const char *
+SDL_ANDROID_SensorGetDeviceName(int device_index)
+{
+ return ASensor_getName(SDL_sensors[device_index].asensor);
+}
+
+static SDL_SensorType
+SDL_ANDROID_SensorGetDeviceType(int device_index)
+{
+ switch (ASensor_getType(SDL_sensors[device_index].asensor)) {
+ case 0x00000001:
+ return SDL_SENSOR_ACCEL;
+ case 0x00000004:
+ return SDL_SENSOR_GYRO;
+ default:
+ return SDL_SENSOR_UNKNOWN;
+ }
+}
+
+static int
+SDL_ANDROID_SensorGetDeviceNonPortableType(int device_index)
+{
+ return ASensor_getType(SDL_sensors[device_index].asensor);
+}
+
+static SDL_SensorID
+SDL_ANDROID_SensorGetDeviceInstanceID(int device_index)
+{
+ return SDL_sensors[device_index].instance_id;
+}
+
+static int
+SDL_ANDROID_SensorOpen(SDL_Sensor *sensor, int device_index)
+{
+ struct sensor_hwdata *hwdata;
+
+ hwdata = (struct sensor_hwdata *)SDL_calloc(1, sizeof(*hwdata));
+ if (hwdata == NULL) {
+ return SDL_OutOfMemory();
+ }
+
+ hwdata->asensor = SDL_sensors[device_index].asensor;
+ hwdata->eventqueue = ASensorManager_createEventQueue(SDL_sensor_manager, SDL_sensor_looper, LOOPER_ID_USER, NULL, NULL);
+ if (!hwdata->eventqueue) {
+ SDL_free(hwdata);
+ return SDL_SetError("Couldn't create sensor event queue");
+ }
+
+ if (ASensorEventQueue_enableSensor(hwdata->eventqueue, hwdata->asensor) < 0) {
+ ASensorManager_destroyEventQueue(SDL_sensor_manager, hwdata->eventqueue);
+ SDL_free(hwdata);
+ return SDL_SetError("Couldn't enable sensor");
+ }
+
+ /* FIXME: What rate should we set for this sensor? 60 FPS? Let's try the default rate for now... */
+
+ sensor->hwdata = hwdata;
+ return 0;
+}
+
+static void
+SDL_ANDROID_SensorUpdate(SDL_Sensor *sensor)
+{
+ int events;
+ ASensorEvent event;
+ struct android_poll_source* source;
+
+ if (ALooper_pollAll(0, NULL, &events, (void**)&source) == LOOPER_ID_USER) {
+ SDL_zero(event);
+ while (ASensorEventQueue_getEvents(sensor->hwdata->eventqueue, &event, 1) > 0) {
+ SDL_PrivateSensorUpdate(sensor, event.data, SDL_arraysize(event.data));
+ }
+ }
+}
+
+static void
+SDL_ANDROID_SensorClose(SDL_Sensor *sensor)
+{
+ if (sensor->hwdata) {
+ ASensorEventQueue_disableSensor(sensor->hwdata->eventqueue, sensor->hwdata->asensor);
+ ASensorManager_destroyEventQueue(SDL_sensor_manager, sensor->hwdata->eventqueue);
+ SDL_free(sensor->hwdata);
+ sensor->hwdata = NULL;
+ }
+}
+
+static void
+SDL_ANDROID_SensorQuit(void)
+{
+ if (SDL_sensors) {
+ SDL_free(SDL_sensors);
+ SDL_sensors = NULL;
+ SDL_sensors_count = 0;
+ }
+}
+
+SDL_SensorDriver SDL_ANDROID_SensorDriver =
+{
+ SDL_ANDROID_SensorInit,
+ SDL_ANDROID_SensorGetCount,
+ SDL_ANDROID_SensorDetect,
+ SDL_ANDROID_SensorGetDeviceName,
+ SDL_ANDROID_SensorGetDeviceType,
+ SDL_ANDROID_SensorGetDeviceNonPortableType,
+ SDL_ANDROID_SensorGetDeviceInstanceID,
+ SDL_ANDROID_SensorOpen,
+ SDL_ANDROID_SensorUpdate,
+ SDL_ANDROID_SensorClose,
+ SDL_ANDROID_SensorQuit,
+};
+
+#endif /* SDL_SENSOR_ANDROID */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.h b/source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.h
new file mode 100644
index 0000000..c65002e
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/android/SDL_androidsensor.h
@@ -0,0 +1,31 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+/* The private structure used to keep track of a sensor */
+struct sensor_hwdata
+{
+ ASensorRef asensor;
+ ASensorEventQueue *eventqueue;
+};
+
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.h b/source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.h
new file mode 100644
index 0000000..2312e84
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.h
@@ -0,0 +1,30 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+/* The private structure used to keep track of a sensor */
+struct sensor_hwdata
+{
+ float data[3];
+};
+
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.m b/source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.m
new file mode 100644
index 0000000..526cce8
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/coremotion/SDL_coremotionsensor.m
@@ -0,0 +1,234 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "SDL_config.h"
+
+#ifdef SDL_SENSOR_COREMOTION
+
+/* This is the system specific header for the SDL sensor API */
+#include <CoreMotion/CoreMotion.h>
+
+#include "SDL_error.h"
+#include "SDL_sensor.h"
+#include "SDL_coremotionsensor.h"
+#include "../SDL_syssensor.h"
+#include "../SDL_sensor_c.h"
+
+typedef struct
+{
+ SDL_SensorType type;
+ SDL_SensorID instance_id;
+} SDL_CoreMotionSensor;
+
+static CMMotionManager *SDL_motion_manager;
+static SDL_CoreMotionSensor *SDL_sensors;
+static int SDL_sensors_count;
+
+static int
+SDL_COREMOTION_SensorInit(void)
+{
+ int i, sensors_count = 0;
+
+ if (!SDL_motion_manager) {
+ SDL_motion_manager = [[CMMotionManager alloc] init];
+ }
+
+ if (SDL_motion_manager.accelerometerAvailable) {
+ ++sensors_count;
+ }
+ if (SDL_motion_manager.gyroAvailable) {
+ ++sensors_count;
+ }
+
+ if (sensors_count > 0) {
+ SDL_sensors = (SDL_CoreMotionSensor *)SDL_calloc(sensors_count, sizeof(*SDL_sensors));
+ if (!SDL_sensors) {
+ return SDL_OutOfMemory();
+ }
+
+ i = 0;
+ if (SDL_motion_manager.accelerometerAvailable) {
+ SDL_sensors[i].type = SDL_SENSOR_ACCEL;
+ SDL_sensors[i].instance_id = SDL_GetNextSensorInstanceID();
+ ++i;
+ }
+ if (SDL_motion_manager.gyroAvailable) {
+ SDL_sensors[i].type = SDL_SENSOR_GYRO;
+ SDL_sensors[i].instance_id = SDL_GetNextSensorInstanceID();
+ ++i;
+ }
+ SDL_sensors_count = sensors_count;
+ }
+ return 0;
+}
+
+static int
+SDL_COREMOTION_SensorGetCount(void)
+{
+ return SDL_sensors_count;
+}
+
+static void
+SDL_COREMOTION_SensorDetect(void)
+{
+}
+
+static const char *
+SDL_COREMOTION_SensorGetDeviceName(int device_index)
+{
+ switch (SDL_sensors[device_index].type) {
+ case SDL_SENSOR_ACCEL:
+ return "Accelerometer";
+ case SDL_SENSOR_GYRO:
+ return "Gyro";
+ default:
+ return "Unknown";
+ }
+}
+
+static SDL_SensorType
+SDL_COREMOTION_SensorGetDeviceType(int device_index)
+{
+ return SDL_sensors[device_index].type;
+}
+
+static int
+SDL_COREMOTION_SensorGetDeviceNonPortableType(int device_index)
+{
+ return SDL_sensors[device_index].type;
+}
+
+static SDL_SensorID
+SDL_COREMOTION_SensorGetDeviceInstanceID(int device_index)
+{
+ return SDL_sensors[device_index].instance_id;
+}
+
+static int
+SDL_COREMOTION_SensorOpen(SDL_Sensor *sensor, int device_index)
+{
+ struct sensor_hwdata *hwdata;
+
+ hwdata = (struct sensor_hwdata *)SDL_calloc(1, sizeof(*hwdata));
+ if (hwdata == NULL) {
+ return SDL_OutOfMemory();
+ }
+ sensor->hwdata = hwdata;
+
+ switch (sensor->type)
+ {
+ case SDL_SENSOR_ACCEL:
+ [SDL_motion_manager startAccelerometerUpdates];
+ break;
+ case SDL_SENSOR_GYRO:
+ [SDL_motion_manager startGyroUpdates];
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+static void
+SDL_COREMOTION_SensorUpdate(SDL_Sensor *sensor)
+{
+ switch (sensor->type)
+ {
+ case SDL_SENSOR_ACCEL:
+ {
+ CMAccelerometerData *accelerometerData = SDL_motion_manager.accelerometerData;
+ if (accelerometerData) {
+ CMAcceleration acceleration = accelerometerData.acceleration;
+ float data[3];
+ data[0] = acceleration.x * SDL_STANDARD_GRAVITY;
+ data[1] = acceleration.y * SDL_STANDARD_GRAVITY;
+ data[2] = acceleration.z * SDL_STANDARD_GRAVITY;
+ if (SDL_memcmp(data, sensor->hwdata->data, sizeof(data)) != 0) {
+ SDL_PrivateSensorUpdate(sensor, data, SDL_arraysize(data));
+ SDL_memcpy(sensor->hwdata->data, data, sizeof(data));
+ }
+ }
+ }
+ break;
+ case SDL_SENSOR_GYRO:
+ {
+ CMGyroData *gyroData = SDL_motion_manager.gyroData;
+ if (gyroData) {
+ CMRotationRate rotationRate = gyroData.rotationRate;
+ float data[3];
+ data[0] = rotationRate.x;
+ data[1] = rotationRate.y;
+ data[2] = rotationRate.z;
+ if (SDL_memcmp(data, sensor->hwdata->data, sizeof(data)) != 0) {
+ SDL_PrivateSensorUpdate(sensor, data, SDL_arraysize(data));
+ SDL_memcpy(sensor->hwdata->data, data, sizeof(data));
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+SDL_COREMOTION_SensorClose(SDL_Sensor *sensor)
+{
+ if (sensor->hwdata) {
+ switch (sensor->type)
+ {
+ case SDL_SENSOR_ACCEL:
+ [SDL_motion_manager stopAccelerometerUpdates];
+ break;
+ case SDL_SENSOR_GYRO:
+ [SDL_motion_manager stopGyroUpdates];
+ break;
+ default:
+ break;
+ }
+ SDL_free(sensor->hwdata);
+ sensor->hwdata = NULL;
+ }
+}
+
+static void
+SDL_COREMOTION_SensorQuit(void)
+{
+}
+
+SDL_SensorDriver SDL_COREMOTION_SensorDriver =
+{
+ SDL_COREMOTION_SensorInit,
+ SDL_COREMOTION_SensorGetCount,
+ SDL_COREMOTION_SensorDetect,
+ SDL_COREMOTION_SensorGetDeviceName,
+ SDL_COREMOTION_SensorGetDeviceType,
+ SDL_COREMOTION_SensorGetDeviceNonPortableType,
+ SDL_COREMOTION_SensorGetDeviceInstanceID,
+ SDL_COREMOTION_SensorOpen,
+ SDL_COREMOTION_SensorUpdate,
+ SDL_COREMOTION_SensorClose,
+ SDL_COREMOTION_SensorQuit,
+};
+
+#endif /* SDL_SENSOR_COREMOTION */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.c b/source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.c
new file mode 100644
index 0000000..cf04045
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.c
@@ -0,0 +1,110 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "SDL_config.h"
+
+#if defined(SDL_SENSOR_DUMMY) || defined(SDL_SENSOR_DISABLED)
+
+#include "SDL_error.h"
+#include "SDL_sensor.h"
+#include "SDL_dummysensor.h"
+#include "../SDL_syssensor.h"
+
+static int
+SDL_DUMMY_SensorInit(void)
+{
+ return 0;
+}
+
+static int
+SDL_DUMMY_SensorGetCount(void)
+{
+ return 0;
+}
+
+static void
+SDL_DUMMY_SensorDetect(void)
+{
+}
+
+static const char *
+SDL_DUMMY_SensorGetDeviceName(int device_index)
+{
+ return NULL;
+}
+
+static SDL_SensorType
+SDL_DUMMY_SensorGetDeviceType(int device_index)
+{
+ return SDL_SENSOR_INVALID;
+}
+
+static int
+SDL_DUMMY_SensorGetDeviceNonPortableType(int device_index)
+{
+ return -1;
+}
+
+static SDL_SensorID
+SDL_DUMMY_SensorGetDeviceInstanceID(int device_index)
+{
+ return -1;
+}
+
+static int
+SDL_DUMMY_SensorOpen(SDL_Sensor *sensor, int device_index)
+{
+ return SDL_Unsupported();
+}
+
+static void
+SDL_DUMMY_SensorUpdate(SDL_Sensor *sensor)
+{
+}
+
+static void
+SDL_DUMMY_SensorClose(SDL_Sensor *sensor)
+{
+}
+
+static void
+SDL_DUMMY_SensorQuit(void)
+{
+}
+
+SDL_SensorDriver SDL_DUMMY_SensorDriver =
+{
+ SDL_DUMMY_SensorInit,
+ SDL_DUMMY_SensorGetCount,
+ SDL_DUMMY_SensorDetect,
+ SDL_DUMMY_SensorGetDeviceName,
+ SDL_DUMMY_SensorGetDeviceType,
+ SDL_DUMMY_SensorGetDeviceNonPortableType,
+ SDL_DUMMY_SensorGetDeviceInstanceID,
+ SDL_DUMMY_SensorOpen,
+ SDL_DUMMY_SensorUpdate,
+ SDL_DUMMY_SensorClose,
+ SDL_DUMMY_SensorQuit,
+};
+
+#endif /* SDL_SENSOR_DUMMY || SDL_SENSOR_DISABLED */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.h b/source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.h
new file mode 100644
index 0000000..507ee93
--- /dev/null
+++ b/source/3rd-party/SDL2/src/sensor/dummy/SDL_dummysensor.h
@@ -0,0 +1,23 @@
+/*
+ Simple DirectMedia Layer
+ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+/* vi: set ts=4 sw=4 expandtab: */