src/haptic/darwin/SDL_syshaptic.c
branchgsoc2008_force_feedback
changeset 2641 e1e1be935178
parent 2639 668fee3b268a
child 2642 b04679da6627
equal deleted inserted replaced
2640:e8a54b6fd512 2641:e1e1be935178
    41 /*
    41 /*
    42  * List of available haptic devices.
    42  * List of available haptic devices.
    43  */
    43  */
    44 static struct
    44 static struct
    45 {
    45 {
    46    char name[256];
    46    char name[256]; /* Name of the device. */
    47    io_service_t dev;
    47 
    48    SDL_Haptic *haptic;
    48    io_service_t dev; /* Node we use to create the device. */
       
    49    SDL_Haptic *haptic; /* Haptic currently assosciated with it. */
       
    50    
       
    51    /* Usage pages for determining if it's a mouse or not. */
       
    52    long usage;
       
    53    long usagePage;
    49 } SDL_hapticlist[MAX_HAPTICS];
    54 } SDL_hapticlist[MAX_HAPTICS];
    50 
    55 
    51 
    56 
    52 /*
    57 /*
    53  * Haptic system hardware data.
    58  * Haptic system hardware data.
   141    int numhaptics;
   146    int numhaptics;
   142    IOReturn result;
   147    IOReturn result;
   143    io_iterator_t iter;
   148    io_iterator_t iter;
   144    CFDictionaryRef match;
   149    CFDictionaryRef match;
   145    io_service_t device;
   150    io_service_t device;
       
   151    CFMutableDictionaryRef hidProperties;
       
   152    CFTypeRef refCF;
   146 
   153 
   147    /* Clear all the memory. */
   154    /* Clear all the memory. */
   148    SDL_memset(SDL_hapticlist, 0, sizeof(SDL_hapticlist));
   155    SDL_memset(SDL_hapticlist, 0, sizeof(SDL_hapticlist));
   149 
   156 
   150    /* Get HID devices. */
   157    /* Get HID devices. */
   160       SDL_SetError("Haptic: Couldn't create a HID object iterator.");
   167       SDL_SetError("Haptic: Couldn't create a HID object iterator.");
   161       return -1;
   168       return -1;
   162    }
   169    }
   163    /* IOServiceGetMatchingServices consumes dictionary. */
   170    /* IOServiceGetMatchingServices consumes dictionary. */
   164 
   171 
   165    if (!iter) { /* No iterator. */
   172    if (!IOIteratorIsValid(iter)) { /* No iterator. */
   166       numhaptics = 0;
   173       numhaptics = 0;
   167       return 0;
   174       return 0;
   168    }
   175    }
   169 
   176 
   170    numhaptics = 0;
   177    numhaptics = 0;
   171    while ((device = IOIteratorNext(iter)) != IO_OBJECT_NULL) {
   178    while ((device = IOIteratorNext(iter)) != IO_OBJECT_NULL) {
   172 
   179 
   173       /* Check for force feedback. */
   180       /* Check for force feedback. */
   174       if (FFIsForceFeedback(device) == FF_OK) {
   181       if (FFIsForceFeedback(device) == FF_OK) {
       
   182 
       
   183          /* Set basic device data. */
   175          HIDGetDeviceProduct(device, SDL_hapticlist[numhaptics].name);
   184          HIDGetDeviceProduct(device, SDL_hapticlist[numhaptics].name);
   176          SDL_hapticlist[numhaptics].dev = device;
   185          SDL_hapticlist[numhaptics].dev = device;
   177          SDL_hapticlist[numhaptics].haptic = NULL;
   186          SDL_hapticlist[numhaptics].haptic = NULL;
       
   187 
       
   188          /* Set usage pages. */
       
   189          hidProperties = 0;
       
   190          refCF = 0;
       
   191          result = IORegistryEntryCreateCFProperties(device,
       
   192                &hidProperties, kCFAllocatorDefault, kNilOptions);
       
   193          if ((result == KERN_SUCCESS) && hidProperties) {
       
   194             refCF = CFDictionaryGetValue(hidProperties, CFSTR(kIOHIDPrimaryUsagePageKey));
       
   195             if (refCF) {
       
   196                if (!CFNumberGetValue(refCF, kCFNumberLongType,
       
   197                      &SDL_hapticlist[numhaptics].usagePage))
       
   198                   SDL_SetError("Haptic: CFNumberGetValue error retrieving pDevice->usagePage.");
       
   199                refCF = CFDictionaryGetValue(hidProperties, CFSTR(kIOHIDPrimaryUsageKey));
       
   200                if (refCF) {
       
   201                   if (!CFNumberGetValue(refCF, kCFNumberLongType,
       
   202                         &SDL_hapticlist[numhaptics].usage))
       
   203                      SDL_SetError("Haptic: CFNumberGetValue error retrieving pDevice->usage.");
       
   204                }
       
   205             }
       
   206             CFRelease(hidProperties);
       
   207          }
       
   208 
       
   209 
       
   210          /* Device has been added. */
   178          numhaptics++;
   211          numhaptics++;
   179       }
   212       }
   180       else { /* Free the unused device. */
   213       else { /* Free the unused device. */
   181          IOObjectRelease(device);
   214          IOObjectRelease(device);
   182       }
   215       }
   244             refCF =
   277             refCF =
   245                CFDictionaryGetValue(usbProperties, CFSTR("USB Product Name"));
   278                CFDictionaryGetValue(usbProperties, CFSTR("USB Product Name"));
   246          if (refCF) {
   279          if (refCF) {
   247             if (!CFStringGetCString(refCF, name, 256,
   280             if (!CFStringGetCString(refCF, name, 256,
   248                                     CFStringGetSystemEncoding())) {
   281                                     CFStringGetSystemEncoding())) {
   249                SDL_SetError("CFStringGetCString error retrieving pDevice->product.");
   282                SDL_SetError("Haptic: CFStringGetCString error retrieving pDevice->product.");
   250                return -1;
   283                return -1;
   251             }
   284             }
   252          }
   285          }
   253 
   286 
   254          CFRelease(usbProperties);
   287          CFRelease(usbProperties);
   255       }
   288       }
   256       else {
   289       else {
   257          SDL_SetError("IORegistryEntryCreateCFProperties failed to create usbProperties.");
   290          SDL_SetError("Haptic: IORegistryEntryCreateCFProperties failed to create usbProperties.");
   258          return -1;
   291          return -1;
   259       }
   292       }
   260 
   293 
   261       /* Release stuff. */
   294       /* Release stuff. */
   262       if (kIOReturnSuccess != IOObjectRelease(parent2)) {
   295       if (kIOReturnSuccess != IOObjectRelease(parent2)) {
   263          SDL_SetError("IOObjectRelease error with parent2.");
   296          SDL_SetError("Haptic: IOObjectRelease error with parent2.");
   264       }
   297       }
   265       if (kIOReturnSuccess != IOObjectRelease(parent1))  {
   298       if (kIOReturnSuccess != IOObjectRelease(parent1))  {
   266          SDL_SetError("IOObjectRelease error with parent1.");
   299          SDL_SetError("Haptic: IOObjectRelease error with parent1.");
   267       }
   300       }
   268    }
   301    }
   269    else {
   302    else {
   270       SDL_SetError("Haptic: Error getting registry entries.");
   303       SDL_SetError("Haptic: Error getting registry entries.");
   271       return -1;
   304       return -1;
   440  * Opens a haptic device from first mouse it finds for usage.
   473  * Opens a haptic device from first mouse it finds for usage.
   441  */
   474  */
   442 int
   475 int
   443 SDL_SYS_HapticMouse(void)
   476 SDL_SYS_HapticMouse(void)
   444 {
   477 {
       
   478    int i;
       
   479 
       
   480    for (i=0; i<SDL_numhaptics; i++) {
       
   481       if ((SDL_hapticlist[i].usagePage == kHIDPage_GenericDesktop) &&
       
   482             (SDL_hapticlist[i].usage == kHIDUsage_GD_Mouse))
       
   483          return i;
       
   484    }
       
   485 
   445    return -1;
   486    return -1;
   446 }
   487 }
   447 
   488 
   448 
   489 
   449 /*
   490 /*