static inline uint8_t get_nibble (void) { static uint8_t next = 0; if (aligned) { fieldoffset[field]++; next = GETBYTES(1, "get_nibble (aligned)"); aligned = 0; return next >> 4; } else {
/*------------------------------------ performGet ---*/ static bool performGet(FidgetPtr xx, HIDDeviceDataPtr walkerHID, PSymbol deviceType, const short argc, PAtom argv) { bool okSoFar = true; OSErr result; E_PhidgResult action = kPhidgDoDefault; if (walkerHID->fClass) { PhidgetDescriptorPtr kind = reinterpret_cast<PhidgetDescriptorPtr>(walkerHID->fClass); #if defined(COMPILE_FOR_OSX_4) action = reinterpret_cast<FpDoGet>(kind->fDoGetFun)(OUR_NAME, deviceType, xx->fDataOut, kind->fShared, walkerHID->fPrivate, walkerHID, short(argc - 2), argv + 2, &result); #endif /* COMPILE_FOR_OSX_4 */ #if defined(COMPILE_FOR_OS9_4) action = static_cast<E_PhidgResult>(CallUniversalProc(kind->fDoGetUpp, uppDoGetProcInfo, OUR_NAME, deviceType, xx->fDataOut, kind->fShared, walkerHID->fPrivate, walkerHID, short(argc - 2), argv + 2, &result)); #endif /* COMPILE_FOR_OS9_4 */ } if (action == kPhidgDoDefault) { #if defined(COMPILE_FOR_OSX_4) // Note that 'default' is only supported with 'CATS' - there is no reasonable behaviour // if we are using a report handler... as we do for non-'CATS'! if (argc >= 3) { long element = 0; if (argv[2].a_type == A_LONG) element = argv[2].a_w.w_long; else { okSoFar = false; LOG_ERROR_2(OUTPUT_PREFIX "element is not an integer for '%s:get'", deviceType->s_name); } if (okSoFar) { HIDElementDataPtr anElement = NULL_PTR; if (element) { // Find the matching element: for (anElement = walkerHID->fFirstElement; anElement; anElement = anElement->fNext) { if (anElement->fCookie == reinterpret_cast<IOHIDElementCookie>(element)) break; } } if (anElement) { UInt32 extendedLength; Pvoid extendedValue; IOReturn result; long value = getHIDElementValue(OUR_NAME, *walkerHID, *anElement, extendedLength, extendedValue, result); if (result == KERN_SUCCESS) { if (extendedLength) { PAtom newList = GETBYTES(extendedLength + 2, Atom); Pchar longValue = reinterpret_cast<Pchar>(extendedValue); SETSYM(newList, deviceType); SETSYM(newList + 1, walkerHID->fSerialNumber); for (UInt32 ii = 0; ii < extendedLength; ++ii, ++longValue) SETLONG(newList + ii + 2, long(*longValue & 0x00FF)); genericListOutput(xx->fDataOut, short(extendedLength + 2), newList); FREEBYTES(newList, extendedLength + 2) } else { Atom newList[3]; SETSYM(newList, deviceType); SETSYM(newList + 1, walkerHID->fSerialNumber); SETLONG(newList + 2, value); genericListOutput(xx->fDataOut, sizeof(newList) / sizeof(*newList), newList); } } if (result) outlet_int(xx->fResultOut, result); } else { okSoFar = false; LOG_ERROR_2(OUTPUT_PREFIX "element not found for '%sget'", deviceType->s_name) } }