wayne roberts / Mbed OS LoRaWAN_singlechannel_gateway

Dependencies:   SX127x sx12xx_hal

Revision:
16:67fa19bc6331
Parent:
13:fa2095be01c4
Child:
17:763412df6872
--- a/lorawan.cpp	Thu Aug 10 14:53:12 2017 -0700
+++ b/lorawan.cpp	Thu Aug 10 17:56:02 2017 -0700
@@ -29,6 +29,7 @@
 volatile uint16_t LoRaWan::rx_slot;
 volatile uint32_t LoRaWan::rx_ms;    // captured timer milliseconds at RxDone
 bool LoRaWan::do_downlink;
+uint32_t LoRaWan::dev_addr_filter;
 
 #ifdef USE_BAND_915
     /* us915-single-channel spreading factors: */
@@ -257,6 +258,20 @@
 //    printf("\n");
 }
 
+void LoRaWan::filtered_printf(uint32_t dev_addr, const char* format, ...)
+{
+    va_list args;
+
+    if (dev_addr_filter != 0) {
+        if (dev_addr_filter != dev_addr)
+            return;
+    }
+
+    va_start(args, format);
+    vprintf(format, args);
+    va_end(args);
+}
+
 uint8_t* Write4ByteValue(uint8_t output[], uint32_t input)
 {
     uint8_t* ptr = output;
@@ -653,9 +668,9 @@
         rxFRMPayload_length = (lora.RegRxNbBytes - LORA_FRAMEMICBYTES) - (rxofs + 1);
         rxFRMPayload = &radio.rx_buf[rxofs+1];
         rx_fport_ptr = &radio.rx_buf[rxofs];
-        printf("port:%d, len:%d, ", *rx_fport_ptr, rxFRMPayload_length);
+        filtered_printf(mote->dev_addr, "port:%d, len:%d, ", *rx_fport_ptr, rxFRMPayload_length);
     } else
-        printf("no-payload\r\n");
+        filtered_printf(mote->dev_addr, "no-payload\r\n");
 
     LoRa_GenerateDataFrameIntegrityCode(mote->network_session_key, radio.rx_buf, lora.RegRxNbBytes-LORA_FRAMEMICBYTES, rx_fhdr->DevAddr, true, rx_fhdr->FCnt, (uint8_t*)&calculated_mic);
 
@@ -664,36 +679,36 @@
     rx_mic += radio.rx_buf[lora.RegRxNbBytes-3] << 8;
     rx_mic += radio.rx_buf[lora.RegRxNbBytes-4];
     if (calculated_mic != rx_mic) {
-        printf("genMic:%08lx, rxMic:%08lx\r\n", calculated_mic, rx_mic);
-        printf("mic fail\n");
+        filtered_printf(mote->dev_addr, "genMic:%08lx, rxMic:%08lx\r\n", calculated_mic, rx_mic);
+        filtered_printf(mote->dev_addr, "mic fail\n");
         return;
     }
 
     if (rx_fport_ptr != NULL && *rx_fport_ptr == 0) {
         /* mac commands are encrypted onto port 0 */
         LoRa_EncryptPayload(mote->network_session_key, rxFRMPayload, rxFRMPayload_length, rx_fhdr->DevAddr, true, rx_fhdr->FCnt, decrypted);
-        printf("mac commands encrypted on port 0\r\n");
+        filtered_printf(mote->dev_addr, "mac commands encrypted on port 0\r\n");
         parse_mac_command(mote, decrypted, rxFRMPayload_length);
     } else {
         if (rx_fhdr->FCtrl.ulBits.FOptsLen > 0) {
             /* mac commands are in header */
-            printf("mac commands in header\r\n");
+            filtered_printf(mote->dev_addr, "mac commands in header\r\n");
             rxofs = sizeof(mhdr_t) + sizeof(fhdr_t);
             parse_mac_command(mote, &radio.rx_buf[rxofs], rx_fhdr->FCtrl.ulBits.FOptsLen);
         }
         if (rxFRMPayload != NULL) {
             LoRa_EncryptPayload(mote->app_session_key, rxFRMPayload, rxFRMPayload_length, rx_fhdr->DevAddr, true, rx_fhdr->FCnt, decrypted);
-            /*printf("app-decrypt:");
+            /*filtered_printf("app-decrypt:");
             for (rxofs = 0; rxofs < rxFRMPayload_length; rxofs++) {
-                printf("%02x ", decrypted[rxofs]);
+                filtered_printf("%02x ", decrypted[rxofs]);
             }
-            printf("  ");
+            filtered_printf("  ");
             for (rxofs = 0; rxofs < rxFRMPayload_length; rxofs++) {
                 if (decrypted[rxofs] >= ' ' && decrypted[rxofs] < 0x7f)
-                    printf("%c", decrypted[rxofs]);
+                    filtered_printf("%c", decrypted[rxofs]);
             }
-            printf("\n");*/
-            decrypted_uplink(decrypted, rxFRMPayload_length, *rx_fport_ptr);
+            filtered_printf("\n");*/
+            decrypted_uplink(mote->dev_addr, decrypted, rxFRMPayload_length, *rx_fport_ptr);
         }
     }
 
@@ -819,10 +834,6 @@
         }
     } else if (mhdr->bits.MType == MTYPE_UNCONF_UP || mhdr->bits.MType == MTYPE_CONF_UP) {
         fhdr_t *fhdr = (fhdr_t*)&radio.rx_buf[1];
-        if (mhdr->bits.MType == MTYPE_UNCONF_UP)
-            printf("MTYPE_UNCONF_UP, ");
-        else if (mhdr->bits.MType == MTYPE_CONF_UP)
-            printf("MTYPE_CONF_UP, ");
 
         for (i = 0; i < N_MOTES; i++) {
             if (motes[i].dev_addr == fhdr->DevAddr) {
@@ -830,14 +841,26 @@
             }
         }
 
+        filtered_printf(mote->dev_addr, "%u, %lu, %.1fdB, %ddBm, ",
+            LoRaWan::rx_slot,
+            time(NULL),
+            lora.RegPktSnrValue / 4.0,
+            lora.get_pkt_rssi()
+        );
+
+        if (mhdr->bits.MType == MTYPE_UNCONF_UP)
+            filtered_printf(mote->dev_addr, "MTYPE_UNCONF_UP, ");
+        else if (mhdr->bits.MType == MTYPE_CONF_UP)
+            filtered_printf(mote->dev_addr, "MTYPE_CONF_UP, ");
+
         if (mote != NULL) {
-            printf("mote:%lx, ", mote->dev_addr);
+            filtered_printf(mote->dev_addr, "mote:%lx, ", mote->dev_addr);
             parse_uplink(mote);
+            filtered_printf(mote->dev_addr, "\r\n");
         } else {
-            printf("mote-not-found %08lx", fhdr->DevAddr);
+            printf("mote-not-found %08lx\r\n", fhdr->DevAddr);
         }
 
-        printf("\r\n");
     } else
         printf(" %02x mtype:%d\r\n", radio.rx_buf[0], mhdr->bits.MType);