1 #import "NJHIDManager.h"
3 @implementation NJHIDManager {
5 IOHIDManagerRef _manager;
8 - (id)initWithCriteria:(NSArray *)criteria
9 delegate:(id <NJHIDManagerDelegate>)delegate
11 if ((self = [super init])) {
12 self.criteria = criteria;
13 self.delegate = delegate;
22 static void _input(void *ctx, IOReturn inResult, void *inSender, IOHIDValueRef value) {
23 NJHIDManager *self = (__bridge NJHIDManager *)ctx;
24 [self.delegate HIDManager:self valueChanged:value];
27 static void _add(void *ctx, IOReturn inResult, void *inSender, IOHIDDeviceRef device) {
28 NJHIDManager *self = (__bridge NJHIDManager *)ctx;
29 [self.delegate HIDManager:self deviceAdded:device];
30 IOHIDDeviceRegisterInputValueCallback(device, _input, ctx);
33 static void _remove(void *ctx, IOReturn inResult, void *inSender, IOHIDDeviceRef device) {
34 NJHIDManager *self = (__bridge NJHIDManager *)ctx;
35 [self.delegate HIDManager:self deviceRemoved:device];
41 IOHIDManagerRef manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
42 IOHIDManagerSetDeviceMatchingMultiple(manager, (__bridge CFArrayRef)self.criteria);
43 IOReturn ret = IOHIDManagerOpen(manager, kIOHIDOptionsTypeNone);
44 if (ret != kIOReturnSuccess) {
45 NSError *error = [NSError errorWithDomain:NSMachErrorDomain code:ret userInfo:nil];
46 IOHIDManagerClose(manager, kIOHIDOptionsTypeNone);
48 [self.delegate HIDManager:self didError:error];
49 NSLog(@"Error starting HID manager: %@.", error);
52 IOHIDManagerScheduleWithRunLoop(_manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
53 IOHIDManagerRegisterDeviceMatchingCallback(_manager, _add, (__bridge void *)self);
54 IOHIDManagerRegisterDeviceRemovalCallback(_manager, _remove, (__bridge void *)self);
55 [self.delegate HIDManagerDidStart:self];
56 NSLog(@"Started HID manager.");
63 IOHIDManagerUnscheduleFromRunLoop(_manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
64 IOHIDManagerClose(_manager, kIOHIDOptionsTypeNone);
67 [self.delegate HIDManagerDidStop:self];
68 NSLog(@"Stopped HID manager.");
75 - (void)setRunning:(BOOL)running {
82 - (NSArray *)criteria {
86 - (void)setCriteria:(NSArray *)criteria {
89 if (![criteria isEqualToArray:_criteria]) {
90 BOOL running = !!_manager;
92 _criteria = [criteria copy];