Gave triggers the optional possibility to consider a command answered
This commit is contained in:
parent
b64d5b92e3
commit
f90494db0b
25
src/gsm.c
25
src/gsm.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user