Connection Manager library for u-blox cellular modules. It manages the modem for keeping data connection always active.
Diff: CNReg.cpp
- Revision:
- 0:86284a262735
- Child:
- 1:29ad1d1ac1f9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CNReg.cpp Tue Jan 12 09:08:15 2016 +0000 @@ -0,0 +1,100 @@ +#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; +} \ No newline at end of file