avrcp: create connection returns status

This commit is contained in:
Milanka Ringwald 2017-06-07 15:45:03 +02:00
parent eaac31e881
commit 8a2c6c7c4b
2 changed files with 19 additions and 31 deletions

View File

@ -557,22 +557,23 @@ static uint8_t avrcp_cmd_opcode(uint8_t *packet, uint16_t size){
} }
static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connection_t * connection, uint8_t *packet, uint16_t size){ static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connection_t * connection, uint8_t *packet, uint16_t size){
avrcp_command_type_t ctype;
avrcp_subunit_type_t subunit_type;
avrcp_subunit_type_t subunit_id;
uint8_t operands[20]; uint8_t operands[20];
uint8_t opcode; uint8_t opcode;
int pos = 0; int pos = 3;
// uint8_t transport_header = packet[0]; // uint8_t transport_header = packet[0];
// uint8_t transaction_label = transport_header >> 4; // uint8_t transaction_label = transport_header >> 4;
// uint8_t packet_type = (transport_header & 0x0F) >> 2; // uint8_t packet_type = (transport_header & 0x0F) >> 2;
// uint8_t frame_type = (transport_header & 0x03) >> 1; // uint8_t frame_type = (transport_header & 0x03) >> 1;
// uint8_t ipid = transport_header & 0x01; // uint8_t ipid = transport_header & 0x01;
uint8_t byte_value = packet[2]; // uint8_t byte_value = packet[2];
// uint16_t pid = (byte_value << 8) | packet[2]; // uint16_t pid = (byte_value << 8) | packet[2];
pos = 3;
avrcp_command_type_t ctype = packet[pos++];
uint8_t byte_value = packet[pos++];
avrcp_subunit_type_t subunit_type = byte_value >> 3;
avrcp_subunit_type_t subunit_id = byte_value & 0x07;
opcode = packet[pos++];
// printf(" Transport header 0x%02x (transaction_label %d, packet_type %d, frame_type %d, ipid %d), pid 0x%4x\n", // printf(" Transport header 0x%02x (transaction_label %d, packet_type %d, frame_type %d, ipid %d), pid 0x%4x\n",
// transport_header, transaction_label, packet_type, frame_type, ipid, pid); // transport_header, transaction_label, packet_type, frame_type, ipid, pid);
// // printf_hexdump(packet+pos, size-pos); // // printf_hexdump(packet+pos, size-pos);
@ -581,12 +582,6 @@ static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connec
if (connection->state == AVCTP_W2_RECEIVE_RESPONSE){ if (connection->state == AVCTP_W2_RECEIVE_RESPONSE){
connection->state = AVCTP_CONNECTION_OPENED; connection->state = AVCTP_CONNECTION_OPENED;
} }
ctype = packet[pos++];
byte_value = packet[pos++];
subunit_type = byte_value >> 3;
subunit_id = byte_value & 0x07;
opcode = packet[pos++];
// operands: // operands:
memcpy(operands, packet+pos, 5); memcpy(operands, packet+pos, 5);
uint8_t unit_type = operands[1] >> 3; uint8_t unit_type = operands[1] >> 3;
@ -600,11 +595,6 @@ static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connec
if (connection->state == AVCTP_W2_RECEIVE_RESPONSE){ if (connection->state == AVCTP_W2_RECEIVE_RESPONSE){
connection->state = AVCTP_CONNECTION_OPENED; connection->state = AVCTP_CONNECTION_OPENED;
} }
ctype = packet[pos++];
byte_value = packet[pos++];
subunit_type = byte_value >> 3;
subunit_id = byte_value & 0x07;
opcode = packet[pos++];
if (size - pos < 7) { if (size - pos < 7) {
log_error("avrcp: wrong packet size"); log_error("avrcp: wrong packet size");
@ -965,11 +955,6 @@ static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connec
break; break;
case AVRCP_CMD_OPCODE_PASS_THROUGH:{ case AVRCP_CMD_OPCODE_PASS_THROUGH:{
// 0x80 | connection->cmd_operands[0] // 0x80 | connection->cmd_operands[0]
ctype = packet[pos++];
byte_value = packet[pos++];
subunit_type = byte_value >> 3;
subunit_id = byte_value & 0x07;
opcode = packet[pos++];
uint8_t operation_id = packet[pos++]; uint8_t operation_id = packet[pos++];
switch (connection->state){ switch (connection->state){
case AVCTP_W2_RECEIVE_PRESS_RESPONSE: case AVCTP_W2_RECEIVE_PRESS_RESPONSE:
@ -1152,18 +1137,21 @@ void avrcp_register_packet_handler(btstack_packet_handler_t callback){
avrcp_callback = callback; avrcp_callback = callback;
} }
void avrcp_connect(bd_addr_t bd_addr){ uint8_t avrcp_connect(bd_addr_t bd_addr){
avrcp_connection_t * connection = get_avrcp_connection_for_bd_addr(bd_addr); avrcp_connection_t * connection = get_avrcp_connection_for_bd_addr(bd_addr);
if (!connection){ if (connection){
connection = avrcp_create_connection(bd_addr); return ERROR_CODE_COMMAND_DISALLOWED;
} }
connection = avrcp_create_connection(bd_addr);
if (!connection){ if (!connection){
log_error("avrcp: could not find or create a connection."); log_error("avrcp: could not allocate connection struct.");
return; return BTSTACK_MEMORY_ALLOC_FAILED;
} }
if (connection->state != AVCTP_CONNECTION_IDLE) return;
connection->state = AVCTP_CONNECTION_W4_L2CAP_CONNECTED; connection->state = AVCTP_CONNECTION_W4_L2CAP_CONNECTED;
l2cap_create_channel(packet_handler, connection->remote_addr, BLUETOOTH_PROTOCOL_AVCTP, 0xffff, NULL); l2cap_create_channel(packet_handler, connection->remote_addr, BLUETOOTH_PROTOCOL_AVCTP, 0xffff, NULL);
return ERROR_CODE_SUCCESS;
} }
void avrcp_unit_info(uint16_t con_handle){ void avrcp_unit_info(uint16_t con_handle){

View File

@ -270,7 +270,7 @@ void avrcp_register_packet_handler(btstack_packet_handler_t callback);
* @brief Connect to device with a bluetooth address. * @brief Connect to device with a bluetooth address.
* @param bd_addr * @param bd_addr
*/ */
void avrcp_connect(bd_addr_t bd_addr); uint8_t avrcp_connect(bd_addr_t bd_addr);
void avrcp_disconnect(uint16_t con_handle); void avrcp_disconnect(uint16_t con_handle);
/** /**
* @brief Unit info. * @brief Unit info.