Tobi's ubw test branch
Dependencies: mavlink_bridge mbed
Fork of AIT_UWB_Range by
MMRanging/MMRanging.cpp
- Committer:
- manumaet
- Date:
- 2015-02-17
- Revision:
- 35:95d838d33bf5
- Parent:
- 34:f56962030c5c
- Child:
- 36:883de6f9a73b
File content as of revision 35:95d838d33bf5:
#include "MMRanging.h" MMRanging::MMRanging(DW1000& DW) : dw(DW) { event_i = 0; counter = 0; dw.setCallbacks(this, &MMRanging::callbackRX, &MMRanging::callbackTX); dw.startRX(); } void MMRanging::callbackRX() { RX_timestamp = dw.getRXTimestamp(); rangingframe RX; dw.readRegister(DW1000_RX_BUFFER, 0, (uint8_t*)&RX, dw.getFramelength()); // get data from buffer uint8_t Index = RX.sequence_number % 10; switch (RX.type) { case 1: rangingtimingsReceiver[Index][0] = dw.getRXTimestamp(); sendRangingframe(2, RX.sequence_number, 0); break; case 2: rangingtimingsSender[Index][1] = dw.getRXTimestamp(); break; case 3: sendRangingframe(4, TX.sequence_number, rangingtimingsReceiver[Index][1] - rangingtimingsReceiver[Index][0]); // TODO: sequence number??? break; case 4: tofs = (rangingtimingsSender[Index][1] - rangingtimingsSender[Index][0] - RX.time_difference_receiver);// - 65536; break; default : break; } 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] = ' '; sprintf(&event[event_i][3], "%d %d", RX.sequence_number, RX.type); if (event_i == 8) event_i = 0; else event_i++; dw.startRX(); } void MMRanging::callbackTX() { TX_timestamp = dw.getTXTimestamp(); uint8_t Index = TX.sequence_number % 10; switch (TX.type) { case 1: rangingtimingsSender[Index][0] = dw.getTXTimestamp(); break; case 2: rangingtimingsReceiver[Index][1] = dw.getTXTimestamp(); break; default: break; } eventtimes[event_i] = 0; event[event_i][0] = '!'; event[event_i][1] = 'S'; event[event_i][2] = ' '; sprintf(&event[event_i][3], "%d %d", TX.sequence_number, TX.type); if (event_i == 8) event_i = 0; else event_i++; } void MMRanging::requestRanging() { sendRangingframe(1, counter, 0); } void MMRanging::requestTime() { sendRangingframe(3, counter, 0); counter++; } void MMRanging::sendRangingframe(uint8_t type, uint8_t sequence_number, uint64_t time_difference_receiver) { TX.type = type; TX.sequence_number = sequence_number; TX.time_difference_receiver = time_difference_receiver; dw.sendFrame((uint8_t*)&TX, sizeof(TX)); }