From 65be2b344ccf6899c8652adae08c40ce64b79b2f Mon Sep 17 00:00:00 2001 From: Sergio Checa Blanco Date: Fri, 20 Jun 2014 10:03:51 +0200 Subject: 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 --- drivers/hfpmodem/voicecall.c | 11 ++++++++--- 1 file 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); -- cgit v1.2.3