Handling extended errors and improved feedback on registrations

This commit is contained in:
Pierre Pronchery 2011-11-03 15:48:45 +00:00
parent 4a48c51c08
commit aa21e237a1

View File

@ -364,6 +364,7 @@ static void _on_trigger_creg(ModemPlugin * modem, char const * answer);
static void _on_trigger_cring(ModemPlugin * modem, char const * answer); static void _on_trigger_cring(ModemPlugin * modem, char const * answer);
static void _on_trigger_csq(ModemPlugin * modem, char const * answer); static void _on_trigger_csq(ModemPlugin * modem, char const * answer);
static void _on_trigger_cusd(ModemPlugin * modem, char const * answer); static void _on_trigger_cusd(ModemPlugin * modem, char const * answer);
static void _on_trigger_ext_error(ModemPlugin * modem, char const * answer);
/* helpers */ /* helpers */
static int _is_figure(int c); static int _is_figure(int c);
@ -604,6 +605,7 @@ static HayesTriggerHandler _hayes_trigger_handlers[] =
{ "+CRING", _on_trigger_cring }, { "+CRING", _on_trigger_cring },
{ "+CSQ", _on_trigger_csq }, { "+CSQ", _on_trigger_csq },
{ "+CUSD", _on_trigger_cusd }, { "+CUSD", _on_trigger_cusd },
{ "+EXT ERROR", _on_trigger_ext_error },
{ "BUSY", _on_trigger_call_error }, { "BUSY", _on_trigger_call_error },
{ "CONNECT", _on_trigger_connect }, { "CONNECT", _on_trigger_connect },
{ "NO CARRIER", _on_trigger_call_error }, { "NO CARRIER", _on_trigger_call_error },
@ -2795,6 +2797,8 @@ static HayesCommandStatus _on_request_registration_automatic(
if((status = _on_request_generic(command, status, priv)) != HCS_SUCCESS) if((status = _on_request_generic(command, status, priv)) != HCS_SUCCESS)
return status; return status;
event->registration.mode = MODEM_REGISTRATION_MODE_AUTOMATIC; event->registration.mode = MODEM_REGISTRATION_MODE_AUTOMATIC;
event->registration.status = MODEM_REGISTRATION_STATUS_SEARCHING;
modem->helper->event(modem->helper->modem, event);
/* force a registration status */ /* force a registration status */
_hayes_request_type(modem, HAYES_REQUEST_REGISTRATION); _hayes_request_type(modem, HAYES_REQUEST_REGISTRATION);
return status; return status;
@ -2981,6 +2985,8 @@ static void _on_trigger_cgatt(ModemPlugin * modem, char const * answer)
else else
hayes->registration_media = NULL; hayes->registration_media = NULL;
event->registration.media = hayes->registration_media; event->registration.media = hayes->registration_media;
/* this is usually worth an event */
modem->helper->event(modem->helper->modem, event);
} }
@ -3672,18 +3678,23 @@ static void _on_trigger_cops(ModemPlugin * modem, char const * answer)
break; break;
} }
event->registration.mode = u; event->registration.mode = u;
free(hayes->registration_operator);
hayes->registration_operator = NULL;
event->registration._operator = NULL;
if(v != 0) if(v != 0)
/* force alphanumeric format */ /* force alphanumeric format */
_hayes_request_type(modem, HAYES_REQUEST_OPERATOR_FORMAT_LONG); _hayes_request_type(modem, HAYES_REQUEST_OPERATOR_FORMAT_LONG);
else else
{ {
buf[sizeof(buf) - 1] = '\0'; buf[sizeof(buf) - 1] = '\0';
free(hayes->registration_operator);
hayes->registration_operator = strdup(buf); hayes->registration_operator = strdup(buf);
event->registration._operator = hayes->registration_operator; event->registration._operator = hayes->registration_operator;
}
/* refresh registration data */
_hayes_request_type(modem, MODEM_REQUEST_SIGNAL_LEVEL);
_hayes_request_type(modem, HAYES_REQUEST_GPRS_ATTACHED);
/* this is usually worth an event */ /* this is usually worth an event */
modem->helper->event(modem->helper->modem, event); modem->helper->event(modem->helper->modem, event);
}
} }
@ -3868,9 +3879,7 @@ static void _on_trigger_creg(ModemPlugin * modem, char const * answer)
{ {
case MODEM_REGISTRATION_STATUS_REGISTERED: case MODEM_REGISTRATION_STATUS_REGISTERED:
/* refresh registration data */ /* refresh registration data */
_hayes_request_type(modem, HAYES_REQUEST_GPRS_ATTACHED);
_hayes_request_type(modem, HAYES_REQUEST_OPERATOR); _hayes_request_type(modem, HAYES_REQUEST_OPERATOR);
_hayes_request_type(modem, MODEM_REQUEST_SIGNAL_LEVEL);
break; break;
default: default:
free(hayes->registration_media); free(hayes->registration_media);
@ -3880,10 +3889,10 @@ static void _on_trigger_creg(ModemPlugin * modem, char const * answer)
hayes->registration_operator = NULL; hayes->registration_operator = NULL;
event->registration._operator = NULL; event->registration._operator = NULL;
event->registration.signal = 0.0 / 0.0; event->registration.signal = 0.0 / 0.0;
/* this is usually an unsollicited event */
modem->helper->event(modem->helper->modem, event);
break; break;
} }
/* this is usually an unsollicited event */
modem->helper->event(modem->helper->modem, event);
} }
@ -3935,6 +3944,29 @@ static void _on_trigger_cusd(ModemPlugin * modem, char const * answer)
} }
/* on_trigger_ext_error */
static void _on_trigger_ext_error(ModemPlugin * modem, char const * answer)
{
ModemPluginHelper * helper = modem->helper;
Hayes * hayes = modem->priv;
/* XXX ugly */
HayesCommand * command = (hayes->queue != NULL) ? hayes->queue->data
: NULL;
unsigned int u;
if(command != NULL)
_hayes_command_set_status(command, HCS_ERROR);
if(sscanf(answer, "%u", &u) != 1)
return;
switch(u)
{
case 0:
default: /* FIXME implement */
break;
}
}
/* helpers */ /* helpers */
/* is_figure */ /* is_figure */
static int _is_figure(int c) static int _is_figure(int c)