BTstackManager support device discovery - names are not cached yet

This commit is contained in:
matthias.ringwald 2010-02-21 13:57:48 +00:00
parent 5f637968bf
commit fb6dae1e84
7 changed files with 424 additions and 50 deletions

View File

@ -59,7 +59,7 @@ typedef enum {
@interface BTDevice : NSObject {
bd_addr_t address; // potential key
bd_addr_t _address;
NSString * name;
uint32_t classOfDevice;
@ -67,14 +67,17 @@ typedef enum {
uint8_t pageScanRepetitionMode;
uint16_t clockOffset;
uint8_t rssi;
// deprecated
BluetoothConnectionState connectionState;
}
- (void) setAddress:(bd_addr_t *)addr;
- (bd_addr_t *) address;
- (void) setAddress:(bd_addr_t*)addr;
- (bd_addr_t*) address;
- (NSString *) toString;
- (NSString *) addressString;
+ (NSString *) stringForAddress:(bd_addr_t *) address;
+ (NSString *) stringForAddress:(bd_addr_t*) address;
@property (readonly) BluetoothDeviceType deviceType;
@property (readonly) NSString * nameOrAddress;
@ -82,6 +85,7 @@ typedef enum {
@property (nonatomic, assign) uint32_t classOfDevice;
@property (nonatomic, assign) uint16_t clockOffset;
@property (nonatomic, assign) uint8_t pageScanRepetitionMode;
@property (nonatomic, assign) uint8_t rssi;
@property (nonatomic, assign) BluetoothConnectionState connectionState;
@end

View File

@ -55,14 +55,24 @@ typedef enum {
kW4Deactivated
} ManagerState;
typedef enum {
kInactive = 1,
kW4InquiryMode,
kInquiry,
kRemoteName,
} DiscoveryState;
@protocol BTstackManagerDelegate;
@interface BTstackManager : NSObject {
@private
id<BTstackManagerDelegate> _delegate;
NSMutableDictionary *deviceInfo;
NSMutableArray *discoveredDevices;
BOOL connectedToDaemon;
ManagerState state;
DiscoveryState discoveryState;
int discoveryDeviceIndex;
}
// shared instance

View File

@ -44,25 +44,26 @@
@synthesize connectionState;
@synthesize pageScanRepetitionMode;
@synthesize clockOffset;
@synthesize rssi;
- (BTDevice *)init {
name = NULL;
bzero(&address, 6);
bzero(&_address, 6);
classOfDevice = kCODInvalid;
connectionState = kBluetoothConnectionNotConnected;
return self;
}
- (void) setAddress:(bd_addr_t *)newAddr{
BD_ADDR_COPY( &address, newAddr);
- (void) setAddress:(bd_addr_t*)newAddr{
BD_ADDR_COPY( &_address, newAddr);
}
- (bd_addr_t *) address{
return &address;
- (bd_addr_t*) address{
return &_address;
}
+ (NSString *) stringForAddress:(bd_addr_t *) address {
uint8_t * addr = (uint8_t*) address;
+ (NSString *) stringForAddress:(bd_addr_t*) address {
uint8_t *addr = (uint8_t*) *address;
return [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2],
addr[3], addr[4], addr[5]];
}
@ -73,7 +74,7 @@
}
- (NSString *) addressString{
return [BTDevice stringForAddress:&address];
return [BTDevice stringForAddress:&_address];
}
- (BluetoothDeviceType) deviceType{
@ -87,7 +88,7 @@
}
}
- (NSString *) toString{
return [NSString stringWithFormat:@"Device addr %@ name %@ COD %x", [BTDevice stringForAddress:&address], name, classOfDevice];
return [NSString stringWithFormat:@"Device addr %@ name %@ COD %x", [BTDevice stringForAddress:&_address], name, classOfDevice];
}
- (void)dealloc {

View File

@ -32,11 +32,11 @@
#import <BTstack/BTstackManager.h>
#import <btstack/btstack.h>
#import <btstack/BTDevice.h>
#import "../../RFCOMM/rfcomm.h"
#define BTstackManagerID @"ch.ringwald.btstack"
#define INQUIRY_INTERVAL 3
static BTstackManager * btstackManager = nil;
@ -84,9 +84,13 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
if (!self) return self;
state = kDeactivated;
discoveryState = kInactive;
connectedToDaemon = NO;
_delegate = nil;
// device discovery
discoveredDevices = [[NSMutableArray alloc] init];
// read device database
[self readDeviceInfo];
@ -124,23 +128,42 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
}
-(BTstackError) deactivate {
if (!connectedToDaemon) return BTSTACK_CONNECTION_TO_BTDAEMON_FAILED;
state = kW4Deactivated;
bt_send_cmd(&btstack_set_power_mode, HCI_POWER_OFF);
return 0;
}
// Discovery
-(BTstackError) startDiscovery {
if (state != kActivated) return BTSTACK_NOT_ACTIVATED;
discoveryState = kW4InquiryMode;
bt_send_cmd(&hci_write_inquiry_mode, 0x01); // with RSSI
return 0;
};
-(BTstackError) stopDiscovery{
return 0;
};
-(int) numberOfDevicesFound{
return 0;
return [discoveredDevices count];
};
-(BTDevice*) deviceAtIndex:(int)index{
return 0;
return (BTDevice*) [discoveredDevices objectAtIndex:index];
};
-(BTDevice*) deviceForAddress:(bd_addr_t*) address{
for (BTDevice *device in discoveredDevices){
// NSLog(@"compare %@ to %@", [BTDevice stringForAddress:address], [device addressString]);
if ( BD_ADDR_CMP(address, [device address]) == 0){
return device;
}
}
return nil;
}
// Connections
-(BTstackError) createL2CAPChannelAtAddress:(bd_addr_t) address withPSM:(uint16_t)psm authenticated:(BOOL)authentication {
return 0;
@ -162,18 +185,14 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
return 0;
};
- (void) handlePacketWithType:(uint8_t)packet_type forChannel:(uint16_t)channel andData:(uint8_t *)packet withLen:(uint16_t) size {
- (void) activationHandleEvent:(uint8_t *)packet withLen:(uint16_t) size {
switch (state) {
case kDeactivated:
break;
case kW4SysBTState:
case kW4SysBTDisabled:
// BTSTACK_EVENT_SYSTEM_BLUETOOTH_ENABLED
if ( packet_type == HCI_EVENT_PACKET
&& packet[0] == BTSTACK_EVENT_SYSTEM_BLUETOOTH_ENABLED){
if ( packet[0] == BTSTACK_EVENT_SYSTEM_BLUETOOTH_ENABLED){
if (packet[2]){
// system bt on - first time try to disable it
if ( state == kW4SysBTState) {
@ -196,20 +215,27 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
break;
case kW4Activated:
if (packet_type == HCI_EVENT_PACKET){
switch (packet[0]){
case BTSTACK_EVENT_STATE:
if (packet[2] == HCI_STATE_WORKING){
state = kActivated;
[_delegate activated];
}
break;
case BTSTACK_EVENT_POWERON_FAILED:
[_delegate activationFailed:BTSTACK_ACTIVATION_POWERON_FAILED];
state = kDeactivated;
break;
default:
break;
switch (packet[0]){
case BTSTACK_EVENT_STATE:
if (packet[2] == HCI_STATE_WORKING){
state = kActivated;
[_delegate activated];
}
break;
case BTSTACK_EVENT_POWERON_FAILED:
[_delegate activationFailed:BTSTACK_ACTIVATION_POWERON_FAILED];
state = kDeactivated;
break;
default:
break;
}
break;
case kW4Deactivated:
if (packet[0] == BTSTACK_EVENT_STATE){
if (packet[2] == HCI_STATE_OFF){
state = kDeactivated;
[_delegate deactivated];
}
}
break;
@ -217,12 +243,154 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
default:
break;
}
}
-(void) discoveryRemoteName{
BOOL found = NO;
while ( discoveryDeviceIndex < [discoveredDevices count]){
BTDevice *device = [discoveredDevices objectAtIndex:discoveryDeviceIndex];
if (device.name) {
discoveryDeviceIndex ++;
continue;
}
bd_addr_t *addr = [device address];
// BD_ADDR_COPY(&addr, device.address);
// 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];
found = YES;
break;
}
if (!found) {
// printf("Queried all devices, restart.\n");
discoveryState = kInquiry;
bt_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
[_delegate discoveryInquiry];
}
}
-(void) discoveryHandleEvent:(uint8_t *)packet withLen:(uint16_t) size {
bd_addr_t addr;
int i;
int numResponses;
switch (discoveryState) {
case kInactive:
break;
case kW4InquiryMode:
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];
}
break;
case kInquiry:
switch (packet[0]){
case HCI_EVENT_INQUIRY_RESULT:
numResponses = packet[2];
for (i=0; i<numResponses ; i++){
bt_flip_addr(addr, &packet[3+i*6]);
// NSLog(@"found %@", [BTDevice stringForAddress:&addr]);
BTDevice* device = [self deviceForAddress:&addr];
if (device) continue;
device = [[BTDevice alloc] init];
[device setAddress:&addr];
device.pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1];
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;
[discoveredDevices addObject:device];
[_delegate deviceInfo:device];
}
break;
case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:
numResponses = packet[2];
for (i=0; i<numResponses ;i++){
bt_flip_addr(addr, &packet[3+i*6]);
// NSLog(@"found %@", [BTDevice stringForAddress:&addr]);
BTDevice* device = [self deviceForAddress:&addr];
if (device) continue;
device = [[BTDevice alloc] init];
[device setAddress:&addr];
device.pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1];
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];
[discoveredDevices addObject:device];
[_delegate deviceInfo:device];
}
break;
case HCI_EVENT_INQUIRY_COMPLETE:
// printf("Inquiry scan done.\n");
discoveryState = kRemoteName;
discoveryDeviceIndex = 0;
[self discoveryRemoteName];
break;
}
break;
case kRemoteName:
if (packet[0] == HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE){
bt_flip_addr(addr, &packet[3]);
// NSLog(@"Get remote name done for %@", [BTDevice stringForAddress:&addr]);
BTDevice* device = [self deviceForAddress:&addr];
if (device) {
if (packet[2] == 0) {
// get lenght: first null byte or max 248 chars
int nameLen = 0;
while (nameLen < 248 && packet[9+nameLen]) nameLen++;
device.name = [[NSString alloc] initWithBytes:&packet[9] length:nameLen encoding:NSUTF8StringEncoding];
}
[_delegate deviceInfo:device];
discoveryDeviceIndex++;
[self discoveryRemoteName];
}
}
break;
default:
break;
}
}
-(void) handlePacketWithType:(uint8_t)packet_type forChannel:(uint16_t)channel andData:(uint8_t *)packet withLen:(uint16_t) size {
switch (state) {
case kDeactivated:
break;
// Activation
case kW4SysBTState:
case kW4SysBTDisabled:
case kW4Activated:
case kW4Deactivated:
if (packet_type == HCI_EVENT_PACKET) [self activationHandleEvent:packet withLen:size];
break;
// Discovery
case kActivated:
if (packet_type == HCI_EVENT_PACKET) [self discoveryHandleEvent:packet withLen:size];
break;
default:
break;
}
[_delegate handlePacketWithType:packet_type forChannel:channel andData:packet withLen:size];
}
- (void)readDeviceInfo {
-(void)readDeviceInfo {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary * dict = [defaults persistentDomainForName:BTstackManagerID];
deviceInfo = [NSMutableDictionary dictionaryWithCapacity:([dict count]+5)];
@ -236,7 +404,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
}
}
- (void)storeDeviceInfo{
-(void)storeDeviceInfo{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setPersistentDomain:deviceInfo forName:BTstackManagerID];
[defaults synchronize];

View File

@ -5,23 +5,36 @@
//
#import "TestBTstackManager.h"
#import <BTstack/BTDevice.h>
@implementation TestBTstackManager
-(id) init {
return self;
}
-(void) test{
-(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!");
}
-(void) discoveryQueryRemoteName:(int)deviceIndex{
NSLog(@"discoveryQueryRemoteName %u/%u!", deviceIndex+1, [bt numberOfDevicesFound]);
}
-(void) deviceInfo:(BTDevice*)device {
NSLog(@"Device Info: addr %@ name %@ COD 0x%06x", [device addressString], [device name], [device classOfDevice] );
}
@end
int main(int argc, char *argv[])
@ -29,7 +42,7 @@ int main(int argc, char *argv[])
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
TestBTstackManager * test = [[TestBTstackManager alloc] init];
[test test];
[test doTest];
CFRunLoopRun();
[test release];

View File

@ -5,7 +5,15 @@
NEXT:
- Provide BTstack Objective-C class
- Provide BTstackManager Objective-C class
- set remote names in deviceInfo
- store deviceInfo on dealloc
- add discard discovered devices
- create new device discovery view: BTDiscoveryViewController
- implement l2cap code
- implement rfcomm code
- figure out how to receive iPhone System Power IONotifications (in BTdaemon) to detect, when phone gets locked
- some trick
- use Cocoa run loop for background app?
@ -14,11 +22,10 @@ NEXT:
- move RFCOMM code into BTdaemon
- L2CAP
- segmentation
- CocoaTouch
- Warning and shutdown of Apple's stack
- add timeouts to cocoa run loop
- BUG: bt_close crashes when used in CocoaTouch app
- BUG: BTdaemon crashes on iPhone when CocoaTouch app is closed (sometimes)
- BUG: malloc warning when BTdaemon is started by launchd
== Release 0.2 - Incoming L2CAP supported + improved Inq Dialog

View File

@ -19,6 +19,7 @@
9C05FC971020D3F300255261 /* socket_connection.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C00F7301017ACC3008DAB17 /* socket_connection.c */; };
9C18015C108BAA7200824BE7 /* libusb-1.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C18015B108BAA7200824BE7 /* libusb-1.0.dylib */; };
9C46FC3A0FA906F700ABEF05 /* hci_transport_h4.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C46FC360FA906F700ABEF05 /* hci_transport_h4.c */; };
9C50953A112744AA00A30986 /* BTstackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C509539112744AA00A30986 /* BTstackManager.m */; };
9C77E79210667F0600F39DCF /* platform_iphone.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C77E79110667F0600F39DCF /* platform_iphone.c */; };
9C7B5AC0100BD3340065D87E /* linked_list.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C7B5ABF100BD3340065D87E /* linked_list.c */; };
9C7B5D01100FC9AE0065D87E /* btstack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9CC813A10FFC0774002816F9 /* btstack.c */; };
@ -30,6 +31,10 @@
9CCE6CEA1025BD0000FCE9F4 /* hci.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C46FC340FA906F700ABEF05 /* hci.c */; };
9CEB4F17107AAAEF00DD5720 /* run_loop_posix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9CEB4DAC10753BE600DD5720 /* run_loop_posix.c */; };
9CF13C1610F8A1C6004C4EEE /* bt_control_iphone.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF13C1510F8A1C6004C4EEE /* bt_control_iphone.m */; };
9CF3F776112F241600D081C9 /* BTstackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C509539112744AA00A30986 /* BTstackManager.m */; };
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 */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -45,7 +50,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
8DD76FB20486AB0100D96B5E /* project */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = project; sourceTree = BUILT_PRODUCTS_DIR; };
8DD76FB20486AB0100D96B5E /* project */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = project; sourceTree = BUILT_PRODUCTS_DIR; };
9C00F7301017ACC3008DAB17 /* socket_connection.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = socket_connection.c; path = src/socket_connection.c; sourceTree = "<group>"; };
9C00F7311017ACC3008DAB17 /* socket_connection.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = socket_connection.h; path = src/socket_connection.h; sourceTree = "<group>"; };
9C00F7D61019082F008DAB17 /* hci_cmds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hci_cmds.c; path = src/hci_cmds.c; sourceTree = "<group>"; };
@ -67,6 +72,8 @@
9C46FC360FA906F700ABEF05 /* hci_transport_h4.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = hci_transport_h4.c; path = src/hci_transport_h4.c; sourceTree = "<group>"; };
9C46FC370FA906F700ABEF05 /* hci_transport_h4.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = hci_transport_h4.h; path = src/hci_transport_h4.h; sourceTree = "<group>"; };
9C46FC380FA906F700ABEF05 /* hci_transport.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = hci_transport.h; path = src/hci_transport.h; sourceTree = "<group>"; };
9C509539112744AA00A30986 /* BTstackManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BTstackManager.m; path = CocoaTouch/src/BTstackManager.m; sourceTree = "<group>"; };
9C50953B112744CD00A30986 /* BTstackManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BTstackManager.h; path = CocoaTouch/include/BTstack/BTstackManager.h; sourceTree = "<group>"; };
9C5BA8A0110B756500D79BBE /* hci_cmds.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = hci_cmds.h; path = include/btstack/hci_cmds.h; sourceTree = "<group>"; };
9C5BABAF110E28E900D79BBE /* l2cap-server.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "l2cap-server.c"; path = "example/l2cap-server.c"; sourceTree = "<group>"; };
9C6459DE1037554B0081A00B /* platform_iphone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = platform_iphone.h; path = src/platform_iphone.h; sourceTree = "<group>"; };
@ -88,7 +95,7 @@
9C78A0BB103C9DEE003B2950 /* ch.ringwald.BTstack.plist */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.plist.xml; name = ch.ringwald.BTstack.plist; path = resources/ch.ringwald.BTstack.plist; sourceTree = "<group>"; };
9C7B5ABF100BD3340065D87E /* linked_list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = linked_list.c; path = src/linked_list.c; sourceTree = "<group>"; };
9C7B5B7E100D04450065D87E /* test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = test.c; path = example/test.c; sourceTree = "<group>"; };
9C7B5CF6100FC96A0065D87E /* clientTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = clientTest; sourceTree = BUILT_PRODUCTS_DIR; };
9C7B5CF6100FC96A0065D87E /* clientTest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = clientTest; sourceTree = BUILT_PRODUCTS_DIR; };
9C7ECB810FCC85650085DAC5 /* bt_control.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = bt_control.h; path = src/bt_control.h; sourceTree = "<group>"; };
9C7ECB830FCC85650085DAC5 /* bt_control_iphone.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = bt_control_iphone.h; path = src/bt_control_iphone.h; sourceTree = "<group>"; };
9C7ECBB30FCC95DD0085DAC5 /* hci_dump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hci_dump.h; path = src/hci_dump.h; sourceTree = "<group>"; };
@ -111,6 +118,13 @@
9CEB4DAA10753B4B00DD5720 /* run_loop_cocoa.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; name = run_loop_cocoa.m; path = src/run_loop_cocoa.m; sourceTree = "<group>"; };
9CEB4DAC10753BE600DD5720 /* run_loop_posix.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = run_loop_posix.c; path = src/run_loop_posix.c; sourceTree = "<group>"; };
9CF13C1510F8A1C6004C4EEE /* bt_control_iphone.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; name = bt_control_iphone.m; path = src/bt_control_iphone.m; sourceTree = "<group>"; };
9CF3F74C112F201600D081C9 /* BTstackCocoaAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = BTstackCocoaAppDelegate.h; path = CocoaTouch/src/BTstackCocoaAppDelegate.h; sourceTree = "<group>"; };
9CF3F74D112F201600D081C9 /* BTstackCocoaAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; name = BTstackCocoaAppDelegate.m; path = CocoaTouch/src/BTstackCocoaAppDelegate.m; sourceTree = "<group>"; };
9CF3F75F112F239B00D081C9 /* TestBTstackManager.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestBTstackManager.app; sourceTree = BUILT_PRODUCTS_DIR; };
9CF3F781112F244B00D081C9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
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>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -130,6 +144,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
9CF3F75D112F239B00D081C9 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9CF3F782112F244C00D081C9 /* UIKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@ -195,6 +217,7 @@
children = (
8DD76FB20486AB0100D96B5E /* project */,
9C7B5CF6100FC96A0065D87E /* clientTest */,
9CF3F75F112F239B00D081C9 /* TestBTstackManager.app */,
);
name = Products;
sourceTree = "<group>";
@ -202,10 +225,18 @@
9C13C9FA10ECED6300B04243 /* CocoaTouch */ = {
isa = PBXGroup;
children = (
9CF3F74C112F201600D081C9 /* BTstackCocoaAppDelegate.h */,
9CF3F74D112F201600D081C9 /* BTstackCocoaAppDelegate.m */,
9C13C9FB10ECED6300B04243 /* BTDevice.h */,
9C13C9FC10ECED6300B04243 /* BTDevice.m */,
9C13C9FD10ECED6300B04243 /* BTInquiryViewController.h */,
9C13C9FE10ECED6300B04243 /* BTInquiryViewController.m */,
9C509539112744AA00A30986 /* BTstackManager.m */,
9C50953B112744CD00A30986 /* BTstackManager.h */,
9CF3F95111306FFB00D081C9 /* TestBTstackManager.h */,
9CF3F95211306FFB00D081C9 /* TestBTstackManager.m */,
9CF3F95A1130702D00D081C9 /* TestBTstackManager-Info.plist */,
9CF3F781112F244B00D081C9 /* UIKit.framework */,
);
name = CocoaTouch;
sourceTree = "<group>";
@ -316,6 +347,23 @@
productReference = 9C7B5CF6100FC96A0065D87E /* clientTest */;
productType = "com.apple.product-type.tool";
};
9CF3F75E112F239B00D081C9 /* TestBTstackManager */ = {
isa = PBXNativeTarget;
buildConfigurationList = 9CF3F765112F239C00D081C9 /* Build configuration list for PBXNativeTarget "TestBTstackManager" */;
buildPhases = (
9CF3F75B112F239B00D081C9 /* Resources */,
9CF3F75C112F239B00D081C9 /* Sources */,
9CF3F75D112F239B00D081C9 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = TestBTstackManager;
productName = TestBTstackManager;
productReference = 9CF3F75F112F239B00D081C9 /* TestBTstackManager.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@ -330,10 +378,21 @@
targets = (
8DD76FA90486AB0100D96B5E /* BTdaemon */,
9C7B5CF5100FC96A0065D87E /* clientTest */,
9CF3F75E112F239B00D081C9 /* TestBTstackManager */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
9CF3F75B112F239B00D081C9 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8DD76FAB0486AB0100D96B5E /* Sources */ = {
isa = PBXSourcesBuildPhase;
@ -354,6 +413,7 @@
9C04B826107D1CED002A63D0 /* run_loop.c in Sources */,
9C04B876107D2B7C002A63D0 /* run_loop_cocoa.m in Sources */,
9CF13C1610F8A1C6004C4EEE /* bt_control_iphone.m in Sources */,
9C50953A112744AA00A30986 /* BTstackManager.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -370,6 +430,16 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
9CF3F75C112F239B00D081C9 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9CF3F776112F241600D081C9 /* BTstackManager.m in Sources */,
9CF3F95311306FFB00D081C9 /* TestBTstackManager.m in Sources */,
9CF3F99F113083F100D081C9 /* BTDevice.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
@ -510,6 +580,97 @@
};
name = "Debug iPhone";
};
9CF3F762112F239C00D081C9 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CODE_SIGN_IDENTITY = "Don't Code Sign";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/UIKit.framework/Headers/UIKit.h";
INFOPLIST_FILE = "CocoaTouch/TestBTstackManager-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-I/Projects/iPhone/btstack/CocoaTouch/include",
"-I/Projects/iPhone/btstack/include",
);
OTHER_LDFLAGS = (
"-L/usr/local/lib",
"-lbtstack",
"-framework",
Foundation,
"-framework",
UIKit,
);
PREBINDING = NO;
PRODUCT_NAME = TestBTstackManager;
SDKROOT = iphonesimulator3.1.2;
};
name = Debug;
};
9CF3F763112F239C00D081C9 /* Debug iPhone */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CODE_SIGN_IDENTITY = "iPhone Developer";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/UIKit.framework/Headers/UIKit.h";
INFOPLIST_FILE = "CocoaTouch/TestBTstackManager-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-I/Projects/iPhone/btstack/CocoaTouch/include",
"-I/Projects/iPhone/btstack/include",
);
OTHER_LDFLAGS = (
"-L/usr/local/lib",
"-lbtstack",
"-framework",
Foundation,
"-framework",
UIKit,
);
PREBINDING = NO;
PRODUCT_NAME = TestBTstackManager;
SDKROOT = iphonesimulator3.1.2;
};
name = "Debug iPhone";
};
9CF3F764112F239C00D081C9 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/UIKit.framework/Headers/UIKit.h";
INFOPLIST_FILE = "CocoaTouch/TestBTstackManager-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-I/Projects/iPhone/btstack/CocoaTouch/include",
"-I/Projects/iPhone/btstack/include",
);
OTHER_LDFLAGS = (
"-L/usr/local/lib",
"-lbtstack",
"-framework",
Foundation,
"-framework",
UIKit,
);
PREBINDING = NO;
PRODUCT_NAME = TestBTstackManager;
SDKROOT = iphonesimulator3.1.2;
ZERO_LINK = NO;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@ -543,6 +704,16 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
9CF3F765112F239C00D081C9 /* Build configuration list for PBXNativeTarget "TestBTstackManager" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9CF3F762112F239C00D081C9 /* Debug */,
9CF3F763112F239C00D081C9 /* Debug iPhone */,
9CF3F764112F239C00D081C9 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;