Formal protocol for the interface shared between Joysticks and JSActions, use new...
[enjoyable.git] / Joystick.m
index 7870ce0..4753caf 100644 (file)
@@ -18,14 +18,15 @@ static NSArray *ActionsForElement(IOHIDDeviceRef device, id base) {
     
     int buttons = 0;
     int axes = 0;
+    int hats = 0;
     
     for (int i = 0; i < CFArrayGetCount(elements); i++) {
         IOHIDElementRef element = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, i);
         int type = IOHIDElementGetType(element);
-        int usage = IOHIDElementGetUsage(element);
-        int usagePage = IOHIDElementGetUsagePage(element);
-        int max = IOHIDElementGetPhysicalMax(element);
-        int min = IOHIDElementGetPhysicalMin(element);
+        unsigned usage = IOHIDElementGetUsage(element);
+        unsigned usagePage = IOHIDElementGetUsagePage(element);
+        long max = IOHIDElementGetPhysicalMax(element);
+        long min = IOHIDElementGetPhysicalMin(element);
         CFStringRef elName = IOHIDElementGetName(element);
         
         JSAction *action = nil;
@@ -40,12 +41,11 @@ static NSArray *ActionsForElement(IOHIDDeviceRef device, id base) {
                                                       idx:++buttons
                                                       max:max];
         } else if (usage == kHIDUsage_GD_Hatswitch) {
-            action = [[JSActionHat alloc] init];
+            action = [[JSActionHat alloc] initWithIndex:++hats];
         } else if (usage >= kHIDUsage_GD_X && usage <= kHIDUsage_GD_Rz) {
-            // TODO(jfw): Scaling equation doesn't seem right if min != 0.
             action = [[JSActionAnalog alloc] initWithIndex:++axes
-                                                    offset:-1.f
-                                                     scale:2.f / (max - min)];
+                                                    rawMin:min
+                                                    rawMax:max];
         } else {
             continue;
         }
@@ -55,31 +55,29 @@ static NSArray *ActionsForElement(IOHIDDeviceRef device, id base) {
         action.cookie = IOHIDElementGetCookie(element);
         [children addObject:action];
     }
+
+    CFRelease(elements);
     return children;
 }
 
-@implementation Joystick
-
-@synthesize vendorId;
-@synthesize productId;
-@synthesize productName;
-@synthesize index;
-@synthesize device;
-@synthesize children;
+@implementation Joystick {
+    int vendorId;
+    int productId;
+}
 
 - (id)initWithDevice:(IOHIDDeviceRef)dev {
     if ((self = [super init])) {
         self.device = dev;
         self.productName = (__bridge NSString *)IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDProductKey));
-        self.vendorId = [(__bridge NSNumber *)IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDVendorIDKey)) intValue];
-        self.productId = [(__bridge NSNumber *)IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDProductIDKey)) intValue];
+        vendorId = [(__bridge NSNumber *)IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDVendorIDKey)) intValue];
+        productId = [(__bridge NSNumber *)IOHIDDeviceGetProperty(dev, CFSTR(kIOHIDProductIDKey)) intValue];
         self.children = ActionsForElement(dev, self);
     }
     return self;
 }
 
 - (NSString *)name {
-    return [NSString stringWithFormat:@"%@ #%d", productName, index];
+    return [NSString stringWithFormat:@"%@ #%d", _productName, _index];
 }
 
 - (id)base {
@@ -87,24 +85,24 @@ static NSArray *ActionsForElement(IOHIDDeviceRef device, id base) {
 }
 
 - (NSString *)uid {
-    return [NSString stringWithFormat: @"%d:%d:%d", vendorId, productId, index];
+    return [NSString stringWithFormat: @"%d:%d:%d", vendorId, productId, _index];
 }
 
-- (JSAction *)findActionByCookie:(void *)cookie {
-    for (JSAction *child in children)
+- (JSAction *)findActionByCookie:(IOHIDElementCookie)cookie {
+    for (JSAction *child in _children)
         if (child.cookie == cookie)
             return child;
     return nil;
 }
 
-- (id)handlerForEvent:(IOHIDValueRef) value {
+- (JSAction *)handlerForEvent:(IOHIDValueRef)value {
     JSAction *mainAction = [self actionForEvent:value];
     return [mainAction findSubActionForValue:value];
 }
 
 - (JSAction *)actionForEvent:(IOHIDValueRef)value {
     IOHIDElementRef elt = IOHIDValueGetElement(value);
-    void *cookie = IOHIDElementGetCookie(elt);
+    IOHIDElementCookie cookie = IOHIDElementGetCookie(elt);
     return [self findActionByCookie:cookie];
 }