Automatically repeat some commands upon (seemingly) recoverable errors
This commit is contained in:
parent
89c37f477d
commit
524c75eee8
@ -72,6 +72,7 @@ typedef struct _Hayes
|
|||||||
/* queue */
|
/* queue */
|
||||||
HayesMode mode;
|
HayesMode mode;
|
||||||
GSList * queue;
|
GSList * queue;
|
||||||
|
GSList * queue_timeout;
|
||||||
|
|
||||||
/* internal */
|
/* internal */
|
||||||
ModemEvent events[MODEM_EVENT_TYPE_COUNT];
|
ModemEvent events[MODEM_EVENT_TYPE_COUNT];
|
||||||
@ -276,6 +277,7 @@ static int _hayes_command_answer_append(HayesCommand * command,
|
|||||||
static HayesCommandStatus _hayes_command_callback(HayesCommand * command);
|
static HayesCommandStatus _hayes_command_callback(HayesCommand * command);
|
||||||
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
|
static gboolean _on_queue_timeout(gpointer data);
|
||||||
static gboolean _on_reset(gpointer data);
|
static gboolean _on_reset(gpointer data);
|
||||||
static gboolean _on_timeout(gpointer data);
|
static gboolean _on_timeout(gpointer data);
|
||||||
static gboolean _on_watch_can_read(GIOChannel * source, GIOCondition condition,
|
static gboolean _on_watch_can_read(GIOChannel * source, GIOCondition condition,
|
||||||
@ -1578,6 +1580,10 @@ static void _hayes_queue_flush(ModemPlugin * modem)
|
|||||||
{
|
{
|
||||||
Hayes * hayes = modem->priv;
|
Hayes * hayes = modem->priv;
|
||||||
|
|
||||||
|
g_slist_foreach(hayes->queue_timeout, (GFunc)_hayes_command_delete,
|
||||||
|
NULL);
|
||||||
|
g_slist_free(hayes->queue_timeout);
|
||||||
|
hayes->queue_timeout = NULL;
|
||||||
g_slist_foreach(hayes->queue, (GFunc)_hayes_command_delete, NULL);
|
g_slist_foreach(hayes->queue, (GFunc)_hayes_command_delete, NULL);
|
||||||
g_slist_free(hayes->queue);
|
g_slist_free(hayes->queue);
|
||||||
hayes->queue = NULL;
|
hayes->queue = NULL;
|
||||||
@ -1930,6 +1936,25 @@ static HayesCommandStatus _hayes_command_callback(HayesCommand * command)
|
|||||||
|
|
||||||
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
|
/* on_queue_timeout */
|
||||||
|
static gboolean _on_queue_timeout(gpointer data)
|
||||||
|
{
|
||||||
|
ModemPlugin * modem = data;
|
||||||
|
Hayes * hayes = modem->priv;
|
||||||
|
HayesCommand * command;
|
||||||
|
|
||||||
|
hayes->source = 0;
|
||||||
|
if(hayes->queue_timeout == NULL) /* nothing to send */
|
||||||
|
return FALSE;
|
||||||
|
command = hayes->queue_timeout->data;
|
||||||
|
_hayes_queue_command(modem, command);
|
||||||
|
hayes->queue_timeout = g_slist_remove(hayes->queue_timeout, command);
|
||||||
|
if(hayes->queue_timeout != NULL)
|
||||||
|
hayes->source = g_timeout_add(2000, _on_queue_timeout, modem);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* on_reset */
|
/* on_reset */
|
||||||
static int _reset_open(ModemPlugin * modem);
|
static int _reset_open(ModemPlugin * modem);
|
||||||
static int _reset_configure(ModemPlugin * modem, char const * device, int fd);
|
static int _reset_configure(ModemPlugin * modem, char const * device, int fd);
|
||||||
@ -2973,6 +2998,7 @@ static void _on_trigger_cme_error(ModemPlugin * modem, char const * answer)
|
|||||||
HayesCommand * command = (hayes->queue != NULL) ? hayes->queue->data
|
HayesCommand * command = (hayes->queue != NULL) ? hayes->queue->data
|
||||||
: NULL;
|
: NULL;
|
||||||
unsigned int u;
|
unsigned int u;
|
||||||
|
HayesCommand * p;
|
||||||
|
|
||||||
if(command != NULL)
|
if(command != NULL)
|
||||||
_hayes_command_set_status(command, HCS_ERROR);
|
_hayes_command_set_status(command, HCS_ERROR);
|
||||||
@ -2985,11 +3011,17 @@ static void _on_trigger_cme_error(ModemPlugin * modem, char const * answer)
|
|||||||
_hayes_trigger(modem, MODEM_EVENT_TYPE_AUTHENTICATION);
|
_hayes_trigger(modem, MODEM_EVENT_TYPE_AUTHENTICATION);
|
||||||
break;
|
break;
|
||||||
case 14: /* SIM busy */
|
case 14: /* SIM busy */
|
||||||
#if 0
|
if(command == NULL)
|
||||||
/* FIXME should wait a bit first */
|
break;
|
||||||
_hayes_queue_command_full(modem, command->attention,
|
if((p = _hayes_command_new(command->attention)) == NULL)
|
||||||
command->callback);
|
break;
|
||||||
#endif
|
_hayes_command_set_callback(p, command->callback,
|
||||||
|
command->priv);
|
||||||
|
hayes->queue_timeout = g_slist_append(
|
||||||
|
hayes->queue_timeout, p);
|
||||||
|
if(hayes->source == 0)
|
||||||
|
hayes->source = g_timeout_add(2000,
|
||||||
|
_on_queue_timeout, modem);
|
||||||
break;
|
break;
|
||||||
default: /* FIXME implement the rest */
|
default: /* FIXME implement the rest */
|
||||||
case 4: /* operation not supported */
|
case 4: /* operation not supported */
|
||||||
@ -3370,6 +3402,7 @@ static void _on_trigger_cms_error(ModemPlugin * modem, char const * answer)
|
|||||||
HayesCommand * command = (hayes->queue != NULL) ? hayes->queue->data
|
HayesCommand * command = (hayes->queue != NULL) ? hayes->queue->data
|
||||||
: NULL;
|
: NULL;
|
||||||
unsigned int u;
|
unsigned int u;
|
||||||
|
HayesCommand * p;
|
||||||
|
|
||||||
if(command != NULL)
|
if(command != NULL)
|
||||||
_hayes_command_set_status(command, HCS_ERROR);
|
_hayes_command_set_status(command, HCS_ERROR);
|
||||||
@ -3381,6 +3414,20 @@ static void _on_trigger_cms_error(ModemPlugin * modem, char const * answer)
|
|||||||
case 316: /* SIM PUK required */
|
case 316: /* SIM PUK required */
|
||||||
_hayes_trigger(modem, MODEM_EVENT_TYPE_AUTHENTICATION);
|
_hayes_trigger(modem, MODEM_EVENT_TYPE_AUTHENTICATION);
|
||||||
break;
|
break;
|
||||||
|
case 500: /* unknown error */
|
||||||
|
/* FIXME duplicated from _on_trigger_cme_error() */
|
||||||
|
if(command == NULL)
|
||||||
|
break;
|
||||||
|
if((p = _hayes_command_new(command->attention)) == NULL)
|
||||||
|
break;
|
||||||
|
_hayes_command_set_callback(p, command->callback,
|
||||||
|
command->priv);
|
||||||
|
hayes->queue_timeout = g_slist_append(
|
||||||
|
hayes->queue_timeout, p);
|
||||||
|
if(hayes->source == 0)
|
||||||
|
hayes->source = g_timeout_add(2000,
|
||||||
|
_on_queue_timeout, modem);
|
||||||
|
break;
|
||||||
default: /* FIXME implement the rest */
|
default: /* FIXME implement the rest */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user