#include "mts/MTS_IO_ICellularRadio.h" #include #include const char MTS::IO::ICellularRadio::ETX = 0x03; //Ends socket connection const char MTS::IO::ICellularRadio::DLE = 0x10; //Escapes ETX and DLE within Payload const char MTS::IO::ICellularRadio::CR = 0x0D; const char MTS::IO::ICellularRadio::NL = 0x0A; const char MTS::IO::ICellularRadio::CTRL_Z = 0x1A; const char *MTS::IO::ICellularRadio::RSP_ERROR = "ERROR"; const char *MTS::IO::ICellularRadio::RSP_OK = "OK"; const char *MTS::IO::ICellularRadio::RSP_CONNECT = "CONNECT"; const char *MTS::IO::ICellularRadio::DEFAULT_RADIO_PORT = "/dev/modem_at1"; const char *MTS::IO::ICellularRadio::DEFAULT_RADIO_DIR = "/var/run/radio/"; const char *MTS::IO::ICellularRadio::VALUE_UNKNOWN = "Unknown"; const char *MTS::IO::ICellularRadio::VALUE_UNAVAILABLE = "Unavailable"; const char *MTS::IO::ICellularRadio::VALUE_NOT_SUPPORTED = "Not Supported"; const char *MTS::IO::ICellularRadio::VALUE_NOT_REGISTERED = "NOT REGISTERED"; const char *MTS::IO::ICellularRadio::VALUE_REGISTERED = "REGISTERED"; const char *MTS::IO::ICellularRadio::VALUE_SEARCHING = "SEARCHING"; const char *MTS::IO::ICellularRadio::VALUE_DENIED = "DENIED"; const char *MTS::IO::ICellularRadio::VALUE_ROAMING = "ROAMING"; //Static Data const char *MTS::IO::ICellularRadio::KEY_TYPE = "type"; //!< GSM or CDMA const char *MTS::IO::ICellularRadio::KEY_CODE = "code"; //!< Product Code : H5, H6, C2, EV3, G3 const char *MTS::IO::ICellularRadio::KEY_MODEL = "model"; //!< Model : HE910, LE910, CE910, DE910, GE910 const char *MTS::IO::ICellularRadio::KEY_MANUFACTURER = "manufacturer"; //!< Manufacturer: Telit const char *MTS::IO::ICellularRadio::KEY_HARDWARE = "hardware"; //!< Radio Hardware Version const char *MTS::IO::ICellularRadio::KEY_FIRMWARE = "firmware"; //!< Radio Firmware Version const char *MTS::IO::ICellularRadio::KEY_FIRMWARE_BUILD = "firmwarebuild"; //!< Radio Firmware Build const char *MTS::IO::ICellularRadio::KEY_VENDOR_FIRMWARE = "vendorfirmware"; //!< Radio Vendor Firmware Version const char *MTS::IO::ICellularRadio::KEY_CARRIER = "carrier"; //!< Cellular Service Provider = Home Network const char *MTS::IO::ICellularRadio::VALUE_CARRIER_VERIZON = "Verizon"; const char *MTS::IO::ICellularRadio::VALUE_CARRIER_AERIS = "Aeris"; const char *MTS::IO::ICellularRadio::VALUE_CARRIER_SPRINT = "Sprint"; const char *MTS::IO::ICellularRadio::VALUE_CARRIER_USCELLULAR = "U.S. Cellular"; const char *MTS::IO::ICellularRadio::VALUE_CARRIER_ATT = "AT&T"; const char *MTS::IO::ICellularRadio::VALUE_CARRIER_TMOBILE = "T-Mobile"; const char *MTS::IO::ICellularRadio::KEY_IMEI = "imei"; //!< International Mobile Station Equipment Identity const char *MTS::IO::ICellularRadio::KEY_MEID = "meid"; //!< Mobile Equipment Identifier const char *MTS::IO::ICellularRadio::KEY_IMSI = "imsi"; //!< International Mobile Subscriber Identity const char *MTS::IO::ICellularRadio::KEY_MSID = "msid"; //!< Mobil Station ID / Mobile Identification Number = MSID/MIN = CDMA-Only const char *MTS::IO::ICellularRadio::KEY_MDN = "mdn"; //!< Mobile Directory Number : Actual phone number dialed to reach radio const char *MTS::IO::ICellularRadio::KEY_ICCID = "iccid"; //!< Integrated Circuit Card Identifier const char *MTS::IO::ICellularRadio::KEY_MSL = "msl"; //!< Master Subsidy Lock const char *MTS::IO::ICellularRadio::KEY_SUPPORTED_CELL_MODES = "supportedCellularModes"; //!< Comma-separated list of all supported cellular modes (2g,3g,4g) const char *MTS::IO::ICellularRadio::KEY_SIM_CARRIER_CODE = "simCarrierCode"; //!< Unique carrier identifier based on the SIM card information. const char *MTS::IO::ICellularRadio::KEY_SIM_MCC = "simMcc"; //!< MCC of the home network from the SIM. const char *MTS::IO::ICellularRadio::KEY_SIM_MNC = "simMnc"; //!< MNC of the home network from the SIM. const char *MTS::IO::ICellularRadio::KEY_VOICE_ENABLED = "voiceEnabled"; //!< Enable/Disable support of voice calls const char *MTS::IO::ICellularRadio::KEY_SMS_ONLY = "smsOnly"; //!< Enable/Disable "SMS only" registration flag //Dynamic Data const char *MTS::IO::ICellularRadio::KEY_ROAMING = "roaming"; //!< Indicates whether or not using Home Network const char *MTS::IO::ICellularRadio::KEY_DATETIME = "datetime"; //!< Date and Time from tower const char *MTS::IO::ICellularRadio::KEY_SERVICE = "service"; //!< Service Connection Type [GPRS, EGPRS, WCDMA, HSDPA, 1xRTT, EVDO] const char *MTS::IO::ICellularRadio::KEY_CELL_MODE = "cellularMode"; //!< Specifies the cellular mode that is currently used by the modem [2g, 3g, 4g] const char *MTS::IO::ICellularRadio::KEY_NETWORK = "network"; //!< Cellular Service Provider const char *MTS::IO::ICellularRadio::KEY_NETWORK_REG = "netreg"; //!< Network Registration const char *MTS::IO::ICellularRadio::KEY_CID = "cid"; //!< Cellular ID = Tower in HEX const char *MTS::IO::ICellularRadio::KEY_LAC = "lac"; //!< Location Area Code in HEX const char *MTS::IO::ICellularRadio::KEY_RAC = "rac"; //!< Routing Area Code in HEX const char *MTS::IO::ICellularRadio::KEY_RSSI = "rssi"; //!< Signal Strength const char *MTS::IO::ICellularRadio::KEY_RSSIDBM = "rssidBm"; //!< Signal Strength in dBm const char *MTS::IO::ICellularRadio::KEY_MCC = "mcc"; //!< Country Code const char *MTS::IO::ICellularRadio::KEY_MNC = "mnc"; //!< Operator Code const char *MTS::IO::ICellularRadio::KEY_CHANNEL = "channel"; //!< ARFCN or UARFCN Assigned Radio Channel const char *MTS::IO::ICellularRadio::KEY_TXPWR = "txpwr"; //!< Transmit Power const char *MTS::IO::ICellularRadio::KEY_PSC = "psc"; //!< Active Primary Synchronization Code = PSC const char *MTS::IO::ICellularRadio::KEY_ECIO = "ecio"; //!< Active Ec/Io = chip energy per total wideband power in dBm const char *MTS::IO::ICellularRadio::KEY_RSCP = "rscp"; //!< Active RSCP = Received Signal Code Power in dBm const char *MTS::IO::ICellularRadio::KEY_DRX = "drx"; //!< Discontinuous reception cycle length = ms const char *MTS::IO::ICellularRadio::KEY_MM = "mm"; //!< Mobility Management State const char *MTS::IO::ICellularRadio::KEY_RR = "rr"; //!< Radio Resource State const char *MTS::IO::ICellularRadio::KEY_NOM = "nom"; //!< Network Operator Mode const char *MTS::IO::ICellularRadio::KEY_ABND = "abnd"; //!< Active Band const char *MTS::IO::ICellularRadio::KEY_BLER = "bler"; //!< Block Error Rate = percentage const char *MTS::IO::ICellularRadio::KEY_SD = "sd"; //!< Service Domain const char *MTS::IO::ICellularRadio::KEY_DEBUG = "debug"; //!< Debug Information const char *MTS::IO::ICellularRadio::KEY_MIP = "mipProfile"; //!< Mobile IP Information const char *MTS::IO::ICellularRadio::KEY_MIP_ID = "id"; //!< Mobile IP ID const char *MTS::IO::ICellularRadio::KEY_MIP_ENABLED = "enabled"; //!< Mobile IP Enabled/Disabled const char *MTS::IO::ICellularRadio::KEY_MIP_NAI = "nai"; //!< Network Access Identifier const char *MTS::IO::ICellularRadio::KEY_MIP_HOMEADDRESS = "homeAddress"; //!< Home Address const char *MTS::IO::ICellularRadio::KEY_MIP_PRIMARYHA = "primaryAddress"; //!< Primary Home Agent const char *MTS::IO::ICellularRadio::KEY_MIP_SECONDARYHA = "secondaryAddress"; //!< Secondary Home Agent const char *MTS::IO::ICellularRadio::KEY_MIP_MNAAASPI = "mnAaaSpi"; //!< Mobile Node Authentication, Authorization, and Accounting Server Security Parameter Index const char *MTS::IO::ICellularRadio::KEY_MIP_MNHASPI = "mnHaSpi"; //!< Mobile Node Home Agent Security Server Parameter Index const char *MTS::IO::ICellularRadio::KEY_MIP_REVTUN = "revTun"; //!< Reverse Tunneling Enabled const char *MTS::IO::ICellularRadio::KEY_MIP_MNAAASS = "mnAaaSs"; //!< Mobile Node Authentication, Authorization, and Accounting Server Shared Secret const char *MTS::IO::ICellularRadio::KEY_MIP_MNHASS = "mnHaSs"; //!< Mobile Node Home Agent Shared Secret const char *MTS::IO::ICellularRadio::KEY_PDP_CONTEXT_ID = "id"; const char *MTS::IO::ICellularRadio::KEY_PDP_CONTEXT_APN = "apn"; const char *MTS::IO::ICellularRadio::KEY_PDP_CONTEXT_IPMODE = "ipMode"; const char *MTS::IO::ICellularRadio::KEY_PDP_CONTEXT_AUTH_TYPE = "authType"; const char *MTS::IO::ICellularRadio::KEY_PDP_CONTEXT_AUTH_USERNAME = "username"; const char *MTS::IO::ICellularRadio::KEY_PDP_CONTEXT_AUTH_PASSWORD = "password"; const char *MTS::IO::ICellularRadio::VALUE_PDP_CONTEXT_IP_MODE_IP = "IP"; const char *MTS::IO::ICellularRadio::VALUE_PDP_CONTEXT_IP_MODE_IPV6 = "IPV6"; const char *MTS::IO::ICellularRadio::VALUE_PDP_CONTEXT_IP_MODE_IPV4V6 = "IPV4V6"; const char *MTS::IO::ICellularRadio::VALUE_PDP_CONTEXT_AUTH_TYPE_NONE = "NONE"; const char *MTS::IO::ICellularRadio::VALUE_PDP_CONTEXT_AUTH_TYPE_PAP = "PAP"; const char *MTS::IO::ICellularRadio::VALUE_PDP_CONTEXT_AUTH_TYPE_CHAP = "CHAP"; const char *MTS::IO::ICellularRadio::VALUE_PDP_CONTEXT_AUTH_TYPE_PAP_CHAP = "PAP-CHAP"; const char *MTS::IO::ICellularRadio::VALUE_TYPE_GSM = "GSM"; const char *MTS::IO::ICellularRadio::VALUE_TYPE_LTE = "LTE"; const char *MTS::IO::ICellularRadio::VALUE_TYPE_CDMA = "CDMA"; const char *MTS::IO::ICellularRadio::KEY_IS_SIM_INSERTED = "isSimInserted"; //!< SIM card insertion indicator. True when a SIM card is inserted const char *MTS::IO::ICellularRadio::KEY_IS_SIM_LOCKED = "isSimLocked"; //!< SIM card lock status indicator. True when a SIM card is locked by PIN / PUK / other code const char *MTS::IO::ICellularRadio::KEY_SIM_LOCK_STATUS = "lockStatus"; //!< SIM card lock status string. Either "READY", "SIM PIN", "SIM PUK" or other state const char *MTS::IO::ICellularRadio::KEY_ATTEMPTS_PIN = "attemptsPin"; //!< The number of attempts left to unlock the SIM card using PIN code const char *MTS::IO::ICellularRadio::KEY_ATTEMPTS_PUK = "attemptsPuk"; //!< The number of attempts left to unlock the SIM card using PUK code const char *MTS::IO::ICellularRadio::VALUE_SD_NO_SERVICE = "NO SERVICE"; const char *MTS::IO::ICellularRadio::VALUE_SD_CS_ONLY = "CS ONLY"; const char *MTS::IO::ICellularRadio::VALUE_SD_PS_ONLY = "PS ONLY"; const char *MTS::IO::ICellularRadio::VALUE_SD_CSPS = "CS+PS"; const char *MTS::IO::ICellularRadio::VALUE_ABND_GSM_850 = "GSM 850"; const char *MTS::IO::ICellularRadio::VALUE_ABND_GSM_900 = "GSM 900"; const char *MTS::IO::ICellularRadio::VALUE_ABND_DCS_1800 = "DCS 1800"; const char *MTS::IO::ICellularRadio::VALUE_ABND_PCS_1900 = "PCS 1900"; const char *MTS::IO::ICellularRadio::VALUE_CARRIER_CODE_VERIZON = "vz"; const char *MTS::IO::ICellularRadio::VALUE_CARRIER_CODE_ATT = "att"; const std::vector MTS::IO::ICellularRadio::DEFAULT_BAIL_STRINGS = { MTS::IO::ICellularRadio::RSP_OK, MTS::IO::ICellularRadio::RSP_ERROR }; MTS::IO::ICellularRadio::~ICellularRadio() { } MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertModelToMtsShortCode(const std::string& sModel, std::string& sCode, MTS::IO::ICellularRadio *radioObject) { CODE eCode = FAILURE; if(sModel.find("HE910-D") == 0) { sCode = "H5"; eCode = SUCCESS; } else if (sModel.find("HE910-EUD") == 0) { sCode = "H6"; eCode = SUCCESS; } else if (sModel.find("LE910-JN1") == 0) { sCode = "LDC3"; eCode = SUCCESS; } else if (sModel.find("LE866A1-JS") == 0) { sCode = "LSB3"; eCode = SUCCESS; } else if (sModel.find("LE910-NAG") == 0) { sCode = "LAT1"; eCode = SUCCESS; } else if (sModel.find("LE910C4-NF") == 0) { sCode = "L4N1"; eCode = SUCCESS; } else if (sModel.find("LE910-NA1") == 0) { if (NULL == radioObject) { sCode = VALUE_NOT_SUPPORTED; eCode = ERROR; } else { std::string sValue; eCode = radioObject->getActiveFirmware(sValue); if (eCode == SUCCESS) { sCode = "LNA3"; } else { sCode = "LAT3"; } } eCode = SUCCESS; } else if (sModel.find("LE910-SVG") == 0) { sCode = "LVW2"; eCode = SUCCESS; } else if (sModel.find("LE910-SV1") == 0) { sCode = "LVW3"; eCode = SUCCESS; } else if (sModel.find("LE910C1-NS") == 0) { sCode = "LSP3"; eCode = SUCCESS; } else if (sModel.find("LE910C1-AP") == 0) { sCode = "LAP3"; eCode = SUCCESS; } else if (sModel.find("ME910C1-WW") == 0) { sCode = "MNG2"; eCode = SUCCESS; } else if (sModel.find("LE910-EUG") == 0) { sCode = "LEU1"; eCode = SUCCESS; } else if (sModel.find("LE910C4-EU") == 0) { sCode = "L4E1"; eCode = SUCCESS; } else if (sModel.find("LE910-EU1") == 0) { sCode = "LEU3"; eCode = SUCCESS; } else if (sModel.find("GE910") == 0) { sCode = "G3"; eCode = SUCCESS; } else if (sModel.find("CE910") == 0) { sCode = "C2"; eCode = SUCCESS; } else if (sModel.find("DE910") == 0) { sCode = "EV3"; eCode = SUCCESS; } else if (sModel.find("EG95") == 0) { if (NULL == radioObject) { sCode = VALUE_NOT_SUPPORTED; eCode = ERROR; } else { std::string sValue; eCode = radioObject->getFirmware(sValue); if (eCode != SUCCESS) { sCode = VALUE_NOT_SUPPORTED; eCode = ERROR; } else if (sValue.find("EG95E") != std::string::npos) { sCode = "LEU7"; eCode = SUCCESS; } else if (sValue.find("EG95NAXD") != std::string::npos) { sCode = "LNA7D"; eCode = SUCCESS; } else if (sValue.find("EG95NA") != std::string::npos) { sCode = "LNA7"; eCode = SUCCESS; } else { sCode = VALUE_NOT_SUPPORTED; eCode = ERROR; } } } else if (sModel.find("EG25") == 0) { if (NULL == radioObject) { sCode = VALUE_NOT_SUPPORTED; eCode = ERROR; } else { std::string sValue; eCode = radioObject->getFirmware(sValue); if (eCode != SUCCESS) { sCode = VALUE_NOT_SUPPORTED; eCode = ERROR; } else if (sValue.find("EG25G") != std::string::npos) { sCode = "L4G1"; eCode = SUCCESS; } else { sCode = VALUE_NOT_SUPPORTED; eCode = ERROR; } } } else if (sModel.find("CB610L") == 0) { sCode = "L6G1"; eCode = SUCCESS; } else { sCode = VALUE_NOT_SUPPORTED; printError("RADIO| Could not identify MTS short code from model. [%s]", sModel.c_str()); eCode = ERROR; } return eCode; } MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertServiceDomainToString(SERVICEDOMAIN eSd, std::string& sSd) { CODE eCode = FAILURE; switch(eSd) { case NO_SERVICE: sSd = VALUE_SD_NO_SERVICE; eCode = SUCCESS; break; case CS_ONLY: sSd = VALUE_SD_CS_ONLY; eCode = SUCCESS; break; case PS_ONLY: sSd = VALUE_SD_PS_ONLY; eCode = SUCCESS; break; case CSPS: sSd = VALUE_SD_CSPS; eCode = SUCCESS; break; default: sSd = VALUE_UNKNOWN; eCode = FAILURE; break; } return eCode; } MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertActiveBandToString(ACTIVEBAND eBand, std::string& sBand) { CODE eCode = FAILURE; switch(eBand) { case GSM_850: sBand = VALUE_ABND_GSM_850; eCode = SUCCESS; break; case GSM_900: sBand = VALUE_ABND_GSM_900; eCode = SUCCESS; break; case DCS_1800: sBand = VALUE_ABND_DCS_1800; eCode = SUCCESS; break; case PCS_1900: sBand = VALUE_ABND_PCS_1900; eCode = SUCCESS; break; default: sBand = VALUE_UNKNOWN; eCode = FAILURE; break; } return eCode; } MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertModelToType(const std::string& sModel, std::string& sType) { CODE eCode = FAILURE; sType = VALUE_NOT_SUPPORTED; if(sModel.find("HE910-D") == 0) { sType = VALUE_TYPE_GSM; eCode = SUCCESS; } else if (sModel.find("HE910-EUD") == 0) { sType = VALUE_TYPE_GSM; eCode = SUCCESS; } else if (sModel.find("LE910-JN1") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE866A1-JS") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910-NAG") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910C4-NF") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910-NA1") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910-SVG") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910-SV1") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910-EUG") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910C4-EU") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910-EU1") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910C1-NS") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("LE910C1-AP") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("ME910C1-WW") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("GE910") == 0) { sType = VALUE_TYPE_GSM; eCode = SUCCESS; } else if (sModel.find("CE910") == 0) { sType = VALUE_TYPE_CDMA; eCode = SUCCESS; } else if (sModel.find("DE910") == 0) { sType = VALUE_TYPE_CDMA; eCode = SUCCESS; } else if (sModel.find("EG95") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("EG25") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else if (sModel.find("CB610L") == 0) { sType = VALUE_TYPE_LTE; eCode = SUCCESS; } else { sType = VALUE_TYPE_GSM; eCode = ERROR; printError("RADIO| Could not identify type from model. [%s]. Assuming [%s]", sModel.c_str(), sType.c_str()); } return eCode; } std::string MTS::IO::ICellularRadio::sendCommand(MTS::AutoPtr& apIo, const std::string& sCmd, const std::vector& vBail, int32_t timeoutMillis, const char& ESC) { IsNeedMoreData isNeedMoreData = [&vBail](const std::string&, const std::string& allData)->bool { for(size_t i = 0; i < vBail.size(); i++) { const std::string& sBail = vBail[i]; if(sBail.size() > 0) { if(allData.find(sBail) != std::string::npos) { //Return when bail string is found printTrace("RADIO| Found bail string [%s]", sBail.c_str()); return false; } } } return true; }; return sendCommand(apIo, sCmd, isNeedMoreData, timeoutMillis, ESC); } std::string MTS::IO::ICellularRadio::sendCommand(MTS::AutoPtr& apIo, const std::string& sCmd, IsNeedMoreData& isNeedMoreData, int32_t timeoutMillis, const char& ESC) { if(MTS::Logger::getPrintLevel() >= MTS::Logger::PrintLevel::TRACE_LEVEL) { printTrace("RADIO| Sending command [%s]", sCmd.c_str()); } if(apIo.isNull()) { printError("RADIO| IO is not set in sendCommand"); return ""; } int32_t iResult; if(ESC == 0x00) { iResult = apIo->write(sCmd.data(), sCmd.size()); } else { std::string sNewCmd(sCmd); sNewCmd.push_back(ESC); iResult = apIo->write(sNewCmd.data(), sNewCmd.size()); } if(iResult == -1) { printError("RADIO| Failed to send command to radio"); return ""; } return waitResponse(apIo, isNeedMoreData, timeoutMillis); } std::string MTS::IO::ICellularRadio::waitResponse(MTS::AutoPtr& apIo, const std::vector& vBail, int32_t timeoutMillis) { IsNeedMoreData isNeedMoreData = [&vBail](const std::string&, const std::string& allData)->bool { for(size_t i = 0; i < vBail.size(); i++) { const std::string& sBail = vBail[i]; if(sBail.size() > 0) { if(allData.find(sBail) != std::string::npos) { //Return when bail string is found printTrace("RADIO| Found bail string [%s]", sBail.c_str()); return false; } } } return true; }; return waitResponse(apIo, isNeedMoreData, timeoutMillis); } std::string MTS::IO::ICellularRadio::waitResponse(MTS::AutoPtr& apIo, MTS::IO::ICellularRadio::IsNeedMoreData& isNeedMoreData, int32_t timeoutMillis) { bool done = false; const uint32_t capacity = 1024; char buffer[capacity]; std::string sResult; Timer timer; timer.start(); do { int32_t iterationTimeout = 100; int bytesRead = apIo->read((char*)buffer, capacity, iterationTimeout); if(bytesRead == -1) { printError("RADIO| Failed to read from radio"); break; } std::string sIteration((char*)buffer, bytesRead); sResult += sIteration; if(isNeedMoreData && !isNeedMoreData(sIteration, sResult)) { printTrace("RADIO| No more data needed"); return sResult; } if(timeoutMillis >= 0) { done = (timer.getMillis() >= (uint64_t)timeoutMillis); } else { //Do not stop looping until bail string is found } } while(!done); //Timed out return sResult; } MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::test(MTS::AutoPtr& apIo, uint32_t timeoutSeconds) { printTrace("RADIO| Basic Test"); uint32_t count = 0; std::string sCmd("AT"); do { std::string sResult = sendCommand(apIo, sCmd); if (sResult.find(RSP_OK) == std::string::npos) { printTrace("RADIO| Waiting for basic radio communication [%s] ...", sResult.c_str()); } else { break; } count++; } while (count < timeoutSeconds); if(count == timeoutSeconds) { printWarning("RADIO| Basic radio communication FAILED"); return NO_RESPONSE; } return SUCCESS; } std::string MTS::IO::ICellularRadio::extractModelFromResult(const std::string& sResult) { std::string sModel(VALUE_NOT_SUPPORTED); if(sResult.find("HE910-D") != std::string::npos) { sModel = "HE910-D"; } else if(sResult.find("HE910-EUD") != std::string::npos) { sModel = "HE910-EUD"; } else if(sResult.find("LE910-JN1") != std::string::npos) { sModel = "LE910-JN1"; } else if(sResult.find("LE866A1-JS") != std::string::npos) { sModel = "LE866A1-JS"; } else if(sResult.find("LE910-NAG") != std::string::npos) { sModel = "LE910-NAG"; } else if(sResult.find("LE910C4-NF") != std::string::npos) { sModel = "LE910C4-NF"; } else if(sResult.find("LE910-NA1") != std::string::npos) { sModel = "LE910-NA1"; } else if(sResult.find("ME910C1-WW") != std::string::npos) { sModel = "ME910C1-WW"; } else if(sResult.find("LE910-SVG") != std::string::npos) { sModel = "LE910-SVG"; } else if(sResult.find("LE910-SV1") != std::string::npos) { sModel = "LE910-SV1"; } else if(sResult.find("LE910-EUG") != std::string::npos) { sModel = "LE910-EUG"; } else if(sResult.find("LE910C4-EU") != std::string::npos) { sModel = "LE910C4-EU"; } else if(sResult.find("LE910-EU1") != std::string::npos) { sModel = "LE910-EU1"; } else if(sResult.find("LE910C1-NS") != std::string::npos) { sModel = "LE910C1-NS"; } else if(sResult.find("LE910C1-AP") != std::string::npos) { sModel = "LE910C1-AP"; } else if(sResult.find("GE910") != std::string::npos) { sModel = "GE910"; } else if(sResult.find("DE910-DUAL") != std::string::npos) { sModel = "DE910-DUAL"; } else if(sResult.find("CE910") != std::string::npos) { sModel = "CE910"; } else if(sResult.find("EG95") != std::string::npos) { sModel = "EG95"; } else if(sResult.find("EG25") != std::string::npos) { sModel = "EG25"; } else if(sResult.find("CB610L") != std::string::npos) { sModel = "CB610L"; } return sModel; } std::string MTS::IO::ICellularRadio::getCodeAsString(CODE eCode) { switch(eCode) { case SUCCESS: return "SUCCESS"; case ERROR: return "ERROR"; case FAILURE: return "FAILURE"; case NO_RESPONSE: return "NO RESPONSE"; default: return "UNKNOWN"; } } MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertUeModeToString(ICellularRadio::UE_MODES_OF_OPERATION mode, std::string& sMode) { CODE rc; switch (mode) { case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1: sMode = "ps_1"; rc = SUCCESS; break; case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2: sMode = "ps_2"; rc = SUCCESS; break; case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1: sMode = "csps_1"; rc = SUCCESS; break; case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2: sMode = "csps_2"; rc = SUCCESS; break; case ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE1: sMode = "cs_1"; rc = SUCCESS; break; case ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE2: sMode = "cs_2"; rc = SUCCESS; break; default: sMode = ICellularRadio::VALUE_UNKNOWN; rc = FAILURE; break; } return rc; } MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertStringToUeMode(const std::string& sMode, ICellularRadio::UE_MODES_OF_OPERATION& mode) { CODE rc; if (sMode == "ps_1") { mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1; rc = SUCCESS; } else if (sMode == "ps_2") { mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2; rc = SUCCESS; } else if (sMode == "csps_1") { mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1; rc = SUCCESS; } else if (sMode == "csps_2") { mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2; rc = SUCCESS; } else if (sMode == "cs_1") { mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE1; rc = SUCCESS; } else if (sMode == "cs_2") { mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE2; rc = SUCCESS; } else { mode = ICellularRadio::UE_MODES_OF_OPERATION::UNKNOWN_MODE; rc = FAILURE; } return rc; }