Matthias Grob & Manuel Stalder / Mbed 2 deprecated DecaWave

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
manumaet
Date:
Fri Nov 28 14:40:03 2014 +0000
Parent:
27:71178fdb78e1
Child:
29:019ff388ed76
Commit message:
after setting up a test MMRanging class, problem with member function pointers

Changed in this revision

DW1000/DW1000.cpp Show annotated file Show diff for this revision Revisions of this file
DW1000/DW1000.h Show annotated file Show diff for this revision Revisions of this file
MMRanging/MMRanging.cpp Show annotated file Show diff for this revision Revisions of this file
MMRanging/MMRanging.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/DW1000/DW1000.cpp	Fri Nov 28 07:44:36 2014 +0000
+++ b/DW1000/DW1000.cpp	Fri Nov 28 14:40:03 2014 +0000
@@ -17,7 +17,7 @@
     irq.rise(this, &DW1000::ISR);       // attach Interrupt handler to rising edge
 }
 
-void DW1000::setCallbacks(void (*callbackRX)(int framelength), void (*callbackTX)()) {
+void DW1000::setCallbacks(void (*callbackRX)(), void (*callbackTX)()) {
     DW1000::callbackRX = callbackRX;
     DW1000::callbackTX = callbackTX;
 }
@@ -121,7 +121,7 @@
     uint64_t status = getStatus();
     if (status & 0x4000) {                                          // a frame was received
         if (callbackRX != NULL)
-            callbackRX(getFramelength());
+            callbackRX();
         writeRegister16(DW1000_SYS_STATUS, 0, 0x6F00);              // clearing of receiving status bits
     }
     if (status & 0x80) {                                            // sending complete
--- a/DW1000/DW1000.h	Fri Nov 28 07:44:36 2014 +0000
+++ b/DW1000/DW1000.h	Fri Nov 28 14:40:03 2014 +0000
@@ -54,7 +54,7 @@
 class DW1000 {
     public:            
         DW1000(PinName MOSI, PinName MISO, PinName SCLK, PinName CS, PinName IRQ);              // constructor, uses SPI class
-        void setCallbacks(void (*callbackRX)(int framelength), void (*callbackTX)());           // setter for callback function pointer fields
+        void setCallbacks(void (*callbackRX)(), void (*callbackTX)());                          // setter for callback function pointer fields
 
         // Device API
         uint32_t getDeviceID();                                                                 // gets the Device ID which should be 0xDECA0130 (good for testing SPI!)
@@ -79,7 +79,7 @@
 
         // Interrupt
         InterruptIn irq;                                                                        // Pin used to handle Events from DW1000 by an Interrupthandler
-        void (*callbackRX)(int framelength);                                                    // function pointer to callback which is called when successfull RX took place
+        void (*callbackRX)();                                                                   // function pointer to callback which is called when successfull RX took place
         void (*callbackTX)();                                                                   // function pointer to callback which is called when successfull TX took place
         void ISR();                                                                             // interrupt handling method (also calls according callback methods)
         uint16_t getFramelength();                                                              // to get the framelength of the received frame from the PHY header
--- a/MMRanging/MMRanging.cpp	Fri Nov 28 07:44:36 2014 +0000
+++ b/MMRanging/MMRanging.cpp	Fri Nov 28 14:40:03 2014 +0000
@@ -1,5 +1,55 @@
 #include "MMRanging.h"
 
-MMRanging::MMRanging(DW1000* dw) {
+MMRanging::MMRanging(DW1000& DW) : dw(DW){
     MMRanging::dw = dw;
+    
+    message[0] = '\0';
+    messageRX[0] = '\0';
+    event_i = 0;
+    counter = 0;
+    
+    dw.setInterrupt(true, true);
+    dw.startRX();
 }
+
+void MMRanging::callbackRX() {
+    RX_timestamp = dw.getRXTimestamp();
+    dw.receiveString(messageRX);
+    if (receiver) {
+        message[0] = 'A';                               // acknowledge messages
+        for(int i = 0; i < 10; i++)
+            message[i+1] = messageRX[i];
+        dw.sendString(message);
+    }
+    eventtimes[event_i] = RX_timestamp - TX_timestamp;                      // TODO: can give some wrong values because of timer reset after 17 seconds
+    event[event_i][0] = '!';
+    event[event_i][1] = 'R';
+    event[event_i][2] = ' ';
+    for(int i = 0; i < 10; i++)
+        event[event_i][i+3] = messageRX[i];
+    if (event_i == 8)
+        event_i = 0;
+    else
+        event_i++;
+    dw.startRX();
+}
+
+void MMRanging::callbackTX() {
+    TX_timestamp = dw.getTXTimestamp();
+    eventtimes[event_i] = 0;
+    event[event_i][0] = '!';
+    event[event_i][1] = 'S';
+    event[event_i][2] = ' ';
+    for(int i = 0; i < 10; i++)
+        event[event_i][i+3] = message[i];
+    if (event_i == 8)
+        event_i = 0;
+    else
+        event_i++;
+}
+
+void MMRanging::requestRanging() {
+    sprintf(message, "%d", counter);                  // send numbers to acknowledge
+    counter++;
+    dw.sendString(message);
+}
\ No newline at end of file
--- a/MMRanging/MMRanging.h	Fri Nov 28 07:44:36 2014 +0000
+++ b/MMRanging/MMRanging.h	Fri Nov 28 14:40:03 2014 +0000
@@ -9,10 +9,24 @@
 #define MMRANGING_TIMEUNIT      1/(128*499.2)               // conversion between LSB of TX and RX timestamps and microseconds
 
 class MMRanging {
-    public:            
-        MMRanging(DW1000* dw);
-    private:
-        DW1000* dw;
+    public:
+        MMRanging(DW1000& DW);
+        void callbackRX();
+        void callbackTX();
+        void requestRanging();
+    //private:
+        DW1000& dw;
+        
+        // draft for first test
+        bool receiver;
+        char message[1021];
+        char messageRX[1021];
+        uint64_t TX_timestamp;
+        uint64_t RX_timestamp;
+        int event_i;
+        char event[10][20];
+        uint64_t eventtimes[10];
+        uint8_t counter;
 };
 
 #endif
\ No newline at end of file
--- a/main.cpp	Fri Nov 28 07:44:36 2014 +0000
+++ b/main.cpp	Fri Nov 28 14:40:03 2014 +0000
@@ -4,80 +4,34 @@
 #include "DW1000.h"                                 // our DW1000 device driver
 #include "MMRanging.h"                              // our self developed raning application
 
-//#define RECEIVER
-
 PC          pc(USBTX, USBRX, 921600);               // USB UART Terminal
 DW1000      dw(PA_7, PA_6, PA_5, PB_6, PB_9);       // SPI1 on Nucleo Board (MOSI, MISO, SCLK, CS, IRQ)
-MMRanging   ranging(&dw);                            // Ranging class for getting distances and later positions
-
-const float timeunit = 1/(128*499.2);               // conversion between LSB of TX and RX timestamps and microseconds
-int i=0;
-char message[1021] = "";
-char messageRX[1021] = "";
-uint64_t TX_timestamp;
-uint64_t RX_timestamp;
-int event_i = 0;
-char event[10][20];
-uint64_t eventtimes[10];
+MMRanging   r(dw);                                  // Ranging class for getting distances and later positions
 
-void callbackRX(int framelength) {
-    RX_timestamp = dw.getRXTimestamp();
-    dw.receiveString(messageRX);
-#ifdef RECEIVER
-    message[0] = 'A';                               // acknowledge messages
-    for(int i = 0; i < 10; i++)
-        message[i+1] = messageRX[i];
-    dw.sendString(message);
-#endif
-    eventtimes[event_i] = RX_timestamp - TX_timestamp;                      // TODO: can give some wrong values because of timer reset after 17 seconds
-    event[event_i][0] = '!';
-    event[event_i][1] = 'R';
-    event[event_i][2] = ' ';
-    for(int i = 0; i < 10; i++)
-        event[event_i][i+3] = messageRX[i];
-    if (event_i == 8)
-        event_i = 0;
-    else
-        event_i++;
-    dw.startRX();
-}
+char message[100] = "";
 
-void callbackTX() {
-    TX_timestamp = dw.getTXTimestamp();
-    eventtimes[event_i] = 0;
-    event[event_i][0] = '!';
-    event[event_i][1] = 'S';
-    event[event_i][2] = ' ';
-    for(int i = 0; i < 10; i++)
-        event[event_i][i+3] = message[i];
-    if (event_i == 8)
-        event_i = 0;
-    else
-        event_i++;
-}
+void callbackRX() {r.callbackRX();}                 // TODO: solve cast from memebr function pointer to function pointer
+void callbackTX() {r.callbackTX();}
 
 int main() {
     pc.printf("DecaWave 0.2\r\nup and running!\r\n");  
     dw.setEUI(0xFAEDCD01FAEDCD01);                  // basic methods called to check if we have a working SPI connection
-    pc.printf("%d DEVICE_ID register: 0x%X\r\n", i, dw.getDeviceID());
-    pc.printf("%d EUI register: %016llX\r\n", i, dw.getEUI());
-    pc.printf("%d Voltage: %f\r\n", i, dw.getVoltage());
-    
+    pc.printf("DEVICE_ID register: 0x%X\r\n", dw.getDeviceID());
+    pc.printf("EUI register: %016llX\r\n", dw.getEUI());
+    pc.printf("Voltage: %f\r\n", dw.getVoltage());
+
+    r.receiver = true;
     dw.setCallbacks(&callbackRX, &callbackTX);
-    dw.setInterrupt(true, true);
-    dw.startRX();
     
     while(1) {
         for(int j = 0; j < 10; j++)
-            if(event[j][0] == '!') {
-                pc.printf("%s Time: %fus\r\n", event[j], eventtimes[j]*timeunit);
-                event[j][0] = 'X';
+            if(r.event[j][0] == '!') {
+                pc.printf("%s Time: %fus\r\n", r.event[j], r.eventtimes[j]*MMRANGING_TIMEUNIT);
+                r.event[j][0] = 'X';
             }    
-#ifndef RECEIVER
-        sprintf(message, "%d", i);                  // send numbers to acknowledge
-        dw.sendString(message);
-        wait(1);
-#endif
-        i++;
+        if (!r.receiver) {
+                r.requestRanging();
+                wait(1);
+        }
     }
 }
\ No newline at end of file