amq amq / CNManager

Fork of CNManager by u-blox

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CNData.cpp Source File

CNData.cpp

00001 #include "CNData.h"
00002 #include "CNLib.h"
00003 #include "CNUtil.h"
00004 
00005 //! Data Connection State
00006 typedef enum {
00007     DATA_UNDEFINED,         //!< undefined
00008     DATA_UP,                //!< data is up
00009     DATA_DOWN,              //!< data is down
00010 } DataState;
00011 
00012 #define IS_DATA_CONNECTED(s) (s == DATA_UP)
00013 #define IS_DATA_DISCONNECTED(s) (s == DATA_DOWN)
00014 #define HAS_DATA_ATTACHED(st, newSt) (st == DATA_DOWN && newSt == DATA_UP)
00015 #define HAS_DATA_DEATTACHED(st, newSt) (newSt== DATA_DOWN && st == DATA_UP)
00016 
00017 static DataState state = DATA_UNDEFINED;       //!<data state
00018 static CNTimer tmDataRetry;                    //!<timer for data retry
00019 static CNTimer tmDataPullStatus;               //!<timer for data pull status
00020 static bool dataIsEnable;                      //!<data is enabled
00021 
00022 static char dapn[20];              //!<apn  of the network provider
00023 static char dusername[10];         //!<user name text string for the authentication phase
00024 static char dpassword[10];         //!<password text string for the authentication phase
00025 static MDMParser::Auth auth;       //!<authentication mode (CHAP,PAP,NONE or DETECT)
00026 
00027 void cnDataInit(){
00028     TRACE("%s enter \r\n", __FUNCTION__); 
00029     state =  DATA_DOWN;
00030     dataIsEnable = false;
00031     tmDataPullStatus.setExpireTimeout(TIMEOUT_CHECK_STATUS_DATA_CONNECITION);
00032     tmDataRetry.setExpireTimeout(TIMEOUT_RETRY_DATA_CONNECTION);
00033     memset(dapn, 0, strlen(dapn));
00034     memset(dusername, 0, strlen(dusername));
00035     memset(dpassword, 0, strlen(dpassword));
00036     auth = MDMParser::AUTH_DETECT;
00037 }
00038 
00039 void cnDataEnable(bool enabled){
00040     TRACE("%s enter enabled: %d\r\n", __FUNCTION__, enabled);
00041     dataIsEnable = enabled;
00042 }
00043 
00044 void cnDataReset(){
00045     TRACE("%s enter \r\n", __FUNCTION__);
00046     state =  DATA_DOWN;
00047     dataIsEnable = false;
00048     tmDataRetry.stop();
00049 }
00050 
00051 void cnDataSetupApn(const char* apn,const char* username,const char* password)
00052 {
00053     TRACE("%s enter \r\n", __FUNCTION__);    
00054     if (apn)
00055         strncpy(dapn, apn, strlen(apn));        
00056     if (username)
00057         strncpy(dusername, username, strlen(username));
00058     if (password)
00059         strncpy(dpassword, password, strlen(password));    
00060 }
00061 
00062 CNResp cnDataLoop(CNLib* const lib, RegStatus regStatus,DataConnStatus* const dataStatus)
00063 {
00064     DataState newState = DATA_UNDEFINED;
00065     *dataStatus = DATA_NO_CHANGES;
00066     MDMParser::IP ip;
00067     char *apn, *username, *password;
00068     
00069     TRACE("%s enter \r\n", __FUNCTION__); 
00070     //enable data connection
00071     if (dataIsEnable && IS_DATA_DISCONNECTED(state) && regStatus == REG_REGISTERED){
00072         if (!tmDataRetry.isOn() || tmDataRetry.isExpired()){
00073             INFO("%s: Trying to bring up Data\r\n", __FUNCTION__);
00074             apn = (dapn[0]=='\0') ? NULL : dapn;
00075             username = (dusername[0]=='\0') ? NULL : dusername;
00076             password = (dpassword[0]=='\0') ? NULL : dpassword;            
00077             ip = lib->join(apn, username, password, auth);
00078             newState = (ip != NOIP)? DATA_UP : DATA_DOWN;
00079             //check result of data activation call
00080             if (IS_DATA_DISCONNECTED(newState)){
00081                 INFO("%s: Data has not been successfully activated\r\n", __FUNCTION__);
00082                 tmDataRetry.start();
00083             }
00084             else if (IS_DATA_CONNECTED(newState)){
00085                 INFO("%s: Data has been activated successfully\r\n", __FUNCTION__);
00086                 tmDataRetry.stop();
00087             }
00088         }
00089     }
00090     //disable data
00091     else if (IS_DATA_CONNECTED(state) && (!dataIsEnable || regStatus == REG_NOT_REGISTERED)){
00092         INFO("%s: Disable data\n", __FUNCTION__);
00093         lib->disableInternalContext();
00094         newState = DATA_DOWN;
00095     }
00096     //pull internal context status
00097     else if (tmDataPullStatus.isExpired() && IS_DATA_CONNECTED(state)){
00098         INFO("%s: Polling Status..\r\n", __FUNCTION__);
00099         lib->getInternalStatusContext();
00100         if (lib->getIpAddress() == NOIP)  newState = DATA_DOWN;
00101             else newState = DATA_UP;
00102     }
00103     //data id attached
00104     if (HAS_DATA_ATTACHED(state, newState)){
00105         INFO("%s: Notify data is up\r\n", __FUNCTION__);
00106         *dataStatus = DATA_IS_CONNECTED;
00107         tmDataRetry.stop();
00108         tmDataPullStatus.start();
00109     }
00110     //data is detached
00111     if (HAS_DATA_DEATTACHED(state, newState)){
00112         INFO("%s: Notify data is down\r\n", __FUNCTION__);
00113         *dataStatus = DATA_IS_DISCONNECTED;
00114         tmDataPullStatus.stop();
00115     }
00116     
00117     //dump info
00118     if (getUtilDebugLevel() > 1 && ( HAS_DATA_ATTACHED(state, newState) ||  HAS_DATA_DEATTACHED(state, newState))){
00119         INFO("CNM Data Dump\r\n");
00120         const char* txtState[] = { "Undefined", "Up", "Down"};
00121         if (newState < sizeof(txtState)/sizeof(*txtState) && newState != DATA_UNDEFINED)
00122             INFO("  State is now:  %s\r\n", txtState[newState]);    
00123         INFO("  Data is enabled: %s, has Data Attached: %s, has Data Detached: %s\r\n", BOOLTOSTR(dataIsEnable),\
00124                 BOOLTOSTR(HAS_DATA_ATTACHED(state, newState)), BOOLTOSTR(HAS_DATA_DEATTACHED(state, newState)));
00125         INFO("  Timer for Data Retry:  %d, Timer for Check Data %d \r\n", tmDataRetry.getRetryContunter(), \
00126                 tmDataPullStatus.getRetryContunter());
00127         if (lib->getIpAddress() != NOIP)
00128             lib->dumpIp(lib->getIpAddress());
00129     }
00130     //update status
00131     if (newState != DATA_UNDEFINED)
00132             state = newState;
00133 
00134     return RES_OK;;
00135 }