// Created by Sam McCall on 4/05/09.
//
+#import "Joystick.h"
+
+#import "JSAction.h"
+#import "JSActionAnalog.h"
+#import "JSActionButton.h"
+#import "JSActionHat.h"
+
static NSArray *ActionsForElement(IOHIDDeviceRef device, id base) {
CFArrayRef elements = IOHIDDeviceCopyMatchingElements(device, NULL, kIOHIDOptionsTypeNone);
NSMutableArray *children = [NSMutableArray arrayWithCapacity:CFArrayGetCount(elements)];
int buttons = 0;
int axes = 0;
+ int hats = 0;
for (int i = 0; i < CFArrayGetCount(elements); i++) {
IOHIDElementRef element = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, i);
int min = IOHIDElementGetPhysicalMin(element);
CFStringRef elName = IOHIDElementGetName(element);
- JSAction *action = NULL;
+ JSAction *action = nil;
- if(!(type == kIOHIDElementTypeInput_Misc
- || type == kIOHIDElementTypeInput_Axis
- || type == kIOHIDElementTypeInput_Button))
- continue;
+ if (!(type == kIOHIDElementTypeInput_Misc
+ || type == kIOHIDElementTypeInput_Axis
+ || type == kIOHIDElementTypeInput_Button))
+ continue;
if (max - min == 1 || usagePage == kHIDPage_Button || type == kIOHIDElementTypeInput_Button) {
- action = [[JSActionButton alloc] initWithIndex:buttons++ andName:(__bridge NSString *)elName];
- [(JSActionButton*)action setMax:max];
+ action = [[JSActionButton alloc] initWithName:(__bridge NSString *)elName
+ 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) {
+ action = [[JSActionAnalog alloc] initWithIndex:++axes
+ rawMin:min
+ rawMax:max];
} else {
- if (usage >= kHIDUsage_GD_X && usage <= kHIDUsage_GD_Rz) {
- action = [[JSActionAnalog alloc] initWithIndex: axes++];
- [(JSActionAnalog*)action setOffset:(double)-1.0];
- [(JSActionAnalog*)action setScale:(double)2.0/(max - min)];
- } else
- continue;
+ continue;
}
- [action setBase:base];
- [action setUsage:usage];
- [action setCookie:IOHIDElementGetCookie(element)];
+ // TODO(jfw): Should be moved into better constructors.
+ action.base = base;
+ action.cookie = IOHIDElementGetCookie(element);
[children addObject:action];
}
return children;
}
- (NSString *)name {
- return [NSString stringWithFormat:@"%@ #%d", productName, index + 1];
+ return [NSString stringWithFormat:@"%@ #%d", productName, index];
}
- (id)base {
- // FIXME(jfw): This is a hack because actions get joysticks as their base.
return nil;
}
-- (NSString *)stringify {
- return [[NSString alloc] initWithFormat: @"%d~%d~%d", vendorId, productId, index];
+- (NSString *)uid {
+ return [NSString stringWithFormat: @"%d:%d:%d", vendorId, productId, index];
}
- (JSAction *)findActionByCookie:(void *)cookie {