wayne roberts / lorawan1v1

Dependencies:   sx12xx_hal

Dependents:   LoRaWAN-SanJose_Bootcamp LoRaWAN-grove-cayenne LoRaWAN-classC-demo LoRaWAN-grove-cayenne ... more

Revision:
7:4b6f960dcca2
Parent:
4:e4bfe9183f94
--- a/radio/radio.cpp	Fri Apr 06 23:41:55 2018 +0000
+++ b/radio/radio.cpp	Fri May 04 11:00:06 2018 -0700
@@ -236,10 +236,11 @@
     lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
 
     MAC_PRINTF("\e[7mdio1:%02x\e[0m\r\n", lora.RegIrqFlags.octet);
-    if (!lora.RegIrqFlags.bits.RxTimeout) {
-        MAC_PRINTF("dio1-not-rxtimeout\r\n");
-    } else if (RadioEvents->RxTimeout)
+
+    if (RadioEvents->RxTimeout)
         RadioEvents->RxTimeout();
+
+    radio.write_reg(REG_LR_IRQFLAGS, 0x80); // ensure RxTimeout is cleared
 }
 
 void Radio::dio1isr()
@@ -259,36 +260,59 @@
     lpt.start();
 }
 
-void Radio::Send(uint8_t size)
+int Radio::Send(uint8_t size, timestamp_t maxListenTime, timestamp_t channelFreeTime, int rssiThresh)
 {
     if (radio.RegOpMode.bits.Mode == RF_OPMODE_SLEEP) {
         radio.set_opmode(RF_OPMODE_STANDBY);
         wait_us(1000);
     }
-    //MAC_PRINTF("Radio::Send() dio:%u:%u opmode:%02x ", radio.dio0.read(), radio.dio1.read(), radio.read_reg(REG_OPMODE));
+    radio.write_reg(REG_LR_IRQFLAGS, 0x08); // ensure TxDone is cleared
+    MAC_PRINTF("Radio::Send() dio:%u:%u opmode:%02x ", radio.dio0.read(), radio.dio1.read(), radio.read_reg(REG_OPMODE));
     lora.RegPayloadLength = size;
     radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
+
+    if (maxListenTime > 0) {
+        int rssi;
+        us_timestamp_t startAt, chFreeAt, now;
+        lora.start_rx(RF_OPMODE_RECEIVER);
+        startAt = lpt.read_us();
+Lstart:
+        do {
+            now = lpt.read_us();
+            if ((now - startAt) > maxListenTime) {
+                return -1;
+            }
+            rssi = lora.get_current_rssi();
+        } while (rssi > rssiThresh);
+        chFreeAt = lpt.read_us();
+        do {
+            now = lpt.read_us();
+            rssi = lora.get_current_rssi();
+            if (rssi > rssiThresh) {
+                goto Lstart;
+            }
+        } while ((now - chFreeAt) < channelFreeTime);
+    }
+
     lora.start_tx(size);
     pinEvent.txing = 1;
+
+    return 0;
 }
 
-/*volatile RadioState_t state;
-
-RadioState_t Radio::GetStatus()
-{
-    return state;
-}*/
-
 void Radio::Rx(unsigned timeout)
 {
-    if (timeout == 0)
+    if (timeout == 0) {
         lora.start_rx(RF_OPMODE_RECEIVER);
-    else
+        MAC_PRINTF("startRxC ");
+    } else {
+        lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);   // yyy tmp remove
         lora.start_rx(RF_OPMODE_RECEIVER_SINGLE);
+        MAC_PRINTF("startRxS:%02x ", lora.RegIrqFlags.octet);
+    }
 
     pinEvent.txing = 0;
 
-    MAC_PRINTF("start_rx ");
 }
 
 
@@ -313,9 +337,23 @@
 
 void Radio::PrintStatus()
 {
-    MAC_PRINTF("dio:%u:%u opmode:%02x ", radio.dio0.read(), radio.dio1.read(), radio.read_reg(REG_OPMODE));
+#ifdef MAC_DEBUG
+    radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
+    switch (radio.RegOpMode.bits.Mode) {
+        case RF_OPMODE_SLEEP: MAC_PRINTF("SLEEP "); break;
+        case RF_OPMODE_STANDBY: MAC_PRINTF("STBY "); break;
+        case RF_OPMODE_SYNTHESIZER_TX: MAC_PRINTF("FSTX "); break;
+        case RF_OPMODE_TRANSMITTER: MAC_PRINTF("TX "); break;
+        case RF_OPMODE_SYNTHESIZER_RX: MAC_PRINTF("FSRX "); break;
+        case RF_OPMODE_RECEIVER: MAC_PRINTF("RXC "); break;
+        case RF_OPMODE_RECEIVER_SINGLE: MAC_PRINTF("RXS "); break;
+        case RF_OPMODE_CAD: MAC_PRINTF("CAD "); break;
+    }
+
+    MAC_PRINTF("dio:%u:%u opmode:%02x %.2fMHz sf%ubw%u ", radio.dio0.read(), radio.dio1.read(), radio.RegOpMode.octet, radio.get_frf_MHz(), lora.getSf(), lora.getBw());
     lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
     MAC_PRINTF("irqFlags:%02x\r\n", lora.RegIrqFlags.octet);
+#endif /* MAC_DEBUG */
 }
 
 #ifdef DUTY_ENABLE