SDL  2.0
SDL_sensor.c File Reference
#include "../SDL_internal.h"
#include "SDL.h"
#include "SDL_atomic.h"
#include "SDL_events.h"
#include "SDL_syssensor.h"
#include "SDL_assert.h"
#include "../events/SDL_events_c.h"
+ Include dependency graph for SDL_sensor.c:

Go to the source code of this file.

Functions

static void SDL_LockSensors (void)
 
static void SDL_UnlockSensors (void)
 
int SDL_SensorInit (void)
 
int SDL_NumSensors (void)
 Count the number of sensors attached to the system right now. More...
 
SDL_SensorID SDL_GetNextSensorInstanceID ()
 
static SDL_bool SDL_GetDriverAndSensorIndex (int device_index, SDL_SensorDriver **driver, int *driver_index)
 
const char * SDL_SensorGetDeviceName (int device_index)
 Get the implementation dependent name of a sensor. More...
 
SDL_SensorType SDL_SensorGetDeviceType (int device_index)
 Get the type of a sensor. More...
 
SDL_SensorType SDL_SensorGetDeviceNonPortableType (int device_index)
 Get the platform dependent type of a sensor. More...
 
SDL_SensorID SDL_SensorGetDeviceInstanceID (int device_index)
 Get the instance ID of a sensor. More...
 
SDL_Sensor * SDL_SensorOpen (int device_index)
 Open a sensor for use. More...
 
SDL_Sensor * SDL_SensorFromInstanceID (SDL_SensorID instance_id)
 
static int SDL_PrivateSensorValid (SDL_Sensor *sensor)
 
const char * SDL_SensorGetName (SDL_Sensor *sensor)
 Get the implementation dependent name of a sensor. More...
 
SDL_SensorType SDL_SensorGetType (SDL_Sensor *sensor)
 Get the type of a sensor. More...
 
int SDL_SensorGetNonPortableType (SDL_Sensor *sensor)
 Get the platform dependent type of a sensor. More...
 
SDL_SensorID SDL_SensorGetInstanceID (SDL_Sensor *sensor)
 Get the instance ID of a sensor. More...
 
int SDL_SensorGetData (SDL_Sensor *sensor, float *data, int num_values)
 
void SDL_SensorClose (SDL_Sensor *sensor)
 
void SDL_SensorQuit (void)
 
int SDL_PrivateSensorUpdate (SDL_Sensor *sensor, float *data, int num_values)
 
void SDL_SensorUpdate (void)
 

Variables

static SDL_SensorDriverSDL_sensor_drivers []
 
static SDL_Sensor * SDL_sensors = NULL
 
static SDL_bool SDL_updating_sensor = SDL_FALSE
 
static SDL_mutexSDL_sensor_lock = NULL
 
static SDL_atomic_t SDL_next_sensor_instance_id
 

Function Documentation

◆ SDL_GetDriverAndSensorIndex()

static SDL_bool SDL_GetDriverAndSensorIndex ( int  device_index,
SDL_SensorDriver **  driver,
int *  driver_index 
)
static

Definition at line 122 of file SDL_sensor.c.

References SDL_SensorDriver::GetCount, i, SDL_arraysize, SDL_FALSE, SDL_SetError, and SDL_TRUE.

Referenced by SDL_SensorGetDeviceInstanceID(), SDL_SensorGetDeviceName(), SDL_SensorGetDeviceNonPortableType(), SDL_SensorGetDeviceType(), and SDL_SensorOpen().

123 {
124  int i, num_sensors, total_sensors = 0;
125 
126  if (device_index >= 0) {
127  for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
128  num_sensors = SDL_sensor_drivers[i]->GetCount();
129  if (device_index < num_sensors) {
130  *driver = SDL_sensor_drivers[i];
131  *driver_index = device_index;
132  return SDL_TRUE;
133  }
134  device_index -= num_sensors;
135  total_sensors += num_sensors;
136  }
137  }
138 
139  SDL_SetError("There are %d sensors available", total_sensors);
140  return SDL_FALSE;
141 }
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_SetError
static SDL_SensorDriver * SDL_sensor_drivers[]
Definition: SDL_sensor.c:35
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
int(* GetCount)(void)
Definition: SDL_syssensor.h:60

◆ SDL_GetNextSensorInstanceID()

SDL_SensorID SDL_GetNextSensorInstanceID ( void  )

Definition at line 112 of file SDL_sensor.c.

References SDL_AtomicIncRef.

113 {
115 }
static SDL_atomic_t SDL_next_sensor_instance_id
Definition: SDL_sensor.c:49
#define SDL_AtomicIncRef(a)
Increment an atomic variable used as a reference count.
Definition: SDL_atomic.h:234

◆ SDL_LockSensors()

◆ SDL_NumSensors()

int SDL_NumSensors ( void  )

Count the number of sensors attached to the system right now.

Gyroscope sensor

The gyroscope returns the current rate of rotation in radians per second. The rotation is positive in the counter-clockwise direction. That is, an observer looking from a positive location on one of the axes would see positive rotation on that axis when it appeared to be rotating counter-clockwise.

values[0]: Angular speed around the x axis values[1]: Angular speed around the y axis values[2]: Angular speed around the z axis

For phones held in portrait mode, the axes are defined as follows: -X ... +X : left ... right -Y ... +Y : bottom ... top -Z ... +Z : farther ... closer

The axis data is not changed when the phone is rotated.

See also
SDL_GetDisplayOrientation()

Definition at line 97 of file SDL_sensor.c.

References SDL_SensorDriver::GetCount, i, SDL_arraysize, SDL_LockSensors(), and SDL_UnlockSensors().

98 {
99  int i, total_sensors = 0;
100  SDL_LockSensors();
101  for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
102  total_sensors += SDL_sensor_drivers[i]->GetCount();
103  }
105  return total_sensors;
106 }
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
static SDL_SensorDriver * SDL_sensor_drivers[]
Definition: SDL_sensor.c:35
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
int(* GetCount)(void)
Definition: SDL_syssensor.h:60

◆ SDL_PrivateSensorUpdate()

int SDL_PrivateSensorUpdate ( SDL_Sensor *  sensor,
float *  data,
int  num_values 
)

Definition at line 476 of file SDL_sensor.c.

References SDL_SensorEvent::data, SDL_arraysize, SDL_ENABLE, SDL_GetEventState, SDL_JOYAXISMOTION, SDL_memcpy, SDL_memset, SDL_min, SDL_PushEvent, SDL_SENSORUPDATE, and SDL_Event::sensor.

477 {
478  int posted;
479 
480  /* Allow duplicate events, for things like steps and heartbeats */
481 
482  /* Update internal sensor state */
483  num_values = SDL_min(num_values, SDL_arraysize(sensor->data));
484  SDL_memcpy(sensor->data, data, num_values*sizeof(*data));
485 
486  /* Post the event, if desired */
487  posted = 0;
488 #if !SDL_EVENTS_DISABLED
491  event.type = SDL_SENSORUPDATE;
492  event.sensor.which = sensor->instance_id;
493  num_values = SDL_min(num_values, SDL_arraysize(event.sensor.data));
494  SDL_memset(event.sensor.data, 0, sizeof(event.sensor.data));
495  SDL_memcpy(event.sensor.data, data, num_values*sizeof(*data));
496  posted = SDL_PushEvent(&event) == 1;
497  }
498 #endif /* !SDL_EVENTS_DISABLED */
499  return posted;
500 }
#define SDL_min(x, y)
Definition: SDL_stdinc.h:406
#define SDL_ENABLE
Definition: SDL_events.h:756
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
SDL_SensorEvent sensor
Definition: SDL_events.h:578
#define SDL_memcpy
#define SDL_GetEventState(type)
Definition: SDL_events.h:769
struct _cl_event * event
#define SDL_PushEvent
float data[6]
Definition: SDL_events.h:503
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
General event structure.
Definition: SDL_events.h:557
#define SDL_memset

◆ SDL_PrivateSensorValid()

static int SDL_PrivateSensorValid ( SDL_Sensor *  sensor)
static

Definition at line 305 of file SDL_sensor.c.

References NULL, and SDL_SetError.

Referenced by SDL_SensorClose(), SDL_SensorGetData(), SDL_SensorGetInstanceID(), SDL_SensorGetName(), SDL_SensorGetNonPortableType(), and SDL_SensorGetType().

306 {
307  int valid;
308 
309  if (sensor == NULL) {
310  SDL_SetError("Sensor hasn't been opened yet");
311  valid = 0;
312  } else {
313  valid = 1;
314  }
315 
316  return valid;
317 }
#define NULL
Definition: begin_code.h:164
#define SDL_SetError

◆ SDL_SensorClose()

void SDL_SensorClose ( SDL_Sensor *  sensor)

Close a sensor previously opened with SDL_SensorOpen()

Definition at line 390 of file SDL_sensor.c.

References NULL, SDL_free, SDL_LockSensors(), SDL_PrivateSensorValid(), SDL_sensors, SDL_UnlockSensors(), and SDL_updating_sensor.

Referenced by SDL_SensorQuit(), and SDL_SensorUpdate().

391 {
392  SDL_Sensor *sensorlist;
393  SDL_Sensor *sensorlistprev;
394 
395  if (!SDL_PrivateSensorValid(sensor)) {
396  return;
397  }
398 
399  SDL_LockSensors();
400 
401  /* First decrement ref count */
402  if (--sensor->ref_count > 0) {
404  return;
405  }
406 
407  if (SDL_updating_sensor) {
409  return;
410  }
411 
412  sensor->driver->Close(sensor);
413  sensor->hwdata = NULL;
414 
415  sensorlist = SDL_sensors;
416  sensorlistprev = NULL;
417  while (sensorlist) {
418  if (sensor == sensorlist) {
419  if (sensorlistprev) {
420  /* unlink this entry */
421  sensorlistprev->next = sensorlist->next;
422  } else {
423  SDL_sensors = sensor->next;
424  }
425  break;
426  }
427  sensorlistprev = sensorlist;
428  sensorlist = sensorlist->next;
429  }
430 
431  SDL_free(sensor->name);
432 
433  /* Free the data associated with this sensor */
434  SDL_free(sensor);
435 
437 }
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
#define SDL_free
static SDL_bool SDL_updating_sensor
Definition: SDL_sensor.c:47
static SDL_Sensor * SDL_sensors
Definition: SDL_sensor.c:46
#define NULL
Definition: begin_code.h:164
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60
static int SDL_PrivateSensorValid(SDL_Sensor *sensor)
Definition: SDL_sensor.c:305

◆ SDL_SensorFromInstanceID()

SDL_Sensor* SDL_SensorFromInstanceID ( SDL_SensorID  instance_id)

Return the SDL_Sensor associated with an instance id.

Definition at line 287 of file SDL_sensor.c.

References SDL_LockSensors(), SDL_sensors, and SDL_UnlockSensors().

288 {
289  SDL_Sensor *sensor;
290 
291  SDL_LockSensors();
292  for (sensor = SDL_sensors; sensor; sensor = sensor->next) {
293  if (sensor->instance_id == instance_id) {
294  break;
295  }
296  }
298  return sensor;
299 }
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
static SDL_Sensor * SDL_sensors
Definition: SDL_sensor.c:46
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60

◆ SDL_SensorGetData()

int SDL_SensorGetData ( SDL_Sensor *  sensor,
float *  data,
int  num_values 
)

Get the current state of an opened sensor.

The number of values and interpretation of the data is sensor dependent.

Parameters
sensorThe sensor to query
dataA pointer filled with the current sensor state
num_valuesThe number of values to write to data
Returns
0 or -1 if an error occurred.

Definition at line 375 of file SDL_sensor.c.

References SDL_arraysize, SDL_memcpy, SDL_min, and SDL_PrivateSensorValid().

376 {
377  if (!SDL_PrivateSensorValid(sensor)) {
378  return -1;
379  }
380 
381  num_values = SDL_min(num_values, SDL_arraysize(sensor->data));
382  SDL_memcpy(data, sensor->data, num_values*sizeof(*data));
383  return 0;
384 }
#define SDL_min(x, y)
Definition: SDL_stdinc.h:406
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
#define SDL_memcpy
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
static int SDL_PrivateSensorValid(SDL_Sensor *sensor)
Definition: SDL_sensor.c:305

◆ SDL_SensorGetDeviceInstanceID()

SDL_SensorID SDL_SensorGetDeviceInstanceID ( int  device_index)

Get the instance ID of a sensor.

This can be called before any sensors are opened.

Returns
The sensor instance ID, or -1 if device_index is out of range.

Definition at line 193 of file SDL_sensor.c.

References SDL_SensorDriver::GetDeviceInstanceID, SDL_GetDriverAndSensorIndex(), SDL_LockSensors(), and SDL_UnlockSensors().

194 {
195  SDL_SensorDriver *driver;
196  SDL_SensorID instance_id = -1;
197 
198  SDL_LockSensors();
199  if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
200  instance_id = driver->GetDeviceInstanceID(device_index);
201  }
203 
204  return instance_id;
205 }
SDL_SensorID(* GetDeviceInstanceID)(int device_index)
Definition: SDL_syssensor.h:75
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
Sint32 SDL_SensorID
Definition: SDL_sensor.h:60
static SDL_bool SDL_GetDriverAndSensorIndex(int device_index, SDL_SensorDriver **driver, int *driver_index)
Definition: SDL_sensor.c:122
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60

◆ SDL_SensorGetDeviceName()

const char* SDL_SensorGetDeviceName ( int  device_index)

Get the implementation dependent name of a sensor.

This can be called before any sensors are opened.

Returns
The sensor name, or NULL if device_index is out of range.

Definition at line 147 of file SDL_sensor.c.

References SDL_SensorDriver::GetDeviceName, NULL, SDL_GetDriverAndSensorIndex(), SDL_LockSensors(), and SDL_UnlockSensors().

148 {
149  SDL_SensorDriver *driver;
150  const char *name = NULL;
151 
152  SDL_LockSensors();
153  if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
154  name = driver->GetDeviceName(device_index);
155  }
157 
158  /* FIXME: Really we should reference count this name so it doesn't go away after unlock */
159  return name;
160 }
const char *(* GetDeviceName)(int device_index)
Definition: SDL_syssensor.h:66
GLuint const GLchar * name
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
#define NULL
Definition: begin_code.h:164
static SDL_bool SDL_GetDriverAndSensorIndex(int device_index, SDL_SensorDriver **driver, int *driver_index)
Definition: SDL_sensor.c:122
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60

◆ SDL_SensorGetDeviceNonPortableType()

SDL_SensorType SDL_SensorGetDeviceNonPortableType ( int  device_index)

Get the platform dependent type of a sensor.

This can be called before any sensors are opened.

Returns
The sensor platform dependent type, or -1 if device_index is out of range.

Definition at line 178 of file SDL_sensor.c.

References SDL_SensorDriver::GetDeviceNonPortableType, SDL_GetDriverAndSensorIndex(), SDL_LockSensors(), and SDL_UnlockSensors().

179 {
180  SDL_SensorDriver *driver;
181  int type = -1;
182 
183  SDL_LockSensors();
184  if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
185  type = driver->GetDeviceNonPortableType(device_index);
186  }
188 
189  return type;
190 }
int(* GetDeviceNonPortableType)(int device_index)
Definition: SDL_syssensor.h:72
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
static SDL_bool SDL_GetDriverAndSensorIndex(int device_index, SDL_SensorDriver **driver, int *driver_index)
Definition: SDL_sensor.c:122
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60

◆ SDL_SensorGetDeviceType()

SDL_SensorType SDL_SensorGetDeviceType ( int  device_index)

Get the type of a sensor.

This can be called before any sensors are opened.

Returns
The sensor type, or SDL_SENSOR_INVALID if device_index is out of range.

Definition at line 163 of file SDL_sensor.c.

References SDL_SensorDriver::GetDeviceType, SDL_GetDriverAndSensorIndex(), SDL_LockSensors(), SDL_SENSOR_INVALID, and SDL_UnlockSensors().

164 {
165  SDL_SensorDriver *driver;
167 
168  SDL_LockSensors();
169  if (SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
170  type = driver->GetDeviceType(device_index);
171  }
173 
174  return type;
175 }
SDL_SensorType(* GetDeviceType)(int device_index)
Definition: SDL_syssensor.h:69
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
SDL_SensorType
Definition: SDL_sensor.h:69
static SDL_bool SDL_GetDriverAndSensorIndex(int device_index, SDL_SensorDriver **driver, int *driver_index)
Definition: SDL_sensor.c:122
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60

◆ SDL_SensorGetInstanceID()

SDL_SensorID SDL_SensorGetInstanceID ( SDL_Sensor *  sensor)

Get the instance ID of a sensor.

This can be called before any sensors are opened.

Returns
The sensor instance ID, or -1 if the sensor is NULL.

Definition at line 362 of file SDL_sensor.c.

References SDL_PrivateSensorValid().

363 {
364  if (!SDL_PrivateSensorValid(sensor)) {
365  return -1;
366  }
367 
368  return sensor->instance_id;
369 }
static int SDL_PrivateSensorValid(SDL_Sensor *sensor)
Definition: SDL_sensor.c:305

◆ SDL_SensorGetName()

const char* SDL_SensorGetName ( SDL_Sensor *  sensor)

Get the implementation dependent name of a sensor.

Returns
The sensor name, or NULL if the sensor is NULL.

Definition at line 323 of file SDL_sensor.c.

References NULL, and SDL_PrivateSensorValid().

324 {
325  if (!SDL_PrivateSensorValid(sensor)) {
326  return NULL;
327  }
328 
329  return sensor->name;
330 }
#define NULL
Definition: begin_code.h:164
static int SDL_PrivateSensorValid(SDL_Sensor *sensor)
Definition: SDL_sensor.c:305

◆ SDL_SensorGetNonPortableType()

int SDL_SensorGetNonPortableType ( SDL_Sensor *  sensor)

Get the platform dependent type of a sensor.

This can be called before any sensors are opened.

Returns
The sensor platform dependent type, or -1 if the sensor is NULL.

Definition at line 349 of file SDL_sensor.c.

References SDL_PrivateSensorValid().

350 {
351  if (!SDL_PrivateSensorValid(sensor)) {
352  return -1;
353  }
354 
355  return sensor->non_portable_type;
356 }
static int SDL_PrivateSensorValid(SDL_Sensor *sensor)
Definition: SDL_sensor.c:305

◆ SDL_SensorGetType()

SDL_SensorType SDL_SensorGetType ( SDL_Sensor *  sensor)

Get the type of a sensor.

This can be called before any sensors are opened.

Returns
The sensor type, or SDL_SENSOR_INVALID if the sensor is NULL.

Definition at line 336 of file SDL_sensor.c.

References SDL_PrivateSensorValid(), and SDL_SENSOR_INVALID.

337 {
338  if (!SDL_PrivateSensorValid(sensor)) {
339  return SDL_SENSOR_INVALID;
340  }
341 
342  return sensor->type;
343 }
static int SDL_PrivateSensorValid(SDL_Sensor *sensor)
Definition: SDL_sensor.c:305

◆ SDL_SensorInit()

int SDL_SensorInit ( void  )

Definition at line 69 of file SDL_sensor.c.

References i, SDL_arraysize, SDL_CreateMutex, SDL_INIT_EVENTS, and SDL_InitSubSystem.

Referenced by SDL_InitSubSystem().

70 {
71  int i, status;
72 
73  /* Create the sensor list lock */
74  if (!SDL_sensor_lock) {
76  }
77 
78 #if !SDL_EVENTS_DISABLED
80  return -1;
81  }
82 #endif /* !SDL_EVENTS_DISABLED */
83 
84  status = -1;
85  for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
86  if (SDL_sensor_drivers[i]->Init() >= 0) {
87  status = 0;
88  }
89  }
90  return status;
91 }
#define SDL_INIT_EVENTS
Definition: SDL.h:83
static SDL_mutex * SDL_sensor_lock
Definition: SDL_sensor.c:48
#define SDL_CreateMutex
#define SDL_InitSubSystem
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
static SDL_SensorDriver * SDL_sensor_drivers[]
Definition: SDL_sensor.c:35
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115

◆ SDL_SensorOpen()

SDL_Sensor* SDL_SensorOpen ( int  device_index)

Open a sensor for use.

The index passed as an argument refers to the N'th sensor on the system.

Returns
A sensor identifier, or NULL if an error occurred.

Definition at line 215 of file SDL_sensor.c.

References SDL_SensorDriver::GetDeviceInstanceID, SDL_SensorDriver::GetDeviceName, SDL_SensorDriver::GetDeviceNonPortableType, SDL_SensorDriver::GetDeviceType, NULL, SDL_SensorDriver::Open, SDL_calloc, SDL_free, SDL_GetDriverAndSensorIndex(), SDL_LockSensors(), SDL_OutOfMemory, SDL_sensors, SDL_strdup, SDL_UnlockSensors(), and SDL_SensorDriver::Update.

216 {
217  SDL_SensorDriver *driver;
218  SDL_SensorID instance_id;
219  SDL_Sensor *sensor;
220  SDL_Sensor *sensorlist;
221  const char *sensorname = NULL;
222 
223  SDL_LockSensors();
224 
225  if (!SDL_GetDriverAndSensorIndex(device_index, &driver, &device_index)) {
227  return NULL;
228  }
229 
230  sensorlist = SDL_sensors;
231  /* If the sensor is already open, return it
232  * it is important that we have a single sensor * for each instance id
233  */
234  instance_id = driver->GetDeviceInstanceID(device_index);
235  while (sensorlist) {
236  if (instance_id == sensorlist->instance_id) {
237  sensor = sensorlist;
238  ++sensor->ref_count;
240  return sensor;
241  }
242  sensorlist = sensorlist->next;
243  }
244 
245  /* Create and initialize the sensor */
246  sensor = (SDL_Sensor *) SDL_calloc(sizeof(*sensor), 1);
247  if (sensor == NULL) {
248  SDL_OutOfMemory();
250  return NULL;
251  }
252  sensor->driver = driver;
253  sensor->instance_id = instance_id;
254  sensor->type = driver->GetDeviceType(device_index);
255  sensor->non_portable_type = driver->GetDeviceNonPortableType(device_index);
256 
257  if (driver->Open(sensor, device_index) < 0) {
258  SDL_free(sensor);
260  return NULL;
261  }
262 
263  sensorname = driver->GetDeviceName(device_index);
264  if (sensorname) {
265  sensor->name = SDL_strdup(sensorname);
266  } else {
267  sensor->name = NULL;
268  }
269 
270  /* Add sensor to list */
271  ++sensor->ref_count;
272  /* Link the sensor in the list */
273  sensor->next = SDL_sensors;
274  SDL_sensors = sensor;
275 
277 
278  driver->Update(sensor);
279 
280  return sensor;
281 }
SDL_SensorID(* GetDeviceInstanceID)(int device_index)
Definition: SDL_syssensor.h:75
int(* GetDeviceNonPortableType)(int device_index)
Definition: SDL_syssensor.h:72
int(* Open)(SDL_Sensor *sensor, int device_index)
Definition: SDL_syssensor.h:81
SDL_SensorType(* GetDeviceType)(int device_index)
Definition: SDL_syssensor.h:69
const char *(* GetDeviceName)(int device_index)
Definition: SDL_syssensor.h:66
void(* Update)(SDL_Sensor *sensor)
Definition: SDL_syssensor.h:88
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
Sint32 SDL_SensorID
Definition: SDL_sensor.h:60
#define SDL_free
static SDL_Sensor * SDL_sensors
Definition: SDL_sensor.c:46
#define NULL
Definition: begin_code.h:164
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_calloc
#define SDL_strdup
static SDL_bool SDL_GetDriverAndSensorIndex(int device_index, SDL_SensorDriver **driver, int *driver_index)
Definition: SDL_sensor.c:122
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60

◆ SDL_SensorQuit()

void SDL_SensorQuit ( void  )

Definition at line 440 of file SDL_sensor.c.

References i, NULL, SDL_SensorDriver::Quit, SDL_arraysize, SDL_assert, SDL_DestroyMutex, SDL_INIT_EVENTS, SDL_LockSensors(), SDL_QuitSubSystem, SDL_SensorClose(), SDL_sensors, SDL_UnlockSensors(), and SDL_updating_sensor.

Referenced by SDL_QuitSubSystem().

441 {
442  int i;
443 
444  /* Make sure we're not getting called in the middle of updating sensors */
446 
447  SDL_LockSensors();
448 
449  /* Stop the event polling */
450  while (SDL_sensors) {
451  SDL_sensors->ref_count = 1;
453  }
454 
455  /* Quit the sensor setup */
456  for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
458  }
459 
461 
462 #if !SDL_EVENTS_DISABLED
464 #endif
465 
466  if (SDL_sensor_lock) {
469  }
470 }
#define SDL_INIT_EVENTS
Definition: SDL.h:83
static SDL_mutex * SDL_sensor_lock
Definition: SDL_sensor.c:48
#define SDL_QuitSubSystem
void SDL_SensorClose(SDL_Sensor *sensor)
Definition: SDL_sensor.c:390
void(* Quit)(void)
Definition: SDL_syssensor.h:94
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
static SDL_bool SDL_updating_sensor
Definition: SDL_sensor.c:47
static SDL_Sensor * SDL_sensors
Definition: SDL_sensor.c:46
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define NULL
Definition: begin_code.h:164
#define SDL_DestroyMutex
static SDL_SensorDriver * SDL_sensor_drivers[]
Definition: SDL_sensor.c:35
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115

◆ SDL_SensorUpdate()

void SDL_SensorUpdate ( void  )

Update the current state of the open sensors.

This is called automatically by the event loop if sensor events are enabled.

This needs to be called from the thread that initialized the sensor subsystem.

Definition at line 503 of file SDL_sensor.c.

References SDL_SensorDriver::Detect, i, SDL_arraysize, SDL_FALSE, SDL_LockSensors(), SDL_SensorClose(), SDL_sensors, SDL_TRUE, SDL_UnlockSensors(), and SDL_updating_sensor.

504 {
505  int i;
506  SDL_Sensor *sensor;
507 
508  SDL_LockSensors();
509 
510  if (SDL_updating_sensor) {
511  /* The sensors are already being updated */
513  return;
514  }
515 
517 
518  /* Make sure the list is unlocked while dispatching events to prevent application deadlocks */
520 
521  for (sensor = SDL_sensors; sensor; sensor = sensor->next) {
522  sensor->driver->Update(sensor);
523  }
524 
525  SDL_LockSensors();
526 
528 
529  /* If any sensors were closed while updating, free them here */
530  for (sensor = SDL_sensors; sensor; sensor = sensor->next) {
531  if (sensor->ref_count <= 0) {
532  SDL_SensorClose(sensor);
533  }
534  }
535 
536  /* this needs to happen AFTER walking the sensor list above, so that any
537  dangling hardware data from removed devices can be free'd
538  */
539  for (i = 0; i < SDL_arraysize(SDL_sensor_drivers); ++i) {
541  }
542 
544 }
void SDL_SensorClose(SDL_Sensor *sensor)
Definition: SDL_sensor.c:390
static void SDL_LockSensors(void)
Definition: SDL_sensor.c:52
void(* Detect)(void)
Definition: SDL_syssensor.h:63
static SDL_bool SDL_updating_sensor
Definition: SDL_sensor.c:47
static SDL_Sensor * SDL_sensors
Definition: SDL_sensor.c:46
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
static SDL_SensorDriver * SDL_sensor_drivers[]
Definition: SDL_sensor.c:35
static void SDL_UnlockSensors(void)
Definition: SDL_sensor.c:60
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115

◆ SDL_UnlockSensors()

Variable Documentation

◆ SDL_next_sensor_instance_id

SDL_atomic_t SDL_next_sensor_instance_id
static

Definition at line 49 of file SDL_sensor.c.

◆ SDL_sensor_drivers

SDL_SensorDriver* SDL_sensor_drivers[]
static
Initial value:
= {
}
SDL_SensorDriver SDL_DUMMY_SensorDriver

Definition at line 35 of file SDL_sensor.c.

◆ SDL_sensor_lock

SDL_mutex* SDL_sensor_lock = NULL
static

Definition at line 48 of file SDL_sensor.c.

◆ SDL_sensors

SDL_Sensor* SDL_sensors = NULL
static

◆ SDL_updating_sensor

SDL_bool SDL_updating_sensor = SDL_FALSE
static

Definition at line 47 of file SDL_sensor.c.

Referenced by SDL_SensorClose(), SDL_SensorQuit(), and SDL_SensorUpdate().