|
|
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: HIDGetValueCaps.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: <USB6> 11/1/99 BWS [2405720] We need a better check for 'bit padding' items,
46: rather than just is constant. We will check to make sure the
47: item is constant, and has no usage, or zero usage. This means we
48: need to pass an additional parameter to some internal functions
49: <USB5> 5/3/99 BWS Fix typo
50: <USB4> 5/3/99 BWS We were not setting isStringRange, isDesignatorRange, and
51: isAbsolute
52: <USB3> 3/7/99 BWS When range/notRange were made a union, we missed this case where
53: they were both being set indescriminately
54: <USB2> 3/7/99 BWS [2311411] Had added missing fields to caps structure, but they
55: were not being filled in
56: <USB1> 3/5/99 BWS first checked in
57: */
58:
59: #include "HIDLib.h"
60:
61: /*
62: *------------------------------------------------------------------------------
63: *
64: * HIDGetSpecificValueCaps - Get the binary values for a report type
65: *
66: * Input:
67: * reportType - HIDP_Input, HIDP_Output, HIDP_Feature
68: * usagePage - Page Criteria or zero
69: * iCollection - Collection Criteria or zero
70: * usage - usage Criteria or zero
71: * valueCaps - ValueCaps Array
72: * piValueCapsLength - Maximum Entries
73: * ptPreparsedData - Pre-Parsed Data
74: * Output:
75: * piValueCapsLength - Entries Populated
76: * Returns:
77: *
78: *------------------------------------------------------------------------------
79: */
80: OSStatus HIDGetSpecificValueCaps(HIDReportType reportType,
81: HIDUsage usagePage,
82: UInt32 iCollection,
83: HIDUsage usage,
84: HIDValueCapsPtr valueCaps,
85: UInt32 *piValueCapsLength,
86: HIDPreparsedDataRef preparsedDataRef)
87: {
88: HIDPreparsedDataPtr ptPreparsedData = (HIDPreparsedDataPtr) preparsedDataRef;
89: HIDCollection *ptCollection;
90: HIDCollection *ptParent;
91: HIDReportItem *ptReportItem;
92: HIDP_UsageItem *ptUsageItem;
93: HIDStringItem *ptStringItem;
94: HIDDesignatorItem *ptDesignatorItem;
95: HIDP_UsageItem *ptFirstCollectionUsageItem;
96: HIDValueCaps *ptCapability;
97: int iR, iU;
98: int parent;
99: int iReportItem, iUsageItem;
100: int iMaxCaps;
101: UInt32 iCount;
102: UInt32 startBit; // Added esb 9-29-99
103: /*
104: * Disallow Null Pointers
105: */
106: if ((valueCaps == NULL)
107: || (piValueCapsLength == NULL)
108: || (ptPreparsedData == NULL))
109: return kHIDNullPointerErr;
110: if (ptPreparsedData->hidTypeIfValid != kHIDOSType)
111: return kHIDInvalidPreparsedDataErr;
112: /*
113: * Save the buffer size
114: */
115: iMaxCaps = *piValueCapsLength;
116: *piValueCapsLength = 0;
117: /*
118: * The Collection must be in range
119: */
120: if ((iCollection < 0) || (iCollection >= ptPreparsedData->collectionCount))
121: return kHIDBadParameterErr;
122: /*
123: * Search only the scope of the Collection specified
124: */
125: ptCollection = &ptPreparsedData->collections[iCollection];
126: for (iR=0; iR<ptCollection->reportItemCount; iR++)
127: {
128: iReportItem = ptCollection->firstReportItem + iR;
129: ptReportItem = &ptPreparsedData->reportItems[iReportItem];
130: /*
131: * Search only reports of the proper type
132: */
133: if ((ptReportItem->reportType == reportType)
134: && ((ptReportItem->globals.usagePage == usagePage)
135: || (usagePage == 0))
136: && HIDIsVariable(ptReportItem, preparsedDataRef))
137: {
138: startBit = ptReportItem->startBit; // Added esb 9-28-99
139: /*
140: * Search the usages
141: */
142: for (iU=0; iU<ptReportItem->usageItemCount; iU++)
143: {
144: /*
145: * Copy all usages if the usage above is zero
146: * or copy all that "match"
147: */
148: iUsageItem = ptReportItem->firstUsageItem + iU;
149: ptUsageItem = &ptPreparsedData->usageItems[iUsageItem];
150:
151: // �� we assume there is a 1-1 corresponence between usage items, string items, and designator items
152: // ���this is not necessarily the case, but its better than nothing
153: ptStringItem = &ptPreparsedData->stringItems[ptReportItem->firstStringItem + iU];
154: ptDesignatorItem = &ptPreparsedData->desigItems[ptReportItem->firstDesigItem + iU];
155:
156: if (HIDUsageInRange(ptUsageItem,usagePage,usage))
157: {
158: /*
159: * Only copy if there's room
160: */
161: if (*piValueCapsLength >= iMaxCaps)
162: return kHIDBufferTooSmallErr;
163: ptCapability = &valueCaps[(*piValueCapsLength)++];
164:
165:
166:
167: /*
168: * Populate the Capability Structure
169: */
170: parent = ptReportItem->parent;
171: ptParent = &ptPreparsedData->collections[parent];
172: ptFirstCollectionUsageItem = &ptPreparsedData->usageItems[ptParent->firstUsageItem];
173: ptCapability->collection = parent;
174: ptCapability->collectionUsagePage = ptParent->usagePage;
175: ptCapability->collectionUsage = ptFirstCollectionUsageItem->usage;
176: ptCapability->bitField = ptReportItem->dataModes;
177: ptCapability->reportID = ptReportItem->globals.reportID;
178: ptCapability->usagePage = ptUsageItem->usagePage;
179:
180: ptCapability->isAbsolute = !(ptReportItem->dataModes & kHIDDataRelative);
181:
182: ptCapability->isRange = ptUsageItem->isRange;
183: if (ptUsageItem->isRange)
184: {
185: ptCapability->u.range.usageMin = ptUsageItem->usageMinimum;
186: ptCapability->u.range.usageMax = ptUsageItem->usageMaximum;
187: }
188: else
189: ptCapability->u.notRange.usage = ptUsageItem->usage;
190:
191: // if there really are that many items
192: if (iU < ptReportItem->stringItemCount)
193: {
194: ptCapability->isStringRange = ptStringItem->isRange;
195:
196: if (ptStringItem->isRange)
197: {
198: ptCapability->u.range.stringMin = ptStringItem->minimum;
199: ptCapability->u.range.stringMax = ptStringItem->maximum;
200: }
201: else
202: ptCapability->u.notRange.stringIndex = ptStringItem->index;
203: }
204: // default, clear it
205: else
206: {
207: ptCapability->isStringRange = false;
208: ptCapability->u.notRange.stringIndex = 0;
209: }
210:
211: // if there really are that many items
212: if (iU < ptReportItem->desigItemCount)
213: {
214: ptCapability->isDesignatorRange = ptDesignatorItem->isRange;
215:
216: if (ptDesignatorItem->isRange)
217: {
218: ptCapability->u.range.designatorMin = ptDesignatorItem->minimum;
219: ptCapability->u.range.designatorMax = ptDesignatorItem->maximum;
220: }
221: else
222: ptCapability->u.notRange.designatorIndex = ptDesignatorItem->index;
223: }
224: // default, clear it
225: else
226: {
227: ptCapability->isDesignatorRange = false;
228: ptCapability->u.notRange.designatorIndex = 0;
229: }
230:
231: ptCapability->bitSize = ptReportItem->globals.reportSize;
232:
233: ptCapability->logicalMin = ptReportItem->globals.logicalMinimum;
234: ptCapability->logicalMax = ptReportItem->globals.logicalMaximum;
235: ptCapability->physicalMin = ptReportItem->globals.physicalMinimum;
236: ptCapability->physicalMax = ptReportItem->globals.physicalMaximum;
237:
238: if (ptUsageItem->isRange)
239: {
240: iCount = ptUsageItem->usageMaximum - ptUsageItem->usageMinimum;
241: if (iCount < 0)
242: iCount = -iCount;
243: }
244: else
245: HIDHasUsage(preparsedDataRef,ptReportItem,
246: ptUsageItem->usagePage,ptUsageItem->usage,
247: NULL,&iCount);
248: ptCapability->reportCount = iCount;
249: ptCapability->startBit = startBit;
250: startBit += (ptCapability->bitSize * ptCapability->reportCount);
251: }
252: }
253: }
254: }
255: return kHIDSuccess;
256: }
257:
258: /*
259: *------------------------------------------------------------------------------
260: *
261: * HIDGetValueCaps - Get the binary values for a report type
262: *
263: * Input:
264: * reportType - HIDP_Input, HIDP_Output, HIDP_Feature
265: * valueCaps - ValueCaps Array
266: * piValueCapsLength - Maximum Entries
267: * ptPreparsedData - Pre-Parsed Data
268: * Output:
269: * piValueCapsLength - Entries Populated
270: * Returns:
271: *
272: *------------------------------------------------------------------------------
273: */
274: OSStatus HIDGetValueCaps(HIDReportType reportType,
275: HIDValueCapsPtr valueCaps,
276: UInt32 *piValueCapsLength,
277: HIDPreparsedDataRef preparsedDataRef)
278: {
279: return HIDGetSpecificValueCaps(reportType,0,0,0,valueCaps,
280: piValueCapsLength,preparsedDataRef);
281: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.