AT command firmware for MultiTech Dot devices.

Fork of mDot_AT_firmware by MultiTech

Dot Library Not Included!

Because these example programs can be used for both mDot and xDot devices, the LoRa stack is not included. The libmDot library should be imported if building for mDot devices. The libxDot library should be imported if building for xDot devices. The AT firmware was last tested with mbed-os-5.4.7. Using a version past mbed-os-5.4.7 will cause the build to fail. The library used with the AT firmware has to match the mbed-os version.

Dot Library Version 3 Updates

Dot Library versions 3.x.x require a channel plan to be injected into the stack. The Dot-Examples and Dot-AT-Firmware do this by defining a macro called "CHANNEL_PLAN" that controls the channel plan that will be used in the examples. Available channel plans will be in the Dot Library repository in the plans folder.

Revision 20 and earlier of Dot-Examples and revision 15 and earlier of Dot-AT-Firmware should be used with Dot Library versions prior to 3.0.0.

Fota Library

Th Fota Library must be added to compile for mDot 3.1.0 with Fota support. Latest dev libraries and 3.2.0 release will include Fota with libmDot/libxDot.

AT Firmware Description

This AT Firmware is what ships on mDot and xDot devices. It provides an AT command interface for using the mDot or xDot for LoRa communication.

AT command documentation can be found on Multitech.com.

The firmware changelog can be found here. The library changelog can be found here.

Dot Libraries

Dot Library Limitations

The commit messages in libmDot-mbed5 and libmDot-dev-mbed5 specify the version of the Dot library the commit contains and the version of mbed-os it was compiled against. We recommend building your application with the version of mbed-os specified in the commit message of the version of the Dot library you're using. This will ensure that you don't run into any runtime issues caused by differences in the mbed-os versions.

Stable and development libraries are available for both mDot and xDot platforms. The library chosen must match the target platform. Compiling for the mDot platform with the xDot library or vice versa will not succeed.

mDot Library

Development library for mDot.

libmDot-dev

Stable library for mDot.

libmDot

xDot Library

Development library for xDot.

libxDot-dev

Stable library for xDot.

libxDot

Committer:
Jason Reiss
Date:
Fri Aug 12 11:08:59 2022 -0500
Revision:
35:e17e00b8e022
Parent:
28:c222ca8383f4
Child:
36:b586cd6e91f3
Update AT Version to 4.1.5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jason Reiss 27:5fafd3b26ac3 1 #include "CmdMulticastRx.h"
Jason Reiss 27:5fafd3b26ac3 2
Jason Reiss 28:c222ca8383f4 3 CmdMulticastRx::CmdMulticastRx() :
Jason Reiss 28:c222ca8383f4 4 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 28:c222ca8383f4 5 Command("Muticast Rx Settings", "AT+MCRX", "Multicast Rx Settings", "(1-8),(DR0-DR15),(FREQ),(-1-7:PERIOD,-1:CLASS_C)")
Jason Reiss 27:5fafd3b26ac3 6 #else
Jason Reiss 28:c222ca8383f4 7 Command("AT+MCRX")
Jason Reiss 27:5fafd3b26ac3 8 #endif
Jason Reiss 27:5fafd3b26ac3 9 {
Jason Reiss 27:5fafd3b26ac3 10 _queryable = true;
Jason Reiss 27:5fafd3b26ac3 11 }
Jason Reiss 27:5fafd3b26ac3 12
Jason Reiss 27:5fafd3b26ac3 13 uint32_t CmdMulticastRx::action(const std::vector<std::string>& args) {
Jason Reiss 27:5fafd3b26ac3 14 if (args.size() == 2) {
Jason Reiss 27:5fafd3b26ac3 15 int index = 0;
Jason Reiss 27:5fafd3b26ac3 16
Jason Reiss 27:5fafd3b26ac3 17 sscanf(args[1].c_str(), "%d", &index);
Jason Reiss 27:5fafd3b26ac3 18
Jason Reiss 27:5fafd3b26ac3 19 index -= 1;
Jason Reiss 27:5fafd3b26ac3 20 CommandTerminal::Serial()->writef("DR%d,%lu,%d\r\n", CommandTerminal::Dot()->getMulticastDatarate(index), CommandTerminal::Dot()->getMulticastFrequency(index), CommandTerminal::Dot()->getMulticastPeriodicity(index));
Jason Reiss 27:5fafd3b26ac3 21 }
Jason Reiss 27:5fafd3b26ac3 22 else if (args.size() == 5) {
Jason Reiss 27:5fafd3b26ac3 23 int index = 0;
Jason Reiss 27:5fafd3b26ac3 24 int datarate = 0;
Jason Reiss 27:5fafd3b26ac3 25 int period = 0;
Jason Reiss 27:5fafd3b26ac3 26
Jason Reiss 27:5fafd3b26ac3 27 sscanf(args[1].c_str(), "%d", &index);
Jason Reiss 27:5fafd3b26ac3 28 sscanf(args[4].c_str(), "%d", &period);
Jason Reiss 27:5fafd3b26ac3 29
Jason Reiss 27:5fafd3b26ac3 30 std::string dr = mts::Text::toUpper(args[2]);
Jason Reiss 27:5fafd3b26ac3 31
Jason Reiss 27:5fafd3b26ac3 32 uint8_t i;
Jason Reiss 27:5fafd3b26ac3 33
Jason Reiss 27:5fafd3b26ac3 34 int res = sscanf(dr.c_str(), "%d", &datarate);
Jason Reiss 27:5fafd3b26ac3 35
Jason Reiss 27:5fafd3b26ac3 36 if (res == 0) {
Jason Reiss 27:5fafd3b26ac3 37 for (i = 0; i < 24; i++) {
Jason Reiss 27:5fafd3b26ac3 38 if (mDot::DataRateStr(i).find(dr) != std::string::npos) {
Jason Reiss 27:5fafd3b26ac3 39 datarate = i;
Jason Reiss 27:5fafd3b26ac3 40 break;
Jason Reiss 27:5fafd3b26ac3 41 }
Jason Reiss 27:5fafd3b26ac3 42 }
Jason Reiss 27:5fafd3b26ac3 43 }
Jason Reiss 27:5fafd3b26ac3 44
Jason Reiss 27:5fafd3b26ac3 45 index -= 1;
Jason Reiss 27:5fafd3b26ac3 46
Jason Reiss 27:5fafd3b26ac3 47 if (CommandTerminal::Dot()->setMulticastDatarate(index, datarate) != mDot::MDOT_OK) {
Jason Reiss 27:5fafd3b26ac3 48 return 1;
Jason Reiss 27:5fafd3b26ac3 49 }
Jason Reiss 27:5fafd3b26ac3 50
Jason Reiss 27:5fafd3b26ac3 51 int frequency = ULONG_MAX;
Jason Reiss 27:5fafd3b26ac3 52 sscanf(args[3].c_str(), "%d", &frequency);
Jason Reiss 27:5fafd3b26ac3 53
Jason Reiss 27:5fafd3b26ac3 54 if (CommandTerminal::Dot()->setMulticastFrequency(index, frequency) != mDot::MDOT_OK) {
Jason Reiss 27:5fafd3b26ac3 55 return 1;
Jason Reiss 27:5fafd3b26ac3 56 }
Jason Reiss 27:5fafd3b26ac3 57
Jason Reiss 27:5fafd3b26ac3 58 if (CommandTerminal::Dot()->setMulticastPeriodicity(index, period) != mDot::MDOT_OK) {
Jason Reiss 27:5fafd3b26ac3 59 return 1;
Jason Reiss 27:5fafd3b26ac3 60 }
Jason Reiss 27:5fafd3b26ac3 61
Jason Reiss 27:5fafd3b26ac3 62 }
Jason Reiss 27:5fafd3b26ac3 63
Jason Reiss 27:5fafd3b26ac3 64 return 0;
Jason Reiss 27:5fafd3b26ac3 65 }
Jason Reiss 27:5fafd3b26ac3 66
Jason Reiss 27:5fafd3b26ac3 67 bool CmdMulticastRx::verify(const std::vector<std::string>& args) {
Jason Reiss 27:5fafd3b26ac3 68 if (args.size() == 2) {
Jason Reiss 27:5fafd3b26ac3 69 int value = 0;
Jason Reiss 27:5fafd3b26ac3 70
Jason Reiss 27:5fafd3b26ac3 71 int res = sscanf(args[1].c_str(), "%d", &value);
Jason Reiss 27:5fafd3b26ac3 72
Jason Reiss 27:5fafd3b26ac3 73 if (res == 0 || value < 1 || value > 8) {
Jason Reiss 28:c222ca8383f4 74 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 27:5fafd3b26ac3 75 CommandTerminal::setErrorMessage("Invalid index, expects (1-8)");;
Jason Reiss 28:c222ca8383f4 76 #endif
Jason Reiss 27:5fafd3b26ac3 77 return false;
Jason Reiss 27:5fafd3b26ac3 78 }
Jason Reiss 27:5fafd3b26ac3 79
Jason Reiss 27:5fafd3b26ac3 80 return true;
Jason Reiss 27:5fafd3b26ac3 81 }
Jason Reiss 27:5fafd3b26ac3 82
Jason Reiss 27:5fafd3b26ac3 83 if (args.size() == 5) {
Jason Reiss 27:5fafd3b26ac3 84 int value = 0;
Jason Reiss 27:5fafd3b26ac3 85
Jason Reiss 27:5fafd3b26ac3 86 int res = sscanf(args[1].c_str(), "%d", &value);
Jason Reiss 27:5fafd3b26ac3 87
Jason Reiss 27:5fafd3b26ac3 88 if (res == 0 || value < 1 || value > 8) {
Jason Reiss 28:c222ca8383f4 89 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 27:5fafd3b26ac3 90 CommandTerminal::setErrorMessage("Invalid index, expects (1-8)");;
Jason Reiss 28:c222ca8383f4 91 #endif
Jason Reiss 27:5fafd3b26ac3 92 return false;
Jason Reiss 27:5fafd3b26ac3 93 }
Jason Reiss 27:5fafd3b26ac3 94
Jason Reiss 27:5fafd3b26ac3 95 res = sscanf(args[4].c_str(), "%d", &value);
Jason Reiss 27:5fafd3b26ac3 96
Jason Reiss 27:5fafd3b26ac3 97 if (res == 0 || value < -1 || value > 7) {
Jason Reiss 28:c222ca8383f4 98 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 27:5fafd3b26ac3 99 CommandTerminal::setErrorMessage("Invalid period, expects (-1-7,-1:CLASS_C)");
Jason Reiss 28:c222ca8383f4 100 #endif
Jason Reiss 27:5fafd3b26ac3 101 return false;
Jason Reiss 27:5fafd3b26ac3 102 }
Jason Reiss 27:5fafd3b26ac3 103
Jason Reiss 27:5fafd3b26ac3 104 int frequency = ULONG_MAX;
Jason Reiss 27:5fafd3b26ac3 105 if (sscanf(args[3].c_str(), "%d", &frequency) != 1) {
Jason Reiss 28:c222ca8383f4 106 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 27:5fafd3b26ac3 107 CommandTerminal::setErrorMessage("Invalid argument");
Jason Reiss 28:c222ca8383f4 108 #endif
Jason Reiss 27:5fafd3b26ac3 109 return false;
Jason Reiss 27:5fafd3b26ac3 110 }
Jason Reiss 27:5fafd3b26ac3 111
Jason Reiss 27:5fafd3b26ac3 112 if (frequency != 0 && (frequency < int(CommandTerminal::Dot()->getMinFrequency()) || frequency > int(CommandTerminal::Dot()->getMaxFrequency()))) {
Jason Reiss 28:c222ca8383f4 113 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 27:5fafd3b26ac3 114 char tmp[256];
Jason Reiss 27:5fafd3b26ac3 115 sprintf(tmp, "Invalid frequency, expects (0,%lu-%lu)", CommandTerminal::Dot()->getMinFrequency(), CommandTerminal::Dot()->getMaxFrequency());
Jason Reiss 27:5fafd3b26ac3 116 CommandTerminal::setErrorMessage(tmp);
Jason Reiss 28:c222ca8383f4 117 #endif
Jason Reiss 28:c222ca8383f4 118 return false;
Jason Reiss 28:c222ca8383f4 119 }
Jason Reiss 28:c222ca8383f4 120
Jason Reiss 28:c222ca8383f4 121 if (!CommandTerminal::Dot()->validateRx2DataRate(strToDataRate(args[2]))) {
Jason Reiss 28:c222ca8383f4 122 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 28:c222ca8383f4 123 CommandTerminal::setErrorMessage("RX data rate invalid");
Jason Reiss 28:c222ca8383f4 124 #endif
Jason Reiss 27:5fafd3b26ac3 125 return false;
Jason Reiss 27:5fafd3b26ac3 126 }
Jason Reiss 27:5fafd3b26ac3 127 return true;
Jason Reiss 27:5fafd3b26ac3 128 }
Jason Reiss 27:5fafd3b26ac3 129
Jason Reiss 28:c222ca8383f4 130 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 27:5fafd3b26ac3 131 CommandTerminal::setErrorMessage("Invalid arguments");
Jason Reiss 28:c222ca8383f4 132 #endif
Jason Reiss 27:5fafd3b26ac3 133 return false;
Jason Reiss 27:5fafd3b26ac3 134 }