Changeset 3505


Ignore:
Timestamp:
11/25/07 21:10:02 (5 years ago)
Author:
mickey
Message:

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

Location:
trunk/src/target/OM-2007.2/libraries/libmokogsmd2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/target/OM-2007.2/libraries/libmokogsmd2/ChangeLog

    r3455 r3505  
     12007-11-25      Michael Lauer   <mickey@openmoko.org> 
     2 
     3        * libmokogsmd/moko-gsmd-connection.[c|h]: 
     4        Register network message handler with libgsmd to get 
     5        answers for trigger messages. 
     6        Keep trying to connect to gsmd, if not available on startup. 
     7        Add new g_signal for incoming operator name 
     8         
     9 
    1102007-11-20  Thomas Wood  <thomas@openedhand.com> 
    211 
  • trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.c

    r3455 r3505  
    2929 
    3030#define DEBUG_THIS_FILE 
    31 #undef DEBUG_THIS_FILE 
     31//#undef DEBUG_THIS_FILE 
    3232 
    3333#ifdef DEBUG_THIS_FILE 
     
    4141#define GSMD_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_GSMD_CONNECTION, MokoGsmdConnectionPrivate)) 
    4242 
     43#define MOKO_GSMD_CHECK_CONNECTION_GET_PRIV \ 
     44        g_return_if_fail( MOKO_IS_GSMD_CONNECTION( self ) ); \ 
     45        MokoGsmdConnectionPrivate* priv = GSMD_CONNECTION_GET_PRIVATE( self ); \ 
     46        if ( !priv->handle ) moko_gsmd_connection_init( self ); \ 
     47        g_return_if_fail( priv->handle ); 
    4348 
    4449GQuark 
     
    9297    SIGNAL_GSMD_EVT_IN_DS          = 15, /* SMS Status Report */ 
    9398    SIGNAL_GSMD_EVT_IN_ERROR       = 16, /* CME/CMS error */ 
     99 
     100    SIGNAL_GSMD_NET_CURRENT_OPERATOR = 100, /* Current Operator */ 
     101 
    94102    LAST_SIGNAL, 
    95103}; 
     
    242250    //TODO add SIGNAL_GSMD_EVT_IN_DS          = 15, /* SMS Status Report */ 
    243251 
    244     moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_OUT_STATUS] = g_signal_new 
     252    moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_IN_ERROR] = g_signal_new 
    245253        ("cme-cms-error", 
    246254        G_TYPE_FROM_CLASS (klass), 
     
    255263        NULL ); 
    256264 
     265    moko_gsmd_connection_signals[SIGNAL_GSMD_NET_CURRENT_OPERATOR] = g_signal_new 
     266        ("network-current-operator", 
     267        G_TYPE_FROM_CLASS (klass), 
     268        G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 
     269        G_STRUCT_OFFSET (MokoGsmdConnectionClass, network_current_operator), 
     270        NULL, 
     271        NULL, 
     272        g_cclosure_marshal_VOID__STRING, 
     273        G_TYPE_NONE, 
     274        1, 
     275        G_TYPE_STRING, 
     276        NULL); 
     277 
     278 
    257279    /* virtual methods */ 
    258280 
     
    299321    if ( size < 0 ) 
    300322    { 
    301         g_warning( "moko_gsmd_connection_source_dispatch:%s %s", 
    302                    "read error from libgsmd:",  
    303                    strerror( errno ) ); 
     323        g_warning( "moko_gsmd_connection_source_dispatch:%s %s", "read error from libgsmd:", strerror( errno ) ); 
    304324    } 
    305325    else 
     
    313333} 
    314334 
    315 int  
    316 _moko_gsmd_connection_eventhandler (struct lgsm_handle *lh,  
    317                                     int evt_type,  
    318                                     struct gsmd_evt_auxdata *aux) 
     335static int net_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) 
     336{ 
     337    printf( "=================== new code here ==========================\n"); 
     338 
     339    moko_debug( "moko_gsmd_connection_network_eventhandler type = %d", gmh->msg_subtype ); 
     340    MokoGsmdConnection* self = moko_gsmd_connection_instance; 
     341 
     342    struct gsmd_msg_auxdata* aux = (struct gsmd_msg_auxdata*) ((void *) gmh + sizeof(*gmh)); 
     343 
     344    switch ( gmh->msg_subtype ) 
     345    { 
     346        case GSMD_NETWORK_SIGQ_GET: 
     347            g_signal_emit( G_OBJECT(self), 
     348                           moko_gsmd_connection_signals[SIGNAL_GSMD_EVT_SIGNAL], 
     349                           0, 
     350                           aux->u.signal.sigq.rssi ); 
     351            break; 
     352        case GSMD_NETWORK_OPER_GET: 
     353            g_signal_emit( G_OBJECT(self), 
     354                           moko_gsmd_connection_signals[SIGNAL_GSMD_NET_CURRENT_OPERATOR], 
     355                           0, 
     356                           aux->u.current_operator.name ); 
     357            break; 
     358    } 
     359    printf( "=================== old code here ==========================\n"); 
     360 
     361    const struct gsmd_signal_quality *sq = (struct gsmd_signal_quality *) 
     362            ((void *) gmh + sizeof(*gmh)); 
     363    const char *oper = (char *) gmh + sizeof(*gmh); 
     364    const struct gsmd_msg_oper *opers = (struct gsmd_msg_oper *) 
     365            ((void *) gmh + sizeof(*gmh)); 
     366    const struct gsmd_own_number *num = (struct gsmd_own_number *) 
     367            ((void *) gmh + sizeof(*gmh)); 
     368    static const char *oper_stat[] = { 
     369        [GSMD_OPER_UNKNOWN] = "of unknown status", 
     370        [GSMD_OPER_AVAILABLE] = "available", 
     371        [GSMD_OPER_CURRENT] = "our current operator", 
     372        [GSMD_OPER_FORBIDDEN] = "forbidden", 
     373    }; 
     374    static const char *srvname[] = { 
     375        [GSMD_SERVICE_ASYNC_MODEM] = "asynchronous modem", 
     376        [GSMD_SERVICE_SYNC_MODEM] = "synchronous modem", 
     377        [GSMD_SERVICE_PAD_ACCESS] = "PAD Access (asynchronous)", 
     378        [GSMD_SERVICE_PACKET_ACCESS] = "Packet Access (synchronous)", 
     379        [GSMD_SERVICE_VOICE] = "voice", 
     380        [GSMD_SERVICE_FAX] = "fax", 
     381    }; 
     382 
     383    //printf( "a = %p, b = %p\n", (void*)aux->u.current_operator.name, oper ); 
     384 
     385    switch (gmh->msg_subtype) 
     386    { 
     387        case GSMD_NETWORK_SIGQ_GET: 
     388            if (sq->rssi == 99) 
     389                printf("Signal undetectable\n"); 
     390            else 
     391                printf("Signal quality %i dBm\n", -113 + sq->rssi * 2); 
     392            if (sq->ber == 99) 
     393                printf("Error rate undetectable\n"); 
     394            else 
     395                printf("Bit error rate %i\n", sq->ber); 
     396            break; 
     397        case GSMD_NETWORK_OPER_GET: 
     398            if (oper[0]) 
     399                printf("Our current operator is %s\n", oper); 
     400            else 
     401                printf("No current operator\n"); 
     402            break; 
     403        case GSMD_NETWORK_OPER_LIST: 
     404            for (; !opers->is_last; opers ++) 
     405                printf("%8.*s   %16.*s,   %.*s for short, is %s\n", 
     406                       sizeof(opers->opname_num), 
     407                              opers->opname_num, 
     408                              sizeof(opers->opname_longalpha), 
     409                                     opers->opname_longalpha, 
     410                                     sizeof(opers->opname_shortalpha), 
     411                                            opers->opname_shortalpha, 
     412                                            oper_stat[opers->stat]); 
     413            break; 
     414        case GSMD_NETWORK_GET_NUMBER: 
     415            printf("\t%s\t%10s%s%s%s\n", num->addr.number, num->name, 
     416                   (num->service == GSMD_SERVICE_UNKNOWN) ? 
     417                           "" : " related to ", 
     418                           (num->service == GSMD_SERVICE_UNKNOWN) ? 
     419                                   "" : srvname[num->service], 
     420                                   (num->service == GSMD_SERVICE_UNKNOWN) ? 
     421                                           "" : " services"); 
     422            break; 
     423        default: 
     424            return -EINVAL; 
     425    } 
     426} 
     427 
     428int 
     429_moko_gsmd_connection_eventhandler (struct lgsm_handle *lh, int evt_type, struct gsmd_evt_auxdata *aux) 
    319430{ 
    320431    moko_debug( "moko_gsmd_connection_eventhandler type = %d", evt_type ); 
     
    410521} 
    411522 
    412 static void 
    413 moko_gsmd_connection_init(MokoGsmdConnection* self) 
    414 { 
    415     moko_debug( "moko_gsmd_connection_init" ); 
    416     /* fail here on more than one MokoGsmdConnection object per process */ 
    417     g_assert( !moko_gsmd_connection_instance); 
    418  
    419     moko_gsmd_connection_instance = self; 
    420  
     523static gboolean 
     524moko_gsmd_connection_try_connect(MokoGsmdConnection* self) 
     525{ 
     526    moko_debug( "moko_gsmd_connection_try_reconnect" ); 
    421527    MokoGsmdConnectionPrivate* priv = GSMD_CONNECTION_GET_PRIVATE(self); 
    422528 
     
    431537                       "can't connect to gsmd. You won't receive any events." ); 
    432538 
    433             return; 
     539            return TRUE; // can't connect, please call me again 
    434540        } 
    435541    } 
     
    447553    }; 
    448554 
    449     priv->source = (MokoGsmdConnectionSource*) g_source_new( &funcs,  
    450                                             sizeof( MokoGsmdConnectionSource) ); 
     555    priv->source = (MokoGsmdConnectionSource*) g_source_new( &funcs, 
     556                    sizeof( MokoGsmdConnectionSource) ); 
    451557    priv->source->handle = priv->handle; 
    452558    priv->source->pollfd.fd = lgsm_fd( priv->handle ); 
     
    459565    for ( int i = GSMD_EVT_IN_CALL; i < __NUM_GSMD_EVT; ++i ) 
    460566    { 
    461         rc |= lgsm_evt_handler_register( priv->handle, i,  
     567        rc |= lgsm_evt_handler_register( priv->handle, i, 
    462568                                         _moko_gsmd_connection_eventhandler ); 
    463569        moko_debug( "-- registered for event %d, return code %d", i, rc ); 
     
    465571 
    466572    lgsm_register_handler( priv->handle, GSMD_MSG_PASSTHROUGH, &pt_msghandler); 
     573    lgsm_register_handler( priv->handle, GSMD_MSG_NETWORK, &net_msghandler); 
     574 
     575    return FALSE; // connection established, don't call again 
     576} 
     577 
     578static void 
     579moko_gsmd_connection_init(MokoGsmdConnection* self) 
     580{ 
     581    moko_debug( "moko_gsmd_connection_init" ); 
     582    moko_gsmd_connection_instance = self; 
     583 
     584    g_timeout_add_seconds( 5, (GSourceFunc)moko_gsmd_connection_try_connect, self ); 
    467585} 
    468586 
     
    491609} 
    492610 
    493 void  
     611void 
    494612moko_gsmd_connection_send_pin(MokoGsmdConnection* self, const gchar* pin) 
    495613{ 
     
    510628} 
    511629 
    512 void  
     630void 
    513631moko_gsmd_connection_network_register(MokoGsmdConnection* self) 
    514632{ 
     
    524642 
    525643int 
    526 moko_gsmd_connection_get_network_status (MokoGsmdConnection* self) 
     644moko_gsmd_connection_get_network_status(MokoGsmdConnection* self) 
    527645{ 
    528646    MokoGsmdConnectionPrivate* priv; 
     
    539657} 
    540658 
    541 void  
     659void 
    542660moko_gsmd_connection_voice_accept(MokoGsmdConnection* self) 
    543661{ 
    544662    MokoGsmdConnectionPrivate* priv; 
    545      
     663 
    546664    g_return_if_fail ( MOKO_IS_GSMD_CONNECTION ( self ) ); 
    547665    priv  = GSMD_CONNECTION_GET_PRIVATE( self ); 
    548      
     666 
    549667    g_return_if_fail( priv->handle ); 
    550668 
     
    552670} 
    553671 
    554 void  
     672void 
    555673moko_gsmd_connection_voice_hangup(MokoGsmdConnection* self) 
    556674{ 
    557675    MokoGsmdConnectionPrivate* priv; 
    558      
     676 
    559677    g_return_if_fail ( MOKO_IS_GSMD_CONNECTION ( self ) ); 
    560678    priv  = GSMD_CONNECTION_GET_PRIVATE( self ); 
    561      
     679 
    562680    g_return_if_fail( priv->handle ); 
    563      
     681 
    564682    lgsm_voice_hangup( priv->handle ); 
    565683} 
    566684 
    567 void  
     685void 
    568686moko_gsmd_connection_voice_dial(MokoGsmdConnection* self, const gchar* number) 
    569687{ 
     
    576694 
    577695    priv  = GSMD_CONNECTION_GET_PRIVATE( self ); 
    578      
     696 
    579697    g_return_if_fail( priv->handle ); 
    580      
     698 
    581699 
    582700    addr.type = 129; /* ??? */ 
     
    585703} 
    586704 
    587 void  
     705void 
    588706moko_gsmd_connection_voice_dtmf(MokoGsmdConnection* self, const gchar number) 
    589707{ 
    590708    MokoGsmdConnectionPrivate* priv; 
    591      
     709 
    592710    g_return_if_fail ( MOKO_IS_GSMD_CONNECTION (self) ); 
    593      
     711 
    594712    priv  = GSMD_CONNECTION_GET_PRIVATE( self ); 
    595      
     713 
    596714    g_return_if_fail( priv->handle ); 
    597      
     715 
    598716    lgsm_voice_dtmf( priv->handle, number ); 
    599717} 
    600718 
    601 void  
     719void 
    602720moko_gsmd_connection_trigger_signal_strength_event(MokoGsmdConnection* self) 
    603721{ 
    604     MokoGsmdConnectionPrivate* priv; 
    605      
    606     g_return_if_fail ( MOKO_IS_GSMD_CONNECTION (self) ); 
    607      
    608     priv  = GSMD_CONNECTION_GET_PRIVATE( self ); 
    609      
    610     g_return_if_fail( priv->handle ); 
    611      
     722    MOKO_GSMD_CHECK_CONNECTION_GET_PRIV 
    612723    lgsm_signal_quality( priv->handle ); 
    613724} 
     725 
     726void 
     727moko_gsmd_connection_trigger_current_operator_event(MokoGsmdConnection* self) 
     728{ 
     729    MOKO_GSMD_CHECK_CONNECTION_GET_PRIV 
     730    lgsm_oper_get( priv->handle ); 
     731} 
  • trunk/src/target/OM-2007.2/libraries/libmokogsmd2/libmokogsmd/moko-gsmd-connection.h

    r3377 r3505  
    1313 *  GNU Public License for more details. 
    1414 * 
    15  *  Current Version: $Rev$ ($Date: 2006/12/21 18:03:04 $) [$Author: mickey $] 
    1615 */ 
    1716 
     
    4039    GObjectClass parent_class; 
    4140 
    42     /* Voice signals */ 
    43     void (*incoming_call) (MokoGsmdConnection *self, int type); 
    44     void (*call_status_progress) (MokoGsmdConnection *self, int type); 
    45     void (*pin_requested) (MokoGsmdConnection *self, int type); 
     41    /* Call signals */ 
     42    void (*incoming_call) (MokoGsmdConnection* self, int type); 
     43    void (*call_status_progress) (MokoGsmdConnection* self, int type); 
     44    void (*pin_requested) (MokoGsmdConnection* self, int type); 
     45    void (*incoming_clip) (MokoGsmdConnection* self, const gchar* number); 
    4646 
    4747    /* SMS signals */ 
     
    4949    /* GPRS signals */ 
    5050 
    51     /* Misc signals */ 
    52     void (*incoming_clip) (MokoGsmdConnection *self, const gchar *number); 
    53     void (*network_registration) (MokoGsmdConnection *self, 
    54                                   int type, 
    55                                   int lac, 
    56                                   int cell); 
    57     void (*trigger_signal_strength_event) (MokoGsmdConnection *self); 
    58     void (*signal_strength_changed) (MokoGsmdConnection *self, int strength); 
     51    /* Network signals */ 
     52    void (*network_registration) (MokoGsmdConnection* self, int type, int lac, int cell); 
     53    void (*signal_strength_changed) (MokoGsmdConnection* self, int strength); 
     54    void (*network_current_operator) (MokoGsmdConnection* self, const gchar* name ); 
     55 
     56    /* Misc */ 
    5957    void (*cme_cms_error) (MokoGsmdConnection *self, int code); 
    6058 
     
    113111void moko_gsmd_connection_network_register (MokoGsmdConnection *self); 
    114112int moko_gsmd_connection_get_network_status (MokoGsmdConnection *self); 
     113void moko_gsmd_connection_trigger_current_operator_event(MokoGsmdConnection* self); 
     114void moko_gsmd_connection_trigger_signal_strength_event(MokoGsmdConnection* self); 
    115115 
    116116/* TODO add type, i.e. MOKO_GSMD_CONNECTION_NETREG_AUTO */ 
Note: See TracChangeset for help on using the changeset viewer.