Avoid errors while handling call waiting control

This commit is contained in:
Pierre Pronchery 2010-05-21 09:32:42 +00:00
parent 5b40259bdf
commit 058621c2b2
5 changed files with 44 additions and 28 deletions

View File

@ -377,11 +377,11 @@ int gsm_set_call_presentation(GSM * gsm, int set)
} }
/* gsm_set_call_waiting */ /* gsm_set_call_waiting_control */
int gsm_set_call_waiting(GSM * gsm, int unsollicited, int mode) int gsm_set_call_waiting_control(GSM * gsm, int unsollicited)
{ {
return gsm_modem_set_call_waiting(gsm->modem, (unsollicited != 0) ? TRUE return gsm_modem_set_call_waiting_control(gsm->modem,
: FALSE, (mode != 0) ? TRUE : FALSE); (unsollicited != 0) ? TRUE : FALSE);
} }
@ -549,6 +549,10 @@ int gsm_event(GSM * gsm, GSMEventType type, ...)
event->call_presentation.format = va_arg(ap, event->call_presentation.format = va_arg(ap,
unsigned int); unsigned int);
break; break;
case GSM_EVENT_TYPE_CALL_WAITING:
event->call_waiting_control.unsollicited = va_arg(ap,
unsigned int);
break;
case GSM_EVENT_TYPE_CONTACT: case GSM_EVENT_TYPE_CONTACT:
event->contact.index = va_arg(ap, unsigned int); event->contact.index = va_arg(ap, unsigned int);
event->contact.name = va_arg(ap, char const *); event->contact.name = va_arg(ap, char const *);
@ -684,10 +688,10 @@ int gsm_is_alive(GSM * gsm)
} }
/* gsm_is_call_waiting */ /* gsm_is_call_waiting_control */
int gsm_is_call_waiting(GSM * gsm) int gsm_is_call_waiting_control(GSM * gsm)
{ {
return gsm_modem_is_call_waiting(gsm->modem); return gsm_modem_is_call_waiting_control(gsm->modem);
} }
@ -1160,8 +1164,11 @@ static int _gsm_trigger_ccwa(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
/* FIXME implement */ if(sscanf(result, "%u", &gsm->event.call_waiting_control.unsollicited)
return 1; == 1)
return _gsm_event_send(gsm, GSM_EVENT_TYPE_CALL_WAITING);
return gsm_event(gsm, GSM_EVENT_TYPE_ERROR,
GSM_ERROR_CALL_WAITING_FAILED, result);
} }

View File

@ -48,6 +48,7 @@ typedef enum _GSMEventType
GSM_EVENT_TYPE_ERROR = 0, GSM_EVENT_TYPE_ERROR = 0,
GSM_EVENT_TYPE_BATTERY_CHARGE, GSM_EVENT_TYPE_BATTERY_CHARGE,
GSM_EVENT_TYPE_CALL_PRESENTATION, GSM_EVENT_TYPE_CALL_PRESENTATION,
GSM_EVENT_TYPE_CALL_WAITING,
GSM_EVENT_TYPE_CONTACT, GSM_EVENT_TYPE_CONTACT,
GSM_EVENT_TYPE_CONTACT_LIST, GSM_EVENT_TYPE_CONTACT_LIST,
GSM_EVENT_TYPE_FUNCTIONAL, GSM_EVENT_TYPE_FUNCTIONAL,
@ -198,6 +199,13 @@ typedef union _GSMEvent
unsigned int format; unsigned int format;
} call_presentation; } call_presentation;
/* GSM_EVENT_TYPE_CALL_WAITING_CONTROL */
struct
{
GSMEventType type;
unsigned int unsollicited;
} call_waiting_control;
/* GSM_EVENT_TYPE_CONTACT */ /* GSM_EVENT_TYPE_CONTACT */
struct struct
{ {
@ -317,7 +325,7 @@ void gsm_set_callback(GSM * gsm, GSMCallback callback, gpointer data);
unsigned int gsm_get_retry(GSM * gsm); unsigned int gsm_get_retry(GSM * gsm);
int gsm_set_call_presentation(GSM * gsm, int set); int gsm_set_call_presentation(GSM * gsm, int set);
int gsm_set_call_waiting(GSM * gsm, int unsollicited, int mode); int gsm_set_call_waiting_control(GSM * gsm, int unsollicited);
int gsm_set_extended_ring_reports(GSM * gsm, int extended); int gsm_set_extended_ring_reports(GSM * gsm, int extended);
int gsm_set_functional(GSM * gsm, int functional); int gsm_set_functional(GSM * gsm, int functional);
int gsm_set_line_presentation(GSM * gsm, int set); int gsm_set_line_presentation(GSM * gsm, int set);
@ -355,7 +363,7 @@ int gsm_fetch_signal_level(GSM * gsm);
/* queries */ /* queries */
int gsm_is_alive(GSM * gsm); int gsm_is_alive(GSM * gsm);
int gsm_is_call_waiting(GSM * gsm); int gsm_is_call_waiting_control(GSM * gsm);
int gsm_is_functional(GSM * gsm); int gsm_is_functional(GSM * gsm);
int gsm_is_mute(GSM * gsm); int gsm_is_mute(GSM * gsm);
int gsm_is_phone_active(GSM * gsm); int gsm_is_phone_active(GSM * gsm);

View File

@ -351,10 +351,10 @@ int gsm_modem_is_alive(GSMModem * gsmm)
} }
/* gsm_modem_is_call_waiting */ /* gsm_modem_is_call_waiting_control */
int gsm_modem_is_call_waiting(GSMModem * gsmm) int gsm_modem_is_call_waiting_control(GSMModem * gsmm)
{ {
char const cmd[] = "AT+CCWA"; char const cmd[] = "AT+CCWA?";
return (gsm_queue(gsmm->gsm, cmd) != NULL) ? 0 : 1; return (gsm_queue(gsmm->gsm, cmd) != NULL) ? 0 : 1;
} }
@ -581,25 +581,23 @@ int gsm_modem_set_call_presentation(GSMModem * gsmm, gboolean set)
} }
/* gsm_modem_set_call_waiting */ /* gsm_modem_set_call_waiting_control */
static void _modem_set_call_waiting_callback(GSM * gsm); static void _modem_set_call_waiting_control_callback(GSM * gsm);
int gsm_modem_set_call_waiting(GSMModem * gsmm, gboolean unsollicited, int gsm_modem_set_call_waiting_control(GSMModem * gsmm, gboolean unsollicited)
gboolean mode)
{ {
char cmd[] = "AT+CCWA=X,X"; char cmd[] = "AT+CCWA=X";
cmd[8] = unsollicited ? '1' : '0'; cmd[8] = unsollicited ? '1' : '0';
cmd[10] = mode ? '1' : '0';
return gsm_queue_full(gsmm->gsm, GSM_PRIORITY_NORMAL, cmd, return gsm_queue_full(gsmm->gsm, GSM_PRIORITY_NORMAL, cmd,
GSM_ERROR_CALL_WAITING_FAILED, GSM_ERROR_CALL_WAITING_FAILED,
_modem_set_call_waiting_callback); _modem_set_call_waiting_control_callback);
} }
static void _modem_set_call_waiting_callback(GSM * gsm) static void _modem_set_call_waiting_control_callback(GSM * gsm)
{ {
/* did it really work? */ /* did it really work? */
gsm_is_call_waiting(gsm); gsm_is_call_waiting_control(gsm);
} }

View File

@ -63,7 +63,7 @@ int gsm_modem_get_registration(GSMModem * gsmm);
int gsm_modem_get_signal_level(GSMModem * gsmm); int gsm_modem_get_signal_level(GSMModem * gsmm);
int gsm_modem_is_alive(GSMModem * gsmm); int gsm_modem_is_alive(GSMModem * gsmm);
int gsm_modem_is_call_waiting(GSMModem * gsmm); int gsm_modem_is_call_waiting_control(GSMModem * gsmm);
int gsm_modem_is_functional(GSMModem * gsmm); int gsm_modem_is_functional(GSMModem * gsmm);
int gsm_modem_is_mute(GSMModem * gsmm); int gsm_modem_is_mute(GSMModem * gsmm);
int gsm_modem_is_phone_active(GSMModem * gsmm); int gsm_modem_is_phone_active(GSMModem * gsmm);
@ -77,8 +77,7 @@ int gsm_modem_send_message(GSMModem * gsmm, char const * number,
char const * text); char const * text);
int gsm_modem_set_call_presentation(GSMModem * gsmm, gboolean set); int gsm_modem_set_call_presentation(GSMModem * gsmm, gboolean set);
int gsm_modem_set_call_waiting(GSMModem * gsmm, gboolean unsollicited, int gsm_modem_set_call_waiting_control(GSMModem * gsmm, gboolean unsollicited);
gboolean mode);
int gsm_modem_set_echo(GSMModem * gsmm, gboolean echo); int gsm_modem_set_echo(GSMModem * gsmm, gboolean echo);
int gsm_modem_set_extended_errors(GSMModem * gsmm, gboolean extended); int gsm_modem_set_extended_errors(GSMModem * gsmm, gboolean extended);
int gsm_modem_set_extended_ring_reports(GSMModem * gsmm, gboolean extended); int gsm_modem_set_extended_ring_reports(GSMModem * gsmm, gboolean extended);

View File

@ -1206,6 +1206,7 @@ static struct
{ "Alive", gsm_is_alive }, { "Alive", gsm_is_alive },
{ "Answer call", gsm_call_answer }, { "Answer call", gsm_call_answer },
{ "Battery charge", gsm_fetch_battery_charge }, { "Battery charge", gsm_fetch_battery_charge },
{ "Call waiting control", gsm_is_call_waiting_control },
{ "Contact list", gsm_fetch_contact_list }, { "Contact list", gsm_fetch_contact_list },
{ "Disable phone", _gsm_set_functional_disable }, { "Disable phone", _gsm_set_functional_disable },
{ "Enable phone", _gsm_set_functional_enable }, { "Enable phone", _gsm_set_functional_enable },
@ -2200,6 +2201,10 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data)
phone_show_call(phone, TRUE, PHONE_CALL_INCOMING, "", phone_show_call(phone, TRUE, PHONE_CALL_INCOMING, "",
event->call_presentation.number); event->call_presentation.number);
return 0; return 0;
case GSM_EVENT_TYPE_CALL_WAITING:
if(event->call_waiting_control.unsollicited == 0)
gsm_set_call_waiting_control(phone->gsm, TRUE);
return 0;
case GSM_EVENT_TYPE_CONTACT: case GSM_EVENT_TYPE_CONTACT:
phone_contacts_set(phone, event->contact.index, phone_contacts_set(phone, event->contact.index,
event->contact.name, event->contact.name,
@ -2216,14 +2221,13 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data)
return 0; return 0;
} }
gsm_set_call_presentation(phone->gsm, TRUE); gsm_set_call_presentation(phone->gsm, TRUE);
/* FIXME sometimes this fails (check it first) */
gsm_set_call_waiting(phone->gsm, TRUE, TRUE);
gsm_set_extended_ring_reports(phone->gsm, TRUE); gsm_set_extended_ring_reports(phone->gsm, TRUE);
gsm_set_operator_mode(phone->gsm, gsm_set_operator_mode(phone->gsm,
GSM_OPERATOR_MODE_AUTOMATIC); GSM_OPERATOR_MODE_AUTOMATIC);
gsm_set_registration_report(phone->gsm, report); gsm_set_registration_report(phone->gsm, report);
gsm_set_supplementary_service_notifications(phone->gsm, gsm_set_supplementary_service_notifications(phone->gsm,
TRUE, TRUE); TRUE, TRUE);
gsm_is_call_waiting_control(phone->gsm);
gsm_is_phone_active(phone->gsm); gsm_is_phone_active(phone->gsm);
#ifndef DEBUG #ifndef DEBUG
_phone_track(phone, PHONE_TRACK_CONTACT_LIST, TRUE); _phone_track(phone, PHONE_TRACK_CONTACT_LIST, TRUE);