From 0727da1d5b004da0361f0a807ecbef2339cb35e2 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Fri, 17 Jan 2014 14:37:41 -0600 Subject: emulator: Improve SLC establishment logic --- src/emulator.c | 31 ++++++++++++++++++++++++++++++- src/ofono.h | 9 +++++++++ src/voicecall.c | 4 ++++ 3 files changed, 43 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/emulator.c b/src/emulator.c index 70505b5c..6171525e 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -636,7 +636,8 @@ done: g_at_server_send_final(server, G_AT_SERVER_RESULT_OK); - em->slc = TRUE; + __ofono_emulator_slc_condition(em, + OFONO_EMULATOR_SLC_CONDITION_CMER); break; } @@ -1266,3 +1267,31 @@ void __ofono_emulator_set_indicator_forced(struct ofono_emulator *em, ind->deferred = TRUE; } } + +void __ofono_emulator_slc_condition(struct ofono_emulator *em, + enum ofono_emulator_slc_condition cond) +{ + if (em->slc == TRUE) + return; + + switch (cond) { + case OFONO_EMULATOR_SLC_CONDITION_CMER: + if ((em->r_features & HFP_HF_FEATURE_3WAY) && + (em->l_features & HFP_AG_FEATURE_3WAY)) + return; + /* Fall Through */ + + case OFONO_EMULATOR_SLC_CONDITION_CHLD: + if ((em->r_features & HFP_HF_FEATURE_HF_INDICATORS) && + (em->l_features & HFP_HF_FEATURE_HF_INDICATORS)) + return; + /* Fall Through */ + + case OFONO_EMULATOR_SLC_CONDITION_BIND: + ofono_info("SLC reached"); + em->slc = TRUE; + + default: + break; + } +} diff --git a/src/ofono.h b/src/ofono.h index c3423299..bfcb58f5 100644 --- a/src/ofono.h +++ b/src/ofono.h @@ -505,8 +505,17 @@ void __ofono_gprs_provision_free_settings( int count); #include + +enum ofono_emulator_slc_condition { + OFONO_EMULATOR_SLC_CONDITION_CMER, + OFONO_EMULATOR_SLC_CONDITION_CHLD, + OFONO_EMULATOR_SLC_CONDITION_BIND, +}; + void __ofono_emulator_set_indicator_forced(struct ofono_emulator *em, const char *name, int value); +void __ofono_emulator_slc_condition(struct ofono_emulator *em, + enum ofono_emulator_slc_condition cond); #include #include diff --git a/src/voicecall.c b/src/voicecall.c index d11a4cd6..550b79b4 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -3304,6 +3304,10 @@ static void emulator_chld_cb(struct ofono_emulator *em, ofono_emulator_send_info(em, buf, TRUE); result.type = OFONO_ERROR_TYPE_NO_ERROR; + + __ofono_emulator_slc_condition(em, + OFONO_EMULATOR_SLC_CONDITION_CHLD); + break; case OFONO_EMULATOR_REQUEST_TYPE_QUERY: -- cgit v1.2.3