From 510ee0fff16c56fc6932b876e4b78a4b22732c74 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 10 May 2010 13:22:49 +0000 Subject: [PATCH] Partly implemented unsollicited and intermediate service notifications --- src/gsm.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/gsm.h | 2 ++ src/modem.c | 12 +++++++++++ src/modem.h | 2 ++ 4 files changed, 74 insertions(+) diff --git a/src/gsm.c b/src/gsm.c index 4805565..153d2eb 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -178,6 +178,8 @@ static int _gsm_trigger_cpbr(GSM * gsm, char const * result); static int _gsm_trigger_cpin(GSM * gsm, char const * result); static int _gsm_trigger_creg(GSM * gsm, char const * result); static int _gsm_trigger_cring(GSM * gsm, char const * result); +static int _gsm_trigger_cssi(GSM * gsm, char const * result); +static int _gsm_trigger_cssu(GSM * gsm, char const * result); static int _gsm_trigger_csq(GSM * gsm, char const * result); static int _gsm_trigger_no_answer(GSM * gsm, char const * result, gboolean * answered); @@ -209,6 +211,8 @@ static GSMTrigger _gsm_triggers[] = GSM_TRIGGER("+CREG: ", creg), GSM_TRIGGER("+CRING: ", cring), GSM_TRIGGER("+CSQ: ", csq), + GSM_TRIGGER("+CSSI: ", cssi), + GSM_TRIGGER("+CSSU: ", cssu), GSM_TRIGGER("NO ANSWER", no_answer), GSM_TRIGGER("NO CARRIER", no_carrier), GSM_TRIGGER("NO DIALTONE", no_dialtone), @@ -423,6 +427,21 @@ int gsm_set_retry(GSM * gsm, unsigned int retry) } +/* gsm_set_supplementary_service_notifications */ +int gsm_set_supplementary_service_notifications(GSM * gsm, int intermediate, + int unsollicited) +{ +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(%s, %s)\n", __func__, (intermediate != 0) + ? "TRUE" : "FALSE", (unsollicited != 0) ? "TRUE" + : "FALSE"); +#endif + return gsm_modem_set_supplementary_service_notifications(gsm->modem, + (intermediate != 0) ? TRUE : FALSE, + (unsollicited != 0) ? TRUE : FALSE); +} + + /* useful */ /* gsm_call */ int gsm_call(GSM * gsm, GSMCallType calltype, char const * number) @@ -857,6 +876,8 @@ static int _parse_do(GSM * gsm, size_t * i) gsm_modem_set_extended_errors(gsm->modem, TRUE); gsm_modem_set_extended_ring_reports(gsm->modem, TRUE); gsm_modem_set_call_presentation(gsm->modem, TRUE); + gsm_modem_set_supplementary_service_notifications(gsm->modem, + TRUE, TRUE); gsm_modem_get_model(gsm->modem); _gsm_event_set_status(gsm, GSM_STATUS_INITIALIZED); _gsm_queue_push(gsm); @@ -1377,6 +1398,43 @@ static int _gsm_trigger_csq(GSM * gsm, char const * result) } +/* gsm_trigger_cssi */ +static int _gsm_trigger_cssi(GSM * gsm, char const * result) +{ + unsigned int i; + unsigned int index = 10; /* XXX not used */ + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result); +#endif + if(sscanf(result, "%u,%u", &i, &index) < 1) + return 1; + if(i == 1) /* FIXME implement the rest */ + i = GSM_PHONE_ACTIVITY_CALL; + else + i = GSM_PHONE_ACTIVITY_UNKNOWN; + return gsm_event(gsm, GSM_EVENT_TYPE_PHONE_ACTIVITY, i); +} + + +/* gsm_trigger_cssu */ +static int _gsm_trigger_cssu(GSM * gsm, char const * result) +{ + unsigned int code; + unsigned int index = 10; + char number[32]; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result); +#endif + if(sscanf(result, "%u,%u,\"%31[^\"]\"", &code, &index, number) < 1) + return 1; + number[sizeof(number) - 1] = '\0'; + /* FIXME implement */ + return 1; +} + + /* gsm_trigger_no_answer */ static int _gsm_trigger_no_answer(GSM * gsm, char const * result, gboolean * answered) diff --git a/src/gsm.h b/src/gsm.h index a253b50..f6aa193 100644 --- a/src/gsm.h +++ b/src/gsm.h @@ -275,6 +275,8 @@ int gsm_set_operator_format(GSM * gsm, GSMOperatorFormat format); int gsm_set_operator_mode(GSM * gsm, GSMOperatorMode mode); int gsm_set_registration_report(GSM * gsm, GSMRegistrationReport report); int gsm_set_retry(GSM * gsm, unsigned int retry); +int gsm_set_supplementary_service_notifications(GSM * gsm, int intermediate, + int unsollicited); /* useful */ /* call management */ diff --git a/src/modem.c b/src/modem.c index 106249b..6dfdc5f 100644 --- a/src/modem.c +++ b/src/modem.c @@ -676,6 +676,18 @@ int gsm_modem_set_registration_report(GSMModem * gsmm, } +/* gsm_modem_set_supplementary_service_notifications */ +int gsm_modem_set_supplementary_service_notifications(GSMModem * gsmm, + gboolean intermediate, gboolean unsollicited) +{ + char cmd[] = "AT+CSSN=X,X"; + + cmd[8] = intermediate ? '1' : '0'; + cmd[10] = unsollicited ? '1' : '0'; + return (gsm_queue(gsmm->gsm, cmd) != NULL) ? 0 : 1; +} + + /* gsm_modem_set_verbose */ int gsm_modem_set_verbose(GSMModem * gsmm, gboolean verbose) { diff --git a/src/modem.h b/src/modem.h index b4ab2b4..5bb90dc 100644 --- a/src/modem.h +++ b/src/modem.h @@ -84,6 +84,8 @@ int gsm_modem_set_operator_format(GSMModem * gsmm, GSMOperatorFormat format); int gsm_modem_set_operator_mode(GSMModem * gsmm, GSMOperatorMode mode); int gsm_modem_set_registration_report(GSMModem * gsmm, GSMRegistrationReport report); +int gsm_modem_set_supplementary_service_notifications(GSMModem * gsmm, + gboolean intermediate, gboolean unsollicited); int gsm_modem_set_verbose(GSMModem * gsmm, gboolean verbose); #endif /* !PHONE_MODEM_H */