dev

Dependencies:   MTS-Serial libmDot-mbed5

Fork of Dot-AT-Firmware by MultiTech

Committer:
Mike Fiore
Date:
Fri Nov 04 14:25:43 2016 -0500
Revision:
14:f9a77400b622
Parent:
9:ff62b20f7000
Child:
16:d5cf2af81a6d
update from git revision 2.0.16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike Fiore 1:e52ae6584f1c 1 #include "CmdRxDataRate.h"
Mike Fiore 1:e52ae6584f1c 2
Mike Fiore 14:f9a77400b622 3 CmdRxDataRate::CmdRxDataRate()
Mike Fiore 9:ff62b20f7000 4 :
Mike Fiore 14:f9a77400b622 5 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))")
Mike Fiore 14:f9a77400b622 6
Mike Fiore 1:e52ae6584f1c 7 {
Mike Fiore 1:e52ae6584f1c 8 _queryable = true;
Mike Fiore 1:e52ae6584f1c 9 }
Mike Fiore 1:e52ae6584f1c 10
Mike Fiore 9:ff62b20f7000 11 uint32_t CmdRxDataRate::action(std::vector<std::string> args) {
Mike Fiore 9:ff62b20f7000 12 if (args.size() == 1) {
Mike Fiore 14:f9a77400b622 13 CommandTerminal::Serial()->writef("%s\r\n", mDot::DataRateStr(CommandTerminal::Dot()->getRxDataRate()).c_str());
Mike Fiore 1:e52ae6584f1c 14 }
Mike Fiore 9:ff62b20f7000 15 else if (args.size() == 2) {
Mike Fiore 9:ff62b20f7000 16 std::string dr = mts::Text::toUpper(args[1]);
Mike Fiore 14:f9a77400b622 17
Mike Fiore 9:ff62b20f7000 18 int datarate = 0;
Mike Fiore 1:e52ae6584f1c 19 uint8_t i;
Mike Fiore 1:e52ae6584f1c 20
Mike Fiore 9:ff62b20f7000 21 int res = sscanf(dr.c_str(), "%d", &datarate);
Mike Fiore 9:ff62b20f7000 22
Mike Fiore 9:ff62b20f7000 23 if (res == 0) {
Mike Fiore 9:ff62b20f7000 24 for (i = 0; i < 24; i++) {
Mike Fiore 9:ff62b20f7000 25 if (mDot::DataRateStr(i).find(dr) != std::string::npos) {
Mike Fiore 9:ff62b20f7000 26 datarate = i;
Mike Fiore 9:ff62b20f7000 27 break;
Mike Fiore 9:ff62b20f7000 28 }
Mike Fiore 9:ff62b20f7000 29 }
Mike Fiore 9:ff62b20f7000 30 } else {
Mike Fiore 9:ff62b20f7000 31 if (datarate > 6) {
Mike Fiore 9:ff62b20f7000 32 // Convert SF to DR
Mike Fiore 14:f9a77400b622 33 if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915 || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915) {
Mike Fiore 9:ff62b20f7000 34 datarate = 10 - datarate;
Mike Fiore 9:ff62b20f7000 35 } else {
Mike Fiore 9:ff62b20f7000 36 datarate = 12 - datarate;
Mike Fiore 9:ff62b20f7000 37 }
Mike Fiore 1:e52ae6584f1c 38 }
Mike Fiore 1:e52ae6584f1c 39 }
Mike Fiore 1:e52ae6584f1c 40
Mike Fiore 14:f9a77400b622 41 if (CommandTerminal::Dot()->setRxDataRate(datarate) != mDot::MDOT_OK) {
Mike Fiore 14:f9a77400b622 42 CommandTerminal::setErrorMessage(CommandTerminal::Dot()->getLastError());;
Mike Fiore 1:e52ae6584f1c 43 return 1;
Mike Fiore 1:e52ae6584f1c 44 }
Mike Fiore 1:e52ae6584f1c 45 }
Mike Fiore 1:e52ae6584f1c 46
Mike Fiore 1:e52ae6584f1c 47 return 0;
Mike Fiore 1:e52ae6584f1c 48 }
Mike Fiore 1:e52ae6584f1c 49
Mike Fiore 9:ff62b20f7000 50 bool CmdRxDataRate::verify(std::vector<std::string> args) {
Mike Fiore 1:e52ae6584f1c 51 if (args.size() == 1)
Mike Fiore 1:e52ae6584f1c 52 return true;
Mike Fiore 1:e52ae6584f1c 53
Mike Fiore 9:ff62b20f7000 54 if (args.size() == 2) {
Mike Fiore 9:ff62b20f7000 55 std::string dr = mts::Text::toUpper(args[1]);
Mike Fiore 9:ff62b20f7000 56
Mike Fiore 1:e52ae6584f1c 57 uint8_t i;
Mike Fiore 1:e52ae6584f1c 58 int datarate = -1;
Mike Fiore 9:ff62b20f7000 59
Mike Fiore 9:ff62b20f7000 60 int res = sscanf(dr.c_str(), "%d", &datarate);
Mike Fiore 9:ff62b20f7000 61
Mike Fiore 9:ff62b20f7000 62 if (res == 0) {
Mike Fiore 9:ff62b20f7000 63 for (i = 0; i < 24; i++) {
Mike Fiore 9:ff62b20f7000 64 if (mDot::DataRateStr(i).find(dr) != std::string::npos) {
Mike Fiore 9:ff62b20f7000 65 datarate = i;
Mike Fiore 9:ff62b20f7000 66 break;
Mike Fiore 9:ff62b20f7000 67 }
Mike Fiore 9:ff62b20f7000 68 }
Mike Fiore 9:ff62b20f7000 69 } else {
Mike Fiore 14:f9a77400b622 70
Mike Fiore 14:f9a77400b622 71 if ((CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915 || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915 ) && datarate > 10) {
Mike Fiore 9:ff62b20f7000 72 datarate = -1;
Mike Fiore 14:f9a77400b622 73 } else if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_EU868 && datarate > 12) {
Mike Fiore 9:ff62b20f7000 74 datarate = -1;
Mike Fiore 9:ff62b20f7000 75 } else if (datarate > 6) {
Mike Fiore 9:ff62b20f7000 76 // Convert SF to DR
Mike Fiore 14:f9a77400b622 77 if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915 || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915) {
Mike Fiore 9:ff62b20f7000 78 datarate = 10 - datarate;
Mike Fiore 9:ff62b20f7000 79 } else {
Mike Fiore 9:ff62b20f7000 80 datarate = 12 - datarate;
Mike Fiore 9:ff62b20f7000 81 }
Mike Fiore 1:e52ae6584f1c 82 }
Mike Fiore 1:e52ae6584f1c 83 }
Mike Fiore 1:e52ae6584f1c 84
Mike Fiore 14:f9a77400b622 85 if (CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_US915 || CommandTerminal::Dot()->getFrequencyBand() == mDot::FB_AU915) {
Mike Fiore 9:ff62b20f7000 86 // DR8-13 used for P2P modes
Mike Fiore 9:ff62b20f7000 87 if (datarate < 0 || datarate > 13 || (datarate >= 5 && datarate <= 7)) {
Mike Fiore 14:f9a77400b622 88 CommandTerminal::setErrorMessage("Invalid data rate, expects (7-10|DR0-DR4|DR8-DR13)");
Mike Fiore 9:ff62b20f7000 89 return false;
Mike Fiore 9:ff62b20f7000 90 }
Mike Fiore 9:ff62b20f7000 91 } else {
Mike Fiore 9:ff62b20f7000 92 if (datarate < 0 || datarate > 7) {
Mike Fiore 14:f9a77400b622 93 CommandTerminal::setErrorMessage("Invalid data rate, expects (7-12|DR0-DR7)");
Mike Fiore 1:e52ae6584f1c 94 return false;
Mike Fiore 1:e52ae6584f1c 95 }
Mike Fiore 1:e52ae6584f1c 96 }
Mike Fiore 1:e52ae6584f1c 97
Mike Fiore 1:e52ae6584f1c 98 return true;
Mike Fiore 1:e52ae6584f1c 99 }
Mike Fiore 1:e52ae6584f1c 100
Mike Fiore 14:f9a77400b622 101 CommandTerminal::setErrorMessage("Invalid arguments");
Mike Fiore 1:e52ae6584f1c 102 return false;
Mike Fiore 1:e52ae6584f1c 103 }