mirror of git://git.sysmocom.de/ofono
gemalto: handle sim is inserted or removed URCs
This commit is contained in:
parent
501de60ec0
commit
1c83dc18c4
|
@ -147,6 +147,67 @@ static GAtChat *open_device(const char *device)
|
||||||
return chat;
|
return chat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sim_ready_cb(gboolean present, gpointer user_data)
|
||||||
|
{
|
||||||
|
struct ofono_modem *modem = user_data;
|
||||||
|
struct gemalto_data *data = ofono_modem_get_data(modem);
|
||||||
|
struct ofono_sim *sim = data->sim;
|
||||||
|
|
||||||
|
at_util_sim_state_query_free(data->sim_state_query);
|
||||||
|
data->sim_state_query = NULL;
|
||||||
|
|
||||||
|
DBG("sim present: %d", present);
|
||||||
|
|
||||||
|
ofono_sim_inserted_notify(sim, present);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gemalto_ciev_notify(GAtResult *result, gpointer user_data)
|
||||||
|
{
|
||||||
|
struct ofono_modem *modem = user_data;
|
||||||
|
struct gemalto_data *data = ofono_modem_get_data(modem);
|
||||||
|
struct ofono_sim *sim = data->sim;
|
||||||
|
|
||||||
|
const char *sim_status = "simstatus";
|
||||||
|
const char *ind_str;
|
||||||
|
int status;
|
||||||
|
GAtResultIter iter;
|
||||||
|
|
||||||
|
g_at_result_iter_init(&iter, result);
|
||||||
|
|
||||||
|
/* Example: +CIEV: simstatus,<status> */
|
||||||
|
if (!g_at_result_iter_next(&iter, "+CIEV:"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!g_at_result_iter_next_unquoted_string(&iter, &ind_str))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!g_str_equal(sim_status, ind_str))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!g_at_result_iter_next_number(&iter, &status))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DBG("sim status %d", status);
|
||||||
|
|
||||||
|
switch (status) {
|
||||||
|
/* SIM is removed from the holder */
|
||||||
|
case 0:
|
||||||
|
ofono_sim_inserted_notify(sim, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* SIM is inserted inside the holder */
|
||||||
|
case 1:
|
||||||
|
/* The SIM won't be ready yet */
|
||||||
|
data->sim_state_query = at_util_sim_state_query_new(data->app,
|
||||||
|
1, 20, sim_ready_cb, modem,
|
||||||
|
NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void sim_state_cb(gboolean present, gpointer user_data)
|
static void sim_state_cb(gboolean present, gpointer user_data)
|
||||||
{
|
{
|
||||||
struct ofono_modem *modem = user_data;
|
struct ofono_modem *modem = user_data;
|
||||||
|
@ -157,6 +218,13 @@ static void sim_state_cb(gboolean present, gpointer user_data)
|
||||||
|
|
||||||
data->have_sim = present;
|
data->have_sim = present;
|
||||||
ofono_modem_set_powered(modem, TRUE);
|
ofono_modem_set_powered(modem, TRUE);
|
||||||
|
|
||||||
|
/* Register for specific sim status reports */
|
||||||
|
g_at_chat_register(data->app, "+CIEV:",
|
||||||
|
gemalto_ciev_notify, FALSE, modem, NULL);
|
||||||
|
|
||||||
|
g_at_chat_send(data->app, "AT^SIND=\"simstatus\",1", none_prefix,
|
||||||
|
NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
|
static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
|
||||||
|
@ -492,17 +560,16 @@ static void gemalto_set_online(struct ofono_modem *modem, ofono_bool_t online,
|
||||||
static void gemalto_pre_sim(struct ofono_modem *modem)
|
static void gemalto_pre_sim(struct ofono_modem *modem)
|
||||||
{
|
{
|
||||||
struct gemalto_data *data = ofono_modem_get_data(modem);
|
struct gemalto_data *data = ofono_modem_get_data(modem);
|
||||||
struct ofono_sim *sim;
|
|
||||||
|
|
||||||
DBG("%p", modem);
|
DBG("%p", modem);
|
||||||
|
|
||||||
ofono_devinfo_create(modem, 0, "atmodem", data->app);
|
ofono_devinfo_create(modem, 0, "atmodem", data->app);
|
||||||
ofono_location_reporting_create(modem, 0, "gemaltomodem", data->app);
|
ofono_location_reporting_create(modem, 0, "gemaltomodem", data->app);
|
||||||
sim = ofono_sim_create(modem, OFONO_VENDOR_CINTERION, "atmodem",
|
data->sim = ofono_sim_create(modem, OFONO_VENDOR_CINTERION, "atmodem",
|
||||||
data->app);
|
data->app);
|
||||||
|
|
||||||
if (sim && data->have_sim == TRUE)
|
if (data->sim && data->have_sim == TRUE)
|
||||||
ofono_sim_inserted_notify(sim, TRUE);
|
ofono_sim_inserted_notify(data->sim, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gemalto_post_sim(struct ofono_modem *modem)
|
static void gemalto_post_sim(struct ofono_modem *modem)
|
||||||
|
|
Loading…
Reference in New Issue