This is the DW1000 driver and our self developed distance measurement application based on it. We do this as a semester thesis at ETH Zürich under the Automatic Control Laboratory in the Department of electrical engineering.

Dependencies:   mbed

Revision:
29:019ff388ed76
Parent:
28:a830131560e8
Child:
31:6f76f3d518ac
--- a/DW1000/DW1000.cpp	Fri Nov 28 14:40:03 2014 +0000
+++ b/DW1000/DW1000.cpp	Fri Nov 28 16:45:10 2014 +0000
@@ -17,9 +17,18 @@
     irq.rise(this, &DW1000::ISR);       // attach Interrupt handler to rising edge
 }
 
-void DW1000::setCallbacks(void (*callbackRX)(), void (*callbackTX)()) {
-    DW1000::callbackRX = callbackRX;
-    DW1000::callbackTX = callbackTX;
+void DW1000::setCallbacks(void (*callbackRX)(void), void (*callbackTX)(void)) {
+    bool RX = false;
+    bool TX = false;
+    if (callbackRX) {
+        DW1000::callbackRX.attach(callbackRX);
+        RX = true;
+    }
+    if (callbackTX) {
+        DW1000::callbackTX.attach(callbackTX);
+        TX = true;
+    }
+    setInterrupt(RX,TX);
 }
 
 uint32_t DW1000::getDeviceID() {
@@ -54,10 +63,6 @@
     return readRegister40(DW1000_SYS_STATUS, 0);
 }
 
-void DW1000::setInterrupt(bool RX, bool TX) {
-    writeRegister16(DW1000_SYS_MASK, 0, RX*0x4000 | TX*0x0080);  // RX good frame 0x4000, TX done 0x0080
-}
-
 uint64_t DW1000::getRXTimestamp() {
     return readRegister40(DW1000_RX_TIME, 0);
 }
@@ -117,17 +122,19 @@
     writeRegister8(DW1000_PMSC, 3, 0xF0);   // clear All reset
 }
 
+
+void DW1000::setInterrupt(bool RX, bool TX) {
+    writeRegister16(DW1000_SYS_MASK, 0, RX*0x4000 | TX*0x0080);  // RX good frame 0x4000, TX done 0x0080
+}
+
 void DW1000::ISR() {
     uint64_t status = getStatus();
     if (status & 0x4000) {                                          // a frame was received
-        if (callbackRX != NULL)
-            callbackRX();
+        callbackRX.call();
         writeRegister16(DW1000_SYS_STATUS, 0, 0x6F00);              // clearing of receiving status bits
     }
     if (status & 0x80) {                                            // sending complete
-        //startRX();                                  // enable receiver again if we need to preserve state          TODO: have to do it here??
-        if (callbackTX != NULL)
-            callbackTX();
+        callbackTX.call();
         writeRegister8(DW1000_SYS_STATUS, 0, 0xF8);                 // clearing of sending status bits
     }
 }