Changeset 5517

Show
Ignore:
Timestamp:
05/11/08 17:17:09 (5 days ago)
Author:
morris
Message:

Listen for disconnect notifications

Auto-disconnect device after 30 minutes

Debug logging

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Spiral/trunk/SPBluetoothRemote.h

    r5472 r5517  
    3131#define SPBluetoothRemoteWillConnect            @"SPBluetoothRemoteWillConnect" 
    3232#define SPBluetoothRemoteDidConnect                     @"SPBluetoothRemoteDidConnect" 
     33#define SPBluetoothRemoteDidDisconnect          @"SPBluetoothRemoteDidDisconnect" 
    3334 
    3435 
     
    3940        IOBluetoothL2CAPChannel                                 *_interruptChannel; 
    4041         
     42        IOBluetoothUserNotification                             *_disconnectNotification; 
     43         
    4144        BOOL                                                                    _controlCompleted; 
    4245        BOOL                                                                    _controlConnected; 
     
    4649        BOOL                                                                    _connected; 
    4750        BOOL                                                                    _connecting; 
     51         
     52        BOOL                                                                    _logging; 
    4853} 
    4954 
     
    5358 
    5459- (void)connectAfterDelay; 
     60- (void)disconnectAfterDelay; 
    5561- (void)remoteDidConnect; 
    5662 
  • Spiral/trunk/SPBluetoothRemote.m

    r5471 r5517  
    3737- (BOOL)_connectControlAsync; 
    3838- (BOOL)_connectInterruptAsync; 
     39- (void)_disconnect; 
    3940 
    4041@end 
     
    4445 
    4546+ (IOBluetoothDevice *)_recentRemoteDevice { 
    46         NSArray                         *recentDevices; 
     47        NSArray                         *devices; 
    4748        IOBluetoothDevice       *device; 
    4849         
    49         recentDevices = [IOBluetoothDevice recentDevices:0]; 
    50          
    51         for(device in recentDevices) { 
     50        devices = [IOBluetoothDevice recentDevices:0]; 
     51         
     52        for(device in devices) { 
    5253                if([[device getName] isEqualToString:[self remoteName]]) 
    5354                        return device; 
     
    7273                return NO; 
    7374         
     75        [_disconnectNotification unregister]; 
     76        _disconnectNotification = [_device registerForDisconnectNotification:self selector:@selector(bluetoothDeviceDidDisconnect:device:)]; 
     77         
    7478        if(!_controlConnected && [[self class] needsControlChannel]) { 
    7579                if(![self _connectControlAsync]) 
     
    9296        _controlCompleted = NO; 
    9397         
     98        if(_logging) 
     99                NSLog(@"*** -[%@ _connectControlAsync]", [self class]); 
     100 
    94101        result = [_device openL2CAPChannelAsync:&_controlChannel withPSM:kBluetoothL2CAPPSMHIDControl delegate:self]; 
    95102         
     
    104111        _interruptCompleted = NO; 
    105112         
     113        if(_logging) 
     114                NSLog(@"*** -[%@ _connectInterruptAsync]", [self class]); 
     115         
    106116        result = [_device openL2CAPChannelAsync:&_interruptChannel withPSM:kBluetoothL2CAPPSMHIDInterrupt delegate:self]; 
    107117         
    108118        return (result == kIOReturnSuccess); 
     119} 
     120 
     121 
     122 
     123- (void)_disconnect { 
     124        NSLog(@"*** -[%@ _disconnect]", [self class]); 
     125 
     126        if(_controlConnected) 
     127                [_controlChannel closeChannel]; 
     128 
     129        if(_interruptConnected) 
     130                [_interruptChannel closeChannel]; 
     131         
     132        [_device closeConnection]; 
    109133} 
    110134 
     
    142166        _device = [[[self class] _recentRemoteDevice] retain]; 
    143167         
     168        if(_device) 
     169                [self connectAfterDelay]; 
     170         
    144171        [IOBluetoothDevice registerForConnectNotifications:self selector:@selector(bluetoothDeviceDidConnect:device:)]; 
    145172 
     
    164191        [[NSNotificationCenter defaultCenter] postNotificationName:SPBluetoothRemoteWillConnect object:self]; 
    165192         
    166         [self performSelector:@selector(_connect) afterDelay:1.0]; 
     193        [self performSelectorOnce:@selector(_connect) afterDelay:1.0]; 
     194
     195 
     196 
     197 
     198- (void)disconnectAfterDelay { 
     199        [self performSelectorOnce:@selector(_disconnect) afterDelay:1800.0]; 
    167200} 
    168201 
     
    205238                _controlCompleted = YES; 
    206239                _controlConnected = (status == kIOReturnSuccess); 
     240 
     241                if(_logging) 
     242                        NSLog(@"*** -[%@ l2capChannelOpenComplete:status::] control %s", [self class], mach_error_string(status)); 
    207243        } 
    208244        else if(channel == _interruptChannel) { 
    209245                _interruptCompleted = YES; 
    210246                _interruptConnected = (status == kIOReturnSuccess); 
     247 
     248                if(_logging) 
     249                        NSLog(@"*** -[%@ l2capChannelOpenComplete:status::]: interrupt %s", [self class], mach_error_string(status)); 
    211250        } 
    212251         
     
    234273- (void)bluetoothDeviceDidConnect:(IOBluetoothUserNotification *)notification device:(IOBluetoothDevice *)device { 
    235274        if([[device getName] isEqualToString:[[self class] remoteName]]) { 
     275                _logging = YES; 
     276                 
     277                NSLog(@"*** -[%@ bluetoothDeviceDidConnect:device::]: %@", [self class], [device getName]); 
     278 
    236279                [device retain]; 
    237280                [_device release]; 
     
    243286} 
    244287 
     288 
     289 
     290- (void)bluetoothDeviceDidDisconnect:(IOBluetoothUserNotification *)notification device:(IOBluetoothDevice *)device { 
     291        if([[device getName] isEqualToString:[[self class] remoteName]]) { 
     292                _logging = YES; 
     293                 
     294                NSLog(@"*** -[%@ bluetoothDeviceDidDisconnect:device::]: %@", [self class], [device getName]); 
     295         
     296                _controlConnected = NO; 
     297                _interruptConnected = NO; 
     298                _connected = NO; 
     299         
     300                [[NSNotificationCenter defaultCenter] postNotificationName:SPBluetoothRemoteDidDisconnect object:self]; 
     301        } 
     302} 
     303 
    245304@end 
  • Spiral/trunk/SPPS3Remote.m

    r5472 r5517  
    106106#pragma mark - 
    107107 
     108- (void)remoteDidConnect { 
     109        [self disconnectAfterDelay]; 
     110         
     111        [super remoteDidConnect]; 
     112} 
     113 
     114 
     115 
     116#pragma mark - 
     117 
    108118- (void)setDelegate:(id <SPPS3RemoteDelegate>)aDelegate { 
    109119        delegate = aDelegate; 
     
    239249 
    240250        [self _handleButton:buffer[5]]; 
     251 
     252        [self disconnectAfterDelay]; 
    241253} 
    242254 
  • Spiral/trunk/SPWiiRemote.m

    r5479 r5517  
    153153        [self _enableLEDLight1]; 
    154154         
     155        [self disconnectAfterDelay]; 
     156         
    155157        [super remoteDidConnect]; 
    156158} 
     
    292294        if(length == 4 && buffer[1] == 0x30) 
    293295                [self _handleButton:buffer[2] << 8 | buffer[3]]; 
     296 
     297        [self disconnectAfterDelay]; 
    294298} 
    295299