From d13869281f1d61868511e2533cb0c41a9cf2f837 Mon Sep 17 00:00:00 2001 From: Milanka Ringwald Date: Wed, 26 Jul 2017 16:16:08 +0200 Subject: [PATCH] avrcp target: introduce handle can send now --- src/classic/avrcp_target.c | 40 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/classic/avrcp_target.c b/src/classic/avrcp_target.c index 49ae80ac7..7c8c894cd 100644 --- a/src/classic/avrcp_target.c +++ b/src/classic/avrcp_target.c @@ -108,6 +108,7 @@ static int avrcp_send_response(uint16_t cid, avrcp_connection_t * connection){ // operands memcpy(command+pos, connection->cmd_operands, connection->cmd_operands_length); pos += connection->cmd_operands_length; + connection->wait_to_send = 0; return l2cap_send(cid, command, pos); } @@ -127,7 +128,10 @@ static uint8_t avrcp_target_response_reject(avrcp_connection_t * connection, avr pos += 2; connection->cmd_operands[pos++] = status; connection->cmd_operands_length = pos; - return avrcp_send_response(connection->l2cap_signaling_cid, connection); + + connection->state = AVCTP_W2_SEND_RESPONSE; + avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } uint8_t avrcp_target_unit_info(uint16_t avrcp_cid, avrcp_subunit_type_t unit_type, uint32_t company_id){ @@ -149,7 +153,10 @@ uint8_t avrcp_target_unit_info(uint16_t avrcp_cid, avrcp_subunit_type_t unit_typ connection->cmd_operands[1] = (unit_type << 4) | unit; // company id is 3 bytes long big_endian_store_32(connection->cmd_operands, 2, company_id); - return avrcp_send_response(connection->l2cap_signaling_cid, connection); + + connection->state = AVCTP_W2_SEND_RESPONSE; + avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } uint8_t avrcp_target_subunit_info(uint16_t avrcp_cid, avrcp_subunit_type_t subunit_type, uint8_t offset, uint8_t * subunit_info_data){ @@ -170,7 +177,10 @@ uint8_t avrcp_target_subunit_info(uint16_t avrcp_cid, avrcp_subunit_type_t subun connection->cmd_operands_length = 5; connection->cmd_operands[0] = (page << 4) | extension_code; memcpy(connection->cmd_operands+1, subunit_info_data + offset, 4); - return avrcp_send_response(connection->l2cap_signaling_cid, connection); + + connection->state = AVCTP_W2_SEND_RESPONSE; + avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } static uint8_t avrcp_target_capability(uint16_t avrcp_cid, avrcp_capability_id_t capability_id, uint8_t capabilities_num, uint8_t * capabilities, uint8_t size){ @@ -197,7 +207,9 @@ static uint8_t avrcp_target_capability(uint16_t avrcp_cid, avrcp_capability_id_t memcpy(connection->cmd_operands+pos, capabilities, size); pos += size; connection->cmd_operands_length = pos; - return avrcp_send_response(connection->l2cap_signaling_cid, connection); + connection->state = AVCTP_W2_SEND_RESPONSE; + avrcp_request_can_send_now(connection, connection->l2cap_signaling_cid); + return ERROR_CODE_SUCCESS; } @@ -220,7 +232,6 @@ static uint8_t * avrcp_get_pdu(uint8_t *packet, uint16_t size){ return packet + 9; } - static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connection_t * connection, uint8_t *packet, uint16_t size){ UNUSED(connection); UNUSED(packet); @@ -295,13 +306,6 @@ static void avrcp_handle_l2cap_data_packet_for_signaling_connection(avrcp_connec } } -static void avrcp_target_handle_can_send_now(avrcp_connection_t * connection){ - switch (connection->state){ - default: - return; - } -} - static void avrcp_controller_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ avrcp_connection_t * connection; switch (packet_type) { @@ -313,9 +317,19 @@ static void avrcp_controller_packet_handler(uint8_t packet_type, uint16_t channe case HCI_EVENT_PACKET: switch (hci_event_packet_get_type(packet)){ case L2CAP_EVENT_CAN_SEND_NOW: + printf("L2CAP_EVENT_CAN_SEND_NOW \n"); connection = get_avrcp_connection_for_l2cap_signaling_cid(channel, &avrcp_target_context); if (!connection) break; - avrcp_target_handle_can_send_now(connection); + switch (connection->state){ + case AVCTP_W2_SEND_RESPONSE: + printf("AVCTP_W2_SEND_RESPONSE - > OPEN \n"); + + connection->state = AVCTP_CONNECTION_OPENED; + avrcp_send_response(connection->l2cap_signaling_cid, connection); + break; + default: + return; + } break; default: avrcp_packet_handler(packet_type, channel, packet, size, &avrcp_target_context);