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.
nodes/nodes.h@0:3333b6066adf, 2017-12-06 (annotated)
- Committer:
- aungriah
- Date:
- Wed Dec 06 21:42:54 2017 +0000
- Revision:
- 0:3333b6066adf
asfaf
Who changed what in which revision?
User | Revision | Line number | New 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 |