Alejandro Ungria Hirte / GA-Test

Dependencies:   mbed-dev

Committer:
aungriah
Date:
Wed Dec 06 21:42:54 2017 +0000
Revision:
0:3333b6066adf
asfaf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aungriah 0:3333b6066adf 1 // Lukas Bieri, Matthias, Manuel Meier & Noa Melchior
aungriah 0:3333b6066adf 2 // based on Work by Matthias Grob & Manuel Stalder
aungriah 0:3333b6066adf 3 // ETH 2017
aungriah 0:3333b6066adf 4
aungriah 0:3333b6066adf 5 #ifndef _NODES_H
aungriah 0:3333b6066adf 6 #define _NODES_H
aungriah 0:3333b6066adf 7
aungriah 0:3333b6066adf 8 #include "mbed.h"
aungriah 0:3333b6066adf 9 #include "DecaWave.h"
aungriah 0:3333b6066adf 10 #include "frames.h"
aungriah 0:3333b6066adf 11
aungriah 0:3333b6066adf 12 #include "globals.h"
aungriah 0:3333b6066adf 13
aungriah 0:3333b6066adf 14 #define TIMEUNITS_TO_US (1/(128*499.2)) // conversion between the decawave timeunits (ca 15.65ps) to microseconds.
aungriah 0:3333b6066adf 15 #define US_TO_TIMEUNITS (128*499.2) // conversion between microseconds to the decawave timeunits (ca 15.65ps).
aungriah 0:3333b6066adf 16 #define MMRANGING_2POWER40 1099511627776 // decimal value of 2^40 to correct timeroverflow between timestamps
aungriah 0:3333b6066adf 17 #define ADRESSES_COUNT 9 // Defines the Adress Space that is covered when Ranging for all
aungriah 0:3333b6066adf 18 // Adress Space: 0 - (ADRESSES_COUNT - 1)
aungriah 0:3333b6066adf 19 #define MAX_TRIES 5 // Number of times a Anchor is pinged until determined it is not in range
aungriah 0:3333b6066adf 20 #define BASE_STATION_ADDR 15 // Defines the Adress of the Base Station (reserved Adress)
aungriah 0:3333b6066adf 21
aungriah 0:3333b6066adf 22 // Constants for Base_Orders
aungriah 0:3333b6066adf 23 #define RANGE_ALL 1
aungriah 0:3333b6066adf 24 #define RANGE_ONE 0
aungriah 0:3333b6066adf 25 #define NOT_USED 0xff
aungriah 0:3333b6066adf 26
aungriah 0:3333b6066adf 27 // Constant for Switch Types Orders
aungriah 0:3333b6066adf 28 #define BECOME_BEACON 1
aungriah 0:3333b6066adf 29 #define BECOME_ANCHOR 0
aungriah 0:3333b6066adf 30
aungriah 0:3333b6066adf 31
aungriah 0:3333b6066adf 32 class Node {
aungriah 0:3333b6066adf 33 public:
aungriah 0:3333b6066adf 34 Node(DecaWave& DW);
aungriah 0:3333b6066adf 35
aungriah 0:3333b6066adf 36 void setAnchor(bool anc);
aungriah 0:3333b6066adf 37 bool isAnchor();
aungriah 0:3333b6066adf 38 bool isBaseStation();
aungriah 0:3333b6066adf 39 void setAddress(uint8_t adr);
aungriah 0:3333b6066adf 40 uint8_t getAddress();
aungriah 0:3333b6066adf 41
aungriah 0:3333b6066adf 42 virtual uint8* getRecFrameRef() = 0;
aungriah 0:3333b6066adf 43 virtual uint16 getRecFrameLength() = 0;
aungriah 0:3333b6066adf 44
aungriah 0:3333b6066adf 45 virtual void callbackRX(uint64_t RxTime) = 0;
aungriah 0:3333b6066adf 46 virtual void callbackTX(uint64_t TxTime) = 0;
aungriah 0:3333b6066adf 47
aungriah 0:3333b6066adf 48 //Frametype of the form 1001XXXX. First 4 Bits for uniqueness
aungriah 0:3333b6066adf 49 enum FrameType{
aungriah 0:3333b6066adf 50 PING = 0x91,
aungriah 0:3333b6066adf 51 ANCHOR_RESPONSE = 0x92,
aungriah 0:3333b6066adf 52 BEACON_RESPONSE = 0x93,
aungriah 0:3333b6066adf 53 TRANSFER_FRAME = 0x94,
aungriah 0:3333b6066adf 54 DISTANCES_FRAME = 0x95,
aungriah 0:3333b6066adf 55 STREAM_TO_BASE = 0x96,
aungriah 0:3333b6066adf 56 BASE_ORDER = 0x97,
aungriah 0:3333b6066adf 57 SWITCH_TYPE = 0x98,
aungriah 0:3333b6066adf 58 BASE_ORDER_ACK = 0x99
aungriah 0:3333b6066adf 59 };
aungriah 0:3333b6066adf 60
aungriah 0:3333b6066adf 61 protected:
aungriah 0:3333b6066adf 62 DecaWave& dw;
aungriah 0:3333b6066adf 63 uint8_t address;
aungriah 0:3333b6066adf 64 bool Anchor;
aungriah 0:3333b6066adf 65 };
aungriah 0:3333b6066adf 66
aungriah 0:3333b6066adf 67 class BaseStationNode : public Node {
aungriah 0:3333b6066adf 68 public:
aungriah 0:3333b6066adf 69 BaseStationNode(DecaWave& DW);
aungriah 0:3333b6066adf 70
aungriah 0:3333b6066adf 71 virtual uint8* getRecFrameRef();
aungriah 0:3333b6066adf 72 virtual uint16 getRecFrameLength();
aungriah 0:3333b6066adf 73
aungriah 0:3333b6066adf 74 virtual void callbackRX(uint64_t RxTime);
aungriah 0:3333b6066adf 75 virtual void callbackTX(uint64_t TxTime);
aungriah 0:3333b6066adf 76
aungriah 0:3333b6066adf 77 void sendOrder(uint8_t beacon_destination, uint8_t anchor_destination, uint8_t action, uint16_t repetitions, uint8_t type);
aungriah 0:3333b6066adf 78
aungriah 0:3333b6066adf 79 private:
aungriah 0:3333b6066adf 80 Timer LocalTimer;
aungriah 0:3333b6066adf 81 bool ack;
aungriah 0:3333b6066adf 82 RangingFrame rangingFrame; // buffer in class for sending a frame (not made locally because then we can recall in the interrupt what was sent)
aungriah 0:3333b6066adf 83 public:
aungriah 0:3333b6066adf 84 StreamFrame receivedStreamFrame;
aungriah 0:3333b6066adf 85 };
aungriah 0:3333b6066adf 86
aungriah 0:3333b6066adf 87 class AnchorNode : public Node {
aungriah 0:3333b6066adf 88 public:
aungriah 0:3333b6066adf 89 AnchorNode(DecaWave& DW);
aungriah 0:3333b6066adf 90
aungriah 0:3333b6066adf 91 virtual uint8* getRecFrameRef();
aungriah 0:3333b6066adf 92 virtual uint16 getRecFrameLength();
aungriah 0:3333b6066adf 93
aungriah 0:3333b6066adf 94 virtual void callbackRX(uint64_t RxTime);
aungriah 0:3333b6066adf 95 virtual void callbackTX(uint64_t TxTime);
aungriah 0:3333b6066adf 96
aungriah 0:3333b6066adf 97 private:
aungriah 0:3333b6066adf 98 uint64_t receiverTimestamps[ADRESSES_COUNT][3];
aungriah 0:3333b6066adf 99
aungriah 0:3333b6066adf 100 void sendAnswer(uint8_t destination, uint8_t type);
aungriah 0:3333b6066adf 101 void sendTransferFrame(uint8_t destination, int timestamp);
aungriah 0:3333b6066adf 102 void sendBaseAck();
aungriah 0:3333b6066adf 103
aungriah 0:3333b6066adf 104 void correctReceiverTimestamps(uint8_t source);
aungriah 0:3333b6066adf 105
aungriah 0:3333b6066adf 106 RangingFrame rangingFrame; // buffer in class for sending a frame (not made locally because then we can recall in the interrupt what was sent)
aungriah 0:3333b6066adf 107
aungriah 0:3333b6066adf 108 public:
aungriah 0:3333b6066adf 109 ExtendedRangingFrame receivedFrame;
aungriah 0:3333b6066adf 110 };
aungriah 0:3333b6066adf 111
aungriah 0:3333b6066adf 112
aungriah 0:3333b6066adf 113
aungriah 0:3333b6066adf 114 class BeaconNode : public Node {
aungriah 0:3333b6066adf 115 public:
aungriah 0:3333b6066adf 116 BeaconNode(DecaWave& DW);
aungriah 0:3333b6066adf 117
aungriah 0:3333b6066adf 118 virtual void requestRanging(uint8_t destination);
aungriah 0:3333b6066adf 119 virtual void requestRangingAll();
aungriah 0:3333b6066adf 120
aungriah 0:3333b6066adf 121 float getDistance(uint8_t index);
aungriah 0:3333b6066adf 122 float getSignalStrength(uint8_t index);
aungriah 0:3333b6066adf 123 int getMode();
aungriah 0:3333b6066adf 124
aungriah 0:3333b6066adf 125 virtual uint8* getRecFrameRef();
aungriah 0:3333b6066adf 126 virtual uint16 getRecFrameLength();
aungriah 0:3333b6066adf 127
aungriah 0:3333b6066adf 128 virtual void callbackRX(uint64_t RxTime);
aungriah 0:3333b6066adf 129 virtual void callbackTX(uint64_t TxTime);
aungriah 0:3333b6066adf 130
aungriah 0:3333b6066adf 131 uint16_t getRepetitions();
aungriah 0:3333b6066adf 132 void decreaseRepetitions();
aungriah 0:3333b6066adf 133 uint8_t getDestination();
aungriah 0:3333b6066adf 134 void clearRec();
aungriah 0:3333b6066adf 135
aungriah 0:3333b6066adf 136
aungriah 0:3333b6066adf 137 private:
aungriah 0:3333b6066adf 138 Timer LocalTimer;
aungriah 0:3333b6066adf 139 float distances[ADRESSES_COUNT]; // Array containing the finally calculated Distances to the anchors
aungriah 0:3333b6066adf 140 float signalStrength[ADRESSES_COUNT]; // Array containing the finally calculated Distances to the anchors
aungriah 0:3333b6066adf 141 uint64_t senderTimestamps[ADRESSES_COUNT][3];
aungriah 0:3333b6066adf 142 volatile bool acknowledgement[3]; // flag to indicate if ranging has started (0) and succeeded (1)
aungriah 0:3333b6066adf 143 int32_t tofs[ADRESSES_COUNT]; // Array containing time of flights for each node (index is address of node)
aungriah 0:3333b6066adf 144 int8_t noRec[ADRESSES_COUNT];
aungriah 0:3333b6066adf 145
aungriah 0:3333b6066adf 146 void sendPingFrame(uint8_t destination);
aungriah 0:3333b6066adf 147 void sendAnswer(uint8_t destination, uint8_t type);
aungriah 0:3333b6066adf 148 void sendStreamFrame(uint8_t anchor_addr);
aungriah 0:3333b6066adf 149 void sendBaseAck();
aungriah 0:3333b6066adf 150
aungriah 0:3333b6066adf 151 inline float calibratedDistance(uint8_t destination);
aungriah 0:3333b6066adf 152 void correctSenderTimestamps(uint8_t source);
aungriah 0:3333b6066adf 153
aungriah 0:3333b6066adf 154 RangingFrame rangingFrame; // buffer in class for sending a frame (not made locally because then we can recall in the interrupt what was sent)
aungriah 0:3333b6066adf 155
aungriah 0:3333b6066adf 156 uint8_t mode;
aungriah 0:3333b6066adf 157 uint8_t destination;
aungriah 0:3333b6066adf 158 uint16_t repetitions;
aungriah 0:3333b6066adf 159
aungriah 0:3333b6066adf 160 public:
aungriah 0:3333b6066adf 161 ExtendedRangingFrame receivedFrame;
aungriah 0:3333b6066adf 162
aungriah 0:3333b6066adf 163
aungriah 0:3333b6066adf 164 };
aungriah 0:3333b6066adf 165
aungriah 0:3333b6066adf 166 #endif
aungriah 0:3333b6066adf 167