#ifndef _IOKIT_HID_IOHIDEVENTDATA_H
#define _IOKIT_HID_IOHIDEVENTDATA_H
#include <IOKit/IOTypes.h>
#include <IOKit/hid/IOHIDEventTypes.h>
#ifdef KERNEL
#include <IOKit/IOLib.h>
#define IOHIDEventRef IOHIDEvent *
#else
#include <IOKit/hid/IOHIDEvent.h>
typedef struct IOHIDEventData IOHIDEventData;
#endif
#define IOHIDEVENT_BASE \
uint32_t size; \
IOHIDEventType type; \
uint64_t timestamp; \
uint32_t options;
struct IOHIDEventData{
IOHIDEVENT_BASE;
};
typedef struct _IOHIDVendorDefinedEventData {
IOHIDEVENT_BASE;
uint16_t usagePage;
uint16_t usage;
uint32_t version;
uint32_t length;
uint8_t data[0];
} IOHIDVendorDefinedEventData;
enum {
kIOHIDKeyboardIsRepeat = 0x00010000
};
typedef struct _IOHIDKeyboardEventData {
IOHIDEVENT_BASE; uint16_t usagePage;
uint16_t usage;
boolean_t down;
} IOHIDKeyboardEventData;
enum {
kIOHIDEventOptionIgnore = 0xf0000000
};
enum {
kIOHIDTransducerRange = 0x00010000,
kIOHIDTransducerTouch = 0x00020000,
kIOHIDTransducerInvert = 0x00040000,
};
enum {
kIOHIDDigitizerOrientationTypeTilt = 0,
kIOHIDDigitizerOrientationTypePolar,
kIOHIDDigitizerOrientationTypeQuality
};
typedef uint8_t IOHIDDigitizerOrientationType;
#define IOHIDAXISEVENT_BASE \
struct { \
IOFixed x; \
IOFixed y; \
IOFixed z; \
} position;
typedef struct _IOHIDAxisEventData {
IOHIDEVENT_BASE; IOHIDAXISEVENT_BASE;
} IOHIDAxisEventData, IOHIDTranslationData, IOHIDRotationEventData, IOHIDScrollEventData, IOHIDScaleEventData, IOHIDVelocityData, IOHIDOrientationEventData, IOHIDAccelerometerEventData;
typedef struct _IOHIDAmbientLightSensorEventData {
IOHIDEVENT_BASE; uint32_t level;
uint32_t ch0;
uint32_t ch1;
Boolean brightnessChanged;
} IOHIDAmbientLightSensorEventData;
typedef struct _IOHIDTemperatureEventData {
IOHIDEVENT_BASE;
IOFixed level;
} IOHIDTemperatureEventData;
typedef struct _IOHIDProximityEventData {
IOHIDEVENT_BASE;
uint32_t detectionMask;
} IOHIDProximityEventData;
typedef struct _IOHIDButtonEventData {
IOHIDEVENT_BASE;
uint32_t buttonMask; IOFixed pressure; uint8_t buttonNumber; uint8_t clickState; uint16_t reserved;
} IOHIDButtonEventData;
typedef struct _IOHIDDigitizerEventData {
IOHIDEVENT_BASE; IOHIDAXISEVENT_BASE;
uint32_t transducerIndex;
uint32_t transducerType; uint32_t identity; uint32_t eventMask; uint32_t childEventMask;
uint32_t buttonMask; IOFixed tipPressure; IOFixed barrelPressure;
IOFixed twist; uint32_t orientationType; union {
struct { IOFixed x; IOFixed y; } tilt;
struct { IOFixed altitude; IOFixed azimuth; } polar;
struct {
IOFixed quality; IOFixed density;
IOFixed irregularity;
IOFixed majorRadius; IOFixed minorRadius; } quality;
}orientation;
} IOHIDDigitizerEventData;
typedef struct _IOHIDSystemQueueElement {
uint64_t timeStamp;
uint64_t deviceID;
uint32_t options;
uint32_t eventCount;
IOHIDEventData events[];
} IOHIDSystemQueueElement;
#define IOHIDEventFieldEventType(field) ((field >> 16) & 0xffff)
#define IOHIDEventFieldOffset(field) (field & 0xffff)
#define IOHIDEventGetSize(type,size) \
{ \
switch ( type ) { \
case kIOHIDEventTypeNULL: \
size = sizeof(IOHIDEventData);\
break; \
case kIOHIDEventTypeVendorDefined:\
size = sizeof(IOHIDVendorDefinedEventData);\
break; \
case kIOHIDEventTypeKeyboard: \
size = sizeof(IOHIDKeyboardEventData);\
break; \
case kIOHIDEventTypeTranslation:\
case kIOHIDEventTypeRotation: \
case kIOHIDEventTypeScroll: \
case kIOHIDEventTypeScale: \
case kIOHIDEventTypeVelocity: \
case kIOHIDEventTypeOrientation:\
case kIOHIDEventTypeAccelerometer:\
size = sizeof(IOHIDAxisEventData);\
break; \
case kIOHIDEventTypeAmbientLightSensor:\
size = sizeof(IOHIDAmbientLightSensorEventData);\
break; \
case kIOHIDEventTypeProximity: \
size = sizeof(IOHIDProximityEventData);\
break; \
case kIOHIDEventTypeButton: \
size = sizeof(IOHIDButtonEventData);\
break; \
case kIOHIDEventTypeDigitizer: \
size = sizeof(IOHIDDigitizerEventData);\
break; \
case kIOHIDEventTypeTemperature:\
size = sizeof(IOHIDTemperatureEventData);\
break; \
default: \
size = 0; \
break; \
} \
}
#define IOHIDEventGetQueueElementSize(type,size)\
{ \
IOHIDEventGetSize(type,size); \
size += sizeof(IOHIDSystemQueueElement); \
}
#ifdef KERNEL
#ifdef HIDEVENTFIXED
#define IOHIDEventValueFloat(value) (value)
#define IOHIDEventValueFixed(value) (value)
#else
#define IOHIDEventValueFloat(value) (value >> 16)
#define IOHIDEventValueFixed(value) (value << 16)
#endif
#define IOHIDEventGetEventWithOptions(event, type, options) event->getEvent(type, options)
#define GET_EVENTDATA(event) event->_data
#else
#define IOHIDEventValueFloat(value) (value / 65536.0)
#define IOHIDEventValueFixed(value) (value * 65536)
#define GET_EVENTDATA(event) event->eventData
#endif
#define GET_EVENTDATA_VALUE(eventData, fieldEvType, fieldOffset, value)\
{ \
switch ( fieldEvType ) { \
case kIOHIDEventTypeNULL: \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldIsRelative): \
value = (eventData->options & kIOHIDEventOptionIsAbsolute) == 0; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldIsCollection): \
value = (eventData->options & kIOHIDEventOptionIsCollection) != 0; \
break; \
}; break; \
case kIOHIDEventTypeVendorDefined: \
{ \
IOHIDVendorDefinedEventData * sysDef = (IOHIDVendorDefinedEventData*)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedUsagePage): \
value = sysDef->usagePage; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedUsage): \
value = sysDef->usage; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedVersion): \
value = sysDef->version; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedDataLength): \
value = sysDef->length; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedData): \
if (sysDef->data) \
value = *((typeof(value)*) sysDef->data); \
break; \
}; \
} \
break; \
case kIOHIDEventTypeButton: \
{ \
IOHIDButtonEventData * button = (IOHIDButtonEventData*)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonMask): \
value = button->buttonMask; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonNumber): \
value = button->buttonNumber; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonClickCount): \
value = button->clickState; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonPressure): \
value = IOHIDEventValueFloat(button->pressure); \
break; \
}; \
} \
break; \
case kIOHIDEventTypeTemperature: \
{ \
IOHIDTemperatureEventData * temp = (IOHIDTemperatureEventData *)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldTemperatureLevel): \
value = IOHIDEventValueFloat(temp->level);\
break; \
}; \
} \
break; \
case kIOHIDEventTypeTranslation: \
case kIOHIDEventTypeRotation: \
case kIOHIDEventTypeScroll: \
case kIOHIDEventTypeScale: \
case kIOHIDEventTypeVelocity: \
case kIOHIDEventTypeOrientation: \
case kIOHIDEventTypeAccelerometer: \
{ \
IOHIDAxisEventData * axis = (IOHIDAxisEventData *)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldTranslationX): \
\
value = IOHIDEventValueFloat(axis->position.x); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldTranslationY): \
\
value = IOHIDEventValueFloat(axis->position.y); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldTranslationZ): \
\
value = IOHIDEventValueFloat(axis->position.z); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldScrollIsPixels): \
value = ((axis->options & kIOHIDEventOptionPixelUnits) != 0);\
break; \
}; \
} \
break; \
case kIOHIDEventTypeAmbientLightSensor: \
{ \
IOHIDAmbientLightSensorEventData * alsEvent = (IOHIDAmbientLightSensorEventData *)eventData;\
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightSensorLevel): \
value = alsEvent->level; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightSensorRawChannel0): \
value = alsEvent->ch0; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightSensorRawChannel1): \
value = alsEvent->ch1; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightDisplayBrightnessChanged): \
value = alsEvent->brightnessChanged; \
break; \
}; \
} \
break; \
case kIOHIDEventTypeProximity: \
{ \
IOHIDProximityEventData * proxEvent = (IOHIDProximityEventData *)eventData;\
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldProximityDetectionMask): \
value = proxEvent->detectionMask; \
break; \
}; \
} \
break; \
case kIOHIDEventTypeKeyboard: \
{ \
IOHIDKeyboardEventData * keyEvent = (IOHIDKeyboardEventData *)eventData;\
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardUsagePage): \
value = keyEvent->usagePage; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardUsage): \
value = keyEvent->usage; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardDown): \
value = keyEvent->down; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardRepeat): \
value = (keyEvent->options & kIOHIDKeyboardIsRepeat);\
break; \
}; \
} \
break; \
case kIOHIDEventTypeDigitizer: \
{ \
IOHIDDigitizerEventData * digEvent = (IOHIDDigitizerEventData *)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerX): \
value = IOHIDEventValueFloat(digEvent->position.x); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerY): \
value = IOHIDEventValueFloat(digEvent->position.y); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerZ): \
value = IOHIDEventValueFloat(digEvent->position.z); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerButtonMask): \
value = digEvent->buttonMask; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIndex): \
value = digEvent->transducerIndex; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIdentity): \
value = digEvent->identity; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerEventMask): \
value = digEvent->eventMask; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerChildEventMask): \
value = digEvent->childEventMask; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerRange): \
value = (digEvent->options & kIOHIDTransducerRange) != 0;\
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTouch): \
value = (digEvent->options & kIOHIDTransducerTouch) != 0;\
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerCollection): \
value = (digEvent->options & kIOHIDEventOptionIsCollection) != 0;\
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerPressure): \
value = IOHIDEventValueFloat(digEvent->tipPressure); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerBarrelPressure): \
value = IOHIDEventValueFloat(digEvent->barrelPressure); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTwist): \
value = IOHIDEventValueFloat(digEvent->twist); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltX): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltY): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerQuality): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerDensity): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIrregularity): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMajorRadius): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMinorRadius): \
switch ( digEvent->orientationType ) {\
case kIOHIDDigitizerOrientationTypeTilt:\
switch ( fieldOffset ) {\
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltX): \
value = IOHIDEventValueFloat(digEvent->orientation.tilt.x); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltY): \
value = IOHIDEventValueFloat(digEvent->orientation.tilt.y); \
break; \
}; \
break; \
case kIOHIDDigitizerOrientationTypePolar:\
switch ( fieldOffset ) {\
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerAltitude): \
value = IOHIDEventValueFloat(digEvent->orientation.polar.altitude); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerAzimuth): \
value = IOHIDEventValueFloat(digEvent->orientation.polar.azimuth); \
break; \
}; \
break; \
case kIOHIDDigitizerOrientationTypeQuality:\
switch ( fieldOffset ) {\
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerQuality): \
value = IOHIDEventValueFloat(digEvent->orientation.quality.quality); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerDensity): \
value = IOHIDEventValueFloat(digEvent->orientation.quality.density); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIrregularity): \
value = IOHIDEventValueFloat(digEvent->orientation.quality.irregularity); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMajorRadius): \
value = IOHIDEventValueFloat(digEvent->orientation.quality.majorRadius); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMinorRadius): \
value = IOHIDEventValueFloat(digEvent->orientation.quality.minorRadius); \
break; \
}; \
break; \
}; \
break; \
}; \
} \
break; \
}; \
}
#define GET_EVENT_VALUE(event, field, value, options) \
{ IOHIDEventType fieldEvType = IOHIDEventFieldEventType(field); \
uint32_t fieldOffset = IOHIDEventFieldOffset(field); \
IOHIDEventRef ev = NULL; \
if ( (ev = IOHIDEventGetEventWithOptions(event, fieldEvType, options)) ) {\
GET_EVENTDATA_VALUE(GET_EVENTDATA(ev),fieldEvType,fieldOffset,value);\
} \
}
#define SET_EVENTDATA_VALUE(eventData, fieldEvType, fieldOffset, value) \
{ switch ( fieldEvType ) { \
case kIOHIDEventTypeNULL: \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldIsRelative): \
if ( value ) \
eventData->options &= ~kIOHIDEventOptionIsAbsolute; \
else \
eventData->options |= kIOHIDEventOptionIsAbsolute; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldIsCollection): \
if ( value ) \
eventData->options |= kIOHIDEventOptionIsCollection; \
else \
eventData->options &= ~kIOHIDEventOptionIsCollection; \
break; \
}; break; \
case kIOHIDEventTypeVendorDefined: \
{ \
IOHIDVendorDefinedEventData * sysDef = (IOHIDVendorDefinedEventData*)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedUsagePage): \
sysDef->usagePage = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedUsage): \
sysDef->usage = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedVersion): \
sysDef->version = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldVendorDefinedData): \
if (sysDef->data) \
*((typeof(value)*) sysDef->data) = value; \
break; \
}; \
} \
break; \
case kIOHIDEventTypeButton: \
{ \
IOHIDButtonEventData * button = (IOHIDButtonEventData*)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonMask): \
button->buttonMask = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonNumber): \
button->buttonNumber = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonClickCount): \
button->clickState = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldButtonPressure): \
button->pressure = IOHIDEventValueFixed(value); \
break; \
}; \
} \
break; \
case kIOHIDEventTypeTemperature: \
{ \
IOHIDTemperatureEventData * temp = (IOHIDTemperatureEventData *)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldTemperatureLevel): \
temp->level = IOHIDEventValueFixed(value);\
break; \
}; \
} \
break; \
case kIOHIDEventTypeTranslation: \
case kIOHIDEventTypeRotation: \
case kIOHIDEventTypeScroll: \
case kIOHIDEventTypeScale: \
case kIOHIDEventTypeVelocity: \
case kIOHIDEventTypeOrientation: \
case kIOHIDEventTypeAccelerometer: \
{ \
IOHIDAxisEventData * axis = (IOHIDAxisEventData *)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldTranslationX): \
\
axis->position.x = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldTranslationY): \
\
axis->position.y = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldTranslationZ): \
\
axis->position.z = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldScrollIsPixels): \
if ( value ) \
axis->options |= kIOHIDEventOptionPixelUnits; \
else \
axis->options &= ~kIOHIDEventOptionPixelUnits; \
break; \
}; \
} \
break; \
case kIOHIDEventTypeAmbientLightSensor: \
{ \
IOHIDAmbientLightSensorEventData * alsEvent = (IOHIDAmbientLightSensorEventData *)eventData;\
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightSensorLevel): \
alsEvent->level = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightSensorRawChannel0): \
alsEvent->ch0 = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightSensorRawChannel1): \
alsEvent->ch1 = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldAmbientLightDisplayBrightnessChanged): \
alsEvent->brightnessChanged = value; \
break; \
}; \
} \
break; \
case kIOHIDEventTypeProximity: \
{ \
IOHIDProximityEventData * proxEvent = (IOHIDProximityEventData *)eventData;\
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldProximityDetectionMask): \
proxEvent->detectionMask = value; \
break; \
}; \
} \
break; \
case kIOHIDEventTypeKeyboard: \
{ \
IOHIDKeyboardEventData * keyEvent = (IOHIDKeyboardEventData *)eventData;\
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardUsagePage): \
keyEvent->usagePage = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardUsage): \
keyEvent->usage = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardDown): \
keyEvent->down = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldKeyboardRepeat): \
if ( value ) \
keyEvent->options |= kIOHIDKeyboardIsRepeat; \
else \
keyEvent->options &= ~kIOHIDKeyboardIsRepeat; \
break; \
}; \
} \
break; \
case kIOHIDEventTypeDigitizer: \
{ \
IOHIDDigitizerEventData * digEvent = (IOHIDDigitizerEventData *)eventData; \
switch ( fieldOffset ) { \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerX): \
digEvent->position.x = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerY): \
digEvent->position.y = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerZ): \
digEvent->position.z = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerButtonMask): \
digEvent->buttonMask = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIndex): \
digEvent->transducerIndex = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIdentity): \
digEvent->identity = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerEventMask): \
digEvent->eventMask = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerChildEventMask): \
digEvent->childEventMask = value; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerRange): \
if ( value ) \
digEvent->options |= kIOHIDTransducerRange; \
else \
digEvent->options &= ~kIOHIDTransducerRange; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTouch): \
if ( value ) \
digEvent->options |= kIOHIDTransducerTouch; \
else \
digEvent->options &= ~kIOHIDTransducerTouch; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerCollection): \
if ( value ) \
digEvent->options |= kIOHIDEventOptionIsCollection; \
else \
digEvent->options &= ~kIOHIDEventOptionIsCollection; \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerPressure): \
digEvent->tipPressure = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerBarrelPressure): \
digEvent->barrelPressure = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTwist): \
digEvent->twist = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltX): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltY): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerQuality): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerDensity): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIrregularity): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMajorRadius): \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMinorRadius): \
switch ( digEvent->orientationType ) {\
case kIOHIDDigitizerOrientationTypeTilt:\
switch ( fieldOffset ) {\
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltX): \
digEvent->orientation.tilt.x = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerTiltY): \
digEvent->orientation.tilt.y = IOHIDEventValueFixed(value); \
break; \
}; \
break; \
case kIOHIDDigitizerOrientationTypePolar:\
switch ( fieldOffset ) {\
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerAltitude): \
digEvent->orientation.polar.altitude = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerAzimuth): \
digEvent->orientation.polar.azimuth = IOHIDEventValueFixed(value); \
break; \
}; \
break; \
case kIOHIDDigitizerOrientationTypeQuality:\
switch ( fieldOffset ) {\
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerQuality): \
digEvent->orientation.quality.quality = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerDensity): \
digEvent->orientation.quality.density = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerIrregularity): \
digEvent->orientation.quality.irregularity = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMajorRadius): \
digEvent->orientation.quality.majorRadius = IOHIDEventValueFixed(value); \
break; \
case IOHIDEventFieldOffset(kIOHIDEventFieldDigitizerMinorRadius): \
digEvent->orientation.quality.minorRadius = IOHIDEventValueFixed(value); \
break; \
}; \
break; \
}; \
break; \
}; \
} \
break; \
}; \
}
#define SET_EVENT_VALUE(event, field, value, options) \
{ IOHIDEventType fieldEvType = IOHIDEventFieldEventType(field); \
uint32_t fieldOffset = IOHIDEventFieldOffset(field); \
IOHIDEventRef ev = NULL; \
if ( (ev = IOHIDEventGetEventWithOptions(event, fieldEvType, options)) ) {\
SET_EVENTDATA_VALUE(GET_EVENTDATA(ev),fieldEvType,fieldOffset,value);\
} \
}
#endif