MicroLabo / Mbed OS mbed-Dot-AT-Firmware

Dependencies:   MTS-Serial libmDot-mbed5

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