few changes for RTS/CTS control

Dependencies:   MTS-Serial libmDot mbed-rtos mbed

Fork of mDot_AT_firmware by MultiTech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CmdTxDataRate.cpp Source File

CmdTxDataRate.cpp

00001 #include "CmdTxDataRate.h"
00002 #include "MTSText.h"
00003 #include "MTSLog.h"
00004 
00005 CmdTxDataRate::CmdTxDataRate(mDot* dot, mts::MTSSerial& serial)
00006 :
00007   Command(dot, "Tx Data Rate", "AT+TXDR", "Set the Tx data rate for all channels"),
00008   _serial(serial)
00009 {
00010     _help = std::string(text()) + ": " + std::string(desc());
00011 
00012     if (_dot->getFrequencyBand() == mDot::FB_915)
00013         _usage = "(7-10|DR0-DR4|DR8-DR13)";
00014     else
00015         _usage = "(7-12|DR0-DR7)";
00016     _queryable = true;
00017 }
00018 
00019 uint32_t CmdTxDataRate::action(std::vector<std::string> args) {
00020     if (args.size() == 1)
00021         {
00022         if (_dot->getVerbose())
00023             _serial.writef("Tx Data Rate: ");
00024 
00025         _serial.writef("DR%d - %s\r\n", _dot->getTxDataRate(), _dot->getDateRateDetails(_dot->getTxDataRate()).c_str());
00026     } else if (args.size() == 2) {
00027         std::string dr = mts::Text::toUpper(args[1]);
00028         int32_t code;
00029         int datarate = -1;
00030         uint8_t i;
00031 
00032         int res = sscanf(dr.c_str(), "%d", &datarate);
00033 
00034         if (res == 0) {
00035             for (i = 0; i < 24; i++) {
00036                 if (mDot::DataRateStr(i).find(dr) != std::string::npos) {
00037                     datarate = i;
00038                     break;
00039                 }
00040             }
00041         } else {
00042             if (datarate > 6) {
00043                 // Convert SF to DR
00044                 if (_dot->getFrequencyBand() == mDot::FB_915) {
00045                     datarate = 10 - datarate;
00046                 } else {
00047                     datarate = 12 - datarate;
00048                 }
00049             }
00050         }
00051 
00052         if ((code = _dot->setTxDataRate(datarate)) != mDot::MDOT_OK) {
00053             setErrorMessage(_dot->getLastError());
00054             return 1;
00055         }
00056     }
00057 
00058     return 0;
00059 }
00060 
00061 bool CmdTxDataRate::verify(std::vector<std::string> args) {
00062     if (args.size() == 1)
00063         return true;
00064 
00065     if (args.size() == 2) {
00066         std::string dr = mts::Text::toUpper(args[1]);
00067 
00068         uint8_t i;
00069         int datarate = -1;
00070 
00071         int res = sscanf(dr.c_str(), "%d", &datarate);
00072 
00073         if (res == 0) {
00074             for (i = 0; i < 24; i++) {
00075 
00076                 if (mDot::DataRateStr(i).find(dr) != std::string::npos) {
00077                     uint8_t _dr = i;
00078 
00079                     if (_dr > 15) {
00080                         _dr = 12 + (mDot::SF_12 - _dr);
00081 
00082                         if (_dot->getFrequencyBand() == mDot::FB_868) {
00083                             if (_dr == mDot::SF_7H) {
00084                                 _dr =  mDot::DR6;
00085                             } else if (_dr ==  mDot::SF_FSK) {
00086                                 _dr =  mDot::DR7;
00087                             } else {
00088                                 _dr = 12 - _dr;
00089                             }
00090                         } else {
00091 
00092                             _dr = 10 - _dr;
00093                         }
00094                     }
00095 
00096                     datarate = _dr;
00097                     break;
00098                 }
00099             }
00100         } else {
00101             if (_dot->getFrequencyBand() == mDot::FB_915 && datarate > 10) {
00102                 datarate = -1;
00103             } else if (_dot->getFrequencyBand() == mDot::FB_868 && datarate > 12) {
00104                 datarate = -1;
00105             } else if (datarate > 6) {
00106                 // Convert SF to DR
00107                 if (_dot->getFrequencyBand() == mDot::FB_915) {
00108                     datarate = 10 - datarate;
00109                 } else {
00110                     datarate = 12 - datarate;
00111                 }
00112             }
00113         }
00114 
00115         if (_dot->getFrequencyBand() == mDot::FB_915) {
00116             // DR8-13 used for P2P modes
00117             if (datarate < 0 || datarate > 13 || (datarate >= 5 && datarate <= 7)) {
00118                 setErrorMessage("Invalid data rate, expects (7-10|DR0-DR4|DR8-DR13)");
00119                 return false;
00120             }
00121         } else {
00122             if (datarate < 0 || datarate > 7) {
00123                 setErrorMessage("Invalid data rate, expects (7-12|DR0-DR7)");
00124                 return false;
00125             }
00126         }
00127 
00128         return true;
00129     }
00130 
00131     setErrorMessage("Invalid arguments");
00132     return false;
00133 }