/* PsychHIDCountCollectionElements() Non-recursively count all elements of a collection which are of the specified type. HID element records hold three pointers to other element records: pPrevious, pChild and pSibling. PsychHIDCountCollectionElements() operates on the theory that the members of a collection are its child and all of that child's siblings. */ int PsychHIDCountCollectionElements(pRecElement collectionRecord, HIDElementTypeMask elementTypeMask) { pRecElement currentElement; int numElements = 0; CFIndex i, nmax; HIDElementTypeMask currentElementMaskValue; #ifdef __LP64__ CFArrayRef children = IOHIDElementGetChildren(collectionRecord); nmax = CFArrayGetCount(children); for (i = 0 ; i < nmax; i++) { currentElement = (pRecElement) CFArrayGetValueAtIndex(children, i); currentElementMaskValue = HIDConvertElementTypeToMask(IOHIDElementGetType(currentElement)); if(currentElementMaskValue & elementTypeMask) ++numElements; } #else for(currentElement=collectionRecord->pChild; currentElement != NULL; currentElement= currentElement->pSibling) { currentElementMaskValue=HIDConvertElementTypeToMask(currentElement->type); if(currentElementMaskValue & elementTypeMask) ++numElements; } #endif return(numElements); }
/* FindCollectionElements() Non-recursively return of a list of a collection's memember elements. HID element records hold three pointers to other element records: pPrevious, pChild and pSibling. FindCollectionElements() operates on the theory that the members of a collection are its child and all of that child's siblings. */ int PsychHIDFindCollectionElements(pRecElement collectionRecord, HIDElementTypeMask elementTypeMask, pRecElement *collectionMembers, int maxListElements) { pRecElement currentElement; int numElements = 0; CFIndex i, nmax; HIDElementTypeMask currentElementMaskValue; #ifdef __LP64__ CFArrayRef children = IOHIDElementGetChildren(collectionRecord); nmax = CFArrayGetCount(children); for (i = 0 ; i < nmax; i++) { currentElement = (pRecElement) CFArrayGetValueAtIndex(children, i); currentElementMaskValue = HIDConvertElementTypeToMask(IOHIDElementGetType(currentElement)); if(currentElementMaskValue & elementTypeMask) { if(numElements == maxListElements) PsychErrorExitMsg(PsychError_internal, "Number of collection elements exceeds allocated storage space." ); collectionMembers[numElements] = currentElement; ++numElements; } } #else for(currentElement=collectionRecord->pChild; currentElement != NULL; currentElement= currentElement->pSibling) { currentElementMaskValue=HIDConvertElementTypeToMask(currentElement->type); if(currentElementMaskValue & elementTypeMask){ if(numElements == maxListElements) PsychErrorExitMsg(PsychError_internal, "Number of collection elements exceeds allocated storage space." ); collectionMembers[numElements]=currentElement; ++numElements; } } #endif return(numElements); }
/* PsychHIDCountCollectionElements() Non-recursively count all elements of a collection which are of the specified type. HID element records hold three pointers to other element records: pPrevious, pChild and pSibling. PsychHIDCountCollectionElements() operates on the theory that the members of a collection are its child and all of that child's siblings. */ int PsychHIDCountCollectionElements(pRecElement collectionRecord, HIDElementTypeMask elementTypeMask) { pRecElement currentElement; int numElements=0; HIDElementTypeMask currentElementMaskValue; for(currentElement=collectionRecord->pChild; currentElement != NULL; currentElement= currentElement->pSibling) { currentElementMaskValue=HIDConvertElementTypeToMask(currentElement->type); if(currentElementMaskValue & elementTypeMask) ++numElements; } return(numElements); }
/* PsychHIDCountCollectionElements() Non-recursively count all elements of a collection which are of the specified type. HID element records hold three pointers to other element records: pPrevious, pChild and pSibling. PsychHIDCountCollectionElements() operates on the theory that the members of a collection are its child and all of that child's siblings. */ int PsychHIDCountCollectionElements(pRecElement collectionRecord, HIDElementTypeMask elementTypeMask) { pRecElement currentElement; int numElements = 0; CFIndex i, nmax; HIDElementTypeMask currentElementMaskValue; CFArrayRef children = IOHIDElementGetChildren(collectionRecord); nmax = CFArrayGetCount(children); for (i = 0; i < nmax; i++) { currentElement = (pRecElement)CFArrayGetValueAtIndex(children, i); currentElementMaskValue = HIDConvertElementTypeToMask(IOHIDElementGetType(currentElement)); if (currentElementMaskValue & elementTypeMask) ++numElements; } return numElements; }
/* FindCollectionElements() Non-recursively return of a list of a collection's memember elements. HID element records hold three pointers to other element records: pPrevious, pChild and pSibling. FindCollectionElements() operates on the theory that the members of a collection are its child and all of that child's siblings. */ int PsychHIDFindCollectionElements(pRecElement collectionRecord, HIDElementTypeMask elementTypeMask, pRecElement *collectionMembers, int maxListElements) { pRecElement currentElement; int numElements=0; HIDElementTypeMask currentElementMaskValue; for(currentElement=collectionRecord->pChild; currentElement != NULL; currentElement= currentElement->pSibling) { currentElementMaskValue=HIDConvertElementTypeToMask(currentElement->type); if(currentElementMaskValue & elementTypeMask){ if(numElements == maxListElements) PsychErrorExitMsg(PsychError_internal, "Number of collection elements exceeds allocated storage space." ); collectionMembers[numElements]=currentElement; ++numElements; } } return(numElements); }
PsychError PSYCHHIDGetElements(void) { pRecDevice specDevice=NULL; UInt32 numDeviceElements; const char *elementFieldNames[]={"typeMaskName", "name", "deviceIndex", "elementIndex", "typeValue", "typeName", "usagePageValue", "usageValue", "usageName", "dataSize", "rangeMin", "rangeMax", "scaledRangeMin", "scaledRangeMax", "relative", "wrapping", "nonLinear", "preferredState", "nullState", "calMin", "calMax", "scalingMin", "scalingMax"}; int numElementStructElements, numElementStructFieldNames=23, elementIndex, deviceIndex; PsychGenericScriptType *elementStruct; pRecElement currentElement; char elementTypeName[PSYCH_HID_MAX_DEVICE_ELEMENT_TYPE_NAME_LENGTH]; char usageName[PSYCH_HID_MAX_DEVICE_ELEMENT_USAGE_NAME_LENGTH]; char *typeMaskName; HIDElementTypeMask typeMask; //all subfunctions should have these two lines PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(1)); PsychCopyInIntegerArg(1, TRUE, &deviceIndex); PsychHIDVerifyInit(); specDevice= PsychHIDGetDeviceRecordPtrFromIndex(deviceIndex); PsychHIDVerifyOpenDeviceInterfaceFromDeviceRecordPtr(specDevice); numDeviceElements= HIDCountDeviceElements(specDevice, kHIDElementTypeIO); numElementStructElements = (int)numDeviceElements; PsychAllocOutStructArray(1, FALSE, numElementStructElements, numElementStructFieldNames, elementFieldNames, &elementStruct); elementIndex=0; for(currentElement=HIDGetFirstDeviceElement(specDevice,kHIDElementTypeIO); currentElement != NULL; currentElement=HIDGetNextDeviceElement(currentElement, kHIDElementTypeIO)) { typeMask=HIDConvertElementTypeToMask (currentElement->type); PsychHIDGetTypeMaskStringFromTypeMask(typeMask, &typeMaskName); PsychSetStructArrayStringElement("typeMaskName", elementIndex, typeMaskName, elementStruct); PsychSetStructArrayStringElement("name", elementIndex, currentElement->name, elementStruct); PsychSetStructArrayDoubleElement("deviceIndex", elementIndex, (double)deviceIndex, elementStruct); PsychSetStructArrayDoubleElement("elementIndex", elementIndex, (double)elementIndex+1, elementStruct); PsychSetStructArrayDoubleElement("typeValue", elementIndex, (double)currentElement->type, elementStruct); HIDGetTypeName(currentElement->type, elementTypeName); PsychSetStructArrayStringElement("typeName", elementIndex, elementTypeName, elementStruct); PsychSetStructArrayDoubleElement("usagePageValue", elementIndex, (double)currentElement->usagePage, elementStruct); PsychSetStructArrayDoubleElement("usageValue", elementIndex, (double)currentElement->usage, elementStruct); HIDGetUsageName (currentElement->usagePage, currentElement->usage, usageName); PsychSetStructArrayStringElement("usageName", elementIndex, usageName, elementStruct); PsychSetStructArrayDoubleElement("dataSize", elementIndex, (double)currentElement->size, elementStruct); PsychSetStructArrayDoubleElement("rangeMin", elementIndex, (double)currentElement->min, elementStruct); PsychSetStructArrayDoubleElement("rangeMax", elementIndex, (double)currentElement->max, elementStruct); PsychSetStructArrayDoubleElement("scaledRangeMin", elementIndex, (double)currentElement->scaledMin, elementStruct); PsychSetStructArrayDoubleElement("scaledRangeMax", elementIndex, (double)currentElement->scaledMax, elementStruct); PsychSetStructArrayDoubleElement("relative", elementIndex, (double)currentElement->relative, elementStruct); //psych_bool flag PsychSetStructArrayDoubleElement("wrapping", elementIndex, (double)currentElement->wrapping, elementStruct); //psych_bool flag PsychSetStructArrayDoubleElement("nonLinear", elementIndex, (double)currentElement->nonLinear, elementStruct); //psych_bool flag PsychSetStructArrayDoubleElement("preferredState", elementIndex, (double)currentElement->preferredState, elementStruct); //psych_bool flag PsychSetStructArrayDoubleElement("nullState", elementIndex, (double)currentElement->nullState, elementStruct); //psych_bool flag PsychSetStructArrayDoubleElement("calMin", elementIndex, (double)currentElement->calMin, elementStruct); PsychSetStructArrayDoubleElement("calMax", elementIndex, (double)currentElement->calMax, elementStruct); PsychSetStructArrayDoubleElement("scalingMin", elementIndex, (double)currentElement->userMin, elementStruct); PsychSetStructArrayDoubleElement("scalingMax", elementIndex, (double)currentElement->userMax, elementStruct); ++elementIndex; } return(PsychError_none); }
PsychError PSYCHHIDGetCollections(void) { pRecDevice specDevice=NULL; UInt32 numDeviceElements; const char *elementFieldNames[]={"typeMaskName", "name", "deviceIndex", "collectionIndex", "typeValue", "typeName", "usagePageValue", "usageValue", "usageName", "memberCollectionIndices", "memberElementIndices"}; int i, numElementStructElements, numElementStructFieldNames=11, elementIndex, deviceIndex; PsychGenericScriptType *elementStruct, *memberCollectionIndicesMat, *memberIOElementIndicesMat; pRecElement currentElement; char elementTypeName[PSYCH_HID_MAX_DEVICE_ELEMENT_TYPE_NAME_LENGTH]; char usageName[PSYCH_HID_MAX_DEVICE_ELEMENT_USAGE_NAME_LENGTH]; char *typeMaskName; HIDElementTypeMask typeMask; pRecElement *memberCollectionRecords, *memberIOElementRecords; double *memberCollectionIndices, *memberIOElementIndices; int numSubCollections, numSubIOElements; PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(1)); PsychCopyInIntegerArg(1, TRUE, &deviceIndex); PsychHIDVerifyInit(); specDevice= PsychHIDGetDeviceRecordPtrFromIndex(deviceIndex); PsychHIDVerifyOpenDeviceInterfaceFromDeviceRecordPtr(specDevice); numDeviceElements= HIDCountDeviceElements(specDevice, kHIDElementTypeCollection); numElementStructElements = (int)numDeviceElements; PsychAllocOutStructArray(1, FALSE, numElementStructElements, numElementStructFieldNames, elementFieldNames, &elementStruct); elementIndex=0; for(currentElement=HIDGetFirstDeviceElement(specDevice,kHIDElementTypeCollection); currentElement != NULL; currentElement=HIDGetNextDeviceElement(currentElement, kHIDElementTypeCollection)) { typeMask=HIDConvertElementTypeToMask (currentElement->type); PsychHIDGetTypeMaskStringFromTypeMask(typeMask, &typeMaskName); PsychSetStructArrayStringElement("typeMaskName", elementIndex, typeMaskName, elementStruct); PsychSetStructArrayStringElement("name", elementIndex, currentElement->name, elementStruct); PsychSetStructArrayDoubleElement("deviceIndex", elementIndex, (double)deviceIndex, elementStruct); PsychSetStructArrayDoubleElement("collectionIndex", elementIndex, (double)elementIndex+1, elementStruct); PsychSetStructArrayDoubleElement("typeValue", elementIndex, (double)currentElement->type, elementStruct); HIDGetTypeName(currentElement->type, elementTypeName); PsychSetStructArrayStringElement("typeName", elementIndex, elementTypeName, elementStruct); PsychSetStructArrayDoubleElement("usagePageValue", elementIndex, (double)currentElement->usagePage, elementStruct); PsychSetStructArrayDoubleElement("usageValue", elementIndex, (double)currentElement->usage, elementStruct); HIDGetUsageName (currentElement->usagePage, currentElement->usage, usageName); PsychSetStructArrayStringElement("usageName", elementIndex, usageName, elementStruct); //find and return the indices of this collection's member collections and indices numSubCollections=PsychHIDCountCollectionElements(currentElement, kHIDElementTypeCollection); numSubIOElements=PsychHIDCountCollectionElements(currentElement, kHIDElementTypeIO); memberCollectionRecords=(pRecElement*)PsychMallocTemp(sizeof(pRecElement) * numSubCollections); memberIOElementRecords=(pRecElement*)PsychMallocTemp(sizeof(pRecElement) * numSubIOElements); PsychHIDFindCollectionElements(currentElement, kHIDElementTypeCollection, memberCollectionRecords, numSubCollections); PsychHIDFindCollectionElements(currentElement, kHIDElementTypeIO, memberIOElementRecords, numSubIOElements); memberCollectionIndices=NULL; PsychAllocateNativeDoubleMat(1, numSubCollections, 1, &memberCollectionIndices, &memberCollectionIndicesMat); memberIOElementIndices=NULL; PsychAllocateNativeDoubleMat(1, numSubIOElements, 1, &memberIOElementIndices, &memberIOElementIndicesMat); for(i=0;i<numSubCollections;i++) memberCollectionIndices[i]=PsychHIDGetIndexFromRecord(specDevice, memberCollectionRecords[i], kHIDElementTypeCollection); for(i=0;i<numSubIOElements;i++) memberIOElementIndices[i]=PsychHIDGetIndexFromRecord(specDevice, memberIOElementRecords[i], kHIDElementTypeIO); PsychFreeTemp(memberCollectionRecords); PsychFreeTemp(memberIOElementRecords); PsychSetStructArrayNativeElement("memberCollectionIndices", elementIndex, memberCollectionIndicesMat, elementStruct); PsychSetStructArrayNativeElement("memberElementIndices", elementIndex, memberIOElementIndicesMat, elementStruct); ++elementIndex; } return(PsychError_none); }