You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
99 <strong>HID</strong> <strong>Sensor</strong> <strong>Usage</strong>s<br />
unsigned long pid;<br />
} PROPERTYKEY;<br />
Actual data can be described in a single structure called a VARIANT type, as follows:<br />
#define VARIANT_BOOL unsigned char // use LSb of byte<br />
#define <strong>HID</strong>FLOAT16 unsigned short // 16-bit mantissa<br />
#define <strong>HID</strong>FLOAT32 unsigned long // 32-bit mantissa<br />
typedef union _flattened_variant_u {<br />
VARIANT_BOOL boolVal;<br />
unsigned char bVal;<br />
unsigned short uiVal;<br />
short iVal;<br />
unsigned long ulVal;<br />
long lVal;<br />
unsigned long long uhVal;<br />
long long hVal;<br />
float fltVal;<br />
double dblVal;<br />
wchar_t wszVal[ WIDE_STRING_SIZE_MAX ];<br />
char szVal[ STRING_SIZE_MAX ];<br />
FLAT_VARIANTVEC vecVal;<br />
<strong>HID</strong>FLOAT16 f16Val;<br />
<strong>HID</strong>FLOAT32 f32Val;<br />
GUID guidVal;<br />
} FLAT_VARIANT_UNION;<br />
Special mention needs to be made about the VARIANTVEC type, which is used to store compex “struct”<br />
data types, such as used for:<br />
<strong>HID</strong>_USAGE_SENSOR_PROPERTY_RESPONSE_CURVE<br />
<strong>HID</strong>_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX<br />
<strong>HID</strong>_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION<br />
<strong>HID</strong>_USAGE_SENSOR_DATA_GENERIC_GUID_OR_PROPERTYKEY<br />
Any other vendor-opaque data<br />
The definition of the VARIANTVEC structure is:<br />
typedef struct _flattened_variant_vector_t {<br />
// the number valid BYTEs in paubElems<br />
unsigned long caubElems;<br />
// array of BYTEs holding the data<br />
unsigned char paubElems[ VECTOR_BYTE_SIZE_MAX ];<br />
} FLAT_VARIANTVEC;<br />
The struct data is type-cast over the top of the paubElems field, and the length (in bytes) of the struct is<br />
stored in the caubElems field.<br />
Here is an example for SENSOR_DATA_TYPE_LIGHT_RESPONSE_CURVE, which MSDN says each<br />
value element must be 32-bits (size of VT_UI4), allowing 14 of them to fit into a <strong>USB</strong> Interrupt Packet:<br />
struct _light_response_curve {<br />
// LCD Display should be set to this percentage when...<br />
int DisplayBrightnessPercent : 8; // 0% to 100%<br />
// ...Illuminance Lux up to 64K is at this value<br />
int CorrespondingLuxValue: 24; // 0 to 100,000 Lux<br />
} LightResponseCurve[ 14 ];<br />
FLAT_VARIANT_UNION fvu;<br />
fvu.vecVal.caubElems = (unsigned long)sizeof(LightResponseCurve);<br />
struct _light_response_curve *pLRC = (struct _light_response_curve *)fvu.vecVal.paubElems;<br />
pLRC->DisplayBrightnessPercent = 10;<br />
pLRC->CorrespondingLuxValue = 10;<br />
pLRC++;<br />
pLRC->DisplayBrightnessPercent = 50;<br />
pLRC->CorrespondingLuxValue = 100;<br />
pLRC++;<br />
pLRC->DisplayBrightnessPercent = 75;<br />
pLRC->CorrespondingLuxValue = 10000;<br />
.<br />
.<br />
.