summaryrefslogtreecommitdiff
path: root/Sensors/Pedometer/Device.h
diff options
context:
space:
mode:
Diffstat (limited to 'Sensors/Pedometer/Device.h')
-rw-r--r--Sensors/Pedometer/Device.h211
1 files changed, 211 insertions, 0 deletions
diff --git a/Sensors/Pedometer/Device.h b/Sensors/Pedometer/Device.h
new file mode 100644
index 00000000..008c3ef6
--- /dev/null
+++ b/Sensors/Pedometer/Device.h
@@ -0,0 +1,211 @@
+//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>
+
+#define SENSOR_POOL_TAG_PEDOMETER 'odeP'
+
+#define Pedometer_Default_MinDataInterval_Ms (100) // milliseconds
+#define Pedometer_Default_Threshold_StepCount (1) // threshold in step counts
+#define Pedometer_Default_Power_Milliwatts (2.0f) // milli watts
+#define Pedometer_TimeoutForHistoryThread_Ms (1000) // milli seconds
+#define Pedometer_Default_HistoryInterval_Ms (60000) // 1 minute in milli seconds
+#define Pedometer_Default_MaxHistoryEntries (60) // max of 60 history entries
+
+// Sensor Common Properties
+typedef enum
+{
+ SENSOR_PROPERTY_STATE = 0,
+ SENSOR_PROPERTY_MIN_INTERVAL,
+ SENSOR_PROPERTY_MAX_DATAFIELDSIZE,
+ SENSOR_PROPERTY_SENSOR_TYPE,
+ SENSOR_PROPERTY_SENSOR_POWER,
+ SENSOR_PROPERTY_MAX_HISTORYSIZE,
+ SENSOR_PROPERTY_HISTORY_INTERVAL,
+ SENSOR_PROPERTY_MAX_HISTROYRECORDSIZE,
+ SENSOR_PROPERTY_SUPPORTED_STEPTYPES,
+ SENSOR_COMMON_PROPERTIES_COUNT
+} SENSOR_COMMON_PROPERTIES_INDEX;
+
+// Sensor Enumeration Properties
+typedef enum
+{
+ SENSOR_TYPE_GUID = 0,
+ SENSOR_MANUFACTURER,
+ SENSOR_MODEL,
+ SENSOR_PERSISTENT_UNIQUEID,
+ SENSOR_CATEGORY,
+ SENSOR_ISPRIMARY,
+
+ // These enumeration properties overlap with
+ // a subset of the common properties, and
+ // facilitate discovery without opening a sensor
+ SENSOR_POWER,
+ SENSOR_MAX_HISTORYSIZE,
+ SENSOR_SUPPORTED_STEPTYPES,
+ SENSOR_ENUMERATION_PROPERTIES_COUNT
+} SENSOR_ENUMERATION_PROPERTIES_INDEX;
+
+// Data-field Properties
+typedef enum
+{
+ SENSOR_RESOLUTION = 0,
+ SENSOR_MIN_RANGE,
+ SENSOR_MAX_RANGE,
+ SENSOR_DATA_FIELD_PROPERTY_COUNT
+} SENSOR_DATA_FIELD_PROPERTY_INDEX;
+
+// Supported Data Fields
+typedef enum
+{
+ PEDOMETER_DATAFIELD_TIMESTAMP = 0,
+ PEDOMETER_DATAFIELD_FIRST_AFTER_RESET,
+ PEDOMETER_DATAFIELD_STEP_TYPE,
+ PEDOMETER_DATAFIELD_STEP_COUNT,
+ PEDOMETER_DATAFIELD_STEP_DURATION,
+ PEDOMETER_DATAFIELD_COUNT
+} PEDOMETER_DATAFIELD_INDEX;
+
+// Supported Data
+typedef enum
+{
+ PEDOMETER_DATA_TIMESTAMP = 0,
+ PEDOMETER_DATA_FIRST_AFTER_RESET,
+ PEDOMETER_DATA_UNKNOWN_STEP_TYPE,
+ PEDOMETER_DATA_UNKNOWN_STEP_COUNT,
+ PEDOMETER_DATA_UNKNOWN_STEP_DURATION,
+ PEDOMETER_DATA_WALKING_STEP_TYPE,
+ PEDOMETER_DATA_WALKING_STEP_COUNT,
+ PEDOMETER_DATA_WALKING_STEP_DURATION,
+ PEDOMETER_DATA_RUNNING_STEP_TYPE,
+ PEDOMETER_DATA_RUNNING_STEP_COUNT,
+ PEDOMETER_DATA_RUNNING_STEP_DURATION,
+ PEDOMETER_DATA_COUNT
+} PEDOMETER_DATA_INDEX;
+
+typedef enum
+{
+ PEDOMETER_THRESHOLD_STEP_COUNT = 0,
+ PEDOMETER_THRESHOLD_COUNT
+} PEDOMETER_THRESHOLD_INDEX;
+
+typedef struct PedometerSample
+{
+ FILETIME Timestamp;
+ BOOL IsFirstAfterReset;
+ ULONG UnknownStepCount;
+ INT64 UnknownStepDurationMs;
+ ULONG WalkingStepCount;
+ INT64 WalkingStepDurationMs;
+ ULONG RunningStepCount;
+ INT64 RunningStepDurationMs;
+} PedometerSample, *PPedometerSample;
+
+// History buffer
+typedef struct
+{
+ PPedometerSample pData;
+ ULONG FirstElemIndex; // index of the oldest entry
+ ULONG LastElemIndex; // index of the latest entry
+ ULONG NumOfElems; // number of entries
+ ULONG BufferLength; // length of the buffer
+} HistoryCircBuffer, *PHistoryCircBuffer;
+
+
+typedef class PedometerDevice
+{
+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;
+
+ ULONG m_CachedThreshold;
+ PedometerSample m_LastSample;
+
+ // History operation
+ BOOLEAN m_HistorySupported;
+ BOOLEAN m_HistoryRetrievalStarted;
+ ULONG m_HistoryMarshalledRecordSize;
+ HANDLE m_hThread;
+
+ PSENSOR_COLLECTION_LIST m_ClientHistoryBuffer;
+ ULONG m_ClientHistoryBufferSize;
+
+ // Sensor Specific Properties
+ PSENSOR_COLLECTION_LIST m_pEnumerationProperties;
+ PSENSOR_COLLECTION_LIST m_pProperties;
+ PSENSOR_PROPERTY_LIST m_pSupportedDataFields;
+ PSENSOR_COLLECTION_LIST m_pDataFieldProperties;
+ 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;
+ static EVT_SENSOR_DRIVER_START_SENSOR_HISTORY OnStartHistory;
+ static EVT_SENSOR_DRIVER_STOP_SENSOR_HISTORY OnStopHistory;
+ static EVT_SENSOR_DRIVER_CLEAR_SENSOR_HISTORY OnClearHistory;
+ static EVT_SENSOR_DRIVER_START_HISTORY_RETRIEVAL OnStartHistoryRetrieval;
+ static EVT_SENSOR_DRIVER_CANCEL_HISTORY_RETRIEVAL OnCancelHistoryRetrieval;
+private:
+
+ NTSTATUS Initialize(_In_ WDFDEVICE Device, _In_ SENSOROBJECT SensorObj);
+ NTSTATUS GetData();
+ VOID ResetPedometer();
+ static ULONG WINAPI HistoryRetrievalThread(_In_ LPVOID lpParam);
+
+} PedometerDevice, *PPedometerDevice;
+
+// Set up accessor function to retrieve device context
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(PedometerDevice, GetPedometerContextFromSensorInstance);
+
+#define PedometerDevice_StepCount_Resolution (1)
+#define PedometerDevice_StepCount_Minimum (0)
+#define PedometerDevice_StepCount_Maximum (0xFFFFFFFF)