few changes for RTS/CTS control
Dependencies: MTS-Serial libmDot mbed-rtos mbed
Fork of mDot_AT_firmware by
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 }
Generated on Tue Jul 12 2022 16:01:24 by 1.7.2