Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 28:a830131560e8, committed 2014-11-28
- 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
--- 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