More work with MBM plugin.

Author: Per Hallsmark.
This commit is contained in:
Tambet Ingo
2008-10-24 10:04:42 +03:00
parent f7aeeafec8
commit 0bd4f4a604

View File

@@ -25,6 +25,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <dbus/dbus-glib.h> #include <dbus/dbus-glib.h>
@@ -61,14 +62,14 @@ mm_modem_mbm_new (const char *serial_device,
return MM_MODEM (g_object_new (MM_TYPE_MODEM_MBM, return MM_MODEM (g_object_new (MM_TYPE_MODEM_MBM,
MM_SERIAL_DEVICE, serial_device, MM_SERIAL_DEVICE, serial_device,
MM_SERIAL_SEND_DELAY, (guint64) 1000, MM_SERIAL_SEND_DELAY, (guint64) 10000,
MM_MODEM_DRIVER, driver, MM_MODEM_DRIVER, driver,
MM_MODEM_MBM_NETWORK_DEVICE, network_device, MM_MODEM_MBM_NETWORK_DEVICE, network_device,
NULL)); NULL));
} }
static void static void
mbm_enable_done (MMSerial *serial, eiapsw_done (MMSerial *serial,
GString *response, GString *response,
GError *error, GError *error,
gpointer user_data) gpointer user_data)
@@ -82,38 +83,137 @@ mbm_enable_done (MMSerial *serial,
} }
static void static void
mbm_enable (MMModemMbm *self, eiac_done (MMSerial *serial,
gboolean enabled, GString *response,
GError *error,
gpointer user_data)
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
char *command;
if (error)
info->error = g_error_copy (error);
command = g_strdup_printf ("AT*EIAPSW=1,1,\"%s\"",
(char *) mm_callback_info_get_data (info, "apn"));
mm_serial_queue_command (serial, command, 10, eiapsw_done, info);
g_free (command);
}
static void
eiad_done (MMSerial *serial,
GString *response,
GError *error,
gpointer user_data)
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
if (error)
info->error = g_error_copy (error);
mm_serial_queue_command (serial, "AT*EIAC=1", 10, eiac_done, info);
}
static void
set_apn (MMModemGsmNetwork *modem,
const char *apn,
MMModemFn callback, MMModemFn callback,
gpointer user_data) gpointer user_data)
{ {
MMCallbackInfo *info; MMCallbackInfo *info;
char *command;
info = mm_callback_info_new (MM_MODEM (self), callback, user_data); info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
mm_callback_info_set_data (info, "apn", g_strdup (apn), g_free);
command = g_strdup_printf ("AT*ENAP=%d,%d", enabled ? 1 : 0, mm_serial_queue_command (MM_SERIAL (modem), "AT*EIAD=0", 10, eiad_done, info);
mm_generic_gsm_get_cid (MM_GENERIC_GSM (self))); }
mm_serial_queue_command (MM_SERIAL (self), command, 3, mbm_enable_done, info); static void
g_free (command); do_register_done (MMSerial *serial,
GString *response,
GError *error,
gpointer user_data)
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
if (error)
info->error = g_error_copy (error);
mm_callback_info_schedule (info);
}
static void
do_register (MMModemGsmNetwork *modem,
const char *network_id,
MMModemFn callback,
gpointer user_data)
{
MMCallbackInfo *info;
info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
sleep (4);
mm_serial_queue_command (MM_SERIAL (modem), "AT*ENAP=1,1", 10, do_register_done, info);
} }
/*****************************************************************************/
/* Modem class override functions */
/*****************************************************************************/ /*****************************************************************************/
static void static void
modem_enable_done (MMModem *modem, GError *error, gpointer user_data) enable_done (MMSerial *serial,
GString *response,
GError *error,
gpointer user_data)
{ {
MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMCallbackInfo *info = (MMCallbackInfo *) user_data;
MMModem *parent_modem_iface;
parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (modem)); if (error)
parent_modem_iface->enable (modem, info->error = g_error_copy (error);
GPOINTER_TO_INT (mm_callback_info_get_data (info, "enable")),
(MMModemFn) mm_callback_info_get_data (info, "callback"), mm_callback_info_schedule (info);
mm_callback_info_get_data (info, "user-data"));
} }
static void
init_done (MMSerial *serial,
GString *response,
GError *error,
gpointer user_data)
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
if (error) {
info->error = g_error_copy (error);
mm_callback_info_schedule (info);
} else
mm_serial_queue_command (serial, "+CFUN=1", 5, enable_done, user_data);
}
static void
enable_flash_done (MMSerial *serial, gpointer user_data)
{
mm_serial_queue_command (serial, "&F E0 +CMEE=1", 3, init_done, user_data);
}
static void
disable_done (MMSerial *serial,
GString *response,
GError *error,
gpointer user_data)
{
mm_serial_close (serial);
mm_callback_info_schedule ((MMCallbackInfo *) user_data);
}
static void
disable_flash_done (MMSerial *serial, gpointer user_data)
{
mm_serial_queue_command (serial, "+CFUN=4", 5, disable_done, user_data);
}
static void static void
enable (MMModem *modem, enable (MMModem *modem,
gboolean enable, gboolean enable,
@@ -122,16 +222,24 @@ enable (MMModem *modem,
{ {
MMCallbackInfo *info; MMCallbackInfo *info;
info = mm_callback_info_new (modem, modem_enable_done, NULL); /* First, reset the previously used CID */
info->user_data = info; mm_generic_gsm_set_cid (MM_GENERIC_GSM (modem), 0);
mm_callback_info_set_data (info, "enable", GINT_TO_POINTER (enable), NULL);
mm_callback_info_set_data (info, "callback", callback, NULL);
mm_callback_info_set_data (info, "user-data", user_data, NULL);
if (enable) info = mm_callback_info_new (modem, callback, user_data);
mm_callback_info_schedule (info);
if (!enable) {
if (mm_serial_is_connected (MM_SERIAL (modem)))
mm_serial_flash (MM_SERIAL (modem), 1000, disable_flash_done, info);
else else
mbm_enable (MM_MODEM_MBM (modem), FALSE, modem_enable_done, info); disable_flash_done (MM_SERIAL (modem), info);
} else {
if (mm_serial_open (MM_SERIAL (modem), &info->error))
mm_serial_flash (MM_SERIAL (modem), 100, enable_flash_done, info);
if (info->error)
mm_callback_info_schedule (info);
}
} }
/*****************************************************************************/ /*****************************************************************************/
@@ -147,6 +255,13 @@ modem_init (MMModem *modem_class)
modem_class->enable = enable; modem_class->enable = enable;
} }
static void
modem_gsm_network_init (MMModemGsmNetwork *class)
{
class->do_register = do_register;
class->set_apn = set_apn;
}
static GObject* static GObject*
constructor (GType type, constructor (GType type,
guint n_construct_params, guint n_construct_params,
@@ -259,8 +374,14 @@ mm_modem_mbm_get_type (void)
(GInterfaceInitFunc) modem_init (GInterfaceInitFunc) modem_init
}; };
static const GInterfaceInfo modem_gsm_network_info = {
(GInterfaceInitFunc) modem_gsm_network_init
};
modem_mbm_type = g_type_register_static (MM_TYPE_GENERIC_GSM, "MMModemMbm", &modem_mbm_type_info, 0); modem_mbm_type = g_type_register_static (MM_TYPE_GENERIC_GSM, "MMModemMbm", &modem_mbm_type_info, 0);
g_type_add_interface_static (modem_mbm_type, MM_TYPE_MODEM, &modem_iface_info); g_type_add_interface_static (modem_mbm_type, MM_TYPE_MODEM, &modem_iface_info);
g_type_add_interface_static (modem_mbm_type, MM_TYPE_MODEM_GSM_NETWORK, &modem_gsm_network_info);
} }
return modem_mbm_type; return modem_mbm_type;