Пример #1
0
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 {
Пример #2
0
/*------------------------------------ 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)
              }
          }