Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of CNManager by
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 }
Generated on Fri Jul 15 2022 21:42:35 by
1.7.2
