21 #include "../../SDL_internal.h"
23 #include "SDL_config.h"
25 #if defined(SDL_SENSOR_WINDOWS)
31 #include "../SDL_syssensor.h"
32 #include "../../core/windows/SDL_windows.h"
36 #include <sensorsapi.h>
39 DEFINE_GUID(SDL_CLSID_SensorManager, 0x77A1C827, 0xFCD2, 0x4689, 0x89, 0x15, 0x9D, 0x61, 0x3C, 0xC5, 0xFA, 0x3E);
40 DEFINE_GUID(SDL_IID_SensorManager, 0xBD77DB67, 0x45A8, 0x42DC, 0x8D, 0x00, 0x6D, 0xCF, 0x15, 0xF8, 0x37, 0x7A);
41 DEFINE_GUID(SDL_IID_SensorManagerEvents, 0x9B3B0B86, 0x266A, 0x4AAD, 0xB2, 0x1F, 0xFD, 0xE5, 0x50, 0x10, 0x01, 0xB7);
42 DEFINE_GUID(SDL_IID_SensorEvents, 0x5D8DCC91, 0x4641, 0x47E7, 0xB7, 0xC3, 0xB7, 0x4F, 0x48, 0xA6, 0xC3, 0x91);
45 DEFINE_PROPERTYKEY(SDL_SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEGREES_PER_SECOND, 0X3F8A69A2, 0X7C5, 0X4E48, 0XA9, 0X65, 0XCD, 0X79, 0X7A, 0XAB, 0X56, 0XD5, 10);
46 DEFINE_PROPERTYKEY(SDL_SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DEGREES_PER_SECOND, 0X3F8A69A2, 0X7C5, 0X4E48, 0XA9, 0X65, 0XCD, 0X79, 0X7A, 0XAB, 0X56, 0XD5, 11);
47 DEFINE_PROPERTYKEY(SDL_SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DEGREES_PER_SECOND, 0X3F8A69A2, 0X7C5, 0X4E48, 0XA9, 0X65, 0XCD, 0X79, 0X7A, 0XAB, 0X56, 0XD5, 12);
56 SDL_Sensor *sensor_opened;
61 static ISensorManager *SDL_sensor_manager;
62 static int SDL_num_sensors;
65 static int ConnectSensor(ISensor *sensor);
66 static int DisconnectSensor(ISensor *sensor);
68 static HRESULT STDMETHODCALLTYPE ISensorManagerEventsVtbl_QueryInterface(ISensorManagerEvents * This, REFIID riid,
void **ppvObject)
82 static ULONG STDMETHODCALLTYPE ISensorManagerEventsVtbl_AddRef(ISensorManagerEvents * This)
87 static ULONG STDMETHODCALLTYPE ISensorManagerEventsVtbl_Release(ISensorManagerEvents * This)
92 static HRESULT STDMETHODCALLTYPE ISensorManagerEventsVtbl_OnSensorEnter(ISensorManagerEvents * This, ISensor *pSensor, SensorState
state)
94 ConnectSensor(pSensor);
98 static ISensorManagerEventsVtbl sensor_manager_events_vtbl = {
99 ISensorManagerEventsVtbl_QueryInterface,
100 ISensorManagerEventsVtbl_AddRef,
101 ISensorManagerEventsVtbl_Release,
102 ISensorManagerEventsVtbl_OnSensorEnter
104 static ISensorManagerEvents sensor_manager_events = {
105 &sensor_manager_events_vtbl
108 static HRESULT STDMETHODCALLTYPE ISensorEventsVtbl_QueryInterface(ISensorEvents * This, REFIID riid,
void **ppvObject)
122 static ULONG STDMETHODCALLTYPE ISensorEventsVtbl_AddRef(ISensorEvents * This)
127 static ULONG STDMETHODCALLTYPE ISensorEventsVtbl_Release(ISensorEvents * This)
132 static HRESULT STDMETHODCALLTYPE ISensorEventsVtbl_OnStateChanged(ISensorEvents * This, ISensor *pSensor, SensorState
state)
138 for (
i = 0;
i < SDL_num_sensors; ++
i) {
148 static HRESULT STDMETHODCALLTYPE ISensorEventsVtbl_OnDataUpdated(ISensorEvents * This, ISensor *pSensor, ISensorDataReport *pNewData)
153 for (
i = 0;
i < SDL_num_sensors; ++
i) {
156 HRESULT hrX, hrY, hrZ;
157 PROPVARIANT valueX, valueY, valueZ;
164 hrX = ISensorDataReport_GetSensorValue(pNewData, &SENSOR_DATA_TYPE_ACCELERATION_X_G, &valueX);
165 hrY = ISensorDataReport_GetSensorValue(pNewData, &SENSOR_DATA_TYPE_ACCELERATION_Y_G, &valueY);
166 hrZ = ISensorDataReport_GetSensorValue(pNewData, &SENSOR_DATA_TYPE_ACCELERATION_Z_G, &valueZ);
168 valueX.vt == VT_R8 && valueY.vt == VT_R8 && valueZ.vt == VT_R8) {
178 hrX = ISensorDataReport_GetSensorValue(pNewData, &SDL_SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEGREES_PER_SECOND, &valueX);
179 hrY = ISensorDataReport_GetSensorValue(pNewData, &SDL_SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DEGREES_PER_SECOND, &valueY);
180 hrZ = ISensorDataReport_GetSensorValue(pNewData, &SDL_SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DEGREES_PER_SECOND, &valueZ);
182 valueX.vt == VT_R8 && valueY.vt == VT_R8 && valueZ.vt == VT_R8) {
183 const float DEGREES_TO_RADIANS = (float)(M_PI / 180.0f);
186 values[0] = (float)valueX.dblVal * DEGREES_TO_RADIANS;
187 values[1] = (
float)valueY.dblVal * DEGREES_TO_RADIANS;
188 values[2] = (float)valueZ.dblVal * DEGREES_TO_RADIANS;
205 static HRESULT STDMETHODCALLTYPE ISensorEventsVtbl_OnEvent(ISensorEvents * This, ISensor *pSensor, REFGUID eventID, IPortableDeviceValues *pEventData)
211 for (
i = 0;
i < SDL_num_sensors; ++
i) {
221 static HRESULT STDMETHODCALLTYPE ISensorEventsVtbl_OnLeave(ISensorEvents * This, REFSENSOR_ID ID)
226 for (
i = 0;
i < SDL_num_sensors; ++
i) {
239 static ISensorEventsVtbl sensor_events_vtbl = {
240 ISensorEventsVtbl_QueryInterface,
241 ISensorEventsVtbl_AddRef,
242 ISensorEventsVtbl_Release,
243 ISensorEventsVtbl_OnStateChanged,
244 ISensorEventsVtbl_OnDataUpdated,
245 ISensorEventsVtbl_OnEvent,
246 ISensorEventsVtbl_OnLeave
248 static ISensorEvents sensor_events = {
252 static int ConnectSensor(ISensor *sensor)
254 SDL_Windows_Sensor *new_sensor, *new_sensors;
257 SENSOR_TYPE_ID type_id;
259 BSTR bstr_name =
NULL;
262 hr = ISensor_GetID(sensor, &sensor_id);
267 hr = ISensor_GetType(sensor, &type_id);
280 hr = ISensor_GetFriendlyName(sensor, &bstr_name);
286 if (bstr_name !=
NULL) {
287 SysFreeString(bstr_name);
294 new_sensors = (SDL_Windows_Sensor *)
SDL_realloc(
SDL_sensors, (SDL_num_sensors + 1) *
sizeof(SDL_Windows_Sensor));
295 if (new_sensors ==
NULL) {
300 ISensor_AddRef(sensor);
301 ISensor_SetEventSink(sensor, &sensor_events);
309 new_sensor->sensor = sensor;
310 new_sensor->type =
type;
311 new_sensor->name =
name;
318 static int DisconnectSensor(ISensor *sensor)
320 SDL_Windows_Sensor *old_sensor;
324 for (
i = 0;
i < SDL_num_sensors; ++
i) {
326 if (sensor == old_sensor->sensor) {
327 ISensor_SetEventSink(sensor,
NULL);
328 ISensor_Release(sensor);
331 if (
i < SDL_num_sensors) {
343 SDL_WINDOWS_SensorInit(
void)
346 ISensorCollection *sensor_collection =
NULL;
352 hr = CoCreateInstance(&SDL_CLSID_SensorManager,
NULL, CLSCTX_INPROC_SERVER, &SDL_IID_SensorManager, (LPVOID *) &SDL_sensor_manager);
357 hr = ISensorManager_SetEventSink(SDL_sensor_manager, &sensor_manager_events);
359 ISensorManager_Release(SDL_sensor_manager);
363 hr = ISensorManager_GetSensorsByCategory(SDL_sensor_manager, &SENSOR_CATEGORY_ALL, &sensor_collection);
367 hr = ISensorCollection_GetCount(sensor_collection, &
count);
372 hr = ISensorCollection_GetAt(sensor_collection,
i, &sensor);
376 hr = ISensor_GetState(sensor, &
state);
378 ISensorManagerEventsVtbl_OnSensorEnter(&sensor_manager_events, sensor,
state);
380 ISensorManager_Release(sensor);
384 ISensorCollection_Release(sensor_collection);
390 SDL_WINDOWS_SensorGetCount(
void)
392 return SDL_num_sensors;
396 SDL_WINDOWS_SensorDetect(
void)
401 SDL_WINDOWS_SensorGetDeviceName(
int device_index)
407 SDL_WINDOWS_SensorGetDeviceType(
int device_index)
413 SDL_WINDOWS_SensorGetDeviceNonPortableType(
int device_index)
419 SDL_WINDOWS_SensorGetDeviceInstanceID(
int device_index)
425 SDL_WINDOWS_SensorOpen(SDL_Sensor *sensor,
int device_index)
432 SDL_WINDOWS_SensorUpdate(SDL_Sensor *sensor)
437 SDL_WINDOWS_SensorClose(SDL_Sensor *sensor)
441 for (
i = 0;
i < SDL_num_sensors; ++
i) {
450 SDL_WINDOWS_SensorQuit(
void)
452 while (SDL_num_sensors > 0) {
456 if (SDL_sensor_manager) {
457 ISensorManager_SetEventSink(SDL_sensor_manager,
NULL);
458 ISensorManager_Release(SDL_sensor_manager);
459 SDL_sensor_manager =
NULL;
462 if (SDL_windowscoinit) {
469 SDL_WINDOWS_SensorInit,
470 SDL_WINDOWS_SensorGetCount,
471 SDL_WINDOWS_SensorDetect,
472 SDL_WINDOWS_SensorGetDeviceName,
473 SDL_WINDOWS_SensorGetDeviceType,
474 SDL_WINDOWS_SensorGetDeviceNonPortableType,
475 SDL_WINDOWS_SensorGetDeviceInstanceID,
476 SDL_WINDOWS_SensorOpen,
477 SDL_WINDOWS_SensorUpdate,
478 SDL_WINDOWS_SensorClose,
479 SDL_WINDOWS_SensorQuit,
#define SDL_UnlockSensors
#define SDL_OutOfMemory()
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLenum GLsizei GLsizei GLint * values
GLuint const GLchar * name
static SDL_Sensor * SDL_sensors
SDL_SensorID SDL_GetNextSensorInstanceID()
int SDL_PrivateSensorUpdate(SDL_Sensor *sensor, float *data, int num_values)
#define SDL_STANDARD_GRAVITY
SDL_SensorDriver SDL_WINDOWS_SensorDriver
HRESULT WIN_CoInitialize(void)
void WIN_CoUninitialize(void)
BOOL WIN_IsEqualIID(REFIID a, REFIID b)
#define WIN_StringToUTF8(S)
int WIN_SetErrorFromHRESULT(const char *prefix, HRESULT hr)
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)