Testing basic mdot with external Interrupt

Dependencies:   libmDot mbed-rtos mbed-src

Fork of mDot_test_rx by Mike Fiore

LoRaWAN Network Configuration

For DevEUI, AppEUI, AppKey configuration to specific network, please see lines 10 to 18.

If using with an 8 channel gateway define config_frequency_sub_band at line 16. Setting config_frequency_sub_band to '1' will limit the device to using just the first eight (8) channels starting at 902.3 MHz.

Free Running vs Interrupt

At line 117 you can change the program from waiting for external interrupts to free-running by changing msg_rdy to be equal to 'true'.

Committer:
jknapp_smtc
Date:
Sat Aug 01 01:08:16 2015 +0000
Revision:
4:ee6bf074135c
Parent:
3:7cc5dfd22b54
Child:
5:25114cb5e9a7
Added comments, rearranged typical parameters, added comment to make free running.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfiore 0:e17e5a07892d 1 #include "mbed.h"
mfiore 0:e17e5a07892d 2 #include "mDot.h"
mfiore 0:e17e5a07892d 3 #include "MTSLog.h"
mfiore 0:e17e5a07892d 4 #include "MTSText.h"
mfiore 0:e17e5a07892d 5 #include <string>
mfiore 0:e17e5a07892d 6 #include <vector>
mfiore 0:e17e5a07892d 7
mfiore 0:e17e5a07892d 8 using namespace mts;
mfiore 0:e17e5a07892d 9
jknapp_smtc 4:ee6bf074135c 10 /* ********************************************** */
jknapp_smtc 4:ee6bf074135c 11 /* Create AppEUI identifier and Assigned AppKey */
jknapp_smtc 4:ee6bf074135c 12 /* ********************************************** */
jknapp_smtc 4:ee6bf074135c 13
jknapp_smtc 3:7cc5dfd22b54 14 static const uint8_t DEVKEY[16] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; // Normal
jknapp_smtc 4:ee6bf074135c 15 static const uint8_t APPEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // SMTC AppEUI - Most Significant Byte First
jknapp_smtc 4:ee6bf074135c 16 static uint8_t config_frequency_sub_band = 0; // 0 = Enable all channels, 1 = 1st eight channels
jknapp_smtc 4:ee6bf074135c 17
jknapp_smtc 4:ee6bf074135c 18 /* ********************************************** */
jknapp_smtc 3:7cc5dfd22b54 19
jknapp_smtc 3:7cc5dfd22b54 20 static std::vector<uint8_t> AppKey (DEVKEY, DEVKEY + sizeof(DEVKEY)/sizeof(uint8_t) );
jknapp_smtc 3:7cc5dfd22b54 21 static std::vector<uint8_t> AppEUI (APPEUI, APPEUI + sizeof(APPEUI)/sizeof(uint8_t) );
jknapp_smtc 3:7cc5dfd22b54 22
jknapp_smtc 3:7cc5dfd22b54 23 InterruptIn button(PB_1);
jknapp_smtc 3:7cc5dfd22b54 24 DigitalOut drive_high(PB_0);
jknapp_smtc 3:7cc5dfd22b54 25 DigitalIn door_open(PA_7);
jknapp_smtc 3:7cc5dfd22b54 26
jknapp_smtc 3:7cc5dfd22b54 27 volatile bool msg_rdy;
jknapp_smtc 3:7cc5dfd22b54 28
jknapp_smtc 3:7cc5dfd22b54 29 void queue_message(){
jknapp_smtc 3:7cc5dfd22b54 30 msg_rdy = true;
jknapp_smtc 3:7cc5dfd22b54 31 }
jknapp_smtc 3:7cc5dfd22b54 32
mfiore 0:e17e5a07892d 33
mfiore 0:e17e5a07892d 34 int main() {
mfiore 0:e17e5a07892d 35 Serial debug(USBTX, USBRX);
mfiore 0:e17e5a07892d 36 debug.baud(460800);
jknapp_smtc 3:7cc5dfd22b54 37 drive_high = 1;
mfiore 0:e17e5a07892d 38
jknapp_smtc 3:7cc5dfd22b54 39 msg_rdy = false;
mfiore 0:e17e5a07892d 40 int32_t ret;
mfiore 0:e17e5a07892d 41 int32_t next_tx;
mfiore 2:aadbdfb6d517 42 int32_t wait_time = 2;
mfiore 0:e17e5a07892d 43 mDot* dot;
mfiore 0:e17e5a07892d 44 std::vector<uint8_t> send_data;
mfiore 0:e17e5a07892d 45 std::vector<uint8_t> recv_data;
mfiore 0:e17e5a07892d 46 uint8_t recv = 0;
mfiore 0:e17e5a07892d 47 uint8_t recv_mismatch = 0;
mfiore 0:e17e5a07892d 48 uint8_t send_failure = 0;
mfiore 0:e17e5a07892d 49 uint8_t iterations = 50;
jknapp_smtc 3:7cc5dfd22b54 50 button.rise(&queue_message);
mfiore 0:e17e5a07892d 51
jknapp_smtc 3:7cc5dfd22b54 52 send_data.push_back(0x01);
jknapp_smtc 3:7cc5dfd22b54 53 send_data.push_back(0x02);
mfiore 0:e17e5a07892d 54
mfiore 0:e17e5a07892d 55 dot = mDot::getInstance();
mfiore 0:e17e5a07892d 56
mfiore 0:e17e5a07892d 57 dot->resetConfig();
mfiore 1:8295b8c0d802 58
mfiore 1:8295b8c0d802 59 dot->setLogLevel(MTSLog::TRACE_LEVEL);
jknapp_smtc 3:7cc5dfd22b54 60 //dot->setJoinByteOrder(1); // MSB
jknapp_smtc 3:7cc5dfd22b54 61 dot->setTxDataRate(mDot::SF_10);
jknapp_smtc 3:7cc5dfd22b54 62 //dot->setTxPower(20);
jknapp_smtc 3:7cc5dfd22b54 63
mfiore 0:e17e5a07892d 64 while ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
mfiore 0:e17e5a07892d 65 logError("failed to set frequency sub band: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:e17e5a07892d 66 }
jknapp_smtc 3:7cc5dfd22b54 67 while ((ret = dot->setPublicNetwork(true)) != mDot::MDOT_OK) {
jknapp_smtc 3:7cc5dfd22b54 68 logError("failed to set Public Network: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:e17e5a07892d 69 }
jknapp_smtc 3:7cc5dfd22b54 70 /** Set network ID
jknapp_smtc 3:7cc5dfd22b54 71 * for use with OTA & AUTO_OTA network join modes
jknapp_smtc 3:7cc5dfd22b54 72 * setting network ID via this function sets network name to empty
jknapp_smtc 3:7cc5dfd22b54 73 * @param id a vector of 8 bytes
jknapp_smtc 3:7cc5dfd22b54 74 * @returns MDOT_OK if success
jknapp_smtc 3:7cc5dfd22b54 75 */
jknapp_smtc 3:7cc5dfd22b54 76 while ((ret = dot->setNetworkId(AppEUI)) != mDot::MDOT_OK) {
jknapp_smtc 3:7cc5dfd22b54 77 logError("failed to set AppEUI: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
jknapp_smtc 3:7cc5dfd22b54 78 }
jknapp_smtc 3:7cc5dfd22b54 79 while ((ret = dot->setNetworkKey(AppKey)) != mDot::MDOT_OK) {
jknapp_smtc 3:7cc5dfd22b54 80 logError("failed to set AppEUI: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:e17e5a07892d 81 }
mfiore 0:e17e5a07892d 82
mfiore 2:aadbdfb6d517 83 logInfo("enabling activity LED");
mfiore 2:aadbdfb6d517 84 dot->setActivityLedEnable(true);
mfiore 2:aadbdfb6d517 85
mfiore 0:e17e5a07892d 86 logInfo("joining network");
mfiore 0:e17e5a07892d 87 while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) {
mfiore 0:e17e5a07892d 88 logError("failed to join network: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:e17e5a07892d 89 wait_ms(dot->getNextTxMs() + 1);
mfiore 0:e17e5a07892d 90 }
mfiore 0:e17e5a07892d 91 logInfo("joined");
mfiore 0:e17e5a07892d 92
jknapp_smtc 3:7cc5dfd22b54 93 dot->setAck(3); // Use Confirmed frames and try three times
jknapp_smtc 3:7cc5dfd22b54 94
jknapp_smtc 3:7cc5dfd22b54 95 while (1) {
jknapp_smtc 3:7cc5dfd22b54 96
jknapp_smtc 3:7cc5dfd22b54 97 send_data[0] = 192; //door_open;
mfiore 0:e17e5a07892d 98 if ((ret = dot->send(send_data)) != mDot::MDOT_OK) {
mfiore 0:e17e5a07892d 99 logError("failed to send: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:e17e5a07892d 100 send_failure++;
mfiore 0:e17e5a07892d 101 } else {
mfiore 0:e17e5a07892d 102 logInfo("send data: %s", Text::bin2hexString(send_data).c_str());
mfiore 0:e17e5a07892d 103 if ((ret = dot->recv(recv_data)) != mDot::MDOT_OK) {
mfiore 0:e17e5a07892d 104 logError("failed to recv: [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str());
mfiore 0:e17e5a07892d 105 } else {
mfiore 0:e17e5a07892d 106 logInfo("recv data: %s", Text::bin2hexString(recv_data).c_str());
jknapp_smtc 3:7cc5dfd22b54 107 if (recv_data[0] == 0x80) {
mfiore 0:e17e5a07892d 108 recv++;
jknapp_smtc 3:7cc5dfd22b54 109 } else if (recv_data[0] == 0xFF) {
jknapp_smtc 3:7cc5dfd22b54 110 goto END;
mfiore 0:e17e5a07892d 111 } else {
mfiore 0:e17e5a07892d 112 recv_mismatch++;
mfiore 0:e17e5a07892d 113 }
mfiore 0:e17e5a07892d 114 }
mfiore 0:e17e5a07892d 115 recv_data.clear();
mfiore 0:e17e5a07892d 116 }
jknapp_smtc 4:ee6bf074135c 117 msg_rdy = false; // Set to 'true' for free running.
jknapp_smtc 3:7cc5dfd22b54 118 while (!msg_rdy) wait(wait_time);
mfiore 0:e17e5a07892d 119 }
jknapp_smtc 3:7cc5dfd22b54 120 END:
mfiore 0:e17e5a07892d 121 logInfo("Version: %s", dot->getId().c_str());
mfiore 0:e17e5a07892d 122 logInfo("Recv: %d/%d", recv, iterations);
mfiore 0:e17e5a07892d 123 logInfo("Recv Mismatch: %d/%d", recv_mismatch, iterations);
mfiore 0:e17e5a07892d 124 logInfo("Send Failure: %d/%d", send_failure, iterations);
mfiore 0:e17e5a07892d 125 logInfo("Dropped: %d/%d", iterations - (recv + recv_mismatch + send_failure), iterations);
mfiore 0:e17e5a07892d 126
mfiore 0:e17e5a07892d 127 return 0;
mfiore 0:e17e5a07892d 128 }