Partly implemented unsollicited and intermediate service notifications

This commit is contained in:
Pierre Pronchery 2010-05-10 13:22:49 +00:00
parent efe1a37c46
commit 510ee0fff1
4 changed files with 74 additions and 0 deletions

View File

@ -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)

View File

@ -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 */

View File

@ -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)
{

View File

@ -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 */