Gave triggers the optional possibility to consider a command answered

This commit is contained in:
Pierre Pronchery 2010-05-08 01:45:44 +00:00
parent b64d5b92e3
commit f90494db0b

View File

@ -37,11 +37,14 @@
/* GSM */ /* GSM */
/* private */ /* private */
/* types */ /* types */
typedef int (*GSMTriggerCallback)(GSM * gsm, char const * result,
gboolean * answered);
typedef struct _GSMTrigger typedef struct _GSMTrigger
{ {
char const * trigger; char const * trigger;
size_t trigger_cnt; size_t trigger_cnt;
int (*callback)(GSM * gsm, char const * result); GSMTriggerCallback callback;
} GSMTrigger; } GSMTrigger;
struct _GSM struct _GSM
@ -159,7 +162,8 @@ static int _gsm_queue_push(GSM * gsm);
/* triggers */ /* triggers */
static int _gsm_trigger_cgmm(GSM * gsm, char const * result); static int _gsm_trigger_cgmm(GSM * gsm, char const * result);
static int _gsm_trigger_cme_error(GSM * gsm, char const * result); static int _gsm_trigger_cme_error(GSM * gsm, char const * result,
gboolean * answered);
static int _gsm_trigger_cms_error(GSM * gsm, char const * result); static int _gsm_trigger_cms_error(GSM * gsm, char const * result);
static int _gsm_trigger_cmgl(GSM * gsm, char const * result); static int _gsm_trigger_cmgl(GSM * gsm, char const * result);
static int _gsm_trigger_cmgs(GSM * gsm, char const * result); static int _gsm_trigger_cmgs(GSM * gsm, char const * result);
@ -174,7 +178,8 @@ static int _gsm_trigger_csq(GSM * gsm, char const * result);
static GSMTrigger _gsm_triggers[] = static GSMTrigger _gsm_triggers[] =
{ {
#define GSM_TRIGGER(trigger, callback) \ #define GSM_TRIGGER(trigger, callback) \
{ trigger, sizeof(trigger) - 1, _gsm_trigger_ ## callback } { trigger, sizeof(trigger) - 1, \
(GSMTriggerCallback)_gsm_trigger_ ## callback }
GSM_TRIGGER("+CGMM: ", cgmm), GSM_TRIGGER("+CGMM: ", cgmm),
GSM_TRIGGER("+CME ERROR: ", cme_error), GSM_TRIGGER("+CME ERROR: ", cme_error),
GSM_TRIGGER("+CMS ERROR: ", cms_error), GSM_TRIGGER("+CMS ERROR: ", cms_error),
@ -765,9 +770,8 @@ static int _parse_do(GSM * gsm, size_t * i)
gsm->mode = GSM_MODE_COMMAND; gsm->mode = GSM_MODE_COMMAND;
gsm_modem_set_echo(gsm->modem, FALSE); gsm_modem_set_echo(gsm->modem, FALSE);
gsm_modem_set_verbose(gsm->modem, TRUE); gsm_modem_set_verbose(gsm->modem, TRUE);
#if 0 /* XXX errors are no longer detected as acknowledging a command */ /* XXX should probably not be set by us */
gsm_modem_set_extended_errors(gsm->modem, TRUE); gsm_modem_set_extended_errors(gsm->modem, TRUE);
#endif
gsm_modem_set_extended_ring_reports(gsm->modem, TRUE); gsm_modem_set_extended_ring_reports(gsm->modem, TRUE);
gsm_modem_get_model(gsm->modem); gsm_modem_get_model(gsm->modem);
_gsm_event_set_status(gsm, GSM_STATUS_INITIALIZED); _gsm_event_set_status(gsm, GSM_STATUS_INITIALIZED);
@ -835,7 +839,8 @@ static int _gsm_parse_line(GSM * gsm, char const * line, gboolean * answered)
if(strncmp(line, _gsm_triggers[i].trigger, if(strncmp(line, _gsm_triggers[i].trigger,
_gsm_triggers[i].trigger_cnt) == 0) _gsm_triggers[i].trigger_cnt) == 0)
return _gsm_triggers[i].callback(gsm, return _gsm_triggers[i].callback(gsm,
&line[_gsm_triggers[i].trigger_cnt]); &line[_gsm_triggers[i].trigger_cnt],
answered);
/* XXX look for a potential trigger */ /* XXX look for a potential trigger */
if(gsmc != NULL && (cmd = gsm_command_get_command(gsmc)) != NULL if(gsmc != NULL && (cmd = gsm_command_get_command(gsmc)) != NULL
&& strncmp(cmd, "AT+", 3) == 0 && isupper((c = cmd[3]))) && strncmp(cmd, "AT+", 3) == 0 && isupper((c = cmd[3])))
@ -844,7 +849,8 @@ static int _gsm_parse_line(GSM * gsm, char const * line, gboolean * answered)
j++); j++);
for(i = 0; _gsm_triggers[i].trigger != NULL; i++) for(i = 0; _gsm_triggers[i].trigger != NULL; i++)
if(strncmp(cmd, _gsm_triggers[i].trigger, j) == 0) if(strncmp(cmd, _gsm_triggers[i].trigger, j) == 0)
return _gsm_triggers[i].callback(gsm, line); return _gsm_triggers[i].callback(gsm, line,
answered);
} }
return 1; return 1;
} }
@ -950,7 +956,8 @@ static int _gsm_trigger_cgmm(GSM * gsm, char const * result)
/* gsm_trigger_cme_error */ /* gsm_trigger_cme_error */
static int _gsm_trigger_cme_error(GSM * gsm, char const * result) static int _gsm_trigger_cme_error(GSM * gsm, char const * result,
gboolean * answered)
{ {
int code; int code;
char * p; char * p;
@ -959,6 +966,8 @@ static int _gsm_trigger_cme_error(GSM * gsm, char const * result)
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result); fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result);
#endif #endif
if(answered != NULL)
*answered = TRUE;
code = strtol(result, &p, 10); code = strtol(result, &p, 10);
if(result[0] == '\0' || *p != '\0') if(result[0] == '\0' || *p != '\0')
return 1; return 1;