HIDProcessGlobalItem.c [plain text]
#include "HIDLib.h"
OSStatus HIDProcessGlobalItem(HIDReportDescriptor *ptDescriptor, HIDPreparsedDataPtr ptPreparsedData)
{
HIDReportSizes *ptReport;
HIDGlobalItems *ptGlobals;
HIDItem *ptItem;
int reportIndex;
if ((ptDescriptor == NULL) || (ptPreparsedData == NULL))
return kHIDNullPointerErr;
ptItem = &ptDescriptor->item;
ptGlobals = &ptDescriptor->globals;
switch (ptItem->tag)
{
case kHIDTagUsagePage:
if (ptItem->unsignedValue == 0)
return kHIDUsagePageZeroErr;
ptGlobals->usagePage = ptItem->unsignedValue;
break;
case kHIDTagLogicalMinimum:
ptGlobals->logicalMinimum = ptItem->signedValue;
break;
case kHIDTagLogicalMaximum:
ptGlobals->logicalMaximum = ptItem->signedValue;
break;
case kHIDTagPhysicalMinimum:
ptGlobals->physicalMinimum = ptItem->signedValue;
break;
case kHIDTagPhysicalMaximum:
ptGlobals->physicalMaximum = ptItem->signedValue;
break;
case kHIDTagUnitExponent:
ptGlobals->unitExponent = ptItem->signedValue;
break;
case kHIDTagUnit:
ptGlobals->units = ptItem->unsignedValue;
break;
case kHIDTagReportSize:
ptGlobals->reportSize = ptItem->unsignedValue;
if (ptGlobals->reportSize == 0)
return kHIDReportSizeZeroErr;
break;
case kHIDTagReportID:
if (ptItem->unsignedValue == 0)
return kHIDReportIDZeroErr;
reportIndex = 0;
while ((reportIndex < ptPreparsedData->reportCount)
&& (ptPreparsedData->reports[reportIndex].reportID != ptItem->unsignedValue))
reportIndex++;
if (reportIndex == ptPreparsedData->reportCount)
{
ptReport = &ptPreparsedData->reports[ptPreparsedData->reportCount++];
ptReport->reportID = ptItem->unsignedValue;
ptReport->inputBitCount = 8;
ptReport->outputBitCount = 8;
ptReport->featureBitCount = 8;
}
ptGlobals->reportID = ptItem->unsignedValue;
ptGlobals->reportIndex = reportIndex;
break;
case kHIDTagReportCount:
#if 0
if (ptItem->unsignedValue == 0)
return kHIDReportCountZeroErr;
#endif
ptGlobals->reportCount = ptItem->unsignedValue;
break;
case kHIDTagPush:
ptDescriptor->globalsStack[ptDescriptor->globalsNesting++] = ptDescriptor->globals;
break;
case kHIDTagPop:
ptDescriptor->globals = ptDescriptor->globalsStack[--ptDescriptor->globalsNesting];
break;
}
return kHIDSuccess;
}