From 74d09eac050bdae543748fe8bda3ee34828a0eed Mon Sep 17 00:00:00 2001
From: Starbeamrainbowlabs <sbrl@starbeamrainbowlabs.com>
Date: Fri, 21 Jun 2019 17:04:48 +0100
Subject: [PATCH] Update TTN LoRaWAN test script

---
 iot/TTNTest/TTNTest.ino    | 105 +++++++++----------------------------
 iot/libraries/arduino-lmic |   1 -
 2 files changed, 24 insertions(+), 82 deletions(-)
 delete mode 160000 iot/libraries/arduino-lmic

diff --git a/iot/TTNTest/TTNTest.ino b/iot/TTNTest/TTNTest.ino
index be8ccd0..2b30122 100644
--- a/iot/TTNTest/TTNTest.ino
+++ b/iot/TTNTest/TTNTest.ino
@@ -1,6 +1,5 @@
 /*******************************************************************************
  * Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman
- * Copyright (c) 2018 Terry Moore, MCCI
  *
  * Permission is hereby granted, free of charge, to anyone
  * obtaining a copy of this document and accompanying files,
@@ -10,41 +9,27 @@
  *
  * This example sends a valid LoRaWAN packet with payload "Hello,
  * world!", using frequency and encryption settings matching those of
- * the The Things Network.
+ * the (early prototype version of) The Things Network.
  *
- * This uses ABP (Activation-by-personalisation), where a DevAddr and
- * Session keys are preconfigured (unlike OTAA, where a DevEUI and
- * application key is configured, while the DevAddr and session keys are
- * assigned/generated in the over-the-air-activation procedure).
+ * Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in g1,
+ *  0.1% in g2).
  *
- * Note: LoRaWAN per sub-band duty-cycle limitation is enforced (1% in
- * g1, 0.1% in g2), but not the TTN fair usage policy (which is probably
- * violated by this sketch when left running for longer)!
+ * Change DEVADDR to a unique address!
+ * See http://thethingsnetwork.org/wiki/AddressSpace
  *
- * To use this sketch, first register your application and device with
- * the things network, to set or generate a DevAddr, NwkSKey and
- * AppSKey. Each device should have their own unique values for these
- * fields.
- *
- * Do not forget to define the radio type correctly in
- * arduino-lmic/project_config/lmic_project_config.h or from your BOARDS.txt.
+ * Do not forget to define the radio type correctly in config.h.
  *
  *******************************************************************************/
 
-// References:
-// [feather] adafruit-feather-m0-radio-with-lora-module.pdf
-
 #include <lmic.h>
 #include <hal/hal.h>
 #include <SPI.h>
 
 #include "config.custom.h"
 
-
 // These callbacks are only used in over-the-air activation, so they are
 // left empty here (we cannot leave them out completely unless
-// DISABLE_JOIN is set in arduino-lmic/project_config/lmic_project_config.h,
-// otherwise the linker will complain).
+// DISABLE_JOIN is set in config.h, otherwise the linker will complain).
 void os_getArtEui (u1_t* buf) { }
 void os_getDevEui (u1_t* buf) { }
 void os_getDevKey (u1_t* buf) { }
@@ -57,11 +42,10 @@ static osjob_t sendjob;
 const unsigned TX_INTERVAL = 60;
 
 // Pin mapping
-// Adapted for the Dragino LoRa Shield
 const lmic_pinmap lmic_pins = {
-    .nss = 10,                  // SPI Chip select - aka NSS
+    .nss = 10,
     .rxtx = LMIC_UNUSED_PIN,
-    .rst = 9,                   // Reset pin
+    .rst = 9,
     .dio = {2, 6, 7},
 };
 
@@ -87,28 +71,23 @@ void onEvent (ev_t ev) {
         case EV_JOINED:
             Serial.println(F("EV_JOINED"));
             break;
-        /*
-        || This event is defined but not used in the code. No
-        || point in wasting codespace on it.
-        ||
-        || case EV_RFU1:
-        ||     Serial.println(F("EV_RFU1"));
-        ||     break;
-        */
+        case EV_RFU1:
+            Serial.println(F("EV_RFU1"));
+            break;
         case EV_JOIN_FAILED:
             Serial.println(F("EV_JOIN_FAILED"));
             break;
         case EV_REJOIN_FAILED:
             Serial.println(F("EV_REJOIN_FAILED"));
             break;
+            break;
         case EV_TXCOMPLETE:
             Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
-            if (LMIC.txrxFlags & TXRX_ACK)
-              Serial.println(F("Received ack"));
-            if (LMIC.dataLen) {
-              Serial.println(F("Received "));
-              Serial.println(LMIC.dataLen);
-              Serial.println(F(" bytes of payload"));
+            if(LMIC.dataLen) {
+                // data received in rx slot after tx
+                Serial.print(F("Data Received: "));
+                Serial.write(LMIC.frame+LMIC.dataBeg, LMIC.dataLen);
+                Serial.println();
             }
             // Schedule next transmission
             os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
@@ -129,20 +108,8 @@ void onEvent (ev_t ev) {
         case EV_LINK_ALIVE:
             Serial.println(F("EV_LINK_ALIVE"));
             break;
-        /*
-        || This event is defined but not used in the code. No
-        || point in wasting codespace on it.
-        ||
-        || case EV_SCAN_FOUND:
-        ||    Serial.println(F("EV_SCAN_FOUND"));
-        ||    break;
-        */
-        case EV_TXSTART:
-            Serial.println(F("EV_TXSTART"));
-            break;
-        default:
-            Serial.print(F("Unknown event: "));
-            Serial.println((unsigned) ev);
+         default:
+            Serial.println(F("Unknown event"));
             break;
     }
 }
@@ -160,10 +127,7 @@ void do_send(osjob_t* j){
 }
 
 void setup() {
-//    pinMode(13, OUTPUT); 
-    while (!Serial); // wait for Serial to be initialized
     Serial.begin(115200);
-    delay(100);     // per sample code on RF_95 test
     Serial.println(F("Starting"));
 
     #ifdef VCC_ENABLE
@@ -188,13 +152,12 @@ void setup() {
     uint8_t nwkskey[sizeof(NWKSKEY)];
     memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
     memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
-    LMIC_setSession (0x13, DEVADDR, nwkskey, appskey);
+    LMIC_setSession (0x1, DEVADDR, nwkskey, appskey);
     #else
-    // If not running an AVR with PROGMEM, just use the arrays directly
-    LMIC_setSession (0x13, DEVADDR, NWKSKEY, APPSKEY);
+    // If not running an AVR with PROGMEM, just use the arrays directly 
+    LMIC_setSession (0x1, DEVADDR, NWKSKEY, APPSKEY);
     #endif
 
-    #if defined(CFG_eu868)
     // Set up the channels used by the Things Network, which corresponds
     // to the defaults of most gateways. Without this, only three base
     // channels from the LoRaWAN specification are used, which certainly
@@ -216,21 +179,11 @@ void setup() {
     // devices' ping slots. LMIC does not have an easy way to define set this
     // frequency and support for class B is spotty and untested, so this
     // frequency is not configured here.
-    #elif defined(CFG_us915)
-    // NA-US channels 0-71 are configured automatically
-    // but only one group of 8 should (a subband) should be active
-    // TTN recommends the second sub band, 1 in a zero based count.
-    // https://github.com/TheThingsNetwork/gateway-conf/blob/master/US-global_conf.json
-    LMIC_selectSubBand(1);
-    #endif
 
     // Disable link check validation
     LMIC_setLinkCheckMode(0);
 
-    // TTN uses SF9 for its RX2 window.
-    LMIC.dn2Dr = DR_SF9;
-
-    // Set data rate and transmit power for uplink
+    // Set data rate and transmit power (note: txpow seems to be ignored by the library)
     LMIC_setDrTxpow(DR_SF7,14);
 
     // Start job
@@ -238,15 +191,5 @@ void setup() {
 }
 
 void loop() {
-    unsigned long now;
-    now = millis();
-    if ((now & 512) != 0) {
-      digitalWrite(13, HIGH);
-    }
-    else {
-      digitalWrite(13, LOW);
-    }
-      
     os_runloop_once();
-    
 }
diff --git a/iot/libraries/arduino-lmic b/iot/libraries/arduino-lmic
deleted file mode 160000
index 9f01615..0000000
--- a/iot/libraries/arduino-lmic
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9f016150100afcde4d3def8abae234c6efc46e0c
