|
|
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: HIDSetButtons.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: <USB3> 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: <USB2> 4/7/99 BWS Add support for reversed report items ! 50: <USB1> 3/5/99 BWS first checked in ! 51: */ ! 52: ! 53: #include "HIDLib.h" ! 54: ! 55: /* ! 56: *------------------------------------------------------------------------------ ! 57: * ! 58: * HIDSetButton - Set the state of a button for a Page ! 59: * ! 60: * Input: ! 61: * reportType - HIDP_Input, HIDP_Output, HIDP_Feature ! 62: * usagePage - Page Criteria or zero ! 63: * iCollection - Collection Criteria or zero ! 64: * usage - Usages for pressed button ! 65: * ptPreparsedData - Pre-Parsed Data ! 66: * psReport - An HID Report ! 67: * iReportLength - The length of the Report ! 68: * Output: ! 69: * Returns: ! 70: * ! 71: *------------------------------------------------------------------------------ ! 72: */ ! 73: OSStatus HIDSetButton (HIDReportType reportType, ! 74: HIDUsage usagePage, ! 75: UInt32 collection, ! 76: HIDUsage usage, ! 77: HIDPreparsedDataRef preparsedDataRef, ! 78: void * report, ! 79: ByteCount reportLength) ! 80: { ! 81: HIDPreparsedDataPtr ptPreparsedData = (HIDPreparsedDataPtr) preparsedDataRef; ! 82: HIDCollection *ptCollection; ! 83: HIDReportItem *ptReportItem; ! 84: OSStatus iStatus; ! 85: int iR, iX; ! 86: SInt32 data; ! 87: int iStart; ! 88: int iReportItem; ! 89: UInt32 iUsageIndex; ! 90: Boolean bIncompatibleReport = false; ! 91: /* ! 92: * Disallow Null Pointers ! 93: */ ! 94: if ((ptPreparsedData == NULL) ! 95: || (report == NULL)) ! 96: return kHIDNullPointerErr; ! 97: if (ptPreparsedData->hidTypeIfValid != kHIDOSType) ! 98: return kHIDInvalidPreparsedDataErr; ! 99: /* ! 100: * The Collection must be in range ! 101: */ ! 102: if ((collection < 0) || (collection >= ptPreparsedData->collectionCount)) ! 103: return kHIDBadParameterErr; ! 104: /* ! 105: * Search only the scope of the Collection specified ! 106: * Go through the ReportItems ! 107: * Filter on ReportType and usagePage ! 108: */ ! 109: ptCollection = &ptPreparsedData->collections[collection]; ! 110: for (iR=0; iR<ptCollection->reportItemCount; iR++) ! 111: { ! 112: iReportItem = ptCollection->firstReportItem + iR; ! 113: ptReportItem = &ptPreparsedData->reportItems[iReportItem]; ! 114: if (HIDIsButton(ptReportItem, preparsedDataRef) ! 115: && HIDHasUsage(preparsedDataRef,ptReportItem,usagePage,usage,&iUsageIndex,NULL)) ! 116: { ! 117: /* ! 118: * This may be the proper data to get ! 119: * Let's check for the proper Report ID, Type, and Length ! 120: */ ! 121: iStatus = HIDCheckReport(reportType,preparsedDataRef,ptReportItem,report,reportLength); ! 122: /* ! 123: * The Report ID or Type may not match. ! 124: * This may not be an error (yet) ! 125: */ ! 126: if (iStatus == kHIDIncompatibleReportErr) ! 127: bIncompatibleReport = true; ! 128: else if (iStatus != kHIDSuccess) ! 129: return iStatus; ! 130: else ! 131: { ! 132: /* ! 133: * Save Arrays ! 134: */ ! 135: if ((ptReportItem->dataModes & kHIDDataArrayBit) == kHIDDataArray) ! 136: { ! 137: for (iX=0; iX<ptReportItem->globals.reportCount; iX++) ! 138: { ! 139: iStart = ptReportItem->startBit + (ptReportItem->globals.reportSize * iX); ! 140: iStatus = HIDGetData(report, reportLength, iStart, ! 141: ptReportItem->globals.reportSize, &data, true); ! 142: if (!iStatus) ! 143: iStatus = HIDPostProcessRIValue (ptReportItem, &data); ! 144: if (iStatus != kHIDSuccess) ! 145: return iStatus; ! 146: // if not already in the list, add it (is this code right??) ! 147: if (data == 0) ! 148: return HIDPutData(report, reportLength, iStart, ! 149: ptReportItem->globals.reportSize, ! 150: iUsageIndex + ptReportItem->globals.logicalMinimum); ! 151: } ! 152: return kHIDBufferTooSmallErr; ! 153: } ! 154: /* ! 155: * Save Bitmaps ! 156: */ ! 157: else if (ptReportItem->globals.reportSize == 1) ! 158: { ! 159: iStart = ptReportItem->startBit + (ptReportItem->globals.reportSize * iUsageIndex); ! 160: // should we call HIDPreProcessRIValue here? ! 161: // we are passing '-1' as trhe value, is this right? Some hack to set the right bit to 1? ! 162: iStatus = HIDPutData(report, reportLength, iStart, ptReportItem->globals.reportSize, -1); ! 163: if (iStatus != kHIDSuccess) ! 164: return iStatus; ! 165: return kHIDSuccess; ! 166: } ! 167: } ! 168: } ! 169: } ! 170: if (bIncompatibleReport) ! 171: return kHIDIncompatibleReportErr; ! 172: return kHIDUsageNotFoundErr; ! 173: } ! 174: ! 175: /* ! 176: *------------------------------------------------------------------------------ ! 177: * ! 178: * HIDSetButtons - Set the state of the buttons for a Page ! 179: * ! 180: * Input: ! 181: * reportType - HIDP_Input, HIDP_Output, HIDP_Feature ! 182: * usagePage - Page Criteria or zero ! 183: * collection - Collection Criteria or zero ! 184: * piUsageList - Usages for pressed buttons ! 185: * piUsageListLength - Max entries in UsageList ! 186: * ptPreparsedData - Pre-Parsed Data ! 187: * report - An HID Report ! 188: * reportLength - The length of the Report ! 189: * Output: ! 190: * piValue - Pointer to usage Value ! 191: * Returns: ! 192: * ! 193: *------------------------------------------------------------------------------ ! 194: */ ! 195: OSStatus ! 196: HIDSetButtons (HIDReportType reportType, ! 197: HIDUsage usagePage, ! 198: UInt32 collection, ! 199: HIDUsage * usageList, ! 200: UInt32 * usageListSize, ! 201: HIDPreparsedDataRef preparsedDataRef, ! 202: void * report, ! 203: ByteCount reportLength) ! 204: { ! 205: HIDPreparsedDataPtr ptPreparsedData = (HIDPreparsedDataPtr) preparsedDataRef; ! 206: OSStatus iStatus; ! 207: int iUsages; ! 208: int usage; ! 209: /* ! 210: * Disallow Null Pointers ! 211: */ ! 212: if ((ptPreparsedData == NULL) ! 213: || (usageList == NULL) ! 214: || (usageListSize == NULL) ! 215: || (report == NULL)) ! 216: return kHIDNullPointerErr; ! 217: if (ptPreparsedData->hidTypeIfValid != kHIDOSType) ! 218: return kHIDInvalidPreparsedDataErr; ! 219: /* ! 220: * Save the usage List Length ! 221: */ ! 222: iUsages = *usageListSize; ! 223: /* ! 224: * Write them out one at a time ! 225: */ ! 226: for (usage=0; usage<iUsages; usage++) ! 227: { ! 228: *usageListSize = usage; ! 229: iStatus = HIDSetButton(reportType, usagePage, collection, ! 230: usageList[usage], preparsedDataRef, ! 231: report, reportLength); ! 232: if (iStatus != kHIDSuccess) ! 233: return iStatus; ! 234: } ! 235: return kHIDSuccess; ! 236: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.