31.08.2013 Views

HID Sensor Usage Tables - USB.org

HID Sensor Usage Tables - USB.org

HID Sensor Usage Tables - USB.org

SHOW MORE
SHOW LESS

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 />

.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!