summaryrefslogtreecommitdiff
path: root/src/MTS_IO_TelitRadio.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/MTS_IO_TelitRadio.cpp')
-rw-r--r--src/MTS_IO_TelitRadio.cpp148
1 files changed, 112 insertions, 36 deletions
diff --git a/src/MTS_IO_TelitRadio.cpp b/src/MTS_IO_TelitRadio.cpp
index 340c0ac..5b8e55d 100644
--- a/src/MTS_IO_TelitRadio.cpp
+++ b/src/MTS_IO_TelitRadio.cpp
@@ -538,42 +538,6 @@ bool TelitRadio::getHardwareVersionFromFirmware(const std::string& sFirmware, st
}
-ICellularRadio::CODE TelitRadio::getRadioNetworkMode(RADIO_NETWORK_MODE &mode)
-{
- std::string sCmd("AT+WS46?");
- std::string cmdResult = sendCommand(sCmd);
- if (cmdResult.find("+WS46:") == std::string::npos) {
- printDebug("%s| AT+WS46? returned unexpected response: [%s][%s]", getName().c_str(), sCmd.c_str(), cmdResult.c_str());
- return FAILURE;
- }
- switch (stoi(MTS::Text::split(cmdResult, ':')[1])) {
- case 12: mode = ICellularRadio::RADIO_NETWORK_MODE_GSM_ONLY; break;
- case 22: mode = ICellularRadio::RADIO_NETWORK_MODE_UMTS_ONLY; break;
- case 25: mode = ICellularRadio::RADIO_NETWORK_MODE_AUTO; break;
- default: mode = ICellularRadio::RADIO_NETWORK_MODE_UNKNOWN; break;
- }
- return SUCCESS;
-}
-
-ICellularRadio::CODE TelitRadio::setRadioNetworkMode(RADIO_NETWORK_MODE mode)
-{
- std::string value;
- switch (mode) {
- case ICellularRadio::RADIO_NETWORK_MODE_GSM_ONLY: value = "12"; break;
- case ICellularRadio::RADIO_NETWORK_MODE_UMTS_ONLY: value = "22"; break;
- case ICellularRadio::RADIO_NETWORK_MODE_AUTO: value = "25"; break;
- default: return FAILURE;
- }
- std::string sCmd("AT+WS46=");
- sCmd += value;
- std::string cmdResult = sendCommand(sCmd);
- if (cmdResult.find(ICellularRadio::RSP_OK) == std::string::npos) {
- printDebug("%s| AT+WS46? returned unexpected response: [%s][%s]", getName().c_str(), sCmd.c_str(), cmdResult.c_str());
- return FAILURE;
- }
- return SUCCESS;
-}
-
ICellularRadio::CODE TelitRadio::getIsSimInserted(bool& bData) {
printTrace("%s| Get SIM insertion status", getName().c_str());
std::string sCmd("AT#SIMDET?");
@@ -664,3 +628,115 @@ ICellularRadio::CODE TelitRadio::getSimLockAttempts(int& iAttemptsPin, int& iAtt
return SUCCESS;
}
+
+ICellularRadio::CODE TelitRadio::getSupportedCellularModes(CELLULAR_MODES &networks) {
+ networks = CELLULAR_MODE_NA;
+ std::string sCmd("AT+WS46=?");
+ std::string cmdResult = sendCommand(sCmd);
+ if (cmdResult.find("+WS46:") == std::string::npos) {
+ printError("%s| AT+WS46=? returned unexpected response: [%s][%s]", getName().c_str(), sCmd.c_str(), cmdResult.c_str());
+ return FAILURE;
+ }
+
+ if (cmdResult.find('(') == std::string::npos) {
+ printError("AT+WS46: error responce %s", cmdResult.c_str());
+ return FAILURE;
+ }
+ std::string s = MTS::Text::split(cmdResult, '(')[1];
+ s = MTS::Text::split(s, ')')[0];
+ std::vector<std::string>v = MTS::Text::split(s, ',');
+ std::vector<int> m;
+ for(const auto &it : v)
+ {
+ if (it.find("-") != std::string::npos) {
+ const std::vector<std::string> &r = MTS::Text::split(it, "-");
+ int begin, end;
+ if ( ! MTS::Text::parse(begin, r[0]) || ! MTS::Text::parse(end, r[1])) {
+ printError("AT+WS46: error parsing network mode range: %s-%s", r[0].c_str(), r[1].c_str());
+ return FAILURE;
+ }
+ for (int i = begin; i<=end; ++i) {
+ m.push_back(i);
+ if (m.size()>1024)
+ break;
+ }
+ } else {
+ int v;
+ if ( ! MTS::Text::parse(v, it)) {
+ printError("AT+WS46: error parsing network mode: %s", it.c_str());
+ return FAILURE;
+ }
+ m.push_back(v);
+ }
+ }
+ if (m.size()>1024) {
+ printError("AT+WS46: network modes count overflow, parsing error");
+ return FAILURE;
+ }
+
+ // Now m contains all network modes
+ for(const auto &it : m) {
+ networks = preferredNetwork(networks, it);
+ }
+
+ return SUCCESS;
+}
+
+ICellularRadio::CODE TelitRadio::setCellularMode(CELLULAR_MODES networks) {
+ int wds = 0;
+ // 3GPP TS 27.007
+ // https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1515
+ switch (static_cast<int>(networks)) {
+ case CELLULAR_MODE_2G : wds = 12; break;
+ case CELLULAR_MODE_3G : wds = 22; break;
+ case CELLULAR_MODE_2G | CELLULAR_MODE_3G | CELLULAR_MODE_4G : wds = 25; break;
+ case CELLULAR_MODE_4G : wds = 28; break;
+ case CELLULAR_MODE_2G | CELLULAR_MODE_3G : wds = 29; break;
+ case CELLULAR_MODE_2G | CELLULAR_MODE_4G : wds = 30; break;
+ case CELLULAR_MODE_3G | CELLULAR_MODE_4G : wds = 31; break;
+ case CELLULAR_MODE_2G | CELLULAR_MODE_3G | CELLULAR_MODE_4G | CELLULAR_MODE_5G: wds = 35; break;
+ case CELLULAR_MODE_5G: wds = 36; break;
+ case CELLULAR_MODE_4G | CELLULAR_MODE_5G: wds = 37; break;
+ case CELLULAR_MODE_3G | CELLULAR_MODE_4G | CELLULAR_MODE_5G: wds = 38; break;
+ case CELLULAR_MODE_2G | CELLULAR_MODE_4G | CELLULAR_MODE_5G: wds = 39; break;
+ case CELLULAR_MODE_3G | CELLULAR_MODE_5G: wds = 40; break;
+ case CELLULAR_MODE_2G | CELLULAR_MODE_3G | CELLULAR_MODE_5G: wds = 41; break;
+ case CELLULAR_MODE_2G | CELLULAR_MODE_5G: wds = 42; break;
+ }
+ std::string sCmd("AT+WS46=");
+ sCmd += std::to_string(wds);
+ std::string cmdResult = sendCommand(sCmd);
+ if (cmdResult.find(ICellularRadio::RSP_OK) == std::string::npos) {
+ printError("%s| AT+WS46= returned unexpected response: [%s][%s]", getName().c_str(), sCmd.c_str(), cmdResult.c_str());
+ return FAILURE;
+ }
+ return SUCCESS;
+}
+
+ICellularRadio::CELLULAR_MODES TelitRadio::preferredNetwork(CELLULAR_MODES prefNetwork, int wds)
+{
+ int result = prefNetwork;
+ // 3GPP TS 27.007
+ // https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1515
+ switch (wds) {
+ case 12: result |= CELLULAR_MODE_2G; break;
+ case 22: result |= CELLULAR_MODE_3G; break;
+ case 25: result |= CELLULAR_MODE_2G | CELLULAR_MODE_3G | CELLULAR_MODE_4G; break;
+ case 28: result |= CELLULAR_MODE_4G; break;
+ case 29: result |= CELLULAR_MODE_2G | CELLULAR_MODE_3G; break;
+ case 30: result |= CELLULAR_MODE_2G | CELLULAR_MODE_4G; break;
+ case 31: result |= CELLULAR_MODE_3G | CELLULAR_MODE_4G; break;
+ case 35: result |= CELLULAR_MODE_2G | CELLULAR_MODE_3G | CELLULAR_MODE_4G | CELLULAR_MODE_5G; break;
+ case 36: result |= CELLULAR_MODE_5G; break;
+ case 37: result |= CELLULAR_MODE_4G | CELLULAR_MODE_5G; break;
+ case 38: result |= CELLULAR_MODE_3G | CELLULAR_MODE_4G | CELLULAR_MODE_5G; break;
+ case 39: result |= CELLULAR_MODE_2G | CELLULAR_MODE_4G | CELLULAR_MODE_5G; break;
+ case 40: result |= CELLULAR_MODE_3G | CELLULAR_MODE_5G; break;
+ case 41: result |= CELLULAR_MODE_2G | CELLULAR_MODE_3G | CELLULAR_MODE_5G; break;
+ case 42: result |= CELLULAR_MODE_2G | CELLULAR_MODE_5G; break;
+ default:
+ printError("AT+WS46: unhandled network mode: %d", wds);
+ break;
+ }
+ return static_cast<CELLULAR_MODES>(result);
+}