summaryrefslogtreecommitdiff
path: root/sensors/Fusion/Device.h
diff options
context:
space:
mode:
Diffstat (limited to 'sensors/Fusion/Device.h')
-rw-r--r--sensors/Fusion/Device.h195
1 files changed, 195 insertions, 0 deletions
diff --git a/sensors/Fusion/Device.h b/sensors/Fusion/Device.h
new file mode 100644
index 00000000..89d45ed9
--- /dev/null
+++ b/sensors/Fusion/Device.h
@@ -0,0 +1,195 @@
+//Copyright (C) Microsoft Corporation, All Rights Reserved
+//
+//Abstract:
+//
+// This module contains the type definitions for the client
+// driver's device callback class.
+//
+//Environment:
+//
+// Windows User-Mode Driver Framework (UMDF)
+
+#pragma once
+
+#include <windows.h>
+#include <wdf.h>
+#include <math.h>
+
+#include "SensorsTrace.h"
+#include <SensorsCx.h>
+#include <SensorsUtils.h>
+#include <Math3DHelper.h>
+#include <SensorsDef.h>
+
+#define SENSOR_POOL_TAG_FUSIONSENSOR 'esuF'
+
+#define FusionSensor_Default_MinDataInterval_Ms (16) // 60Hz
+#define FusionSensor_Default_DataInterval (100) // 10Hz
+#define FusionSensor_Quarternion_Maximum (1.0f)
+#define FusionSensor_Quarternion_Minimum (-1.0f)
+#define FusionSensor_Quarternion_Resolution ((FusionSensor_Quarternion_Maximum-FusionSensor_Quarternion_Minimum)/65536)
+
+
+// TODO: Customize the following 5 lines based on the hardware being used
+#define GyrFakeDevice_Minimum_DegreesPerSecond (-2000.0f)
+#define GyrFakeDevice_Maximum_DegreesPerSecond (2000.0f)
+#define GyrFakeDevice_Precision (65536.0f) // 65536 = 2^16, 16 bit data
+#define GyrFakeDevice_Range_DegreesPerSecond (GyrFakeDevice_Maximum_DegreesPerSecond - GyrFakeDevice_Minimum_DegreesPerSecond)
+#define GyrFakeDevice_Resolution_DegreesPerSecond (GyrFakeDevice_Range_DegreesPerSecond / GyrFakeDevice_Precision)
+
+// TODO: Customize the following 3 lines based on the hardware being used
+#define AccFakeDevice_Axis_Resolution (4.0f / 65536.0f) // in delta g
+#define AccFakeDevice_Axis_Minimum (-2.0f) // in g
+#define AccFakeDevice_Axis_Maximum (2.0f) // in g
+
+// Sensor Common Properties
+typedef enum
+{
+ SENSOR_PROPERTY_STATE = 0,
+ SENSOR_PROPERTY_MIN_INTERVAL,
+ SENSOR_PROPERTY_MAX_DATAFIELDSIZE,
+ SENSOR_PROPERTY_SENSOR_TYPE,
+ SENSOR_PROPERTY_USE_GYRO,
+ SENSOR_PROPERTIES_COUNT
+} SENSOR_COMMON_PROPERTIES_INDEX;
+
+// Sensor Enumeration Properties
+typedef enum
+{
+ SENSOR_TYPE_GUID = 0,
+ SENSOR_MANUFACTURER,
+ SENSOR_MODEL,
+ SENSOR_PERSISTENT_UNIQUEID,
+ SENSOR_ISPRIMARY,
+ SENSOR_ENUMERATION_PROPERTIES_COUNT
+} SENSOR_ENUMERATION_PROPERTIES_INDEX;
+
+// Accelerometer related data-field Properties
+typedef enum
+{
+ SENSOR_ACC_RESOLUTION = 0,
+ SENSOR_ACC_MIN_RANGE,
+ SENSOR_ACC_MAX_RANGE,
+ SENSOR_ACC_DATA_FIELD_PROPERTY_COUNT
+} SENSOR_ACC_DATA_FIELD_PROPERTY_INDEX;
+
+// Gyroscope related data-field Properties
+typedef enum
+{
+ SENSOR_GYR_RESOLUTION = 0,
+ SENSOR_GYR_MIN_RANGE,
+ SENSOR_GYR_MAX_RANGE,
+ SENSOR_GYR_DATA_FIELD_PROPERTY_COUNT
+} SENSOR_GYR_DATA_FIELD_PROPERTY_INDEX;
+
+// Supported Data
+typedef enum
+{
+ FUSIONSENSOR_DATA_TIMESTAMP = 0,
+ FUSIONSENSOR_DATA_QUATERNION_W,
+ FUSIONSENSOR_DATA_QUATERNION_X,
+ FUSIONSENSOR_DATA_QUATERNION_Y,
+ FUSIONSENSOR_DATA_QUATERNION_Z,
+ FUSIONSENSOR_DATA_ACCURACY,
+ FUSIONSENSOR_DATA_DECLINATION_ANGLE,
+ FUSIONSENSOR_DATA_COUNT
+} FUSIONSENSOR_DATA_INDEX;
+
+typedef enum
+{
+ FUSIONSENSOR_THRESHOLD_ROTATION_ANGLE = 0,
+ FUSIONSENSOR_THRESHOLD_LINEAR_ACCELERATION_X,
+ FUSIONSENSOR_THRESHOLD_LINEAR_ACCELERATION_Y,
+ FUSIONSENSOR_THRESHOLD_LINEAR_ACCELERATION_Z,
+ FUSIONSENSOR_THRESHOLD_ROTATION_RATE_X,
+ FUSIONSENSOR_THRESHOLD_ROTATION_RATE_Y,
+ FUSIONSENSOR_THRESHOLD_ROTATION_RATE_Z,
+ FUSIONSENSOR_THRESHOLD_COUNT
+} FUSIONSENSOR_THRESHOLD_INDEX;
+
+typedef struct FusionSensorSample
+{
+ FILETIME Timestamp;
+ QUATERNION Quaternion;
+ ULONG Accuracy;
+ FLOAT DeclinationAngle;
+} FusionSensorSample, *PFusionSensorSample;
+
+//
+// Fusion Threshold
+//
+typedef struct _FusThreshold
+{
+ FLOAT RotationAngle;
+ VEC3D LinearAcceleration;
+ VEC3D RotationRate;
+} FusThreshold, *PFusThreshold;
+
+typedef class FusionSensorDevice
+{
+private:
+ // Simulator
+ WDFOBJECT m_SimulatorInstance;
+
+ // WDF
+ WDFDEVICE m_FxDevice;
+ SENSOROBJECT m_SensorInstance;
+ WDFWAITLOCK m_Lock;
+ WDFTIMER m_Timer;
+
+ // Sensor operation
+ BOOLEAN m_PoweredOn;
+ BOOLEAN m_Started;
+ ULONG m_Interval;
+
+ BOOLEAN m_FirstSample;
+ ULONG m_StartTime;
+ ULONGLONG m_SampleCount;
+
+ FusThreshold m_CachedThresholds;
+
+ FusionSensorSample m_LastSample;
+
+ // Sensor Specific Properties
+ PSENSOR_COLLECTION_LIST m_pEnumerationProperties;
+ PSENSOR_COLLECTION_LIST m_pProperties;
+ PSENSOR_PROPERTY_LIST m_pSupportedDataFields;
+ PSENSOR_COLLECTION_LIST m_pAccDataFieldProperties; // Accelerometer related datafield properties
+ PSENSOR_COLLECTION_LIST m_pGyrDataFieldProperties; // Gyroscope related datafield properties
+ PSENSOR_COLLECTION_LIST m_pThresholds;
+ PSENSOR_COLLECTION_LIST m_pData;
+
+public:
+ // WDF callbacks
+ static EVT_WDF_DRIVER_DEVICE_ADD OnDeviceAdd;
+ static EVT_WDF_DEVICE_PREPARE_HARDWARE OnPrepareHardware;
+ static EVT_WDF_DEVICE_RELEASE_HARDWARE OnReleaseHardware;
+ static EVT_WDF_DEVICE_D0_ENTRY OnD0Entry;
+ static EVT_WDF_DEVICE_D0_EXIT OnD0Exit;
+ static EVT_WDF_TIMER OnTimerExpire;
+
+ // CLX callbacks
+ static EVT_SENSOR_DRIVER_START_SENSOR OnStart;
+ static EVT_SENSOR_DRIVER_STOP_SENSOR OnStop;
+ static EVT_SENSOR_DRIVER_GET_SUPPORTED_DATA_FIELDS OnGetSupportedDataFields;
+ static EVT_SENSOR_DRIVER_GET_PROPERTIES OnGetProperties;
+ static EVT_SENSOR_DRIVER_GET_DATA_FIELD_PROPERTIES OnGetDataFieldProperties;
+ static EVT_SENSOR_DRIVER_GET_DATA_INTERVAL OnGetDataInterval;
+ static EVT_SENSOR_DRIVER_SET_DATA_INTERVAL OnSetDataInterval;
+ static EVT_SENSOR_DRIVER_GET_DATA_THRESHOLDS OnGetDataThresholds;
+ static EVT_SENSOR_DRIVER_SET_DATA_THRESHOLDS OnSetDataThresholds;
+ static EVT_SENSOR_DRIVER_DEVICE_IO_CONTROL OnIoControl;
+
+private:
+
+ NTSTATUS Initialize(_In_ WDFDEVICE Device, _In_ SENSOROBJECT SensorObj);
+ NTSTATUS GetData();
+
+} FusionSensorDevice, *PFusionSensorDevice;
+
+// Set up accessor function to retrieve device context
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(FusionSensorDevice, GetFusionSensorContextFromSensorInstance);
+
+#define FusionSensorDevice_StepCount_Resolution (1)
+#define FusionSensorDevice_StepCount_Minimum (0)
+#define FusionSensorDevice_StepCount_Maximum (0xFFFFFFFF)