Partly implemented unsollicited and intermediate service notifications
This commit is contained in:
parent
efe1a37c46
commit
510ee0fff1
58
src/gsm.c
58
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)
|
||||
|
@ -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 */
|
||||
|
12
src/modem.c
12
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)
|
||||
{
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user