Cellular library for MTS Socket Modem Arduino Shield devices from Multi-Tech Systems

Dependents:   mtsas mtsas mtsas mtsas

Committer:
Leon Lindenfelser
Date:
Mon Feb 19 14:25:58 2018 -0600
Revision:
82:5b33b670adb7
Parent:
81:2e12915f892e
Add support for MTQ-LAT3(LE910-NA1) adn MTQ-LVW3(LE910-sv1)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Leon Lindenfelser 82:5b33b670adb7 1 #include "mbed.h"
Leon Lindenfelser 82:5b33b670adb7 2 #include "CellularFactory.h"
Leon Lindenfelser 82:5b33b670adb7 3 #include "MTSLog.h"
Leon Lindenfelser 82:5b33b670adb7 4 #include <string>
Leon Lindenfelser 82:5b33b670adb7 5
Leon Lindenfelser 82:5b33b670adb7 6 using namespace mts;
Leon Lindenfelser 82:5b33b670adb7 7
Leon Lindenfelser 82:5b33b670adb7 8 Cellular* CellularFactory::create(MTSBufferedIO* io) {
Leon Lindenfelser 82:5b33b670adb7 9 bool uip;
Leon Lindenfelser 82:5b33b670adb7 10 std::string model;
Leon Lindenfelser 82:5b33b670adb7 11 std::string reply;
Leon Lindenfelser 82:5b33b670adb7 12 Cellular::Radio type = Cellular::NA;
Leon Lindenfelser 82:5b33b670adb7 13 Cellular* cell;
Leon Lindenfelser 82:5b33b670adb7 14
Leon Lindenfelser 82:5b33b670adb7 15 /* wait for radio to get into a good state */
Leon Lindenfelser 82:5b33b670adb7 16 while (true) {
Leon Lindenfelser 82:5b33b670adb7 17 if (sendCommand(io, "AT", 1000).find("OK") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 18 logTrace("radio replied");
Leon Lindenfelser 82:5b33b670adb7 19 break;
Leon Lindenfelser 82:5b33b670adb7 20 } else {
Leon Lindenfelser 82:5b33b670adb7 21 logTrace("waiting on radio...");
Leon Lindenfelser 82:5b33b670adb7 22 }
Leon Lindenfelser 82:5b33b670adb7 23 wait(1);
Leon Lindenfelser 82:5b33b670adb7 24 }
Leon Lindenfelser 82:5b33b670adb7 25
Leon Lindenfelser 82:5b33b670adb7 26 while (true) {
Leon Lindenfelser 82:5b33b670adb7 27 /* AT#VVERSION is a UIP specific AT command
Leon Lindenfelser 82:5b33b670adb7 28 * if we get an error response, we're not using a UIP board */
Leon Lindenfelser 82:5b33b670adb7 29 reply = sendCommand(io, "AT#VVERSION", 2000);
Leon Lindenfelser 82:5b33b670adb7 30 if ((reply.find("ERROR") != string::npos) || (reply.find("error") != string::npos)) {
Leon Lindenfelser 82:5b33b670adb7 31 uip = false;
Leon Lindenfelser 82:5b33b670adb7 32 break;
Leon Lindenfelser 82:5b33b670adb7 33 } else if (reply.find("VVERSION:") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 34 uip = true;
Leon Lindenfelser 82:5b33b670adb7 35 break;
Leon Lindenfelser 82:5b33b670adb7 36 } else {
Leon Lindenfelser 82:5b33b670adb7 37 logTrace("Checking for UIP chip");
Leon Lindenfelser 82:5b33b670adb7 38 }
Leon Lindenfelser 82:5b33b670adb7 39 wait(1);
Leon Lindenfelser 82:5b33b670adb7 40 }
Leon Lindenfelser 82:5b33b670adb7 41
Leon Lindenfelser 82:5b33b670adb7 42 /* "ATI4" gets us the model (HE910, DE910, etc) */
Leon Lindenfelser 82:5b33b670adb7 43 while (true) {
Leon Lindenfelser 82:5b33b670adb7 44 string mNumber;
Leon Lindenfelser 82:5b33b670adb7 45 model = sendCommand(io, "ATI4", 3000);
Leon Lindenfelser 82:5b33b670adb7 46 if (uip) {
Leon Lindenfelser 82:5b33b670adb7 47 if (model.find("HE910") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 48 type = Cellular::MTSMC_H5_IP;
Leon Lindenfelser 82:5b33b670adb7 49 mNumber = "HE910";
Leon Lindenfelser 82:5b33b670adb7 50 } else if (model.find("DE910") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 51 type = Cellular::MTSMC_EV3_IP;
Leon Lindenfelser 82:5b33b670adb7 52 mNumber = "DE910";
Leon Lindenfelser 82:5b33b670adb7 53 } else if (model.find("CE910") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 54 type = Cellular::MTSMC_C2_IP;
Leon Lindenfelser 82:5b33b670adb7 55 mNumber = "CE910";
Leon Lindenfelser 82:5b33b670adb7 56 }
Leon Lindenfelser 82:5b33b670adb7 57 if (type != Cellular::NA) {
Leon Lindenfelser 82:5b33b670adb7 58 cell = new UIP(type);
Leon Lindenfelser 82:5b33b670adb7 59 logDebug("UIP radio model: %s", mNumber.c_str());
Leon Lindenfelser 82:5b33b670adb7 60 break;
Leon Lindenfelser 82:5b33b670adb7 61 }
Leon Lindenfelser 82:5b33b670adb7 62 } else {
Leon Lindenfelser 82:5b33b670adb7 63 if (model.find("HE910") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 64 type = Cellular::MTSMC_H5;
Leon Lindenfelser 82:5b33b670adb7 65 mNumber = "HE910";
Leon Lindenfelser 82:5b33b670adb7 66 } else if (model.find("DE910") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 67 type = Cellular::MTSMC_EV3;
Leon Lindenfelser 82:5b33b670adb7 68 mNumber = "DE910";
Leon Lindenfelser 82:5b33b670adb7 69 } else if (model.find("CE910") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 70 type = Cellular::MTSMC_C2;
Leon Lindenfelser 82:5b33b670adb7 71 mNumber = "CE910";
Leon Lindenfelser 82:5b33b670adb7 72 } else if (model.find("GE910") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 73 type = Cellular::MTSMC_G3;
Leon Lindenfelser 82:5b33b670adb7 74 mNumber = "GE910";
Leon Lindenfelser 82:5b33b670adb7 75 } else if (model.find("LE910-NAG") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 76 type = Cellular::MTSMC_LAT1;
Leon Lindenfelser 82:5b33b670adb7 77 mNumber = "LE910-NAG";
Leon Lindenfelser 82:5b33b670adb7 78 } else if (model.find("LE910-SVG") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 79 type = Cellular::MTSMC_LVW2;
Leon Lindenfelser 82:5b33b670adb7 80 mNumber = "LE910-SVG";
Leon Lindenfelser 82:5b33b670adb7 81 } else if (model.find("LE910-EUG") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 82 type = Cellular::MTSMC_LEU1;
Leon Lindenfelser 82:5b33b670adb7 83 mNumber = "LE910-EUG";
Leon Lindenfelser 82:5b33b670adb7 84 } else if (model.find("LE910-NA1") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 85 type = Cellular::MTQ_LAT3;
Leon Lindenfelser 82:5b33b670adb7 86 mNumber = "LE910-NA1";
Leon Lindenfelser 82:5b33b670adb7 87 } else if (model.find("LE910-SV1") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 88 type = Cellular::MTQ_LVW3;
Leon Lindenfelser 82:5b33b670adb7 89 mNumber = "LE910-SV1";
Leon Lindenfelser 82:5b33b670adb7 90 } else if (model.find("ME910C1-NA") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 91 type = Cellular::MTQ_MAT1;
Leon Lindenfelser 82:5b33b670adb7 92 mNumber = "ME910C1-NA";
Leon Lindenfelser 82:5b33b670adb7 93 } else if (model.find("ME910C1-NV") != string::npos) {
Leon Lindenfelser 82:5b33b670adb7 94 type = Cellular::MTQ_MVW1;
Leon Lindenfelser 82:5b33b670adb7 95 mNumber = "ME910C1-NV";
Leon Lindenfelser 82:5b33b670adb7 96 }
Leon Lindenfelser 82:5b33b670adb7 97 if (type != Cellular::NA) {
Leon Lindenfelser 82:5b33b670adb7 98 cell = new EasyIP(type);
Leon Lindenfelser 82:5b33b670adb7 99 logDebug("EasyIP radio model: %s", mNumber.c_str());
Leon Lindenfelser 82:5b33b670adb7 100 break;
Leon Lindenfelser 82:5b33b670adb7 101 }
Leon Lindenfelser 82:5b33b670adb7 102 }
Leon Lindenfelser 82:5b33b670adb7 103 logTrace("Determining radio type");
Leon Lindenfelser 82:5b33b670adb7 104 wait(1);
Leon Lindenfelser 82:5b33b670adb7 105 }
Leon Lindenfelser 82:5b33b670adb7 106
Leon Lindenfelser 82:5b33b670adb7 107 if (! cell->init(io)) {
Leon Lindenfelser 82:5b33b670adb7 108 logError("cellular initialization failed");
Leon Lindenfelser 82:5b33b670adb7 109 return NULL;
Leon Lindenfelser 82:5b33b670adb7 110 }
Leon Lindenfelser 82:5b33b670adb7 111
Leon Lindenfelser 82:5b33b670adb7 112 return cell;
Leon Lindenfelser 82:5b33b670adb7 113 }