Hadi Ho / Mbed 2 deprecated mDot_USB_AT_firmware

Dependencies:   MTS-Serial libmDot mbed-rtos mbed

Fork of mDot_USB_AT_firmware by Hadi Ho

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CmdRxDataRate.cpp Source File

CmdRxDataRate.cpp

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