diff options
Diffstat (limited to 'src/MTS_IO_CellularRadioFactory.cpp')
-rw-r--r-- | src/MTS_IO_CellularRadioFactory.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/MTS_IO_CellularRadioFactory.cpp b/src/MTS_IO_CellularRadioFactory.cpp new file mode 100644 index 0000000..3a5cb74 --- /dev/null +++ b/src/MTS_IO_CellularRadioFactory.cpp @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2015 by Multi-Tech Systems + * + * This file is part of libmts_io. + * + * libmts_io is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * libmts_io is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with libmts_io. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/*! + \file MTS_IO_CellularRadioFactory.cpp + \brief A brief description + \date Nov 5, 2014 + \author sgodinez + + A more elaborate description +*/ + +#include <mts/MTS_IO_CellularRadioFactory.h> +#include <mts/MTS_IO_HE910DRadio.h> +#include <mts/MTS_IO_HE910EUDRadio.h> +#include <mts/MTS_IO_LE910NAGRadio.h> +#include <mts/MTS_IO_LE910SVGRadio.h> +#include <mts/MTS_IO_LE910EUGRadio.h> +#include <mts/MTS_IO_GE910Radio.h> +#include <mts/MTS_IO_CE910Radio.h> +#include <mts/MTS_IO_DE910Radio.h> +#include <mts/MTS_Logger.h> + +using namespace MTS::IO; + +CellularRadioFactory::CellularRadioFactory() { + m_mCreationMap[HE910DRadio::MODEL_NAME] = &CellularRadioFactory::createHE910D; + m_mCreationMap[HE910EUDRadio::MODEL_NAME] = &CellularRadioFactory::createHE910EUD; + m_mCreationMap[LE910NAGRadio::MODEL_NAME] = &CellularRadioFactory::createLE910NAG; + m_mCreationMap[LE910SVGRadio::MODEL_NAME] = &CellularRadioFactory::createLE910SVG; + m_mCreationMap[LE910EUGRadio::MODEL_NAME] = &CellularRadioFactory::createLE910EUG; + m_mCreationMap[GE910Radio::MODEL_NAME] = &CellularRadioFactory::createGE910; + m_mCreationMap[DE910Radio::MODEL_NAME] = &CellularRadioFactory::createDE910; + m_mCreationMap[CE910Radio::MODEL_NAME] = &CellularRadioFactory::createCE910; +} + +MTS::IO::CellularRadio* CellularRadioFactory::create(const std::string& sModel, const std::string& sPort) { + + std::string model(sModel); + + if(model.size() == 0) { + model = identifyRadio(sPort); + } + + if(m_mCreationMap.count(model)) { + //Call this object's function via a function pointer + return (this->*m_mCreationMap[model])(sPort); + } + + printWarning("[CELLULARRADIOFACTORY] Unknown radio [%s]. Attempting HE910 version.", model.c_str()); + + return new HE910DRadio(sPort); +} + +std::string CellularRadioFactory::identifyRadio(const std::string& sPort) { + MTS::AutoPtr<Connection> apIo; + + //Attempt to open port to radio + apIo.reset(new SerialConnection(SerialConnection::Builder(sPort).baudRate(115200).useLockFile().build())); + while(!apIo->open(30000)) { + printError("CellularRadioFactory| Failed to open radio port [%s]", sPort.c_str()); + return CellularRadio::VALUE_UNKNOWN; + } + + //Attempt basic radio communication + if(CellularRadio::test(apIo) != CellularRadio::SUCCESS) { + printError("CellularRadioFactory| Failed to communicate with radio on port [%s]", sPort.c_str()); + apIo->close(); + return CellularRadio::VALUE_UNKNOWN; + } + + //Get model + int count = 0; + std::string sCmd("ATI4"); + std::string sResult; + do { + sResult = CellularRadio::sendCommand(apIo, sCmd, CellularRadio::DEFAULT_BAIL_STRINGS, 1000, CellularRadio::CR); + if (sResult.find("OK") == std::string::npos) { + printDebug("RADIO| Attempting to get radio model [%s] ...", sResult.c_str()); + } else { + break; + } + count++; + } while (count < 30); + + if(count == 30) { + printDebug("RADIO| Unable to get radio model"); + apIo->close(); + return CellularRadio::VALUE_UNKNOWN; + } + + std::string sModel = CellularRadio::extractModelFromResult(sResult); + printDebug("RADIO| Extracted [%s] from ATI4 query", sModel.c_str()); + apIo->close(); + return sModel; +} + +CellularRadio* CellularRadioFactory::createHE910D(const std::string& sPort) { + return new HE910DRadio(sPort); +} + +CellularRadio* CellularRadioFactory::createHE910EUD(const std::string& sPort) { + return new HE910EUDRadio(sPort); +} + +CellularRadio* CellularRadioFactory::createLE910NAG(const std::string& sPort) { + return new LE910NAGRadio(sPort); +} + +CellularRadio* CellularRadioFactory::createLE910SVG(const std::string& sPort) { + return new LE910SVGRadio(sPort); +} + +CellularRadio* CellularRadioFactory::createLE910EUG(const std::string& sPort) { + return new LE910EUGRadio(sPort); +} + +CellularRadio* CellularRadioFactory::createGE910(const std::string& sPort) { + return new GE910Radio(sPort); +} + +CellularRadio* CellularRadioFactory::createDE910(const std::string& sPort) { + return new DE910Radio(sPort); +} + +CellularRadio* CellularRadioFactory::createCE910(const std::string& sPort) { + return new CE910Radio(sPort); +} |