summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhii Kostiuk <serhii.o.kostiuk@globallogic.com>2020-07-17 02:51:22 -0500
committerSerhii Kostiuk <serhii.o.kostiuk@globallogic.com>2020-07-17 02:51:22 -0500
commitd520358b3e88ae80af968254b42645c4d9eae604 (patch)
treed6c9c3f1f23de7e215fca1dbbe4f38b3c4a09815
parentf0be0e4a343f9a600fe8c9fc34fa580c548a4e9e (diff)
parent298efe4e17d3665f9ddbb9298a37b563c60de735 (diff)
downloadlibmts-io-d520358b3e88ae80af968254b42645c4d9eae604.tar.gz
libmts-io-d520358b3e88ae80af968254b42645c4d9eae604.tar.bz2
libmts-io-d520358b3e88ae80af968254b42645c4d9eae604.zip
Merge branch 'ap/vendor_firmware' into 'delta-radio-fwu'
Add vendor firmware version See merge request !29
-rw-r--r--include/mts/MTS_IO_CellularRadio.h1
-rw-r--r--include/mts/MTS_IO_ICellularRadio.h2
-rw-r--r--include/mts/MTS_IO_ME910Radio.h2
-rw-r--r--include/mts/MTS_IO_QuectelRadio.h5
-rw-r--r--include/mts/MTS_IO_TelitRadio.h4
-rw-r--r--src/MTS_IO_CellularRadio.cpp5
-rw-r--r--src/MTS_IO_ICellularRadio.cpp1
-rw-r--r--src/MTS_IO_ME910Radio.cpp32
-rw-r--r--src/MTS_IO_QuectelRadio.cpp44
-rw-r--r--src/MTS_IO_TelitRadio.cpp113
10 files changed, 110 insertions, 99 deletions
diff --git a/include/mts/MTS_IO_CellularRadio.h b/include/mts/MTS_IO_CellularRadio.h
index 57a4de6..ab6e00a 100644
--- a/include/mts/MTS_IO_CellularRadio.h
+++ b/include/mts/MTS_IO_CellularRadio.h
@@ -55,6 +55,7 @@ namespace MTS {
CODE getFirmware(std::string& sFirmware) override;
CODE getFirmwareBuild(std::string& sFirmwareBuild) override;
+ CODE getVendorFirmware(std::string& sVendorFirmware) override;
CODE getHardware(std::string& sHardware) override;
CODE getManufacturer(std::string& sManufacturer) override;
CODE getImei(std::string& sImei) override;
diff --git a/include/mts/MTS_IO_ICellularRadio.h b/include/mts/MTS_IO_ICellularRadio.h
index e1edbcd..085c217 100644
--- a/include/mts/MTS_IO_ICellularRadio.h
+++ b/include/mts/MTS_IO_ICellularRadio.h
@@ -119,6 +119,7 @@ namespace MTS {
static const char *KEY_HARDWARE; //!< Radio Hardware Version
static const char *KEY_FIRMWARE; //!< Radio Firmware Version
static const char *KEY_FIRMWARE_BUILD;//!< Radio Firmware Build
+ static const char *KEY_VENDOR_FIRMWARE; //!< Radio Vendor Firmware Version
static const char *KEY_IMEI; //!< International Mobile Station Equipment Identity
static const char *KEY_MEID; //!< Mobile Equipment Identifier
static const char *KEY_IMSI; //!< International Mobile Subscriber Identity
@@ -221,6 +222,7 @@ namespace MTS {
virtual CODE getFirmware(std::string& sFirmware) = 0;
virtual CODE getFirmwareBuild(std::string& sFirmwareBuild) = 0;
+ virtual CODE getVendorFirmware(std::string& sVendorFirmware) = 0;
virtual CODE getHardware(std::string& sHardware) = 0;
virtual CODE getManufacturer(std::string& sManufacturer) = 0;
virtual CODE getImei(std::string& sImei) = 0;
diff --git a/include/mts/MTS_IO_ME910Radio.h b/include/mts/MTS_IO_ME910Radio.h
index 09e8ede..93af86f 100644
--- a/include/mts/MTS_IO_ME910Radio.h
+++ b/include/mts/MTS_IO_ME910Radio.h
@@ -36,8 +36,6 @@ namespace MTS {
virtual CODE setRxDiversity(const Json::Value& jArgs);
- virtual CODE getFirmwareBuild(std::string& sFirmware);
-
protected:
private:
diff --git a/include/mts/MTS_IO_QuectelRadio.h b/include/mts/MTS_IO_QuectelRadio.h
index 6e7372b..41c89dc 100644
--- a/include/mts/MTS_IO_QuectelRadio.h
+++ b/include/mts/MTS_IO_QuectelRadio.h
@@ -31,6 +31,7 @@ namespace MTS {
public:
bool resetRadio(uint32_t iTimeoutMillis = 5000) override;
+ CODE getVendorFirmware(std::string& sVendorFirmware) override;
CODE getModel(std::string& sModel) override;
CODE getIccid(std::string& sIccid) override;
CODE getService(std::string& sService) override;
@@ -72,10 +73,6 @@ namespace MTS {
static const std::string VALUE_MTS_DELTA_NAME;
static const std::string VALUE_MTS_DELTA_PATH;
- // TODO: Consider asbtracting to the ICellularRadio::getFirmwareBuild
- //!< Get Quectel-specific firmware version (firmware build?)
- CODE getQuectelFirmware(std::string& sFirmware);
-
CODE startFileUpload(const std::string& sTargetFilename, size_t nBytes);
CODE abortFileUpload();
diff --git a/include/mts/MTS_IO_TelitRadio.h b/include/mts/MTS_IO_TelitRadio.h
index a3425f9..c3ba764 100644
--- a/include/mts/MTS_IO_TelitRadio.h
+++ b/include/mts/MTS_IO_TelitRadio.h
@@ -30,6 +30,8 @@ namespace MTS {
public:
bool resetRadio(uint32_t iTimeoutMillis = 5000) override;
+ CODE getFirmwareBuild(std::string& sFirmwareBuild) override;
+ CODE getVendorFirmware(std::string& sVendorFirmware) override;
CODE getModel(std::string& sModel) override;
CODE getIccid(std::string& sIccid) override;
CODE getService(std::string& sService) override;
@@ -79,8 +81,6 @@ namespace MTS {
static const size_t FILE_CHUNK_SIZE;
static const std::string CMD_ABORT_UPLOAD;
- CODE getTelitFirmware(std::string& sFirmware);
-
CODE startWrite();
CODE abortWrite();
diff --git a/src/MTS_IO_CellularRadio.cpp b/src/MTS_IO_CellularRadio.cpp
index c4514e6..19f1b7b 100644
--- a/src/MTS_IO_CellularRadio.cpp
+++ b/src/MTS_IO_CellularRadio.cpp
@@ -200,6 +200,11 @@ ICellularRadio::CODE CellularRadio::getFirmwareBuild(std::string& sFirmwareBuild
return FAILURE;
}
+ICellularRadio::CODE CellularRadio::getVendorFirmware(std::string& sVendorFirmware) {
+ sVendorFirmware = ICellularRadio::VALUE_NOT_SUPPORTED;
+ return FAILURE;
+}
+
ICellularRadio::CODE CellularRadio::getHardware(std::string& sHardware) {
printTrace("%s| Get Hardware", m_sName.c_str());
sHardware = ICellularRadio::VALUE_NOT_SUPPORTED;
diff --git a/src/MTS_IO_ICellularRadio.cpp b/src/MTS_IO_ICellularRadio.cpp
index 4b58189..9dbfad1 100644
--- a/src/MTS_IO_ICellularRadio.cpp
+++ b/src/MTS_IO_ICellularRadio.cpp
@@ -33,6 +33,7 @@ const char *MTS::IO::ICellularRadio::KEY_MANUFACTURER = "manufacturer"; //!<
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";
diff --git a/src/MTS_IO_ME910Radio.cpp b/src/MTS_IO_ME910Radio.cpp
index 2b181d2..ad3e7ec 100644
--- a/src/MTS_IO_ME910Radio.cpp
+++ b/src/MTS_IO_ME910Radio.cpp
@@ -33,35 +33,3 @@ ME910Radio::ME910Radio(const std::string& sME910Model, const std::string& sPort)
ICellularRadio::CODE ME910Radio::setRxDiversity(const Json::Value& jArgs) {
return FAILURE;
}
-
-
-ICellularRadio::CODE ME910Radio::getFirmwareBuild(std::string& sFirmwareBuild) {
- std::string sCmd("AT#CFVR");
-
- std::string sResult = sendCommand(sCmd);
-
- size_t end = sResult.find(ICellularRadio::RSP_OK);
- if (end == std::string::npos) {
- printWarning("%s| Unable to get firmware build number [%s]",
- getName().c_str(),
- sCmd.c_str());
- return FAILURE;
- }
-
- size_t start = sResult.find("#CFVR:");
- if (start == std::string::npos) {
- printWarning("%s| Command returned unexpected response [%s]",
- getName().c_str(),
- sCmd.c_str());
- return FAILURE;
- }
-
- start += sizeof("#CFVR:");
-
- sFirmwareBuild = MTS::Text::trim(sResult.substr(start, end-start));
- if(sFirmwareBuild.size() == 0) {
- printWarning("%s| Firmware Build Version is empty", getName().c_str());
- return FAILURE;
- }
- return SUCCESS;
-}
diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp
index 2d1ffcd..22fa92f 100644
--- a/src/MTS_IO_QuectelRadio.cpp
+++ b/src/MTS_IO_QuectelRadio.cpp
@@ -56,6 +56,26 @@ bool QuectelRadio::resetRadio(uint32_t iTimeoutMillis) {
return false;
}
+ICellularRadio::CODE QuectelRadio::getVendorFirmware(std::string& sVendorFirmware) {
+ printTrace("%s| Get Quectel-specific firmware version", getName().c_str());
+ sVendorFirmware = ICellularRadio::VALUE_NOT_SUPPORTED;
+ std::string sCmd("AT+QGMR");
+ std::string sResult = sendCommand(sCmd);
+ size_t pos = sResult.find(ICellularRadio::RSP_OK);
+ if (pos == std::string::npos) {
+ printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str());
+ return FAILURE;
+ }
+
+ sVendorFirmware = MTS::Text::trim(sResult.substr(0, pos));
+ if(sVendorFirmware.size() == 0) {
+ printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str());
+ return FAILURE;
+ }
+
+ return SUCCESS;
+}
+
ICellularRadio::CODE QuectelRadio::getModel(std::string& sModel) {
printTrace("%s| Get Model", getName().c_str());
//Always returns SUCCESS because the model should be m_sName
@@ -591,7 +611,7 @@ ICellularRadio::CODE QuectelRadio::fumoLocalApply(ICellularRadio::UpdateCb& step
ICellularRadio::CODE rc;
std::string sCmd;
- rc = getQuectelFirmware(m_sQuectelFirmware);
+ rc = getVendorFirmware(m_sQuectelFirmware);
if (rc != SUCCESS) {
callNextStep(stepCb, "FUMO Error: Failed to obtain current firmware version");
return rc;
@@ -954,26 +974,6 @@ ICellularRadio::CODE QuectelRadio::checkFile(bool& bIsFilePresent, const std::st
return SUCCESS;
}
-ICellularRadio::CODE QuectelRadio::getQuectelFirmware(std::string& sFirmware) {
- printTrace("%s| Get Quectel-specific firmware version", getName().c_str());
- sFirmware = ICellularRadio::VALUE_NOT_SUPPORTED;
- std::string sCmd("AT+QGMR");
- std::string sResult = sendCommand(sCmd);
- size_t pos = sResult.find(ICellularRadio::RSP_OK);
- if (pos == std::string::npos) {
- printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str());
- return FAILURE;
- }
-
- sFirmware = MTS::Text::trim(sResult.substr(0, pos));
- if(sFirmware.size() == 0) {
- printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str());
- return FAILURE;
- }
-
- return SUCCESS;
-}
-
uint16_t QuectelRadio::getQuectelChecksum(const void* data, size_t nBytes) {
auto castData = static_cast<const uint8_t*>(data);
uint16_t iChecksum = 0;
@@ -1053,7 +1053,7 @@ ICellularRadio::CODE QuectelRadio::fumoWaitNewFirmware(ICellularRadio::UpdateCb&
MTS::Thread::sleep(10000);
- if (getQuectelFirmware(sQuectelFirmware) != SUCCESS) {
+ if (getVendorFirmware(sQuectelFirmware) != SUCCESS) {
// The radio is probably unavailable
resetConnection(100);
continue;
diff --git a/src/MTS_IO_TelitRadio.cpp b/src/MTS_IO_TelitRadio.cpp
index 52b5664..a82004c 100644
--- a/src/MTS_IO_TelitRadio.cpp
+++ b/src/MTS_IO_TelitRadio.cpp
@@ -51,6 +51,80 @@ bool TelitRadio::resetRadio(uint32_t iTimeoutMillis) {
return false;
}
+ICellularRadio::CODE TelitRadio::getFirmwareBuild(std::string& sFirmwareBuild) {
+ std::string sCmd("AT#CFVR");
+
+ std::string sResult = sendCommand(sCmd);
+
+ size_t end = sResult.find(ICellularRadio::RSP_OK);
+ if (end == std::string::npos) {
+ printWarning("%s| Unable to get firmware build number [%s]",
+ getName().c_str(),
+ sCmd.c_str());
+ return FAILURE;
+ }
+
+ size_t start = sResult.find("#CFVR:");
+ if (start == std::string::npos) {
+ printWarning("%s| Command returned unexpected response [%s]",
+ getName().c_str(),
+ sCmd.c_str());
+ return FAILURE;
+ }
+
+ start += sizeof("#CFVR:");
+
+ sFirmwareBuild = MTS::Text::trim(sResult.substr(start, end-start));
+ if(sFirmwareBuild.size() == 0) {
+ printWarning("%s| Firmware Build Version is empty", getName().c_str());
+ return FAILURE;
+ }
+ return SUCCESS;
+}
+
+ICellularRadio::CODE TelitRadio::getVendorFirmware(std::string& sVendorFirmware) {
+ printTrace("%s| Get Telit-specific firmware version", getName().c_str());
+ ICellularRadio::CODE rc = FAILURE;
+ sVendorFirmware = ICellularRadio::VALUE_NOT_SUPPORTED;
+ std::string sFirmware;
+ std::string sFirmwareBuild;
+ std::string sCmd("AT#SWPKGV");
+ std::string sResult = sendCommand(sCmd);
+ size_t pos = sResult.find(ICellularRadio::RSP_OK);
+
+ do {
+
+ if (pos != std::string::npos) {
+ // Found
+ std::vector<std::string> vLine = MTS::Text::split(sResult, "\r");
+ sVendorFirmware = MTS::Text::trim(vLine[1]);
+ if(sVendorFirmware.size() == 0) {
+ printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str());
+ rc = FAILURE;
+ } else {
+ rc = SUCCESS;
+ }
+ break;
+ }
+
+ // Not Found. Then we will use "AT+CGMR" + "AT#CFVR"
+ rc = getFirmware(sFirmware);
+ if (rc != SUCCESS){
+ break;
+ }
+
+ rc = getFirmwareBuild(sFirmwareBuild);
+ if (rc != SUCCESS){
+ break;
+ }
+
+ sVendorFirmware = sFirmware + "," + sFirmwareBuild;
+
+ } while (false);
+
+
+ return rc;
+}
ICellularRadio::CODE TelitRadio::getModel(std::string& sModel) {
printTrace("%s| Get Model", getName().c_str());
@@ -789,7 +863,7 @@ ICellularRadio::CODE TelitRadio::fumoLocalApply(ICellularRadio::UpdateCb& stepCb
std::string sCmd;
FOTA_GROUP group = getFotaGroup();
- rc = getTelitFirmware(m_sTelitFirmware);
+ rc = getVendorFirmware(m_sTelitFirmware);
if (rc != SUCCESS) {
callNextStep(stepCb, "FUMO Error: Failed to obtain current firmware version");
return rc;
@@ -938,41 +1012,6 @@ ICellularRadio::CODE TelitRadio::abortWrite() {
return sendBasicCommand(CMD_ABORT_UPLOAD, 2000, 0x00);
}
-ICellularRadio::CODE TelitRadio::getTelitFirmware(std::string& sFirmware) {
- /*
- * Currently, AT+CGMR command is used to determine the radio firmware version.
- *
- * AT+CGMR
- * M0F.670006
- *
- * Perhaps in the future we will use AT#SWPKGV command.
- *
- * AT#SWPKGV
- * 25.20.676-P0F.670690
- * M0F.670006
- * P0F.670690
- * A0F.670006
- */
-
- printTrace("%s| Get Telit-specific firmware version", getName().c_str());
- sFirmware = ICellularRadio::VALUE_NOT_SUPPORTED;
- std::string sCmd("AT+CGMR");
- std::string sResult = sendCommand(sCmd);
- size_t pos = sResult.find(ICellularRadio::RSP_OK);
- if (pos == std::string::npos) {
- printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str());
- return FAILURE;
- }
-
- sFirmware = MTS::Text::trim(sResult.substr(0, pos));
- if(sFirmware.size() == 0) {
- printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str());
- return FAILURE;
- }
-
- return SUCCESS;
-}
-
ICellularRadio::CODE TelitRadio::fumoWaitUpgradeFinished(ICellularRadio::UpdateCb& stepCb) {
const uint32_t duAttachTimeout = 300000; // wait for 300 seconds for the radio to attach
const uint32_t duUrcTimeout = 60 * 1000; // wait for 1 minutes for the next URC message
@@ -1026,7 +1065,7 @@ ICellularRadio::CODE TelitRadio::fumoCheckNewFirmware(ICellularRadio::UpdateCb&
CODE rc = SUCCESS;
std::string sTelitFirmware;
- rc = getTelitFirmware(sTelitFirmware);
+ rc = getVendorFirmware(sTelitFirmware);
if (rc != SUCCESS) {
callNextStep(stepCb, "FUMO Error: Failed to obtain current firmware version");