Tobi's ubw test branch

Dependencies:   mavlink_bridge mbed

Fork of AIT_UWB_Range by Benjamin Hepp

MMRanging/MMRanging.cpp

Committer:
manumaet
Date:
2014-12-01
Revision:
31:6f76f3d518ac
Parent:
29:019ff388ed76
Child:
32:041dd02e0e3b

File content as of revision 31:6f76f3d518ac:

#include "MMRanging.h"

MMRanging::MMRanging(DW1000& DW) : dw(DW){
    MMRanging::dw = dw;
    
    ranging_i = 0;
    
    message[0] = '\0';
    messageRX[0] = '\0';
    event_i = 0;
    counter = 0;
    
    dw.setCallbacks(this, &MMRanging::callbackRX, &MMRanging::callbackTX);
    dw.startRX();
}

void MMRanging::callbackRX() {
    RX_timestamp = dw.getRXTimestamp();
    
    dw.receiveString(messageRX);
    
    rangingframe* RX = (rangingframe*)messageRX;
    switch (RX->type) {
        case 1:
            rangingtimingsReceiver[RX->sequence_number][0] = dw.getRXTimestamp();
            TX.type = 2;
            TX.sequence_number = RX->sequence_number;
            TX.time_difference_receiver = 0;
            dw.sendFrame((uint8_t*)&TX, 10);
            break;
        case 2:
            rangingtimingsSender[RX->sequence_number][1] = dw.getRXTimestamp();
            break;
        case 3:
            TX.type = 4;
            TX.time_difference_receiver = rangingtimingsReceiver[TX.sequence_number][1] - rangingtimingsReceiver[TX.sequence_number][0];
            dw.sendFrame((uint8_t*)&TX, 10);
            break;
        case 4:
            tofs[RX->sequence_number] = rangingtimingsSender[RX->sequence_number][1] - rangingtimingsSender[RX->sequence_number][0] - RX->time_difference_receiver;
            //tofs[RX->sequence_number] = (rangingtimingsSender[RX->sequence_number][1] - rangingtimingsSender[RX->sequence_number][0] - RX->time_difference_receiver) >> 1;
            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] = ' ';
    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();
    
    switch (TX.type) {
        case 1:
            rangingtimingsSender[TX.sequence_number][0] = dw.getTXTimestamp();
            break;
        case 2:
            rangingtimingsReceiver[TX.sequence_number][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);
    //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() {
    TX.type = 1;
    TX.sequence_number = counter;
    TX.time_difference_receiver = 0;
    dw.sendFrame((uint8_t*)&TX, 10);
}

void MMRanging::requestTime() {
    TX.type = 3;
    TX.sequence_number = counter;
    TX.time_difference_receiver = 0;
    dw.sendFrame((uint8_t*)&TX, 10);
    counter++;
}