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 CmdRxDataRate.cpp Source File

CmdRxDataRate.cpp

00001 #include "CmdRxDataRate.h"
00002 
00003 CmdRxDataRate::CmdRxDataRate()
00004 :
00005   Command("Rx Data Rate", "AT+RXDR", "Set the Rx datarate, testing purposes only", "US:(7-10|DR0-DR4|DR8-DR13)) EU:(7-12|DR0-DR7))")
00006   
00007 {
00008     _queryable = true;
00009 }
00010 
00011 uint32_t CmdRxDataRate::action(std::vector<std::string> args) {
00012     if (args.size() == 1) {
00013         CommandTerminal::Serial()->writef("%s\r\n", mDot::DataRateStr(CommandTerminal::Dot()->getRxDataRate()).c_str());
00014     }
00015     else if (args.size() == 2) {
00016         std::string dr = mts::Text::toUpper(args[1]);
00017         
00018         int datarate = 0;
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                 if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915 || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915) {
00034                     datarate = 10 - datarate;
00035                 } else {
00036                     datarate = 12 - datarate;
00037                 }
00038             }
00039         }
00040 
00041         if (CommandTerminal::Dot()->setRxDataRate(datarate) != mDot::MDOT_OK) {
00042             CommandTerminal::setErrorMessage(CommandTerminal::Dot()->getLastError());;
00043             return 1;
00044         }
00045     }
00046 
00047     return 0;
00048 }
00049 
00050 bool CmdRxDataRate::verify(std::vector<std::string> args) {
00051     if (args.size() == 1)
00052         return true;
00053 
00054     if (args.size() == 2) {
00055         std::string dr = mts::Text::toUpper(args[1]);
00056 
00057         uint8_t i;
00058         int datarate = -1;
00059 
00060         int res = sscanf(dr.c_str(), "%d", &datarate);
00061 
00062         if (res == 0) {
00063             for (i = 0; i < 24; i++) {
00064                 if (mDot::DataRateStr(i).find(dr) != std::string::npos) {
00065                     datarate = i;
00066                     break;
00067                 }
00068             }
00069         } else {
00070 
00071             if ((CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915  || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915 ) && datarate > 10) {
00072                 datarate = -1;
00073             } else if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_EU868 && datarate > 12) {
00074                 datarate = -1;
00075             } else if (datarate > 6) {
00076                 // Convert SF to DR
00077                 if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915 || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915) {
00078                     datarate = 10 - datarate;
00079                 } else {
00080                     datarate = 12 - datarate;
00081                 }
00082             }
00083         }
00084 
00085         if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915 || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915) {
00086             // DR8-13 used for P2P modes
00087             if (datarate < 0 || datarate > 13 || (datarate >= 5 && datarate <= 7)) {
00088                 CommandTerminal::setErrorMessage("Invalid data rate, expects (7-10|DR0-DR4|DR8-DR13)");
00089                 return false;
00090             }
00091         } else {
00092             if (datarate < 0 || datarate > 7) {
00093                 CommandTerminal::setErrorMessage("Invalid data rate, expects (7-12|DR0-DR7)");
00094                 return false;
00095             }
00096         }
00097 
00098         return true;
00099     }
00100 
00101     CommandTerminal::setErrorMessage("Invalid arguments");
00102     return false;
00103 }