r3505 - in trunk/src/target/OM-2007.2/libraries/libmokogsmd2: . libmokogsmd
mickey at sita.openmoko.org
mickey at sita.openmoko.org
Sun Nov 25 21:10:02 CET 2007
Author: mickey
Date: 2007-11-25 21:10:02 +0100 (Sun, 25 Nov 2007)
New Revision: 3505
Modified:
trunk/src/target/OM-2007.2/libraries/libmokogsmd2/ChangeLog
trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.c
trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.h
Log:
libmokogsmd2:
Register network message handler with libgsmd to get
answers for trigger messages.
Keep trying to connect to gsmd, if not available on startup.
Add new g_signal for incoming operator name
Modified: trunk/src/target/OM-2007.2/libraries/libmokogsmd2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/libraries/libmokogsmd2/ChangeLog 2007-11-25 20:07:09 UTC (rev 3504)
+++ trunk/src/target/OM-2007.2/libraries/libmokogsmd2/ChangeLog 2007-11-25 20:10:02 UTC (rev 3505)
@@ -1,3 +1,12 @@
+2007-11-25 Michael Lauer <mickey at openmoko.org>
+
+ * libmokogsmd/moko-gsmd-connection.[c|h]:
+ Register network message handler with libgsmd to get
+ answers for trigger messages.
+ Keep trying to connect to gsmd, if not available on startup.
+ Add new g_signal for incoming operator name
+
+
2007-11-20 Thomas Wood <thomas at openedhand.com>
* libmokogsmd/moko-gsmd-connection.c:
Modified: trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.c
===================================================================
--- trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.c 2007-11-25 20:07:09 UTC (rev 3504)
+++ trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.c 2007-11-25 20:10:02 UTC (rev 3505)
@@ -28,7 +28,7 @@
#include <errno.h>
#define DEBUG_THIS_FILE
-#undef DEBUG_THIS_FILE
+//#undef DEBUG_THIS_FILE
#ifdef DEBUG_THIS_FILE
#define moko_debug(fmt,...) g_debug(fmt,##__VA_ARGS__)
@@ -40,6 +40,11 @@
#define GSMD_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_GSMD_CONNECTION, MokoGsmdConnectionPrivate))
+#define MOKO_GSMD_CHECK_CONNECTION_GET_PRIV \
+ g_return_if_fail( MOKO_IS_GSMD_CONNECTION( self ) ); \
+ MokoGsmdConnectionPrivate* priv = GSMD_CONNECTION_GET_PRIVATE( self ); \
+ if ( !priv->handle ) moko_gsmd_connection_init( self ); \
+ g_return_if_fail( priv->handle );
GQuark
moko_gsmd_error_quark ()
@@ -91,6 +96,9 @@
SIGNAL_GSMD_EVT_IN_CBM = 14, /* Incoming Cell Broadcast message */
SIGNAL_GSMD_EVT_IN_DS = 15, /* SMS Status Report */
SIGNAL_GSMD_EVT_IN_ERROR = 16, /* CME/CMS error */
+
+ SIGNAL_GSMD_NET_CURRENT_OPERATOR = 100, /* Current Operator */
+
LAST_SIGNAL,
};
static guint moko_gsmd_connection_signals[LAST_SIGNAL] = { 0 };
@@ -241,7 +249,7 @@
//TODO add SIGNAL_GSMD_EVT_IN_CBM = 14, /* Incoming Cell Broadcast message */
//TODO add SIGNAL_GSMD_EVT_IN_DS = 15, /* SMS Status Report */
- moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_OUT_STATUS] = g_signal_new
+ moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_IN_ERROR] = g_signal_new
("cme-cms-error",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
@@ -254,6 +262,20 @@
G_TYPE_INT,
NULL );
+ moko_gsmd_connection_signals[SIGNAL_GSMD_NET_CURRENT_OPERATOR] = g_signal_new
+ ("network-current-operator",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ G_STRUCT_OFFSET (MokoGsmdConnectionClass, network_current_operator),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING,
+ NULL);
+
+
/* virtual methods */
/* install properties */
@@ -298,9 +320,7 @@
size = read( self->pollfd.fd, &buf, sizeof( buf ) );
if ( size < 0 )
{
- g_warning( "moko_gsmd_connection_source_dispatch:%s %s",
- "read error from libgsmd:",
- strerror( errno ) );
+ g_warning( "moko_gsmd_connection_source_dispatch:%s %s", "read error from libgsmd:", strerror( errno ) );
}
else
{
@@ -312,11 +332,102 @@
return TRUE;
}
-int
-_moko_gsmd_connection_eventhandler (struct lgsm_handle *lh,
- int evt_type,
- struct gsmd_evt_auxdata *aux)
+static int net_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh)
{
+ printf( "=================== new code here ==========================\n");
+
+ moko_debug( "moko_gsmd_connection_network_eventhandler type = %d", gmh->msg_subtype );
+ MokoGsmdConnection* self = moko_gsmd_connection_instance;
+
+ struct gsmd_msg_auxdata* aux = (struct gsmd_msg_auxdata*) ((void *) gmh + sizeof(*gmh));
+
+ switch ( gmh->msg_subtype )
+ {
+ case GSMD_NETWORK_SIGQ_GET:
+ g_signal_emit( G_OBJECT(self),
+ moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_SIGNAL],
+ 0,
+ aux->u.signal.sigq.rssi );
+ break;
+ case GSMD_NETWORK_OPER_GET:
+ g_signal_emit( G_OBJECT(self),
+ moko_gsmd_connection_signals[SIGNAL_GSMD_NET_CURRENT_OPERATOR],
+ 0,
+ aux->u.current_operator.name );
+ break;
+ }
+ printf( "=================== old code here ==========================\n");
+
+ const struct gsmd_signal_quality *sq = (struct gsmd_signal_quality *)
+ ((void *) gmh + sizeof(*gmh));
+ const char *oper = (char *) gmh + sizeof(*gmh);
+ const struct gsmd_msg_oper *opers = (struct gsmd_msg_oper *)
+ ((void *) gmh + sizeof(*gmh));
+ const struct gsmd_own_number *num = (struct gsmd_own_number *)
+ ((void *) gmh + sizeof(*gmh));
+ static const char *oper_stat[] = {
+ [GSMD_OPER_UNKNOWN] = "of unknown status",
+ [GSMD_OPER_AVAILABLE] = "available",
+ [GSMD_OPER_CURRENT] = "our current operator",
+ [GSMD_OPER_FORBIDDEN] = "forbidden",
+ };
+ static const char *srvname[] = {
+ [GSMD_SERVICE_ASYNC_MODEM] = "asynchronous modem",
+ [GSMD_SERVICE_SYNC_MODEM] = "synchronous modem",
+ [GSMD_SERVICE_PAD_ACCESS] = "PAD Access (asynchronous)",
+ [GSMD_SERVICE_PACKET_ACCESS] = "Packet Access (synchronous)",
+ [GSMD_SERVICE_VOICE] = "voice",
+ [GSMD_SERVICE_FAX] = "fax",
+ };
+
+ //printf( "a = %p, b = %p\n", (void*)aux->u.current_operator.name, oper );
+
+ switch (gmh->msg_subtype)
+ {
+ case GSMD_NETWORK_SIGQ_GET:
+ if (sq->rssi == 99)
+ printf("Signal undetectable\n");
+ else
+ printf("Signal quality %i dBm\n", -113 + sq->rssi * 2);
+ if (sq->ber == 99)
+ printf("Error rate undetectable\n");
+ else
+ printf("Bit error rate %i\n", sq->ber);
+ break;
+ case GSMD_NETWORK_OPER_GET:
+ if (oper[0])
+ printf("Our current operator is %s\n", oper);
+ else
+ printf("No current operator\n");
+ break;
+ case GSMD_NETWORK_OPER_LIST:
+ for (; !opers->is_last; opers ++)
+ printf("%8.*s %16.*s, %.*s for short, is %s\n",
+ sizeof(opers->opname_num),
+ opers->opname_num,
+ sizeof(opers->opname_longalpha),
+ opers->opname_longalpha,
+ sizeof(opers->opname_shortalpha),
+ opers->opname_shortalpha,
+ oper_stat[opers->stat]);
+ break;
+ case GSMD_NETWORK_GET_NUMBER:
+ printf("\t%s\t%10s%s%s%s\n", num->addr.number, num->name,
+ (num->service == GSMD_SERVICE_UNKNOWN) ?
+ "" : " related to ",
+ (num->service == GSMD_SERVICE_UNKNOWN) ?
+ "" : srvname[num->service],
+ (num->service == GSMD_SERVICE_UNKNOWN) ?
+ "" : " services");
+ break;
+ default:
+ return -EINVAL;
+ }
+}
+
+int
+_moko_gsmd_connection_eventhandler (struct lgsm_handle *lh, int evt_type, struct gsmd_evt_auxdata *aux)
+{
moko_debug( "moko_gsmd_connection_eventhandler type = %d", evt_type );
MokoGsmdConnection* self = moko_gsmd_connection_instance;
@@ -409,15 +520,10 @@
return 0;
}
-static void
-moko_gsmd_connection_init(MokoGsmdConnection* self)
+static gboolean
+moko_gsmd_connection_try_connect(MokoGsmdConnection* self)
{
- moko_debug( "moko_gsmd_connection_init" );
- /* fail here on more than one MokoGsmdConnection object per process */
- g_assert( !moko_gsmd_connection_instance);
-
- moko_gsmd_connection_instance = self;
-
+ moko_debug( "moko_gsmd_connection_try_reconnect" );
MokoGsmdConnectionPrivate* priv = GSMD_CONNECTION_GET_PRIVATE(self);
priv->handle = lgsm_init( LGSMD_DEVICE_GSMD );
@@ -430,7 +536,7 @@
g_warning( "libgsmd: %s",
"can't connect to gsmd. You won't receive any events." );
- return;
+ return TRUE; // can't connect, please call me again
}
}
else
@@ -446,8 +552,8 @@
NULL,
};
- priv->source = (MokoGsmdConnectionSource*) g_source_new( &funcs,
- sizeof( MokoGsmdConnectionSource) );
+ priv->source = (MokoGsmdConnectionSource*) g_source_new( &funcs,
+ sizeof( MokoGsmdConnectionSource) );
priv->source->handle = priv->handle;
priv->source->pollfd.fd = lgsm_fd( priv->handle );
priv->source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
@@ -458,14 +564,26 @@
int rc = 0;
for ( int i = GSMD_EVT_IN_CALL; i < __NUM_GSMD_EVT; ++i )
{
- rc |= lgsm_evt_handler_register( priv->handle, i,
+ rc |= lgsm_evt_handler_register( priv->handle, i,
_moko_gsmd_connection_eventhandler );
moko_debug( "-- registered for event %d, return code %d", i, rc );
}
lgsm_register_handler( priv->handle, GSMD_MSG_PASSTHROUGH, &pt_msghandler);
+ lgsm_register_handler( priv->handle, GSMD_MSG_NETWORK, &net_msghandler);
+
+ return FALSE; // connection established, don't call again
}
+static void
+moko_gsmd_connection_init(MokoGsmdConnection* self)
+{
+ moko_debug( "moko_gsmd_connection_init" );
+ moko_gsmd_connection_instance = self;
+
+ g_timeout_add_seconds( 5, (GSourceFunc)moko_gsmd_connection_try_connect, self );
+}
+
/* public API */
void
moko_gsmd_connection_set_antenna_power(MokoGsmdConnection* self, gboolean on, GError **error)
@@ -490,7 +608,7 @@
}
}
-void
+void
moko_gsmd_connection_send_pin(MokoGsmdConnection* self, const gchar* pin)
{
MokoGsmdConnectionPrivate* priv;
@@ -509,7 +627,7 @@
lgsm_pin( priv->handle, 1, pin, NULL);
}
-void
+void
moko_gsmd_connection_network_register(MokoGsmdConnection* self)
{
MokoGsmdConnectionPrivate* priv;
@@ -523,7 +641,7 @@
}
int
-moko_gsmd_connection_get_network_status (MokoGsmdConnection* self)
+moko_gsmd_connection_get_network_status(MokoGsmdConnection* self)
{
MokoGsmdConnectionPrivate* priv;
enum lgsm_netreg_state state;
@@ -538,33 +656,33 @@
return state;
}
-void
+void
moko_gsmd_connection_voice_accept(MokoGsmdConnection* self)
{
MokoGsmdConnectionPrivate* priv;
-
+
g_return_if_fail ( MOKO_IS_GSMD_CONNECTION ( self ) );
priv = GSMD_CONNECTION_GET_PRIVATE( self );
-
+
g_return_if_fail( priv->handle );
lgsm_voice_in_accept( priv->handle );
}
-void
+void
moko_gsmd_connection_voice_hangup(MokoGsmdConnection* self)
{
MokoGsmdConnectionPrivate* priv;
-
+
g_return_if_fail ( MOKO_IS_GSMD_CONNECTION ( self ) );
priv = GSMD_CONNECTION_GET_PRIVATE( self );
-
+
g_return_if_fail( priv->handle );
-
+
lgsm_voice_hangup( priv->handle );
}
-void
+void
moko_gsmd_connection_voice_dial(MokoGsmdConnection* self, const gchar* number)
{
MokoGsmdConnectionPrivate* priv;
@@ -575,39 +693,39 @@
g_return_if_fail( strlen( number ) > 2 );
priv = GSMD_CONNECTION_GET_PRIVATE( self );
-
+
g_return_if_fail( priv->handle );
-
+
addr.type = 129; /* ??? */
g_stpcpy( &addr.addr[0], number );
lgsm_voice_out_init( priv->handle, &addr );
}
-void
+void
moko_gsmd_connection_voice_dtmf(MokoGsmdConnection* self, const gchar number)
{
MokoGsmdConnectionPrivate* priv;
-
+
g_return_if_fail ( MOKO_IS_GSMD_CONNECTION (self) );
-
+
priv = GSMD_CONNECTION_GET_PRIVATE( self );
-
+
g_return_if_fail( priv->handle );
-
+
lgsm_voice_dtmf( priv->handle, number );
}
-void
+void
moko_gsmd_connection_trigger_signal_strength_event(MokoGsmdConnection* self)
{
- MokoGsmdConnectionPrivate* priv;
-
- g_return_if_fail ( MOKO_IS_GSMD_CONNECTION (self) );
-
- priv = GSMD_CONNECTION_GET_PRIVATE( self );
-
- g_return_if_fail( priv->handle );
-
+ MOKO_GSMD_CHECK_CONNECTION_GET_PRIV
lgsm_signal_quality( priv->handle );
}
+
+void
+moko_gsmd_connection_trigger_current_operator_event(MokoGsmdConnection* self)
+{
+ MOKO_GSMD_CHECK_CONNECTION_GET_PRIV
+ lgsm_oper_get( priv->handle );
+}
Modified: trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.h
===================================================================
--- trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.h 2007-11-25 20:07:09 UTC (rev 3504)
+++ trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.h 2007-11-25 20:10:02 UTC (rev 3505)
@@ -12,7 +12,6 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Public License for more details.
*
- * Current Version: $Rev$ ($Date: 2006/12/21 18:03:04 $) [$Author: mickey $]
*/
#ifndef _MOKO_GSMD_CONNECTION_H_
@@ -39,23 +38,22 @@
struct _MokoGsmdConnectionClass {
GObjectClass parent_class;
- /* Voice signals */
- void (*incoming_call) (MokoGsmdConnection *self, int type);
- void (*call_status_progress) (MokoGsmdConnection *self, int type);
- void (*pin_requested) (MokoGsmdConnection *self, int type);
+ /* Call signals */
+ void (*incoming_call) (MokoGsmdConnection* self, int type);
+ void (*call_status_progress) (MokoGsmdConnection* self, int type);
+ void (*pin_requested) (MokoGsmdConnection* self, int type);
+ void (*incoming_clip) (MokoGsmdConnection* self, const gchar* number);
/* SMS signals */
/* GPRS signals */
- /* Misc signals */
- void (*incoming_clip) (MokoGsmdConnection *self, const gchar *number);
- void (*network_registration) (MokoGsmdConnection *self,
- int type,
- int lac,
- int cell);
- void (*trigger_signal_strength_event) (MokoGsmdConnection *self);
- void (*signal_strength_changed) (MokoGsmdConnection *self, int strength);
+ /* Network signals */
+ void (*network_registration) (MokoGsmdConnection* self, int type, int lac, int cell);
+ void (*signal_strength_changed) (MokoGsmdConnection* self, int strength);
+ void (*network_current_operator) (MokoGsmdConnection* self, const gchar* name );
+
+ /* Misc */
void (*cme_cms_error) (MokoGsmdConnection *self, int code);
/* Future padding */
@@ -112,6 +110,8 @@
/* network */
void moko_gsmd_connection_network_register (MokoGsmdConnection *self);
int moko_gsmd_connection_get_network_status (MokoGsmdConnection *self);
+void moko_gsmd_connection_trigger_current_operator_event(MokoGsmdConnection* self);
+void moko_gsmd_connection_trigger_signal_strength_event(MokoGsmdConnection* self);
/* TODO add type, i.e. MOKO_GSMD_CONNECTION_NETREG_AUTO */
/* voice calls */
More information about the commitlog
mailing list