|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: File: HIDHasUsage.c
24:
25: Contains: xxx put contents here xxx
26:
27: Version: xxx put version here xxx
28:
29: Copyright: � 1999 by Apple Computer, Inc., all rights reserved.
30:
31: File Ownership:
32:
33: DRI: xxx put dri here xxx
34:
35: Other Contact: xxx put other contact here xxx
36:
37: Technology: xxx put technology here xxx
38:
39: Writers:
40:
41: (BWS) Brent Schorsch
42:
43: Change History (most recent first):
44:
45: <USB1> 3/5/99 BWS first checked in
46: */
47:
48: #include "HIDLib.h"
49:
50: /*
51: *------------------------------------------------------------------------------
52: *
53: * HidP_UsageFromIndex
54: *
55: * Input:
56: * ptPreparsedData - The Preparsed Data
57: * ptReportItem - The Report Item
58: * usagePage - The usage Page to find
59: * usage - The usage to find
60: * piIndex(optional) - The usage Index pointer
61: * piCount(optional) - The usage Count pointer
62: * Output:
63: * piIndex - The usage Index
64: * Returns:
65: * The usage
66: *
67: *------------------------------------------------------------------------------
68: */
69: Boolean HIDHasUsage (HIDPreparsedDataRef preparsedDataRef,
70: HIDReportItem *ptReportItem,
71: HIDUsage usagePage, HIDUsage usage,
72: UInt32 *piIndex, UInt32 *piCount)
73: {
74: HIDPreparsedDataPtr ptPreparsedData = (HIDPreparsedDataPtr) preparsedDataRef;
75: int iUsageItem;
76: UInt32 iUsageIndex;
77: int iUsages;
78: int i;
79: UInt32 iCountsLeft;
80: HIDP_UsageItem *ptUsageItem;
81: Boolean bOnPage;
82: /*
83: * Disallow Null Pointers
84: */
85: if ((ptPreparsedData == NULL)
86: || (ptReportItem == NULL))
87: return 0;
88: if (ptPreparsedData->hidTypeIfValid != kHIDOSType)
89: return 0;
90: /*
91: * Look through the usage Items for this usage
92: */
93: iUsageItem = ptReportItem->firstUsageItem;
94: iUsageIndex = 0;
95: for (i=0; i<ptReportItem->usageItemCount; i++)
96: {
97: /*
98: * Each usage Item is either a usage or a usage range
99: */
100: ptUsageItem = &ptPreparsedData->usageItems[iUsageItem++];
101: bOnPage = ((usagePage == 0) || (usagePage == ptUsageItem->usagePage));
102: if (ptUsageItem->isRange)
103: {
104: /*
105: * For usage Ranges
106: * If the index is in the range
107: * then return the usage
108: * Otherwise adjust the index by the size of the range
109: */
110: if ((usage >= ptUsageItem->usageMinimum)
111: && (usage <= ptUsageItem->usageMaximum))
112: {
113: if (piIndex != NULL)
114: *piIndex = iUsageIndex + (ptUsageItem->usageMinimum - usage);
115: /*
116: * If this usage is the last one for this ReportItem
117: * then it gets all of the remaining reportCount
118: */
119: if (piCount != NULL)
120: {
121: if (((i+1) == ptReportItem->usageItemCount)
122: && (usage == ptUsageItem->usageMaximum))
123: {
124: iCountsLeft = ptReportItem->globals.reportCount - iUsageIndex - 1;
125: if (iCountsLeft > 1)
126: *piCount = iCountsLeft;
127: else
128: *piCount = 1;
129: }
130: else
131: *piCount = 1;
132: }
133: if (bOnPage)
134: return true;
135: }
136: iUsages = ptUsageItem->usageMaximum - ptUsageItem->usageMinimum + 1;
137: if (iUsages < 0)
138: iUsages = -iUsages;
139: iUsageIndex += iUsages;
140: }
141: else
142: {
143: /*
144: * For Usages
145: * If the index is zero
146: * then return this usage
147: * Otherwise one less to index through
148: */
149: if (usage == ptUsageItem->usage)
150: {
151: if (piIndex != NULL)
152: *piIndex = iUsageIndex;
153: if (piCount != NULL)
154: {
155: if ((i+1) == ptReportItem->usageItemCount)
156: {
157: iCountsLeft = ptReportItem->globals.reportCount - iUsageIndex - 1;
158: if (iCountsLeft > 1)
159: *piCount = iCountsLeft;
160: else
161: *piCount = 1;
162: }
163: else
164: *piCount = 1;
165: }
166: if (bOnPage)
167: return true;
168: }
169: iUsageIndex++;
170: }
171: }
172: return false;
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.