activegs-ios/Common.iphone/MfiGameControllerHandler.m

93 lines
3.2 KiB
Objective-C

//
// MfiGameControllerHandler.m
// activegs
//
// Created by Yoshi Sugawara on 4/1/16.
//
//
#import "MfiGameControllerHandler.h"
@interface MfiGameControllerHandler()
@property (nonatomic,copy) void (^controllerCallbackSetup)(GCController *gameController);
@property (nonatomic,copy) void (^controllerDisconnectedCallback)(void);
@end
@implementation MfiGameControllerHandler
-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:GCControllerDidConnectNotification
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:GCControllerDidDisconnectNotification
object:nil];
}
- (void)discoverController:(void (^)(GCController *gameController))controllerCallbackSetup disconnectedCallback:(void (^)(void))controllerDisconnectedCallback{
self.controllerCallbackSetup = controllerCallbackSetup;
self.controllerDisconnectedCallback = controllerDisconnectedCallback;
if ([self hasControllerConnected]) {
NSLog(@"Already have a controller connected!");
[self foundController];
} else {
[self startDiscovery];
}
}
-(void) startDiscovery {
[GCController startWirelessControllerDiscoveryWithCompletionHandler:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(foundController)
name:GCControllerDidConnectNotification
object:nil];
}
- (void) stopDiscovery {
NSLog(@"Stopping controller discovery...");
[GCController stopWirelessControllerDiscovery];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:GCControllerDidConnectNotification
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:GCControllerDidDisconnectNotification
object:nil];
}
- (void)foundController {
NSLog(@"Found a controller!");
if (self.controllerCallbackSetup) {
self.controllerCallbackSetup([[GCController controllers] firstObject]);
}
[self stopDiscovery];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(controllerDisconnected)
name:GCControllerDidDisconnectNotification
object:nil];
}
- (void)controllerDisconnected {
if (self.controllerDisconnectedCallback){
self.controllerDisconnectedCallback();
}
[self startDiscovery];
}
- (BOOL)hasControllerConnected {
return [[GCController controllers] count] > 0;
}
-(GCController*) getController {
// just return the first one for now
if ( [self hasControllerConnected] ) {
return [[GCController controllers] firstObject];
}
return nil;
}
@end