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:
Thu Nov 19 09:58:25 2020 -0600
Revision:
28:c222ca8383f4
Parent:
27:5fafd3b26ac3
update to Dot 4.0.0 release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike Fiore 1:e52ae6584f1c 1 #include "CmdDisplayConfig.h"
Mike Fiore 1:e52ae6584f1c 2
Jason Reiss 28:c222ca8383f4 3 #if MTS_CMD_TERM_VERBOSE
Jason Reiss 28:c222ca8383f4 4 CmdDisplayConfig::CmdDisplayConfig() :
Jason Reiss 28:c222ca8383f4 5 Command("Display Settings", "AT&V", "Displays current settings and status", "TABLE")
Jason Reiss 28:c222ca8383f4 6 {
Mike Fiore 14:f9a77400b622 7
Mike Fiore 1:e52ae6584f1c 8 }
Mike Fiore 1:e52ae6584f1c 9
jenkins@jenkinsdm1 18:63f098f042b2 10 uint32_t CmdDisplayConfig::action(const std::vector<std::string>& args) {
Mike Fiore 14:f9a77400b622 11 CommandTerminal::Serial()->writef("Device ID:\t\t");
Mike Fiore 14:f9a77400b622 12 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getDeviceId(), ":").c_str());
Mike Fiore 1:e52ae6584f1c 13
jenkins@jenkinsdm1 16:d5cf2af81a6d 14 CommandTerminal::Serial()->writef("Default Frequency Band:\t%s\r\n", CommandTerminal::Dot()->FrequencyBandStr(CommandTerminal::Dot()->getDefaultFrequencyBand()).c_str());
jenkins@jenkinsdm1 16:d5cf2af81a6d 15 // using getChannelPlanName here instead of mDot::FrequencyBandStr allows AT firmware to properly display custom channel plan names
jenkins@jenkinsdm1 16:d5cf2af81a6d 16 CommandTerminal::Serial()->writef("Current Frequency Band:\t%s\r\n", CommandTerminal::Dot()->getChannelPlanName().c_str());
Mike Fiore 14:f9a77400b622 17 CommandTerminal::Serial()->writef("Frequency Sub Band:\t%u\r\n", CommandTerminal::Dot()->getFrequencySubBand());
Jason Reiss 27:5fafd3b26ac3 18
jenkins@jenkinsdm1 18:63f098f042b2 19 int32_t ret = CommandTerminal::Dot()->getPublicNetwork();
jenkins@jenkinsdm1 18:63f098f042b2 20 string network_mode = "Not defined";
jenkins@jenkinsdm1 18:63f098f042b2 21 switch(ret) {
jenkins@jenkinsdm1 18:63f098f042b2 22 case 0: network_mode = "Private MTS";
jenkins@jenkinsdm1 18:63f098f042b2 23 break;
jenkins@jenkinsdm1 18:63f098f042b2 24 case 1: network_mode = "Public LoRaWAN";
jenkins@jenkinsdm1 18:63f098f042b2 25 break;
jenkins@jenkinsdm1 18:63f098f042b2 26 case 2: network_mode = "Private LoRaWAN";
jenkins@jenkinsdm1 18:63f098f042b2 27 break;
jenkins@jenkinsdm1 18:63f098f042b2 28 }
jenkins@jenkinsdm1 18:63f098f042b2 29 CommandTerminal::Serial()->writef("Network Mode:\t\t%s\r\n", network_mode.c_str());
Jason Reiss 27:5fafd3b26ac3 30
Mike Fiore 14:f9a77400b622 31 CommandTerminal::Serial()->writef("Start Up Mode:\t\t%s\r\n", mDot::ModeStr(CommandTerminal::Dot()->getStartUpMode()).c_str());
Mike Fiore 14:f9a77400b622 32
Mike Fiore 14:f9a77400b622 33 CommandTerminal::Serial()->writef("Network Address:\t%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getNetworkAddress()).c_str());
Mike Fiore 1:e52ae6584f1c 34
Mike Fiore 14:f9a77400b622 35 CommandTerminal::Serial()->writef("Network ID:\t\t");
Mike Fiore 14:f9a77400b622 36 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getNetworkId(), ":").c_str());
Mike Fiore 1:e52ae6584f1c 37
Mike Fiore 14:f9a77400b622 38 CommandTerminal::Serial()->writef("Network ID Passphrase:\t%s\r\n", CommandTerminal::Dot()->getNetworkName().c_str());
Mike Fiore 1:e52ae6584f1c 39
Mike Fiore 14:f9a77400b622 40 CommandTerminal::Serial()->writef("Network Key:\t\t");
jenkins@jenkinsdm1 18:63f098f042b2 41
Mike Fiore 14:f9a77400b622 42 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getNetworkKey(), ".").c_str());
Mike Fiore 14:f9a77400b622 43 CommandTerminal::Serial()->writef("Network Key Passphrase:\t%s\r\n", CommandTerminal::Dot()->getNetworkPassphrase().c_str());
Mike Fiore 1:e52ae6584f1c 44
Jason Reiss 27:5fafd3b26ac3 45
Jason Reiss 27:5fafd3b26ac3 46 CommandTerminal::Serial()->writef("Gen App Key:\t\t");
Jason Reiss 27:5fafd3b26ac3 47 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getGenAppKey(), ".").c_str());
Jason Reiss 27:5fafd3b26ac3 48
Mike Fiore 14:f9a77400b622 49 CommandTerminal::Serial()->writef("Network Session Key:\t");
Mike Fiore 14:f9a77400b622 50 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getNetworkSessionKey(), ".").c_str());
Mike Fiore 1:e52ae6584f1c 51
Mike Fiore 14:f9a77400b622 52 CommandTerminal::Serial()->writef("Data Session Key:\t");
Mike Fiore 14:f9a77400b622 53 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getDataSessionKey(), ".").c_str());
Mike Fiore 1:e52ae6584f1c 54
Mike Fiore 14:f9a77400b622 55 CommandTerminal::Serial()->writef("Network Join Mode:\t%s\r\n", mDot::JoinModeStr(CommandTerminal::Dot()->getJoinMode()).c_str());
Mike Fiore 1:e52ae6584f1c 56
Mike Fiore 14:f9a77400b622 57 CommandTerminal::Serial()->writef("Network Join Retries:\t%u\r\n", CommandTerminal::Dot()->getJoinRetries());
Mike Fiore 14:f9a77400b622 58
Mike Fiore 14:f9a77400b622 59 CommandTerminal::Serial()->writef("Preserve Session:\t%s\r\n", CommandTerminal::Dot()->getPreserveSession() ? "on" : "off");
Mike Fiore 1:e52ae6584f1c 60
Jason Reiss 27:5fafd3b26ac3 61 CommandTerminal::Serial()->writef("Dev Nonce:\t\t%d\r\n", CommandTerminal::Dot()->getDevNonce());
Jason Reiss 27:5fafd3b26ac3 62 CommandTerminal::Serial()->writef("Join Nonce:\t\t%d\r\n", CommandTerminal::Dot()->getAppNonce());
Mike Fiore 14:f9a77400b622 63 CommandTerminal::Serial()->writef("Join Delay:\t\t%d\r\n", CommandTerminal::Dot()->getJoinDelay());
Mike Fiore 9:ff62b20f7000 64
Mike Fiore 14:f9a77400b622 65 CommandTerminal::Serial()->writef("Join Rx1 DR Offset:\t%d\r\n", CommandTerminal::Dot()->getJoinRx1DataRateOffset());
Mike Fiore 4:666017851052 66
Jason Reiss 23:4f0a981c0349 67 CommandTerminal::Serial()->writef("Join Rx2 Datarate:\tDR%d - %s\r\n", CommandTerminal::Dot()->getJoinRx2DataRate(), CommandTerminal::Dot()->getDataRateDetails(CommandTerminal::Dot()->getJoinRx2DataRate()).c_str());
Mike Fiore 9:ff62b20f7000 68
Mike Fiore 14:f9a77400b622 69 CommandTerminal::Serial()->writef("Join Rx2 Frequency:\t%lu\r\n", CommandTerminal::Dot()->getJoinRx2Frequency());
Mike Fiore 9:ff62b20f7000 70
Jason Reiss 28:c222ca8383f4 71 CommandTerminal::Serial()->writef("Device Class:\t\t%s\r\n", CommandTerminal::Dot()->getClass().c_str());
Jason Reiss 28:c222ca8383f4 72 CommandTerminal::Serial()->writef("Class B Timeout:\t%d s\r\n", CommandTerminal::Dot()->getClassCTimeout());
Jason Reiss 28:c222ca8383f4 73 CommandTerminal::Serial()->writef("Class C Timeout:\t%d s\r\n", CommandTerminal::Dot()->getClassBTimeout());
Jason Reiss 28:c222ca8383f4 74
Mike Fiore 14:f9a77400b622 75 CommandTerminal::Serial()->writef("App Port:\t\t%d\r\n", CommandTerminal::Dot()->getAppPort());
Mike Fiore 14:f9a77400b622 76
jenkins@jenkinsdm1 16:d5cf2af81a6d 77 CommandTerminal::Serial()->writef("Listen Before Talk:\t");
jenkins@jenkinsdm1 16:d5cf2af81a6d 78 if (CommandTerminal::Dot()->getLbtTimeUs() == 0 && CommandTerminal::Dot()->getLbtThreshold() == 0) {
jenkins@jenkinsdm1 16:d5cf2af81a6d 79 CommandTerminal::Serial()->writef("off\r\n");
jenkins@jenkinsdm1 16:d5cf2af81a6d 80 } else {
jenkins@jenkinsdm1 16:d5cf2af81a6d 81 CommandTerminal::Serial()->writef("%u us, %d dBm\r\n", CommandTerminal::Dot()->getLbtTimeUs(), CommandTerminal::Dot()->getLbtThreshold());
jenkins@jenkinsdm1 16:d5cf2af81a6d 82 }
jenkins@jenkinsdm1 16:d5cf2af81a6d 83
Mike Fiore 14:f9a77400b622 84 CommandTerminal::Serial()->writef("Link Check Threshold:\t");
Mike Fiore 14:f9a77400b622 85 if (CommandTerminal::Dot()->getLinkCheckThreshold() == 0) {
Mike Fiore 14:f9a77400b622 86 CommandTerminal::Serial()->writef("off\r\n");
Mike Fiore 1:e52ae6584f1c 87 } else {
Mike Fiore 14:f9a77400b622 88 CommandTerminal::Serial()->writef("%lu\r\n", CommandTerminal::Dot()->getLinkCheckThreshold());
Mike Fiore 1:e52ae6584f1c 89 }
Mike Fiore 1:e52ae6584f1c 90
Mike Fiore 14:f9a77400b622 91 CommandTerminal::Serial()->writef("Link Check Count:\t");
Mike Fiore 14:f9a77400b622 92 if (CommandTerminal::Dot()->getLinkCheckCount() == 0) {
Mike Fiore 14:f9a77400b622 93 CommandTerminal::Serial()->writef("off\r\n");
Mike Fiore 1:e52ae6584f1c 94 } else {
Mike Fiore 14:f9a77400b622 95 CommandTerminal::Serial()->writef("%lu packets\r\n", CommandTerminal::Dot()->getLinkCheckCount());
Mike Fiore 1:e52ae6584f1c 96 }
Mike Fiore 1:e52ae6584f1c 97
Mike Fiore 14:f9a77400b622 98 CommandTerminal::Serial()->writef("ACK Retries:\t\t");
Mike Fiore 14:f9a77400b622 99 if (CommandTerminal::Dot()->getAck() == 0) {
Mike Fiore 14:f9a77400b622 100 CommandTerminal::Serial()->writef("off\r\n");
Mike Fiore 1:e52ae6584f1c 101 } else {
Mike Fiore 14:f9a77400b622 102 CommandTerminal::Serial()->writef("%u\r\n", CommandTerminal::Dot()->getAck());
Mike Fiore 1:e52ae6584f1c 103 }
Mike Fiore 1:e52ae6584f1c 104
Mike Fiore 14:f9a77400b622 105 CommandTerminal::Serial()->writef("Packet Repeat:\t\t%d\r\n", CommandTerminal::Dot()->getRepeat());
Mike Fiore 9:ff62b20f7000 106
Mike Fiore 14:f9a77400b622 107 CommandTerminal::Serial()->writef("Adaptive Data Rate:\t%s\r\n", CommandTerminal::Dot()->getAdr() ? "on" : "off");
Mike Fiore 14:f9a77400b622 108 CommandTerminal::Serial()->writef("Command Echo:\t\t%s\r\n", CommandTerminal::Dot()->getEcho() ? "on" : "off");
Mike Fiore 14:f9a77400b622 109 CommandTerminal::Serial()->writef("Verbose Response:\t%s\r\n", CommandTerminal::Dot()->getVerbose() ? "on" : "off");
Mike Fiore 1:e52ae6584f1c 110
Mike Fiore 14:f9a77400b622 111 CommandTerminal::Serial()->writef("Tx Frequency:\t\t%lu\r\n", CommandTerminal::Dot()->getTxFrequency());
Mike Fiore 9:ff62b20f7000 112
Jason Reiss 23:4f0a981c0349 113 CommandTerminal::Serial()->writef("Tx Data Rate:\t\tDR%d - %s\r\n", CommandTerminal::Dot()->getTxDataRate(), CommandTerminal::Dot()->getDataRateDetails(CommandTerminal::Dot()->getTxDataRate()).c_str());
Jason Reiss 23:4f0a981c0349 114 CommandTerminal::Serial()->writef("Min/Max Tx Data Rate:\tMin: DR%d - %s\r\n\t\t\tMax: DR%d - %s\r\n", CommandTerminal::Dot()->getMinDatarate(), CommandTerminal::Dot()->getDataRateDetails(CommandTerminal::Dot()->getMinDatarate()).c_str(), CommandTerminal::Dot()->getMaxDatarate(), CommandTerminal::Dot()->getDataRateDetails(CommandTerminal::Dot()->getMaxDatarate()).c_str());
Mike Fiore 14:f9a77400b622 115 CommandTerminal::Serial()->writef("Tx Power:\t\t%u\r\n", CommandTerminal::Dot()->getTxPower());
jenkins@jenkinsdm1 16:d5cf2af81a6d 116 CommandTerminal::Serial()->writef("Min/Max Tx Power:\tMin: %u\r\n\t\t\tMax: %u\r\n", CommandTerminal::Dot()->getMinTxPower(), CommandTerminal::Dot()->getMaxTxPower());
Mike Fiore 14:f9a77400b622 117 CommandTerminal::Serial()->writef("Tx Antenna Gain:\t%d\r\n", CommandTerminal::Dot()->getAntennaGain());
Mike Fiore 14:f9a77400b622 118 CommandTerminal::Serial()->writef("Tx Wait:\t\t%s\r\n", CommandTerminal::Dot()->getTxWait() ? "on" : "off");
Mike Fiore 1:e52ae6584f1c 119
Mike Fiore 9:ff62b20f7000 120 bool hasChannels = false;
Mike Fiore 9:ff62b20f7000 121 for (size_t i = 0; i < 16; i++) {
Mike Fiore 14:f9a77400b622 122 if (CommandTerminal::Dot()->getConfigChannels()[i] != 0) {
Mike Fiore 9:ff62b20f7000 123 hasChannels = true;
Mike Fiore 9:ff62b20f7000 124 break;
Mike Fiore 9:ff62b20f7000 125 }
Mike Fiore 9:ff62b20f7000 126 }
Mike Fiore 9:ff62b20f7000 127
Mike Fiore 9:ff62b20f7000 128 if (hasChannels) {
Mike Fiore 14:f9a77400b622 129 CommandTerminal::Serial()->writef("Tx Channels --------------------------------------\r\n");
Mike Fiore 14:f9a77400b622 130 CommandTerminal::Serial()->writef("\tIndex\tFrequency\tDR Range\r\n");
Mike Fiore 9:ff62b20f7000 131 for (size_t i = 0; i < 16; i++) {
Mike Fiore 14:f9a77400b622 132 if (CommandTerminal::Dot()->getConfigChannels()[i] != 0)
Mike Fiore 14:f9a77400b622 133 CommandTerminal::Serial()->writef("\t%d:\t%09lu\t%02x\r\n", i, CommandTerminal::Dot()->getConfigChannels()[i], CommandTerminal::Dot()->getConfigChannelRanges()[i]);
Mike Fiore 9:ff62b20f7000 134 }
Mike Fiore 14:f9a77400b622 135 CommandTerminal::Serial()->writef("--------------------------------------------------\r\n");
Mike Fiore 9:ff62b20f7000 136 }
Mike Fiore 9:ff62b20f7000 137
Mike Fiore 14:f9a77400b622 138 CommandTerminal::Serial()->writef("Rx Delay:\t\t%d s\r\n", CommandTerminal::Dot()->getRxDelay());
Mike Fiore 14:f9a77400b622 139 // CommandTerminal::Serial()->writef("Rx Frequency:\t\t%lu\r\n", CommandTerminal::Dot()->getRxFrequency());
Mike Fiore 14:f9a77400b622 140 // CommandTerminal::Serial()->writef("Rx Data Rate:\t\t%s\r\n", mDot::DataRateStr(CommandTerminal::Dot()->getRxDataRate()).c_str());
Mike Fiore 1:e52ae6584f1c 141
Mike Fiore 14:f9a77400b622 142 CommandTerminal::Serial()->writef("Rx Output Style:\t%s\r\n", mDot::RxOutputStr(CommandTerminal::Dot()->getRxOutput()).c_str());
Mike Fiore 1:e52ae6584f1c 143
Mike Fiore 14:f9a77400b622 144 CommandTerminal::Serial()->writef("Debug Baud Rate:\t%lu\r\n", CommandTerminal::Dot()->getDebugBaud());
Mike Fiore 14:f9a77400b622 145 CommandTerminal::Serial()->writef("Serial Baud Rate:\t%lu\r\n", CommandTerminal::Dot()->getBaud());
Mike Fiore 14:f9a77400b622 146 CommandTerminal::Serial()->writef("Serial Flow Control:\t%s\r\n", CommandTerminal::Dot()->getFlowControl() == 0 ? "off" : "on");
Mike Fiore 14:f9a77400b622 147 CommandTerminal::Serial()->writef("Serial Clear On Error:\t%s\r\n", CommandTerminal::Dot()->getSerialClearOnError() == 0 ? "off" : "on");
Mike Fiore 1:e52ae6584f1c 148
Mike Fiore 14:f9a77400b622 149 uint8_t mode = CommandTerminal::Dot()->getWakeMode();
Mike Fiore 14:f9a77400b622 150 CommandTerminal::Serial()->writef("Wake Mode:\t\t%s\r\n", mode == 0 ? "INTERVAL" : ( mode == 1 ? "INTERRUPT" : "BOTH"));
Mike Fiore 14:f9a77400b622 151 CommandTerminal::Serial()->writef("Wake Interval:\t\t%lu s\r\n", CommandTerminal::Dot()->getWakeInterval());
Mike Fiore 14:f9a77400b622 152 CommandTerminal::Serial()->writef("Wake Delay:\t\t%lu ms\r\n", CommandTerminal::Dot()->getWakeDelay());
Mike Fiore 14:f9a77400b622 153 CommandTerminal::Serial()->writef("Wake Timeout:\t\t%u ms\r\n", CommandTerminal::Dot()->getWakeTimeout());
Mike Fiore 14:f9a77400b622 154 CommandTerminal::Serial()->writef("Wake Pin:\t\t%s\r\n", mDot::pinName2Str(CommandTerminal::Dot()->getWakePin()).c_str());
Mike Fiore 1:e52ae6584f1c 155
Mike Fiore 14:f9a77400b622 156 CommandTerminal::Serial()->writef("Log Level:\t\t%ld\r\n", CommandTerminal::Dot()->getLogLevel());
Mike Fiore 1:e52ae6584f1c 157
Mike Fiore 1:e52ae6584f1c 158 return 0;
Mike Fiore 1:e52ae6584f1c 159 }
Mike Fiore 1:e52ae6584f1c 160
Jason Reiss 28:c222ca8383f4 161 #endif // MTS_CMD_TERM_VERBOSE