summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2014-01-17 14:37:41 -0600
committerDenis Kenzior <denkenz@gmail.com>2014-10-20 13:40:27 -0500
commit0727da1d5b004da0361f0a807ecbef2339cb35e2 (patch)
treef11627aeda55c6a20a3a707abe3c8d18237aea82 /src
parentd292e0e0ede635b2398f2176a4ddfa01022f0ef3 (diff)
downloadofono-0727da1d5b004da0361f0a807ecbef2339cb35e2.tar.bz2
emulator: Improve SLC establishment logic
Diffstat (limited to 'src')
-rw-r--r--src/emulator.c31
-rw-r--r--src/ofono.h9
-rw-r--r--src/voicecall.c4
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: