Connection Manager library for u-blox cellular modules. It manages the modem for keeping data connection always active.

Dependents:   C027_demo_ConnMan

CNReg.cpp

Committer:
msinig
Date:
2016-01-12
Revision:
0:86284a262735
Child:
1:29ad1d1ac1f9

File content as of revision 0:86284a262735:

#include "CNReg.h"
#include "CNLib.h"

#define ISREG(r)        ((r == MDMParser::REG_HOME) || (r == MDMParser::REG_ROAMING))
#define ISROMAING(r)    (r == MDMParser::REG_ROAMING)
#define ISUNKKOWN(r)    (r == MDMParser::REG_UNKNOWN)

static MDMParser::Reg stateCS;      //!< CS registration status
static MDMParser::Reg statePS;      //!< PS registration status
static CNTimer tmStatusPull;       //!< timer for polling registration status
static bool isRomaingEnabled;       //!< roaming is allowed

void cnRegInit(){
    TRACE("%s enter \r\n", __FUNCTION__);
    stateCS = MDMParser::REG_UNKNOWN;
    statePS = MDMParser::REG_UNKNOWN;
    tmStatusPull.setExpireTimeout(TIMEOUT_POLLING_NETWORK_STATUS);
    tmStatusPull.start();
}

void cnRegSetRoaming(bool enabled){
    isRomaingEnabled = enabled;
}

void cnRegReset(){
    TRACE("%s enter \r\n", __FUNCTION__);
    stateCS = MDMParser::REG_UNKNOWN;
    statePS = MDMParser::REG_UNKNOWN;
}

CNResp cnRegLoop(CNLib* cnLib, RegStatus* status){
    MDMParser::Reg newStateCS = cnLib->getNet()->csd;
    MDMParser::Reg newStatePS = cnLib->getNet()->psd;
    bool isRoamingRegister, isCSRegistered, hasCsRegister, hasCsDeRegister, isPSRegistered, hasPsRegister, hasPsDeRegister;
    
    //read and set COPS if necessary
    if (cnLib->getNet()->regStatus == MDMParser::COPS_UNKOWN)
        cnLib->getNetworkInfo();
    if (cnLib->getNet()->regStatus != MDMParser::COPS_AUTOMATIC_REG)
        cnLib->setNetAutoReg();    
    // poll registration info when timer expires
    if (tmStatusPull.isExpired()){
        INFO("%s Polling Net Info timer Expired, checking net status\r\n", __FUNCTION__);
        cnLib->checkNetStatus();
         newStateCS = cnLib->getNet()->csd;
         newStatePS = cnLib->getNet()->psd;
        if (!tmStatusPull.isOn())
            tmStatusPull.start();
    }
    //recover an old value in case of read errors
    if (ISUNKKOWN(newStateCS)) newStateCS = stateCS;
    if (ISUNKKOWN(newStatePS)) newStatePS = statePS;        
    //process registration changes
    isRoamingRegister = ISROMAING(stateCS) || ISROMAING(statePS);
    isCSRegistered = ISREG(stateCS);
    hasCsRegister = (!isCSRegistered && ISREG(newStateCS));
    hasCsDeRegister = ( isCSRegistered && !ISREG(newStateCS));
    isPSRegistered = ISREG(statePS);
    hasPsRegister = ( !isPSRegistered && ISREG(newStatePS));
    hasPsDeRegister = ( isPSRegistered && !ISREG(newStatePS));
    //verify roaming
    if (!isRoamingRegister || (isRoamingRegister && isRomaingEnabled)){
        //verify registration
        if ((isCSRegistered && hasPsRegister) || (isPSRegistered &&  hasCsRegister) || \
                (hasPsRegister && hasCsRegister) ){
            TRACE("%s CS and PS have just registered\r\n", __FUNCTION__);
            *status = REG_REGISTERED;
        }
        else if (hasPsDeRegister || hasCsDeRegister){
            TRACE("%s CS or PS are not registered\r\n", __FUNCTION__);
            *status = REG_NOT_REGISTERED;
        }
    }else{
        INFO("%s Roaming not allowed\r\n", __FUNCTION__);
        *status = REG_NOT_REGISTERED;
    }
    //Perform action in base of registration status
    if (hasCsRegister){
        //cnLib->getNetMccMnc();
    } else if (hasCsDeRegister){
        //cnLib->getNet()->netMccMnc = 0;
        memset(cnLib->getNet()->opr, 0, strlen(cnLib->getNet()->opr));
    }
    //Dump info
    if (getUtilDebugLevel() > 1 && (newStatePS != statePS || newStateCS != stateCS )){
        const char* txtStatus[] = { "unchanged", "registered", "NOT anymore registered"};
        INFO("cn registration Dump\r\n");
        if (*status < sizeof(txtStatus)/sizeof(*txtStatus))
                INFO("  Status is now %s\r\n", txtStatus[*status]);
        INFO("  has CS Registered = %s, has CS DeRegistered = %s\r\n", BOOLTOSTR(hasCsRegister), BOOLTOSTR(hasCsDeRegister));
        INFO("  is Roaming active = %s, polling Timer %d\r\n", \
                BOOLTOSTR(isRoamingRegister), tmStatusPull.read());
        cnLib->dumpNetStatus(cnLib->getNet());
    }
    //update status
    stateCS = newStateCS;
    statePS = newStatePS;

    return RES_OK;    
}