wayne roberts / lorawan1v1

Dependencies:   sx12xx_hal

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

Revision:
4:e4bfe9183f94
Parent:
0:6b3ac9c5a042
Child:
7:4b6f960dcca2
--- a/radio/radio.cpp	Mon Mar 05 16:49:15 2018 -0800
+++ b/radio/radio.cpp	Mon Mar 19 14:39:06 2018 -0700
@@ -189,17 +189,17 @@
 }
 #endif /* if 0 */
 
-//volatile bool fooEnable = false;
-
-void Radio::dio0callback()
-{
-    us_timestamp_t now = lpt.read_us();
+volatile struct pe {
+    uint8_t dio0 : 1;
+    uint8_t dio1 : 1;
+    uint8_t txing : 1;
+} pinEvent;
+volatile us_timestamp_t dio0at;
 
-    lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
-
-    if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER ||
-        radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
-    {
+void
+Radio::dio0UserContext()
+{
+    if (!pinEvent.txing) {
         lora.service();
         if (!lora.RegIrqFlags.bits.RxDone) {
             MAC_PRINTF("not-rxdone\r\n");
@@ -211,19 +211,27 @@
             if (snr < 0)
                 rssi += snr;
             //MAC_PRINTF("rxdone snr:%.2f, rssi:%d\r\n", snr, rssi);
-            //fooEnable = true;
-            RadioEvents->RxDone(radio.rx_buf, lora.RegRxNbBytes, rssi, snr, now);
+            RadioEvents->RxDone(radio.rx_buf, lora.RegRxNbBytes, rssi, snr, dio0at);
         }
-    } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) {
-        if (!lora.RegIrqFlags.bits.TxDone) {
-            MAC_PRINTF("not-txdone\r\n");
-        } else if (RadioEvents->TxDone)
-            RadioEvents->TxDone(now);
+    } 
+}
+
+void Radio::dio0isr()
+{
+    dio0at = lpt.read_us();
+ 
+    if (pinEvent.txing) {
+        /* TxDone handling requires low latency */
+        if (RadioEvents->TxDone)
+            RadioEvents->TxDone(dio0at);
+
         lora.service();
-    }
-} // ..dio0callback()
+        pinEvent.txing = 0;
+    } else
+        pinEvent.dio0 = 1;
+}
 
-void Radio::dio1callback()
+void Radio::dio1UserContext()
 {
     lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
 
@@ -234,10 +242,15 @@
         RadioEvents->RxTimeout();
 }
 
+void Radio::dio1isr()
+{
+    pinEvent.dio1 = 1;
+}
+
 void Radio::Init(const RadioEvents_t* e)
 {
-    dio0.rise(dio0callback);
-    dio1.rise(dio1callback);
+    dio0.rise(dio0isr);
+    dio1.rise(dio1isr);
 
     radio.rf_switch = rfsw_callback;
     boardInit();
@@ -256,6 +269,7 @@
     lora.RegPayloadLength = size;
     radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
     lora.start_tx(size);
+    pinEvent.txing = 1;
 }
 
 /*volatile RadioState_t state;
@@ -272,6 +286,8 @@
     else
         lora.start_rx(RF_OPMODE_RECEIVER_SINGLE);
 
+    pinEvent.txing = 0;
+
     MAC_PRINTF("start_rx ");
 }
 
@@ -382,3 +398,15 @@
 }
 #endif /* DUTY_ENABLE */
 
+void Radio::UserContext()
+{
+    if (pinEvent.dio0) {
+        dio0UserContext();
+        pinEvent.dio0 = 0;
+    }
+
+    if (pinEvent.dio1) {
+        dio1UserContext();
+        pinEvent.dio1 = 0;
+    }
+}