From 7d9e4b220f92c01b353d4e118c3dd8fab76bd3fa Mon Sep 17 00:00:00 2001 From: Milanka Ringwald Date: Fri, 20 Nov 2015 11:01:03 +0100 Subject: [PATCH] hfp: handle call terminantion --- src/hfp.h | 6 +++- src/hfp_ag.c | 87 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 70 insertions(+), 23 deletions(-) diff --git a/src/hfp.h b/src/hfp.h index 307abc296..078734fac 100644 --- a/src/hfp.h +++ b/src/hfp.h @@ -218,7 +218,11 @@ typedef enum { typedef enum { HFP_AG_INCOMING_CALL, - HFP_AG_INCOMING_CALL_DROPED + HFP_AG_INCOMING_CALL_ACCEPETED_BY_AG, + HFP_AG_INCOMING_CALL_ACCEPETED_BY_HF, + HFP_AG_TERMINATE_CALL_BY_AG, + HFP_AG_TERMINATE_CALL_BY_HF, + HFP_AG_CALL_DROPED, } hfp_ag_call_event_t; diff --git a/src/hfp_ag.c b/src/hfp_ag.c index a3347f6b2..2251e8edb 100644 --- a/src/hfp_ag.c +++ b/src/hfp_ag.c @@ -793,6 +793,30 @@ static void hfp_ag_trigger_incoming_call(void){ } } +static void hfp_ag_trigger_answer_incoming_call(void){ + linked_list_iterator_t it; + linked_list_iterator_init(&it, hfp_get_connections()); + while (linked_list_iterator_has_next(&it)){ + hfp_connection_t * connection = (hfp_connection_t *)linked_list_iterator_next(&it); + if (connection->call_state != HFP_CALL_W4_ANSWER) continue; + connection->run_call_state_machine = 1; + connection->command = HFP_CMD_AG_ANSWER_CALL; + hfp_run_for_context(connection); + } +} + +static void hfp_ag_trigger_terminate_call(void){ + linked_list_iterator_t it; + linked_list_iterator_init(&it, hfp_get_connections()); + while (linked_list_iterator_has_next(&it)){ + hfp_connection_t * connection = (hfp_connection_t *)linked_list_iterator_next(&it); + hfp_ag_establish_service_level_connection(connection->remote_addr); + connection->terminate_call = 1; + hfp_run_for_context(connection); + } +} + + static void hfp_ag_call_sm(hfp_ag_call_event_t event){ switch (event){ case HFP_AG_INCOMING_CALL: @@ -800,7 +824,9 @@ static void hfp_ag_call_sm(hfp_ag_call_event_t event){ case HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS: switch (hfp_ag_callsetup_state){ case HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS: + hfp_ag_callsetup_state = HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS; hfp_ag_trigger_incoming_call(); + printf("TODO AG rings\n"); break; default: break; @@ -812,7 +838,39 @@ static void hfp_ag_call_sm(hfp_ag_call_event_t event){ } break; - case HFP_AG_INCOMING_CALL_DROPED: + case HFP_AG_INCOMING_CALL_ACCEPETED_BY_AG: + switch (hfp_ag_call_state){ + case HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS: + switch (hfp_ag_callsetup_state){ + case HFP_CALLSETUP_STATUS_INCOMING_CALL_SETUP_IN_PROGRESS: + hfp_ag_callsetup_state = HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS; + hfp_ag_call_state = HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT; + hfp_ag_trigger_answer_incoming_call(); + printf("TODO AG answers call\n"); + break; + default: + break; + } + break; + default: + break; + } + break; + case HFP_AG_TERMINATE_CALL_BY_AG: + switch (hfp_ag_call_state){ + case HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT: + hfp_ag_callsetup_state = HFP_CALLSETUP_STATUS_NO_CALL_SETUP_IN_PROGRESS; + hfp_ag_call_state = HFP_CALL_STATUS_NO_HELD_OR_ACTIVE_CALLS; + hfp_ag_trigger_terminate_call(); + printf("TODO AG termante call\n"); + break; + default: + break; + } + break; + case HFP_AG_CALL_DROPED: + break; + default: break; } @@ -1037,24 +1095,21 @@ void hfp_ag_set_use_in_band_ring_tone(int use_in_band_ring_tone){ } /** - * @brief + * @brief Called from GSM */ void hfp_ag_incoming_call(void){ hfp_ag_call_sm(HFP_AG_INCOMING_CALL); } + +void hfp_ag_answer_incoming_call(void){ + hfp_ag_call_sm(HFP_AG_INCOMING_CALL_ACCEPETED_BY_AG); +} /** * @brief */ void hfp_ag_terminate_call(void){ - linked_list_iterator_t it; - linked_list_iterator_init(&it, hfp_get_connections()); - while (linked_list_iterator_has_next(&it)){ - hfp_connection_t * connection = (hfp_connection_t *)linked_list_iterator_next(&it); - hfp_ag_establish_service_level_connection(connection->remote_addr); - connection->terminate_call = 1; - hfp_run_for_context(connection); - } + hfp_ag_call_sm(HFP_AG_TERMINATE_CALL_BY_AG); } void hfp_ag_audio_connection_transfer_towards_ag(bd_addr_t bd_addr){ @@ -1064,18 +1119,6 @@ void hfp_ag_audio_connection_transfer_towards_ag(bd_addr_t bd_addr){ hfp_ag_release_audio_connection(bd_addr); } -void hfp_ag_answer_incoming_call(void){ - linked_list_iterator_t it; - linked_list_iterator_init(&it, hfp_get_connections()); - while (linked_list_iterator_has_next(&it)){ - hfp_connection_t * connection = (hfp_connection_t *)linked_list_iterator_next(&it); - if (connection->call_state != HFP_CALL_W4_ANSWER) continue; - connection->run_call_state_machine = 1; - connection->command = HFP_CMD_AG_ANSWER_CALL; - hfp_run_for_context(connection); - } -} - /** * @brief */