mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-23 10:21:12 +00:00
added BTDiscoveryViewController as a cleaner implementation of BTInquiryViewController, split BTstackManagerDelegate into BTstackManagerDelegate and BTstackManagerListener
This commit is contained in:
parent
b2c95ae948
commit
de4536005f
@ -16,7 +16,5 @@
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainWindow</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
54
CocoaTouch/include/BTstack/BTDiscoveryViewController.h
Normal file
54
CocoaTouch/include/BTstack/BTDiscoveryViewController.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (C) 2009 by Matthias Ringwald
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the copyright holders nor the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
|
||||
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <BTstack/BTstackManager.h>
|
||||
|
||||
@class BTstackManager;
|
||||
|
||||
typedef enum {
|
||||
kInquiryInactive,
|
||||
kInquiryActive,
|
||||
kInquiryRemoteName
|
||||
} InquiryState;
|
||||
|
||||
@interface BTDiscoveryViewController : UITableViewController<BTstackManagerListener>
|
||||
{
|
||||
BTstackManager *bt;
|
||||
UIActivityIndicatorView *deviceActivity;
|
||||
UIActivityIndicatorView *bluetoothActivity;
|
||||
UIFont * deviceNameFont;
|
||||
UIFont * macAddressFont;
|
||||
InquiryState inquiryState;
|
||||
int remoteNameIndex;
|
||||
BOOL showIcons;
|
||||
}
|
||||
@property (nonatomic, assign) BOOL showIcons;
|
||||
@end
|
@ -67,12 +67,14 @@ typedef enum {
|
||||
} DiscoveryState;
|
||||
|
||||
@protocol BTstackManagerDelegate;
|
||||
@protocol BTstackManagerListener;
|
||||
|
||||
@interface BTstackManager : NSObject {
|
||||
@private
|
||||
id<BTstackManagerDelegate> _delegate;
|
||||
NSMutableDictionary *deviceInfo;
|
||||
NSMutableArray *discoveredDevices;
|
||||
NSMutableArray *discoveredDevices;
|
||||
NSMutableSet *listeners;
|
||||
BOOL connectedToDaemon;
|
||||
ManagerState state;
|
||||
DiscoveryState discoveryState;
|
||||
@ -82,9 +84,15 @@ typedef enum {
|
||||
// shared instance
|
||||
+(BTstackManager *) sharedInstance;
|
||||
|
||||
// listeners
|
||||
-(void) addListener:(id<BTstackManagerListener>)listener;
|
||||
-(void) removeListener:(id<BTstackManagerListener>)listener;
|
||||
|
||||
// Activation
|
||||
-(BTstackError) activate;
|
||||
-(BTstackError) deactivate;
|
||||
-(BOOL) isActivating;
|
||||
-(BOOL) isActive;
|
||||
|
||||
// Discovery
|
||||
-(BTstackError) startDiscovery;
|
||||
@ -111,8 +119,23 @@ typedef enum {
|
||||
|
||||
|
||||
@protocol BTstackManagerDelegate
|
||||
@optional
|
||||
|
||||
// Everything is optional but you should implement all methods of a group
|
||||
// Activation callbacks
|
||||
-(BOOL) disableSystemBluetooth; // default: YES
|
||||
|
||||
// Connection events
|
||||
-(NSString*) pinForAddress:(bd_addr_t)addr; // default: "0000"
|
||||
|
||||
// direct access
|
||||
-(void) handlePacketWithType:(uint8_t) packet_type
|
||||
forChannel:(uint16_t) channel
|
||||
andData:(uint8_t *)packet
|
||||
withLen:(uint16_t) size;
|
||||
@end
|
||||
|
||||
|
||||
@protocol BTstackManagerListener
|
||||
@optional
|
||||
|
||||
// Activation events
|
||||
@ -120,19 +143,12 @@ typedef enum {
|
||||
-(void) activationFailed:(BTstackError)error;
|
||||
-(void) deactivated;
|
||||
|
||||
// Activation callbacks
|
||||
-(BOOL) disableSystemBluetooth; // default: YES
|
||||
|
||||
// Discovery events: general
|
||||
-(void) deviceInfo:(BTDevice*)device;
|
||||
-(void) discoveryStopped;
|
||||
|
||||
// Discovery events: UI
|
||||
-(void) discoveryInquiry;
|
||||
-(void) discoveryQueryRemoteName:(int)deviceIndex;
|
||||
|
||||
// Connection events
|
||||
-(NSString*) pinForAddress:(bd_addr_t)addr; // default: "0000"
|
||||
|
||||
-(void) l2capChannelCreatedAtAddress:(bd_addr_t)addr withPSM:(uint16_t)psm asID:(uint16_t)channelID;
|
||||
-(void) l2capChannelCreateFailedAtAddress:(bd_addr_t)addr withPSM:(uint16_t)psm error:(BTstackError)error;
|
||||
@ -145,11 +161,4 @@ typedef enum {
|
||||
-(void) rfcommDataReceivedForConnectionID:(uint16_t)connectionID withData:(uint8_t *)packet ofLen:(uint16_t)size;
|
||||
|
||||
// TODO add l2cap and rfcomm incoming events
|
||||
|
||||
// direct access
|
||||
-(void) handlePacketWithType:(uint8_t) packet_type
|
||||
forChannel:(uint16_t) channel
|
||||
andData:(uint8_t *)packet
|
||||
withLen:(uint16_t) size;
|
||||
@end
|
||||
|
||||
|
327
CocoaTouch/src/BTDiscoveryViewController.m
Normal file
327
CocoaTouch/src/BTDiscoveryViewController.m
Normal file
@ -0,0 +1,327 @@
|
||||
/*
|
||||
* Copyright (C) 2009 by Matthias Ringwald
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the copyright holders nor the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
|
||||
* RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#import <BTstack/BTDiscoveryViewController.h>
|
||||
#import <BTstack/BTDevice.h>
|
||||
|
||||
// fix compare for 3.0
|
||||
#ifndef __IPHONE_3_0
|
||||
#define __IPHONE_3_0 30000
|
||||
#endif
|
||||
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_3_0
|
||||
// SDK 30 defines missing in SDK 20
|
||||
@interface UITableViewCell (NewIn30)
|
||||
- (id)initWithStyle:(int)style reuseIdentifier:(NSString *)reuseIdentifier;
|
||||
@end
|
||||
#endif
|
||||
|
||||
@implementation BTDiscoveryViewController
|
||||
@synthesize showIcons;
|
||||
|
||||
- (id) init {
|
||||
self = [super initWithStyle:UITableViewStyleGrouped];
|
||||
macAddressFont = [UIFont fontWithName:@"Courier New" size:[UIFont labelFontSize]];
|
||||
deviceNameFont = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];
|
||||
inquiryState = kInquiryInactive;
|
||||
|
||||
deviceActivity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
|
||||
[deviceActivity startAnimating];
|
||||
bluetoothActivity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
|
||||
[bluetoothActivity startAnimating];
|
||||
|
||||
bt = [BTstackManager sharedInstance];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
-(void) reload{
|
||||
[[self tableView] reloadData];
|
||||
}
|
||||
|
||||
/*
|
||||
- (id)initWithStyle:(UITableViewStyle)style {
|
||||
// Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
|
||||
if (self = [super initWithStyle:style]) {
|
||||
}
|
||||
return self;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
|
||||
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
|
||||
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
[super viewWillAppear:animated];
|
||||
}
|
||||
*/
|
||||
/*
|
||||
- (void)viewDidAppear:(BOOL)animated {
|
||||
[super viewDidAppear:animated];
|
||||
}
|
||||
*/
|
||||
/*
|
||||
- (void)viewWillDisappear:(BOOL)animated {
|
||||
[super viewWillDisappear:animated];
|
||||
}
|
||||
*/
|
||||
/*
|
||||
- (void)viewDidDisappear:(BOOL)animated {
|
||||
[super viewDidDisappear:animated];
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
// Override to allow orientations other than the default portrait orientation.
|
||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
|
||||
// Return YES for supported orientations
|
||||
return (interfaceOrientation == UIInterfaceOrientationPortrait);
|
||||
}
|
||||
*/
|
||||
|
||||
- (void)didReceiveMemoryWarning {
|
||||
// Releases the view if it doesn't have a superview.
|
||||
[super didReceiveMemoryWarning];
|
||||
|
||||
// Release any cached data, images, etc that aren't in use.
|
||||
}
|
||||
|
||||
- (void)viewDidUnload {
|
||||
[super viewDidUnload];
|
||||
// Release any retained subviews of the main view.
|
||||
// e.g. self.myOutlet = nil;
|
||||
}
|
||||
|
||||
-(void) activated{
|
||||
[self reload];
|
||||
}
|
||||
-(void) activationFailed:(BTstackError)error{
|
||||
[self reload];
|
||||
};
|
||||
-(void) discoveryInquiry {
|
||||
inquiryState = kInquiryActive;
|
||||
[self reload];
|
||||
}
|
||||
-(void) discoveryQueryRemoteName:(int)deviceIndex {
|
||||
inquiryState = kInquiryRemoteName;
|
||||
remoteNameIndex = deviceIndex;
|
||||
[self reload];
|
||||
}
|
||||
-(void) deviceInfo:(BTDevice*)device {
|
||||
[self reload];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Table view methods
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
|
||||
return @"Devices";
|
||||
}
|
||||
|
||||
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Customize the number of rows in the table view.
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||||
return 1 + [bt numberOfDevicesFound];
|
||||
}
|
||||
|
||||
|
||||
// Customize the appearance of table view cells.
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
static NSString *CellIdentifier = @"Cell";
|
||||
|
||||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
|
||||
if (cell == nil) {
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_0
|
||||
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
|
||||
#else
|
||||
cell = [[[UITableViewCell alloc] initWithFrame:CGRectNull reuseIdentifier:(NSString *)CellIdentifier] autorelease];
|
||||
#endif
|
||||
}
|
||||
|
||||
// Set up the cell...
|
||||
NSString *theLabel = nil;
|
||||
UIImage *theImage = nil;
|
||||
UIFont *theFont = nil;
|
||||
|
||||
int idx = [indexPath indexAtPosition:1];
|
||||
if (idx >= [bt numberOfDevicesFound]) {
|
||||
if ([bt isActivating]){
|
||||
theLabel = @"Activating BTstack...";
|
||||
cell.accessoryView = bluetoothActivity;
|
||||
} else if (![bt isActive]){
|
||||
theLabel = @"Bluetooth not accessible!";
|
||||
cell.accessoryView = nil;
|
||||
} else {
|
||||
#if 0
|
||||
if (connectedDevice) {
|
||||
theLabel = @"Disconnect";
|
||||
cell.accessoryView = nil;
|
||||
} else if (remoteDevice) {
|
||||
theLabel = @"Connecting...";
|
||||
cell.accessoryView = bluetoothActivity;
|
||||
} else {
|
||||
#endif
|
||||
|
||||
switch (inquiryState){
|
||||
case kInquiryInactive:
|
||||
if ([bt numberOfDevicesFound] > 0){
|
||||
theLabel = @"Find more devices...";
|
||||
} else {
|
||||
theLabel = @"Find devices...";
|
||||
}
|
||||
cell.accessoryView = nil;
|
||||
break;
|
||||
case kInquiryActive:
|
||||
theLabel = @"Searching...";
|
||||
cell.accessoryView = bluetoothActivity;
|
||||
break;
|
||||
case kInquiryRemoteName:
|
||||
theLabel = @"Query device names...";
|
||||
cell.accessoryView = bluetoothActivity;
|
||||
break;
|
||||
}
|
||||
// }
|
||||
}
|
||||
} else {
|
||||
|
||||
BTDevice *dev = [bt deviceAtIndex:idx];
|
||||
|
||||
// pick font
|
||||
theLabel = [dev nameOrAddress];
|
||||
if ([dev name]){
|
||||
theFont = deviceNameFont;
|
||||
} else {
|
||||
theFont = macAddressFont;
|
||||
}
|
||||
|
||||
// pick an icon for the devices
|
||||
if (showIcons) {
|
||||
NSString *imageName = @"bluetooth.png";
|
||||
// check major device class
|
||||
switch (([dev classOfDevice] & 0x1f00) >> 8) {
|
||||
case 0x01:
|
||||
imageName = @"computer.png";
|
||||
break;
|
||||
case 0x02:
|
||||
imageName = @"smartphone.png";
|
||||
break;
|
||||
case 0x05:
|
||||
switch ([dev classOfDevice] & 0xff){
|
||||
case 0x40:
|
||||
imageName = @"keyboard.png";
|
||||
break;
|
||||
case 0x80:
|
||||
imageName = @"mouse.png";
|
||||
break;
|
||||
case 0xc0:
|
||||
imageName = @"keyboard.png";
|
||||
break;
|
||||
default:
|
||||
imageName = @"HID.png";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LASER_KB
|
||||
if ([dev name] && [[dev name] isEqualToString:@"CL800BT"]){
|
||||
imageName = @"keyboard.png";
|
||||
}
|
||||
|
||||
if ([dev name] && [[dev name] isEqualToString:@"CL850"]){
|
||||
imageName = @"keyboard.png";
|
||||
}
|
||||
|
||||
// Celluon CL800BT, CL850 have 00-0b-24-aa-bb-cc, COD 0x400210
|
||||
uint8_t *addr = (uint8_t *) [dev address];
|
||||
if (addr[0] == 0x00 && addr[1] == 0x0b && addr[2] == 0x24){
|
||||
imageName = @"keyboard.png";
|
||||
}
|
||||
#endif
|
||||
theImage = [UIImage imageNamed:imageName];
|
||||
}
|
||||
|
||||
// set accessory view
|
||||
switch ([dev connectionState]) {
|
||||
case kBluetoothConnectionNotConnected:
|
||||
case kBluetoothConnectionConnected:
|
||||
cell.accessoryView = nil;
|
||||
break;
|
||||
case kBluetoothConnectionConnecting:
|
||||
case kBluetoothConnectionRemoteName:
|
||||
cell.accessoryView = deviceActivity;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_0
|
||||
if (theLabel) cell.textLabel.text = theLabel;
|
||||
if (theFont) cell.textLabel.font = theFont;
|
||||
if (theImage) cell.imageView.image = theImage;
|
||||
#else
|
||||
if (theLabel) cell.text = theLabel;
|
||||
if (theFont) cell.font = theFont;
|
||||
if (theImage) cell.image = theImage;
|
||||
#endif
|
||||
return cell;
|
||||
}
|
||||
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
// Navigation logic may go here. Create and push another view controller.
|
||||
// AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
|
||||
// [self.navigationController pushViewController:anotherViewController];
|
||||
// [anotherViewController release];
|
||||
}
|
||||
|
||||
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
// if (allowSelection) {
|
||||
// return indexPath;
|
||||
//}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
@ -50,17 +50,19 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
[btstackManager handlePacketWithType:packet_type forChannel:channel andData:packet withLen:size];
|
||||
}
|
||||
|
||||
// dummy implementation of BTstackManagerDelegate protocol to avoid respondsToSelector call
|
||||
@implementation NSObject (BTstackManagerDelegateDummy)
|
||||
// dummy implementation of BTstackManagerListener and Delegate protocol to avoid respondsToSelector call
|
||||
@implementation NSObject (BTstackManagerDummy)
|
||||
// BTstackManagerDelegate
|
||||
-(NSString*) pinForAddress:(bd_addr_t)addr { return @"0000"; }; // default: "0000"
|
||||
-(BOOL) disableSystemBluetooth { return YES; }; // default: YES
|
||||
// BTstackManagerListener
|
||||
-(void) activated {};
|
||||
-(void) activationFailed:(BTstackError)error {};
|
||||
-(void) deactivated {};
|
||||
-(BOOL) disableSystemBluetooth { return YES; }; // default: YES
|
||||
-(void) deviceInfo:(BTDevice*)device {};
|
||||
-(void) discoveryStopped {};
|
||||
-(void) discoveryInquiry{};
|
||||
-(void) discoveryQueryRemoteName:(int)deviceIndex{};
|
||||
-(NSString*) pinForAddress:(bd_addr_t)addr { return @"0000"; }; // default: "0000"
|
||||
-(void) l2capChannelCreatedAtAddress:(bd_addr_t)addr withPSM:(uint16_t)psm asID:(uint16_t)channelID {};
|
||||
-(void) l2capChannelCreateFailedAtAddress:(bd_addr_t)addr withPSM:(uint16_t)psm error:(BTstackError)error{};
|
||||
-(void) l2capChannelClosedForChannelID:(uint16_t)channelID{};
|
||||
@ -85,11 +87,14 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
state = kDeactivated;
|
||||
discoveryState = kInactive;
|
||||
connectedToDaemon = NO;
|
||||
_delegate = nil;
|
||||
|
||||
// device discovery
|
||||
discoveredDevices = [[NSMutableArray alloc] init];
|
||||
|
||||
// delegate and listener
|
||||
_delegate = nil;
|
||||
listeners = [[NSMutableArray alloc] init];
|
||||
|
||||
// read device database
|
||||
[self readDeviceInfo];
|
||||
|
||||
@ -109,6 +114,15 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
return btstackManager;
|
||||
}
|
||||
|
||||
// listeners
|
||||
-(void) addListener:(id<BTstackManagerListener>)listener{
|
||||
[listeners addObject:listener];
|
||||
}
|
||||
|
||||
-(void) removeListener:(id<BTstackManagerListener>)listener{
|
||||
[listeners removeObject:listener];
|
||||
}
|
||||
|
||||
// Activation
|
||||
-(BTstackError) activate {
|
||||
|
||||
@ -133,6 +147,13 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
return 0;
|
||||
}
|
||||
|
||||
-(BOOL) isActive {
|
||||
return state == kActivated;
|
||||
}
|
||||
|
||||
-(BOOL) isActivating {
|
||||
return state == kW4Activated;
|
||||
}
|
||||
|
||||
// Discovery
|
||||
-(BTstackError) startDiscovery {
|
||||
@ -200,11 +221,15 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
bt_send_cmd(&btstack_set_system_bluetooth_enabled, 0);
|
||||
} else {
|
||||
state = kDeactivated;
|
||||
[_delegate activationFailed:BTSTACK_ACTIVATION_FAILED_SYSTEM_BLUETOOTH];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener activationFailed:BTSTACK_ACTIVATION_FAILED_SYSTEM_BLUETOOTH];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
state = kDeactivated;
|
||||
[_delegate activationFailed:BTSTACK_ACTIVATION_FAILED_UNKNOWN];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener activationFailed:BTSTACK_ACTIVATION_FAILED_UNKNOWN];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
state = kW4Activated;
|
||||
@ -218,12 +243,16 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
case BTSTACK_EVENT_STATE:
|
||||
if (packet[2] == HCI_STATE_WORKING){
|
||||
state = kActivated;
|
||||
[_delegate activated];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener activated];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case BTSTACK_EVENT_POWERON_FAILED:
|
||||
[_delegate activationFailed:BTSTACK_ACTIVATION_POWERON_FAILED];
|
||||
state = kDeactivated;
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener activationFailed:BTSTACK_ACTIVATION_POWERON_FAILED];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -234,7 +263,9 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
if (packet[0] == BTSTACK_EVENT_STATE){
|
||||
if (packet[2] == HCI_STATE_OFF){
|
||||
state = kDeactivated;
|
||||
[_delegate deactivated];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener deactivated];
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -258,7 +289,9 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
// NSLog(@"Get remote name of %@", [BTDevice stringForAddress:addr]);
|
||||
bt_send_cmd(&hci_remote_name_request, addr,
|
||||
device.pageScanRepetitionMode, 0, device.clockOffset | 0x8000);
|
||||
[_delegate discoveryQueryRemoteName:discoveryDeviceIndex];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener discoveryQueryRemoteName:discoveryDeviceIndex];
|
||||
}
|
||||
found = YES;
|
||||
break;
|
||||
}
|
||||
@ -266,7 +299,9 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
// printf("Queried all devices, restart.\n");
|
||||
discoveryState = kInquiry;
|
||||
bt_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
|
||||
[_delegate discoveryInquiry];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener discoveryInquiry];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -284,7 +319,9 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
if (packet[0] == HCI_EVENT_COMMAND_COMPLETE && COMMAND_COMPLETE_EVENT(packet, hci_write_inquiry_mode) ) {
|
||||
discoveryState = kInquiry;
|
||||
bt_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
|
||||
[_delegate discoveryInquiry];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener discoveryInquiry];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -304,14 +341,19 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
device.classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3);
|
||||
device.clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff;
|
||||
device.rssi = 0;
|
||||
#if 0
|
||||
// get name from deviceInfo
|
||||
NSMutableDictionary * deviceDict = [deviceInfo objectForKey:[device addressString]];
|
||||
NSString *addrString = [[device addressString] retain];
|
||||
NSMutableDictionary * deviceDict = [deviceInfo objectForKey:addrString];
|
||||
[addrString release];
|
||||
if (deviceDict){
|
||||
device.name = [deviceDict objectForKey:PREFS_REMOTE_NAME];
|
||||
}
|
||||
#endif
|
||||
[discoveredDevices addObject:device];
|
||||
|
||||
[_delegate deviceInfo:device];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener deviceInfo:device];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -328,14 +370,19 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
device.classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3);
|
||||
device.clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff;
|
||||
device.rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1];
|
||||
#if 0
|
||||
// get name from deviceInfo
|
||||
NSMutableDictionary * deviceDict = [deviceInfo objectForKey:[device addressString]];
|
||||
NSString *addrString = [[device addressString] retain];
|
||||
NSMutableDictionary * deviceDict = [deviceInfo objectForKey:addrString];
|
||||
[addrString release];
|
||||
if (deviceDict){
|
||||
device.name = [deviceDict objectForKey:PREFS_REMOTE_NAME];
|
||||
}
|
||||
#endif
|
||||
[discoveredDevices addObject:device];
|
||||
|
||||
[_delegate deviceInfo:device];
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener deviceInfo:device];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -360,15 +407,21 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
while (nameLen < 248 && packet[9+nameLen]) nameLen++;
|
||||
NSString *name = [[NSString alloc] initWithBytes:&packet[9] length:nameLen encoding:NSUTF8StringEncoding];
|
||||
device.name = name;
|
||||
#if 0
|
||||
// set in device info
|
||||
NSMutableDictionary *deviceDict = [deviceInfo objectForKey:[device addressString]];
|
||||
NSString *addrString = [[device addressString] retain];
|
||||
NSMutableDictionary * deviceDict = [deviceInfo objectForKey:addrString];
|
||||
if (!deviceDict){
|
||||
deviceDict = [NSMutableDictionary dictionaryWithCapacity:3];
|
||||
[deviceInfo setObject:deviceDict forKey:[device addressString]];
|
||||
[deviceInfo setObject:deviceDict forKey:addrString];
|
||||
}
|
||||
[deviceDict setObject:name forKey:PREFS_REMOTE_NAME];
|
||||
[addrString release];
|
||||
#endif
|
||||
for (id<BTstackManagerListener> listener in listeners) {
|
||||
[listener deviceInfo:device];
|
||||
}
|
||||
}
|
||||
[_delegate deviceInfo:device];
|
||||
discoveryDeviceIndex++;
|
||||
[self discoveryRemoteName];
|
||||
}
|
||||
@ -402,7 +455,6 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
[_delegate handlePacketWithType:packet_type forChannel:channel andData:packet withLen:size];
|
||||
}
|
||||
|
||||
@ -419,6 +471,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
|
||||
[deviceEntry addEntriesFromDictionary:value];
|
||||
[deviceInfo setObject:deviceEntry forKey:key];
|
||||
}
|
||||
// NSLog(@"store prefs %@", deviceInfo );
|
||||
}
|
||||
|
||||
-(void)storeDeviceInfo{
|
||||
|
@ -8,9 +8,10 @@
|
||||
#import <BTstack/BTstackManager.h>
|
||||
|
||||
@class BTstackManager;
|
||||
|
||||
@interface TestBTstackManager : NSObject<BTstackManagerDelegate>{
|
||||
@class BTDiscoveryViewController;
|
||||
@interface TestBTstackManager : NSObject<BTstackManagerDelegate,BTstackManagerListener>{
|
||||
BTstackManager *bt;
|
||||
BTDiscoveryViewController* discoveryView;
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -6,28 +6,20 @@
|
||||
|
||||
#import "TestBTstackManager.h"
|
||||
#import <BTstack/BTDevice.h>
|
||||
#import <BTstack/BTDiscoveryViewController.h>
|
||||
|
||||
@implementation TestBTstackManager
|
||||
|
||||
-(void) doTest{
|
||||
bt = [BTstackManager sharedInstance];
|
||||
[bt setDelegate:self];
|
||||
BTstackError err = [bt activate];
|
||||
if (err) NSLog(@"activate err 0x%02x!", err);
|
||||
}
|
||||
|
||||
-(void) activated{
|
||||
NSLog(@"activated!");
|
||||
[bt startDiscovery];
|
||||
}
|
||||
|
||||
-(void) activationFailed:(BTstackError)error{
|
||||
NSLog(@"activationFailed error 0x%02x!", error);
|
||||
};
|
||||
|
||||
-(void) discoveryInquiry{
|
||||
NSLog(@"discoveryInquiry!");
|
||||
[bt storeDeviceInfo];
|
||||
// [bt storeDeviceInfo];
|
||||
}
|
||||
-(void) discoveryQueryRemoteName:(int)deviceIndex{
|
||||
NSLog(@"discoveryQueryRemoteName %u/%u!", deviceIndex+1, [bt numberOfDevicesFound]);
|
||||
@ -35,18 +27,31 @@
|
||||
-(void) deviceInfo:(BTDevice*)device {
|
||||
NSLog(@"Device Info: addr %@ name %@ COD 0x%06x", [device addressString], [device name], [device classOfDevice] );
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(UIApplication *)application {
|
||||
|
||||
// create discovery controller
|
||||
discoveryView = [[BTDiscoveryViewController alloc] init];
|
||||
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:discoveryView];
|
||||
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||
[window addSubview:nav.view];
|
||||
[window makeKeyAndVisible];
|
||||
|
||||
// BTstack
|
||||
bt = [BTstackManager sharedInstance];
|
||||
[bt setDelegate:self];
|
||||
[bt addListener:self];
|
||||
[bt addListener:discoveryView];
|
||||
|
||||
BTstackError err = [bt activate];
|
||||
if (err) NSLog(@"activate err 0x%02x!", err);
|
||||
|
||||
}
|
||||
@end
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
TestBTstackManager * test = [[TestBTstackManager alloc] init];
|
||||
[test doTest];
|
||||
CFRunLoopRun();
|
||||
[test release];
|
||||
|
||||
int retVal = UIApplicationMain(argc, argv, nil, @"TestBTstackManager");
|
||||
[pool release];
|
||||
return 0;
|
||||
return retVal;
|
||||
}
|
3
TODO.txt
3
TODO.txt
@ -6,7 +6,8 @@
|
||||
NEXT:
|
||||
|
||||
- Provide BTstackManager Objective-C class
|
||||
- create new device discovery view: BTDiscoveryViewController
|
||||
- cache device names - working but crashes somehow
|
||||
- support visualization of connections in BTDiscoveryViewController
|
||||
- implement l2cap code
|
||||
- implement rfcomm code
|
||||
|
||||
|
@ -35,6 +35,7 @@
|
||||
9CF3F782112F244C00D081C9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CF3F781112F244B00D081C9 /* UIKit.framework */; };
|
||||
9CF3F95311306FFB00D081C9 /* TestBTstackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF3F95211306FFB00D081C9 /* TestBTstackManager.m */; };
|
||||
9CF3F99F113083F100D081C9 /* BTDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C13C9FC10ECED6300B04243 /* BTDevice.m */; };
|
||||
9CF3FB1F113191E400D081C9 /* BTDiscoveryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF3FB1E113191E400D081C9 /* BTDiscoveryViewController.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
@ -125,6 +126,8 @@
|
||||
9CF3F95111306FFB00D081C9 /* TestBTstackManager.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = TestBTstackManager.h; path = CocoaTouch/src/TestBTstackManager.h; sourceTree = "<group>"; };
|
||||
9CF3F95211306FFB00D081C9 /* TestBTstackManager.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; name = TestBTstackManager.m; path = CocoaTouch/src/TestBTstackManager.m; sourceTree = "<group>"; };
|
||||
9CF3F95A1130702D00D081C9 /* TestBTstackManager-Info.plist */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.plist.xml; name = "TestBTstackManager-Info.plist"; path = "CocoaTouch/TestBTstackManager-Info.plist"; sourceTree = "<group>"; };
|
||||
9CF3FB1E113191E400D081C9 /* BTDiscoveryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BTDiscoveryViewController.m; path = CocoaTouch/src/BTDiscoveryViewController.m; sourceTree = "<group>"; };
|
||||
9CF3FB201131920200D081C9 /* BTDiscoveryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BTDiscoveryViewController.h; path = CocoaTouch/include/BTstack/BTDiscoveryViewController.h; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -231,8 +234,10 @@
|
||||
9C13C9FC10ECED6300B04243 /* BTDevice.m */,
|
||||
9C13C9FD10ECED6300B04243 /* BTInquiryViewController.h */,
|
||||
9C13C9FE10ECED6300B04243 /* BTInquiryViewController.m */,
|
||||
9C509539112744AA00A30986 /* BTstackManager.m */,
|
||||
9C50953B112744CD00A30986 /* BTstackManager.h */,
|
||||
9C509539112744AA00A30986 /* BTstackManager.m */,
|
||||
9CF3FB201131920200D081C9 /* BTDiscoveryViewController.h */,
|
||||
9CF3FB1E113191E400D081C9 /* BTDiscoveryViewController.m */,
|
||||
9CF3F95111306FFB00D081C9 /* TestBTstackManager.h */,
|
||||
9CF3F95211306FFB00D081C9 /* TestBTstackManager.m */,
|
||||
9CF3F95A1130702D00D081C9 /* TestBTstackManager-Info.plist */,
|
||||
@ -437,6 +442,7 @@
|
||||
9CF3F776112F241600D081C9 /* BTstackManager.m in Sources */,
|
||||
9CF3F95311306FFB00D081C9 /* TestBTstackManager.m in Sources */,
|
||||
9CF3F99F113083F100D081C9 /* BTDevice.m in Sources */,
|
||||
9CF3FB1F113191E400D081C9 /* BTDiscoveryViewController.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user