added status to L2CAP_CHANNEL_OPENED event

This commit is contained in:
matthias.ringwald 2009-10-19 20:21:32 +00:00
parent f57a4e829f
commit 03cfbabc9a
6 changed files with 74 additions and 51 deletions

View File

@ -4,6 +4,8 @@ Last milestone reached: create script to build APT package for BTdeamon, Resourc
Last change: don't set name to empty string on error in CocoaTouch
NEXT:
- forward channel ID to client packet handler
- change BTstack.h, BTstack.c and all example apps
- CocoaTouch User Interface Components
- move all inquiry related code from BTstackCocoaAppDelegate into BTInquiryViewController
- prepare WiiMoteDemo for release

View File

@ -257,18 +257,25 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
case L2CAP_EVENT_CHANNEL_OPENED:
// inform about new l2cap connection
bt_flip_addr(event_addr, &packet[2]);
uint16_t psm = READ_BT_16(packet, 10);
source_cid = READ_BT_16(packet, 12);
con_handle = READ_BT_16(packet, 8);
printf("Channel successfully opened: ");
print_bd_addr(event_addr);
printf(", handle 0x%02x, psm 0x%02x, source cid 0x%02x, dest cid 0x%02x\n",
con_handle, psm, source_cid, READ_BT_16(packet, 14));
// send SABM command on dlci 0
printf("Sending SABM #0\n");
_bt_rfcomm_send_sabm(source_cid, 1, 0);
bt_flip_addr(event_addr, &packet[3]);
uint16_t psm = READ_BT_16(packet, 11);
source_cid = READ_BT_16(packet, 13);
con_handle = READ_BT_16(packet, 9);
if (packet[2] == 0) {
printf("Channel successfully opened: ");
print_bd_addr(event_addr);
printf(", handle 0x%02x, psm 0x%02x, source cid 0x%02x, dest cid 0x%02x\n",
con_handle, psm, source_cid, READ_BT_16(packet, 15));
// send SABM command on dlci 0
printf("Sending SABM #0\n");
_bt_rfcomm_send_sabm(source_cid, 1, 0);
} else {
printf("L2CAP connection to device ");
print_bd_addr(event_addr);
printf(" failed. status code %u\n", packet[2]);
exit(1);
}
break;
case HCI_EVENT_DISCONNECTION_COMPLETE:

View File

@ -61,27 +61,35 @@ void packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size){
case L2CAP_EVENT_CHANNEL_OPENED:
// inform about new l2cap connection
bt_flip_addr(event_addr, &packet[2]);
uint16_t psm = READ_BT_16(packet, 10);
uint16_t source_cid = READ_BT_16(packet, 12);
con_handle = READ_BT_16(packet, 8);
printf("Channel successfully opened: ");
print_bd_addr(event_addr);
printf(", handle 0x%02x, psm 0x%02x, source cid 0x%02x, dest cid 0x%02x\n",
con_handle, psm, source_cid, READ_BT_16(packet, 14));
if (psm == 0x13) {
source_cid_interrupt = source_cid;
// interupt channel openedn succesfully, now open control channel, too.
bt_send_cmd(&l2cap_create_channel, event_addr, 0x11);
// inform about new l2cap connection
bt_flip_addr(event_addr, &packet[3]);
uint16_t psm = READ_BT_16(packet, 11);
uint16_t source_cid = READ_BT_16(packet, 13);
con_handle = READ_BT_16(packet, 9);
if (packet[2] == 0) {
printf("Channel successfully opened: ");
print_bd_addr(event_addr);
printf(", handle 0x%02x, psm 0x%02x, source cid 0x%02x, dest cid 0x%02x\n",
con_handle, psm, source_cid, READ_BT_16(packet, 15));
if (psm == 0x13) {
source_cid_interrupt = source_cid;
// interupt channel openedn succesfully, now open control channel, too.
bt_send_cmd(&l2cap_create_channel, event_addr, 0x11);
} else {
source_cid_control = source_cid;
// request acceleration data..
uint8_t setMode31[] = { 0x52, 0x12, 0x00, 0x31 };
bt_send_l2cap( source_cid, setMode31, sizeof(setMode31));
// stop blinking
uint8_t setLEDs[] = { 0x52, 0x11, 0x10 };
bt_send_l2cap( source_cid, setLEDs, sizeof(setLEDs));
}
} else {
source_cid_control = source_cid;
// request acceleration data..
uint8_t setMode31[] = { 0x52, 0x12, 0x00, 0x31 };
bt_send_l2cap( source_cid, setMode31, sizeof(setMode31));
// stop blinking
uint8_t setLEDs[] = { 0x52, 0x11, 0x10 };
bt_send_l2cap( source_cid, setLEDs, sizeof(setLEDs));
printf("L2CAP connection to device ");
print_bd_addr(event_addr);
printf(" failed. status code %u\n", packet[2]);
exit(1);
}
break;

View File

@ -72,7 +72,7 @@
// data: none
#define BTSTACK_EVENT_POWERON_FAILED 0x62
// data: event (8), len(8), address(48), handle (16), psm (16), source_cid(16), dest_cid (16)
// data: event (8), len(8), status (8), address(48), handle (16), psm (16), source_cid(16), dest_cid (16)
#define L2CAP_EVENT_CHANNEL_OPENED 0x70
// data: event (8), len(8), channel (16)

View File

@ -106,7 +106,7 @@ void l2cap_disconnect_internal(uint16_t source_cid, uint8_t reason){
void l2cap_event_handler( uint8_t *packet, uint16_t size ){
// handle connection complete events
if (packet[0] == HCI_EVENT_CONNECTION_COMPLETE && packet[2] == 0){
if (packet[0] == HCI_EVENT_CONNECTION_COMPLETE) {
bd_addr_t address;
bt_flip_addr(address, &packet[5]);
@ -115,13 +115,17 @@ void l2cap_event_handler( uint8_t *packet, uint16_t size ){
l2cap_channel_t * chan = (l2cap_channel_t *) it;
if ( ! BD_ADDR_CMP( chan->address, address) ){
if (chan->state == L2CAP_STATE_CLOSED) {
chan->handle = READ_BT_16(packet, 3);
chan->sig_id = l2cap_next_sig_id();
chan->source_cid = l2cap_next_source_cid();
l2cap_send_signaling_packet( chan->handle, CONNECTION_REQUEST, chan->sig_id, chan->psm, chan->source_cid);
chan->state = L2CAP_STATE_WAIT_CONNECT_RSP;
if (packet[2] == 0){
chan->handle = READ_BT_16(packet, 3);
chan->sig_id = l2cap_next_sig_id();
chan->source_cid = l2cap_next_source_cid();
l2cap_send_signaling_packet( chan->handle, CONNECTION_REQUEST, chan->sig_id, chan->psm, chan->source_cid);
chan->state = L2CAP_STATE_WAIT_CONNECT_RSP;
} else {
l2cap_emit_channel_opened(chan, packet[2]); // failure, forward error code
}
}
}
}
@ -179,7 +183,8 @@ void l2cap_signaling_handler(l2cap_channel_t *channel, uint8_t *packet, uint16_t
l2cap_send_signaling_packet(channel->handle, CONFIGURE_REQUEST, channel->sig_id, channel->dest_cid, 0, 4, &config_options);
channel->state = L2CAP_STATE_WAIT_CONFIG_REQ_RSP;
} else {
//@TODO: implement failed
//@TODO use separate error codes
l2cap_emit_channel_opened(channel, READ_BT_16 (packet, L2CAP_SIGNALING_DATA_OFFSET+3)); // failure, forward error code
}
break;
//@TODO: implement other signaling packets
@ -202,7 +207,7 @@ void l2cap_signaling_handler(l2cap_channel_t *channel, uint8_t *packet, uint16_t
l2cap_send_signaling_packet(channel->handle, CONFIGURE_RESPONSE, identifier, channel->dest_cid, 0, 0, size - 16, &packet[16]);
channel->state = L2CAP_STATE_OPEN;
l2cap_emit_channel_opened(channel);
l2cap_emit_channel_opened(channel, 0); // success
break;
}
break;
@ -242,15 +247,16 @@ void l2cap_close_channels_for_connection(connection_t *connection){
}
// notify client
void l2cap_emit_channel_opened(l2cap_channel_t *channel) {
uint8_t event[16];
void l2cap_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
uint8_t event[17];
event[0] = L2CAP_EVENT_CHANNEL_OPENED;
event[1] = sizeof(event) - 2;
bt_flip_addr(&event[2], channel->address);
bt_store_16(event, 8, channel->handle);
bt_store_16(event, 10, channel->psm);
bt_store_16(event, 12, channel->source_cid);
bt_store_16(event, 14, channel->dest_cid);
event[2] = status;
bt_flip_addr(&event[3], channel->address);
bt_store_16(event, 9, channel->handle);
bt_store_16(event, 11, channel->psm);
bt_store_16(event, 13, channel->source_cid);
bt_store_16(event, 15, channel->dest_cid);
socket_connection_send_packet(channel->connection, HCI_EVENT_PACKET, 0, event, sizeof(event));
}

View File

@ -60,5 +60,5 @@ void l2cap_set_capture_connection(connection_t * connection);
void l2cap_finialize_channel_close(l2cap_channel_t *channel);
void l2cap_close_channels_for_connection(connection_t *connection);
void l2cap_emit_channel_opened(l2cap_channel_t *channel);
void l2cap_emit_channel_opened(l2cap_channel_t *channel, uint8_t status);
void l2cap_emit_channel_closed(l2cap_channel_t *channel);