hfp ag: test incoming call

This commit is contained in:
Milanka Ringwald 2015-11-18 10:54:50 +01:00
parent 446acc6645
commit 259633092e
4 changed files with 36 additions and 46 deletions

View File

@ -284,7 +284,6 @@ void hfp_reset_context_flags(hfp_connection_t * context){
context->notify_ag_on_new_codecs = 0;
// establish codecs connection
context->ag_trigger_codec_connection_setup = 0; // TODO remove
context->hf_trigger_codec_connection_setup = 0;
context->suggested_codec = 0;
context->negotiated_codec = 0;

View File

@ -266,15 +266,6 @@ typedef enum {
HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN
} hfp_state_t;
/*
// establish codecs connection
uint8_t hf_trigger_codec_connection_setup;
uint8_t ag_trigger_codec_connection_setup;
uint8_t ag_ready_for_codecs_connection_setup;
uint8_t suggested_codec;
uint8_t codec_confirmed;
*/
typedef enum {
HFP_CODECS_IDLE,
HFP_CODECS_RECEIVED_LIST,
@ -410,8 +401,6 @@ typedef struct hfp_connection {
// establish codecs connection
uint8_t hf_trigger_codec_connection_setup;
uint8_t ag_trigger_codec_connection_setup;
uint8_t ag_ready_for_codecs_connection_setup;
uint8_t suggested_codec;
uint8_t codec_confirmed;

View File

@ -388,7 +388,7 @@ static int codecs_exchange_state_machine(hfp_connection_t * context){
switch (context->command){
case HFP_CMD_AVAILABLE_CODECS:
hfp_ag_ok(context->rfcomm_cid);
printf("HFP_CODECS_RECEIVED_LIST \n");
//printf("HFP_CODECS_RECEIVED_LIST \n");
if (context->state < HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED){
context->codecs_state = HFP_CODECS_RECEIVED_LIST;
break;
@ -406,19 +406,19 @@ static int codecs_exchange_state_machine(hfp_connection_t * context){
case HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP:
hfp_ag_ok(context->rfcomm_cid);
printf(" HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP \n");
//printf(" HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP \n");
context->codecs_state = HFP_CODECS_RECEIVED_TRIGGER_CODEC_EXCHANGE;
break;
case HFP_CMD_AG_SEND_COMMON_CODEC:
printf(" HFP_CMD_AG_SEND_COMMON_CODEC \n");
//printf(" HFP_CMD_AG_SEND_COMMON_CODEC \n");
context->codecs_state = HFP_CODECS_AG_SENT_COMMON_CODEC;
context->suggested_codec = hfp_ag_suggest_codec(context);
hfp_ag_cmd_suggest_codec(context->rfcomm_cid, context->suggested_codec);
break;
case HFP_CMD_HF_CONFIRMED_CODEC:
printf("HFP_CMD_HF_CONFIRMED_CODEC \n");
//printf("HFP_CMD_HF_CONFIRMED_CODEC \n");
context->run_codecs_state_machine = 0;
if (context->codec_confirmed != context->suggested_codec){
context->codecs_state = HFP_CODECS_ERROR;
@ -618,14 +618,16 @@ static int hfp_ag_run_for_audio_connection(hfp_connection_t * context){
if (context->release_audio_connection){
context->state = HFP_W4_SCO_DISCONNECTED;
context->release_audio_connection = 0;
gap_disconnect(context->sco_handle);
done = 1;
return done;
}
if (context->state == HFP_AUDIO_CONNECTION_ESTABLISHED) return done;
if (context->codecs_state != HFP_CODECS_EXCHANGED) return done;
if (context->establish_audio_connection){
context->state = HFP_W4_SCO_CONNECTED;
context->establish_audio_connection = 0;
hci_send_cmd(&hci_setup_synchronous_connection, context->con_handle, 8000, 8000, 0xFFFF, hci_get_sco_voice_setting(), 0xFF, 0x003F);
done = 1;
return done;
@ -636,16 +638,22 @@ static int hfp_ag_run_for_audio_connection(hfp_connection_t * context){
static int incoming_call_state_machine(hfp_connection_t * context){
if (!context->run_call_state_machine) return 0;
if (context->state != HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED) return 0;
if (context->state < HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED) return 0;
printf("* incoming_call_state_machine *\n");
printf(" -> State machine: Incoming Call\n");
int done = 0;
hfp_ag_indicator_t * indicator;
if (context->terminate_call){
// TODO, reset flags
context->terminate_call = 0;
context->run_call_state_machine = 0;
return done;
}
switch (context->call_state){
case HFP_CALL_IDLE:
printf(" HFP_CALL_TRIGGER_AUDIO_CONNECTION \n");
//printf(" HFP_CALL_TRIGGER_AUDIO_CONNECTION \n");
indicator = get_ag_indicator_for_name(context, "callsetup");
if (!indicator) break;
@ -662,8 +670,7 @@ static int incoming_call_state_machine(hfp_connection_t * context){
break;
case HFP_CALL_W4_ANSWER:
printf(" HFP_CALL_W4_ANSWER \n");
//printf(" HFP_CALL_W4_ANSWER \n");
context->call_state = HFP_CALL_TRANSFER_CALL_STATUS;
hfp_emit_event(hfp_callback, HFP_SUBEVENT_STOP_RINGINIG, 0);
hfp_ag_ok(context->rfcomm_cid);
@ -671,8 +678,7 @@ static int incoming_call_state_machine(hfp_connection_t * context){
break;
case HFP_CALL_TRANSFER_CALL_STATUS:
printf(" HFP_CALL_TRANSFER_CALL_STATUS \n");
//printf(" HFP_CALL_TRANSFER_CALL_STATUS \n");
context->call_state = HFP_CALL_TRANSFER_CALLSETUP_STATUS;
indicator = get_ag_indicator_for_name(context, "call");
indicator->status = HFP_CALL_STATUS_ACTIVE_OR_HELD_CALL_IS_PRESENT;
@ -681,8 +687,7 @@ static int incoming_call_state_machine(hfp_connection_t * context){
break;
case HFP_CALL_TRANSFER_CALLSETUP_STATUS:
printf(" HFP_CALL_TRANSFER_CALLSETUP_STATUS \n");
//printf(" HFP_CALL_TRANSFER_CALLSETUP_STATUS \n");
if (use_in_band_tone(context)){
context->call_state = HFP_CALL_ACTIVE;
} else {
@ -695,13 +700,12 @@ static int incoming_call_state_machine(hfp_connection_t * context){
done = 1;
break;
case HFP_CALL_TRIGGER_AUDIO_CONNECTION:
printf(" HFP_CALL_TRIGGER_AUDIO_CONNECTION \n");
//printf(" HFP_CALL_TRIGGER_AUDIO_CONNECTION \n");
context->call_state = HFP_CALL_W4_AUDIO_CONNECTION;
hfp_ag_establish_audio_connection(context->remote_addr);
break;
case HFP_CALL_W4_AUDIO_CONNECTION:
printf(" HFP_CALL_W4_AUDIO_CONNECTION \n");
//printf(" HFP_CALL_W4_AUDIO_CONNECTION \n");
if (context->state < HFP_AUDIO_CONNECTION_ESTABLISHED) break;
printf(" HFP_CALL_W4_AUDIO_CONNECTION 2 \n");
@ -713,8 +717,7 @@ static int incoming_call_state_machine(hfp_connection_t * context){
}
break;
case HFP_CALL_ACTIVE:
printf(" HFP_CALL_ACTIVE \n");
//printf(" HFP_CALL_ACTIVE \n");
break;
default:
break;
@ -754,10 +757,10 @@ static void hfp_run_for_context(hfp_connection_t *context){
if (!done){
done = hfp_ag_run_for_context_service_level_connection_queries(context);
}
// if (!done){
// done = incoming_call_state_machine(context);
// }
if (!done){
done = incoming_call_state_machine(context);
}
if (!done){
done = hfp_ag_run_for_audio_connection(context);
@ -903,7 +906,6 @@ void hfp_ag_establish_audio_connection(bd_addr_t bd_addr){
case HFP_CODECS_RECEIVED_LIST:
case HFP_CODECS_AG_RESEND_COMMON_CODEC:
case HFP_CODECS_ERROR:
printf("\nhfp_ag_establish_audio_connection ag_trigger_codec_connection_setup\n");
connection->command = HFP_CMD_AG_SEND_COMMON_CODEC;
break;
default:

View File

@ -213,17 +213,17 @@ TEST_GROUP(HFPClient){
}
};
// TEST(HFPClient, HFAnswerIncomingCallWithInBandRingTone){
// setup_hfp_service_level_connection(default_slc_setup(), default_slc_setup_size());
// CHECK_EQUAL(service_level_connection_established, 1);
TEST(HFPClient, HFAnswerIncomingCallWithInBandRingTone){
setup_hfp_service_level_connection(default_slc_setup(), default_slc_setup_size());
CHECK_EQUAL(service_level_connection_established, 1);
// hfp_ag_call(device_addr, 1);
// simulate_test_sequence(default_ic_setup(), default_ic_setup_size());
// CHECK_EQUAL(audio_connection_established, 1);
hfp_ag_call(device_addr, 1);
simulate_test_sequence(default_ic_setup(), default_ic_setup_size());
CHECK_EQUAL(audio_connection_established, 1);
// //simulate_test_sequence(alert_ic_setup(), alert_ic_setup_size());
// //CHECK_EQUAL(stop_ringing, 1);
// }
simulate_test_sequence(alert_ic_setup(), alert_ic_setup_size());
CHECK_EQUAL(stop_ringing, 1);
}
TEST(HFPClient, HFAudioConnectionEstablished){