summaryrefslogtreecommitdiffstats
path: root/drivers/hfpmodem/voicecall.c
diff options
context:
space:
mode:
authorSergio Checa Blanco <sergio.checa@bmw-carit.de>2014-06-20 10:03:51 +0200
committerDenis Kenzior <denkenz@gmail.com>2014-06-21 11:45:44 -0500
commit65be2b344ccf6899c8652adae08c40ce64b79b2f (patch)
tree1e0aadee4d89704af2568199228828a92d864ec4 /drivers/hfpmodem/voicecall.c
parent62c34467a287a6aa8790cf11b6a7c628e358d398 (diff)
downloadofono-65be2b344ccf6899c8652adae08c40ce64b79b2f.tar.bz2
hfpmodem: Split AT+VTS command into multiple +VTS
According to the standard "3GPP 27.007 v6.8.0" Appendix C.2.11, when sending multiple DTMF characters, these must go in individual +VTS commands for each tone. This adopts the AT modem approach. Before: AT+VTS=1234\r After: AT+VTS=1;+VTS=2;+VTS=3;+VTS=4\r
Diffstat (limited to 'drivers/hfpmodem/voicecall.c')
-rw-r--r--drivers/hfpmodem/voicecall.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/hfpmodem/voicecall.c b/drivers/hfpmodem/voicecall.c
index e958fe0d..f16282c1 100644
--- a/drivers/hfpmodem/voicecall.c
+++ b/drivers/hfpmodem/voicecall.c
@@ -654,8 +654,10 @@ static void hfp_send_dtmf(struct ofono_voicecall *vc, const char *dtmf,
{
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
struct change_state_req *req = g_try_new0(struct change_state_req, 1);
+ int len = strlen(dtmf);
char *buf;
int s;
+ int i;
if (req == NULL)
goto error;
@@ -665,12 +667,15 @@ static void hfp_send_dtmf(struct ofono_voicecall *vc, const char *dtmf,
req->data = data;
req->affected_types = 0;
- /* strlen("AT+VTS=) = 7 + NULL */
- buf = g_try_new(char, strlen(dtmf) + 8);
+ /* strlen("AT") + (n-1) * strlen("+VTS=T;") + strlen(+VTS=T) + null */
+ buf = g_try_new(char, len * 7 + 2);
if (buf == NULL)
goto error;
- sprintf(buf, "AT+VTS=%s", dtmf);
+ s = sprintf(buf, "AT+VTS=%c", dtmf[0]);
+
+ for (i = 1; i < len; i++)
+ s += sprintf(buf + s, ";+VTS=%c", dtmf[i]);
s = g_at_chat_send(vd->chat, buf, none_prefix,
generic_cb, req, g_free);