diff options
author | Denis Kenzior <denkenz@gmail.com> | 2014-01-17 14:37:41 -0600 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2014-10-20 13:40:27 -0500 |
commit | 0727da1d5b004da0361f0a807ecbef2339cb35e2 (patch) | |
tree | f11627aeda55c6a20a3a707abe3c8d18237aea82 /src | |
parent | d292e0e0ede635b2398f2176a4ddfa01022f0ef3 (diff) | |
download | ofono-0727da1d5b004da0361f0a807ecbef2339cb35e2.tar.bz2 |
emulator: Improve SLC establishment logic
Diffstat (limited to 'src')
-rw-r--r-- | src/emulator.c | 31 | ||||
-rw-r--r-- | src/ofono.h | 9 | ||||
-rw-r--r-- | src/voicecall.c | 4 |
3 files changed, 43 insertions, 1 deletions
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 <ofono/emulator.h> + +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 <ofono/gnss.h> #include <ofono/cdma-sms.h> 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: |