bjornrun wrote: > > Hello NetworkManager people! > > This patch relates to the Modem-Manager and the addition of MBM broadband > modem. The diff is taken today from > git://gitorious.org/modemmanager/mainline.git > > This will add support of showing network mode and signal quality using > +CIND? > > Related nm-applet patch will come shortly.... > > Regards, > Bjorn > > --- > > --- ../foss/modemmanager/mainline/plugins/mm-modem-mbm.c 2008-10-27 > 04:57:58.000000000 -0700 > +++ ../src/modemmanager/plugins/mm-modem-mbm.c 2008-10-27 > 07:22:24.000000000 -0700 > @@ -4,6 +4,7 @@ > for supporting Ericsson modules like F3507g. > > Author: Per Hallsmark <[EMAIL PROTECTED]> > + Bjorn Runaker <[EMAIL PROTECTED]> > > This program is free software; you can redistribute it and/or modify > it under the terms of the GNU General Public License as published by > @@ -42,6 +43,7 @@ > > typedef struct { > char *network_device; > + guint32 signal_quality; > } MMModemMbmPrivate; > > enum { > @@ -242,6 +244,119 @@ > > } > > +static gboolean > +parse_erinfo (const char *reply, int *mode, int *gsm_rinfo, int > *umts_rinfo) > +{ > + if (reply == NULL || strncmp (reply, "*ERINFO:", 8)) > + return FALSE; > + > + if (sscanf (reply + 8, "%d,%d,%d", mode, gsm_rinfo, umts_rinfo)) > + return TRUE; > + > + return FALSE; > +} > + > +static void > +get_network_mode_done (MMSerial *serial, > + GString *response, > + GError *error, > + gpointer user_data) > +{ > + MMCallbackInfo *info = (MMCallbackInfo *) user_data; > + > + g_debug("get_network_mode_done"); > + if (error) > + info->error = g_error_copy (error); > + else { > + int mode; > + int gsm_rinfo; > + int umts_rinfo; > + guint32 result = 0; > + > + if (parse_erinfo (response->str, &mode, &gsm_rinfo, &umts_rinfo)) > { > + if (umts_rinfo == 2) > + result = MM_MODEM_GSM_NETWORK_MODE_HSDPA; > + else if (umts_rinfo && !gsm_rinfo) > + result = MM_MODEM_GSM_NETWORK_MODE_3G; > + else if (umts_rinfo && gsm_rinfo) > + result = MM_MODEM_GSM_NETWORK_MODE_PREFER_3G; > + else if (gsm_rinfo) > + result = MM_MODEM_GSM_NETWORK_MODE_GPRS; > + } > + > + if (result == 0) > + info->error = g_error_new (MM_MODEM_ERROR, > MM_MODEM_ERROR_GENERAL, > + "%s", "Could not parse network > mode results"); > + else > + mm_callback_info_set_result (info, GUINT_TO_POINTER (result), > NULL); > + } > + > + mm_callback_info_schedule (info); > +} > + > +static void > +get_network_mode (MMModemGsmNetwork *modem, > + MMModemUIntFn callback, > + gpointer user_data) > +{ > + MMCallbackInfo *info; > + g_debug("get_network_mode"); > + info = mm_callback_info_uint_new (MM_MODEM (modem), callback, > user_data); > + mm_serial_queue_command (MM_SERIAL (modem), "AT*ERINFO?", 3, > get_network_mode_done, info); > +} > + > +/* GetSignalQuality */ > + > +static void > +get_signal_quality_done (MMSerial *serial, > + GString *response, > + GError *error, > + gpointer user_data) > +{ > + MMCallbackInfo *info = (MMCallbackInfo *) user_data; > + char *reply = response->str; > + > + if (error) > + info->error = g_error_copy (error); > + else if (!strncmp (reply, "+CIND: ", 7)) { > + /* Got valid reply */ > + int battch; > + int signal; > + > + reply += 7; > + > + if (sscanf (reply, "%d,%d", &battch, &signal)) { > + /* Normalize the quality */ > + signal = signal * 100 / 5; > + > + MM_MODEM_MBM_GET_PRIVATE (serial)->signal_quality = signal; > + mm_callback_info_set_result (info, GUINT_TO_POINTER (signal), > NULL); > + } else > + info->error = g_error_new_literal (MM_MODEM_ERROR, > MM_MODEM_ERROR_GENERAL, > + "Could not parse signal > quality results"); > + } > + > + mm_callback_info_schedule (info); > +} > + > +static void > +get_signal_quality (MMModemGsmNetwork *modem, > + MMModemUIntFn callback, > + gpointer user_data) > +{ > + MMCallbackInfo *info; > + > + g_debug("mbm get_signal_quality"); > + if (mm_serial_is_connected (MM_SERIAL (modem))) { > + g_message ("Returning saved signal quality %d", > MM_MODEM_MBM_GET_PRIVATE (modem)->signal_quality); > + callback (MM_MODEM (modem), MM_MODEM_MBM_GET_PRIVATE > (modem)->signal_quality, NULL, user_data); > + return; > + } > + > + info = mm_callback_info_uint_new (MM_MODEM (modem), callback, > user_data); > + mm_serial_queue_command (MM_SERIAL (modem), "+CIND?", 3, > get_signal_quality_done, info); > +} > + > > /*****************************************************************************/ > > static void > @@ -260,6 +375,8 @@ > { > class->do_register = do_register; > class->set_apn = set_apn; > + class->get_network_mode = get_network_mode; > + class->get_signal_quality = get_signal_quality; > } > > > --- ../foss/modemmanager/mainline/plugins/mm-modem-mbm.h 2008-10-27 > 04:57:58.000000000 -0700 > +++ ../src/modemmanager/plugins/mm-modem-mbm.h 2008-10-27 > 07:26:48.000000000 -0700 > @@ -4,8 +4,9 @@ > for supporting Ericsson modules like F3507g. > > Author: Per Hallsmark <[EMAIL PROTECTED]> > + Bjorn Runaker <[EMAIL PROTECTED]> > > This program is free software; you can redistribute it and/or modify > it under the terms of the GNU General Public License as published by > > >
Hi Dan! Hope this makes the patch more useful! Regards, Bjorn http://www.nabble.com/file/p20192267/mm-modem-mbm.c.patch mm-modem-mbm.c.patch http://www.nabble.com/file/p20192267/mm-modem-mbm.h.patch mm-modem-mbm.h.patch -- View this message in context: http://www.nabble.com/-PATCH--mm-modem-mbm.c-tp20189529p20192267.html Sent from the Gnome - NetworkManager mailing list archive at Nabble.com. _______________________________________________ NetworkManager-list mailing list NetworkManager-list@gnome.org http://mail.gnome.org/mailman/listinfo/networkmanager-list