Matthias Grob & Manuel Stalder / Mbed 2 deprecated DecaWave

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
manumaet
Date:
Fri Nov 21 14:33:23 2014 +0000
Parent:
9:c8839de428ac
Child:
11:c87d37db2c6f
Commit message:
in between messing with framelenght of sendFrame to solve issue with >1 byte;; readRegister8 tested

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
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/DW1000/DW1000.cpp	Thu Nov 20 16:00:34 2014 +0000
+++ b/DW1000/DW1000.cpp	Fri Nov 21 14:33:23 2014 +0000
@@ -37,13 +37,26 @@
     return Voltage;
 }
 
-void DW1000::sendFrame(char* message, int length) {
-    writeRegister(DW1000_TX_BUFFER, 0, (uint8_t*)message, length);  // fill buffer
+void DW1000::sendString(char* message) {
+    sendFrame((uint8_t*)message, strlen(message)+1);
+}
+
+char* DW1000::receiveString() {
+    uint16_t framelength = 0;                                       // get framelength
+    readRegister(DW1000_RX_FINFO, 0, (uint8_t*)&framelength, 2);
+    framelength = (framelength & 0x03FF) - 2;                       // take only the right bits and subtract the 2 CRC Bytes
+    char* receive = new char[framelength];                          // get data from buffer
+    readRegister(DW1000_RX_BUFFER, 0, (uint8_t*)receive, framelength);
+    return receive;
+}
+
+void DW1000::sendFrame(uint8_t* message, int length) {
+    writeRegister(DW1000_TX_BUFFER, 0, message, length);  // fill buffer
     
     uint16_t framelength = length+2;                                // put length of frame including 2 CRC Bytes
-    writeRegister(DW1000_TX_FCTRL, 0, (uint8_t*)&framelength, 1);
+    writeRegister(DW1000_TX_FCTRL, 0, (uint8_t*)&framelength, 1);   // TODO: make that bigger frames than 256 can be sent
     
-    writeRegister8(DW1000_SYS_CTRL, 0, 0x02);                       // trigger sending process by setting the TXSTRT bit
+    //writeRegister8(DW1000_SYS_CTRL, 0, 0x02);                       // trigger sending process by setting the TXSTRT bit
 }
 
 void DW1000::receiveFrame() {
@@ -62,13 +75,18 @@
 }
 
 // SPI Interface ------------------------------------------------------------------------------------
+uint8_t DW1000::readRegister8(uint8_t reg, uint16_t subaddress) {
+    uint8_t result;
+    readRegister(reg, subaddress, &result, 1);
+    return result;
+}
+
 void DW1000::writeRegister8(uint8_t reg, uint16_t subaddress, uint8_t buffer) {
     writeRegister(reg, subaddress, &buffer, 1);
 }
 
 void DW1000::readRegister(uint8_t reg, uint16_t subaddress, uint8_t *buffer, int length) {
     setupTransaction(reg, subaddress, false);
-    
     for(int i=0; i<length; i++)     // get data
         buffer[i] = spi.write(0x00);
     deselect();
@@ -76,7 +94,6 @@
 
 void DW1000::writeRegister(uint8_t reg, uint16_t subaddress, uint8_t *buffer, int length) {
     setupTransaction(reg, subaddress, true);
-    
     for(int i=0; i<length; i++)     // put data
         spi.write(buffer[i]);
     deselect();
--- a/DW1000/DW1000.h	Thu Nov 20 16:00:34 2014 +0000
+++ b/DW1000/DW1000.h	Fri Nov 21 14:33:23 2014 +0000
@@ -61,7 +61,9 @@
         void setEUI(uint64_t EUI);
         float getVoltage();
         
-        void sendFrame(char* message, int length);
+        void sendString(char* message);                                                         // to send String with arbitrary length
+        char* receiveString();                                                                  // to receive char string with arbitrary length (ATTENTION! you have to delete the returned memory location as "client delete[] receive;")
+        void sendFrame(uint8_t* message, int length);
         void receiveFrame();
         
     //private:
@@ -76,6 +78,7 @@
         DigitalOut cs;                                                                          // Slave selector for SPI-Bus (here explicitly needed to start and end SPI transactions also usable to wake up DW1000)
         InterruptIn irq;                                                                        // Pin used to handle Events from DW1000 by an Interrupthandler
         
+        uint8_t readRegister8(uint8_t reg, uint16_t subaddress);                                // expressive to read just one byte
         void writeRegister8(uint8_t reg, uint16_t subaddress, uint8_t buffer);                  // expressive to write just one byte
         
         void readRegister(uint8_t reg, uint16_t subaddress, uint8_t *buffer, int length);
--- a/main.cpp	Thu Nov 20 16:00:34 2014 +0000
+++ b/main.cpp	Fri Nov 21 14:33:23 2014 +0000
@@ -8,19 +8,26 @@
 #define SENDER
 
 void Interrupthandler() {
-    uint8_t frameready = 0;
+    /*uint8_t frameready = 0;
     dw.readRegister(DW1000_SYS_STATUS, 1, &frameready, 1);
-    pc.printf("Interrupt status: %X\r\n", frameready);
-    // get data from buffer
-    uint8_t receive[20] = "NOTHING IN!!";
-    dw.readRegister(DW1000_RX_BUFFER, 0, receive, 20);
-    pc.printf("Message received: %s\r\n", receive);
-    dw.resetRX();
+    pc.printf("Interrupt status: %X\r\n", frameready);*/
+    
+    uint16_t framelength = 0;                                       // get framelength
+    dw.readRegister(DW1000_RX_FINFO, 0, (uint8_t*)&framelength, 2);
+    framelength &= 0x03FF;
+    framelength -= 2;
+    
+    char* receive = dw.receiveString();
+    pc.printf("Message Received: %s %d\r\n", receive, framelength);
+    delete[] receive;
+    
+    dw.resetRX();                                                   // TODO: is crucial because otherwise only 1 frame is received correct
     dw.receiveFrame();
 }
 
 int main() {
     int i=0;
+    char message[1024] = "";
     pc.printf("DecaWave 0.1\r\nup and running!\r\n");
     
     dw.setEUI(0xFAEDCD01FAEDCD01);
@@ -37,7 +44,7 @@
     
     dw.callbackRX = &Interrupthandler;
 #ifndef SENDER
-    uint8_t dataframereadyinterrupt = 0x20; // only good frame would be 0x40
+    uint8_t dataframereadyinterrupt = 0x40; // only good frame 0x40 all frames 0x20
     dw.writeRegister(DW1000_SYS_MASK, 1, &dataframereadyinterrupt, 1);
     
     // Receive something
@@ -46,24 +53,32 @@
     
     while(1) {
         i++;
-        
 # ifdef SENDER                      // to make one node sender and one receiver
         // Send something
-        char message[20];
-        sprintf((char*)message, "HELLO WORLD! %d", i);
-        dw.sendFrame(message, 20);
+        message[i-1] = 'O';
+        message[i] = '\0';
+        //sprintf((char*)message, "HELLO WORLD! %d", i);
+        if (i < 200)
+            pc.printf("%d Message: \"%s\" %d\r\n", i, message, strlen(message));
+        else
+            pc.printf("%d Message: %d\r\n", i, strlen(message));
+        dw.sendString(message);
         
-        uint8_t messagecheck[20];
-        dw.readRegister(DW1000_TX_BUFFER, 0, messagecheck, 20);
-        pc.printf("Message in buffer: %s\r\nSending...\r\n", messagecheck);
+        char messagecheck[1024];
+        dw.readRegister(DW1000_TX_BUFFER, 0, (uint8_t*)messagecheck, strlen(message)+1);
+        messagecheck[1] = '\0';
+        if (i < 200)
+            pc.printf("%d  Buffer: \"%s\" %d\r\n", i, messagecheck, strlen(messagecheck)+1);
+        else
+            pc.printf("%d  Buffer: %d\r\n", i, strlen(messagecheck)+1);
         /*for(int i=0; i<10; i++) {                                 // to control Voltage
             pc.printf("%d Voltage: %f\r\n", i, dw.getVoltage());
             wait(0.2);
         }*/
-        wait(0.1);
+        wait(1);
 #else
         pc.printf("%d Waiting...\r\n", i);
-        wait(5);
+        wait(1);
 # endif
         
     }