amiro-lld / include / DW1000 / v0 / deca_instance.h @ b6364b51
History | View | Annotate | Download (33.587 KB)
1 | fce9feec | Robin Ewers | /*! ----------------------------------------------------------------------------
|
---|---|---|---|
2 | * @file instance.h
|
||
3 | * @brief DecaWave header for application level instance
|
||
4 | *
|
||
5 | * @attention
|
||
6 | *
|
||
7 | * Copyright 2015 (c) DecaWave Ltd, Dublin, Ireland.
|
||
8 | *
|
||
9 | * All rights reserved.
|
||
10 | *
|
||
11 | * @author DecaWave
|
||
12 | */
|
||
13 | 8c47f14b | Thomas Schöpping | #ifndef DECAINSTANCE_H
|
14 | #define DECAINSTANCE_H
|
||
15 | fce9feec | Robin Ewers | |
16 | #include <amiro-lld.h> |
||
17 | 8c47f14b | Thomas Schöpping | |
18 | fce9feec | Robin Ewers | #if defined(AMIROLLD_CFG_USE_DW1000) || defined(__DOXYGEN__)
|
19 | 8c47f14b | Thomas Schöpping | |
20 | fce9feec | Robin Ewers | #include <alld_dw1000.h> |
21 | |||
22 | 8c47f14b | Thomas Schöpping | #ifdef __cplusplus
|
23 | extern "C" { |
||
24 | #endif
|
||
25 | |||
26 | fce9feec | Robin Ewers | /******************************************************************************************************************
|
27 | ********************* NOTES on TREK compile/build time features/options ***********************************************************
|
||
28 | *******************************************************************************************************************/
|
||
29 | #define DEEP_SLEEP (1) //To enable deep-sleep set this to 1 |
||
30 | //DEEP_SLEEP mode can be used, for example, by a Tag instance to put the DW1000 into low-power deep-sleep mode while it is
|
||
31 | //waiting for start of next ranging exchange
|
||
32 | |||
33 | #define CORRECT_RANGE_BIAS (1) // Compensate for small bias due to uneven accumulator growth at close up high power |
||
34 | |||
35 | #define ANCTOANCTWR (1) //if set to 1 then anchor to anchor two-way ranging will be done in the last 2 slots, this |
||
36 | //is used for TREK demo, to aid in anchor installation,
|
||
37 | |||
38 | #define TAG_HASTO_RANGETO_A0 (0) //if set to 1 then tag will only send the Final if the Response from A0 has been received |
||
39 | |||
40 | #define READ_EVENT_COUNTERS (0) //read event counters - can be used for debug to periodically output event counters |
||
41 | |||
42 | #define DISCOVERY (0) //set to 1 to enable tag discovery - tags starts by sending blinks (with own ID) and then |
||
43 | //anchor assigns a slot to it and gives it short address
|
||
44 | |||
45 | /******************************************************************************************************************
|
||
46 | *******************************************************************************************************************
|
||
47 | *******************************************************************************************************************/
|
||
48 | |||
49 | #define NUM_INST 1 // one instance (tag or anchor - controlling one DW1000) |
||
50 | #define SPEED_OF_LIGHT (299702547.0) // in m/s in air |
||
51 | #define MASK_40BIT (0x00FFFFFFFFFF) // DW1000 counter is 40 bits |
||
52 | #define MASK_TXDTS (0x00FFFFFFFE00) // The TX timestamp will snap to 8 ns resolution - mask lower 9 bits. |
||
53 | |||
54 | //! callback events
|
||
55 | #define DWT_SIG_RX_NOERR 0 |
||
56 | #define DWT_SIG_TX_DONE 1 // Frame has been sent |
||
57 | #define DWT_SIG_RX_OKAY 2 // Frame Received with Good CRC |
||
58 | #define DWT_SIG_RX_ERROR 3 // Frame Received but CRC is wrong |
||
59 | #define DWT_SIG_RX_TIMEOUT 4 // Timeout on receive has elapsed |
||
60 | #define DWT_SIG_TX_AA_DONE 6 // ACK frame has been sent (as a result of auto-ACK) |
||
61 | #define DWT_SIG_RX_BLINK 7 // Received ISO EUI 64 blink message |
||
62 | #define DWT_SIG_RX_PHR_ERROR 8 // Error found in PHY Header |
||
63 | #define DWT_SIG_RX_SYNCLOSS 9 // Un-recoverable error in Reed Solomon Decoder |
||
64 | #define DWT_SIG_RX_SFDTIMEOUT 10 // Saw preamble but got no SFD within configured time |
||
65 | #define DWT_SIG_RX_PTOTIMEOUT 11 // Got preamble detection timeout (no preamble detected) |
||
66 | |||
67 | #define DWT_SIG_TX_PENDING 12 // TX is pending |
||
68 | #define DWT_SIG_TX_ERROR 13 // TX failed |
||
69 | #define DWT_SIG_RX_PENDING 14 // RX has been re-enabled |
||
70 | #define DWT_SIG_DW_IDLE 15 // DW radio is in IDLE (no TX or RX pending) |
||
71 | |||
72 | #define SIG_RX_UNKNOWN 99 // Received an unknown frame |
||
73 | |||
74 | //DecaRTLS frame function codes
|
||
75 | #define RTLS_DEMO_MSG_RNG_INIT (0x71) // Ranging initiation message |
||
76 | #define RTLS_DEMO_MSG_TAG_POLL (0x81) // Tag poll message |
||
77 | #define RTLS_DEMO_MSG_ANCH_RESP (0x70) // Anchor response to poll |
||
78 | #define RTLS_DEMO_MSG_ANCH_POLL (0x7A) // Anchor to anchor poll message |
||
79 | #define RTLS_DEMO_MSG_ANCH_RESP2 (0x7B) // Anchor response to poll from anchor |
||
80 | #define RTLS_DEMO_MSG_ANCH_FINAL (0x7C) // Anchor final massage back to Anchor |
||
81 | #define RTLS_DEMO_MSG_TAG_FINAL (0x82) // Tag final massage back to Anchor |
||
82 | |||
83 | |||
84 | //lengths including the Decaranging Message Function Code byte
|
||
85 | //absolute length = 17 +
|
||
86 | #define RANGINGINIT_MSG_LEN 5 // FunctionCode(1), Sleep Correction Time (2), Tag Address (2) |
||
87 | |||
88 | //absolute length = 11 +
|
||
89 | #define TAG_POLL_MSG_LEN 2 // FunctionCode(1), Range Num (1) |
||
90 | #define ANCH_RESPONSE_MSG_LEN 8 // FunctionCode(1), Sleep Correction Time (2), Measured_TOF_Time(4), Range Num (1) (previous) |
||
91 | #define TAG_FINAL_MSG_LEN 33 // FunctionCode(1), Range Num (1), Poll_TxTime(5), |
||
92 | // Resp0_RxTime(5), Resp1_RxTime(5), Resp2_RxTime(5), Resp3_RxTime(5), Final_TxTime(5), Valid Response Mask (1)
|
||
93 | #define ANCH_POLL_MSG_LEN_S 2 // FunctionCode(1), Range Num (1), |
||
94 | #define ANCH_POLL_MSG_LEN 4 // FunctionCode(1), Range Num (1), Next Anchor (2) |
||
95 | #define ANCH_FINAL_MSG_LEN 33 // FunctionCode(1), Range Num (1), Poll_TxTime(5), |
||
96 | // Resp0_RxTime(5), Resp1_RxTime(5), Resp2_RxTime(5), Resp3_RxTime(5), Final_TxTime(5), Valid Response Mask (1)
|
||
97 | #define MAX_MAC_MSG_DATA_LEN (TAG_FINAL_MSG_LEN) //max message len of the above |
||
98 | |||
99 | #define STANDARD_FRAME_SIZE 127 |
||
100 | |||
101 | #define ADDR_BYTE_SIZE_L (8) |
||
102 | #define ADDR_BYTE_SIZE_S (2) |
||
103 | |||
104 | #define FRAME_CONTROL_BYTES 2 |
||
105 | #define FRAME_SEQ_NUM_BYTES 1 |
||
106 | #define FRAME_PANID 2 |
||
107 | #define FRAME_CRC 2 |
||
108 | #define FRAME_SOURCE_ADDRESS_S (ADDR_BYTE_SIZE_S)
|
||
109 | #define FRAME_DEST_ADDRESS_S (ADDR_BYTE_SIZE_S)
|
||
110 | #define FRAME_SOURCE_ADDRESS_L (ADDR_BYTE_SIZE_L)
|
||
111 | #define FRAME_DEST_ADDRESS_L (ADDR_BYTE_SIZE_L)
|
||
112 | #define FRAME_CTRLP (FRAME_CONTROL_BYTES + FRAME_SEQ_NUM_BYTES + FRAME_PANID) //5 |
||
113 | #define FRAME_CRTL_AND_ADDRESS_L (FRAME_DEST_ADDRESS_L + FRAME_SOURCE_ADDRESS_L + FRAME_CTRLP) //21 bytes for 64-bit addresses) |
||
114 | #define FRAME_CRTL_AND_ADDRESS_S (FRAME_DEST_ADDRESS_S + FRAME_SOURCE_ADDRESS_S + FRAME_CTRLP) //9 bytes for 16-bit addresses) |
||
115 | #define FRAME_CRTL_AND_ADDRESS_LS (FRAME_DEST_ADDRESS_L + FRAME_SOURCE_ADDRESS_S + FRAME_CTRLP) //15 bytes for one 16-bit address and one 64-bit address) |
||
116 | #define MAX_USER_PAYLOAD_STRING_LL (STANDARD_FRAME_SIZE-FRAME_CRTL_AND_ADDRESS_L-TAG_FINAL_MSG_LEN-FRAME_CRC) //127 - 21 - 16 - 2 = 88 |
||
117 | #define MAX_USER_PAYLOAD_STRING_SS (STANDARD_FRAME_SIZE-FRAME_CRTL_AND_ADDRESS_S-TAG_FINAL_MSG_LEN-FRAME_CRC) //127 - 9 - 16 - 2 = 100 |
||
118 | #define MAX_USER_PAYLOAD_STRING_LS (STANDARD_FRAME_SIZE-FRAME_CRTL_AND_ADDRESS_LS-TAG_FINAL_MSG_LEN-FRAME_CRC) //127 - 15 - 16 - 2 = 94 |
||
119 | |||
120 | //NOTE: the user payload assumes that there are only 88 "free" bytes to be used for the user message (it does not scale according to the addressing modes)
|
||
121 | #define MAX_USER_PAYLOAD_STRING MAX_USER_PAYLOAD_STRING_LL
|
||
122 | |||
123 | #define BLINK_FRAME_CONTROL_BYTES (1) |
||
124 | #define BLINK_FRAME_SEQ_NUM_BYTES (1) |
||
125 | #define BLINK_FRAME_CRC (FRAME_CRC)
|
||
126 | #define BLINK_FRAME_SOURCE_ADDRESS (ADDR_BYTE_SIZE_L)
|
||
127 | #define BLINK_FRAME_CTRLP (BLINK_FRAME_CONTROL_BYTES + BLINK_FRAME_SEQ_NUM_BYTES) //2 |
||
128 | #define BLINK_FRAME_CRTL_AND_ADDRESS (BLINK_FRAME_SOURCE_ADDRESS + BLINK_FRAME_CTRLP) //10 bytes |
||
129 | #define BLINK_FRAME_LEN_BYTES (BLINK_FRAME_CRTL_AND_ADDRESS + BLINK_FRAME_CRC)
|
||
130 | |||
131 | |||
132 | #if (DISCOVERY == 0) |
||
133 | #define MAX_TAG_LIST_SIZE (8) |
||
134 | #else
|
||
135 | #define MAX_TAG_LIST_SIZE (100) |
||
136 | #endif
|
||
137 | |||
138 | |||
139 | #define MAX_ANCHOR_LIST_SIZE (4) //this is limited to 4 in this application |
||
140 | #define NUM_EXPECTED_RESPONSES (3) //e.g. MAX_ANCHOR_LIST_SIZE - 1 |
||
141 | |||
142 | #define NUM_EXPECTED_RESPONSES_ANC0 (2) //anchor A0 expects response from A1 and A2 |
||
143 | #define NUM_EXPECTED_RESPONSES_ANC1 (1) //anchor A1 expects response from A2 |
||
144 | |||
145 | #define GATEWAY_ANCHOR_ADDR (0x8000) |
||
146 | #define A1_ANCHOR_ADDR (0x8001) |
||
147 | #define A2_ANCHOR_ADDR (0x8002) |
||
148 | #define A3_ANCHOR_ADDR (0x8003) |
||
149 | |||
150 | #define WAIT4TAGFINAL 2 |
||
151 | #define WAIT4ANCFINAL 1 |
||
152 | |||
153 | // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
154 | // NOTE: the maximum RX timeout is ~ 65ms
|
||
155 | // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
156 | |||
157 | #define INST_DONE_WAIT_FOR_NEXT_EVENT 1 //this signifies that the current event has been processed and instance is ready for next one |
||
158 | #define INST_DONE_WAIT_FOR_NEXT_EVENT_TO 2 //this signifies that the current event has been processed and that instance is waiting for next one with a timeout |
||
159 | //which will trigger if no event coming in specified time
|
||
160 | #define INST_NOT_DONE_YET 0 //this signifies that the instance is still processing the current event |
||
161 | |||
162 | //application data message byte offsets
|
||
163 | #define FCODE 0 // Function code is 1st byte of messageData |
||
164 | #define PTXT 2 // Poll TX time |
||
165 | #define RRXT0 7 // A0 Response RX time |
||
166 | #define RRXT1 12 // A1 Response RX time |
||
167 | #define RRXT2 17 // A2 Response RX time |
||
168 | #define RRXT3 22 // A3 Response RX time |
||
169 | #define FTXT 27 // Final TX time |
||
170 | #define VRESP 32 // Mask of valid response times (e.g. if bit 1 = A0's response time is valid) |
||
171 | #define RES_TAG_SLP0 1 // Response tag sleep correction LSB |
||
172 | #define RES_TAG_SLP1 2 // Response tag sleep correction MSB |
||
173 | #define TOFR 3 // ToF (n-1) 4 bytes |
||
174 | #define TOFRN 7 // range number 1 byte |
||
175 | #define POLL_RNUM 1 // Poll message range number |
||
176 | #define POLL_NANC 2 // Address of next anchor to send a poll message (e.g. A1) |
||
177 | #define RES_TAG_ADD0 3 // Tag's short address (slot num) LSB |
||
178 | #define RES_TAG_ADD1 4 // Tag's short address (slot num) MSB |
||
179 | |||
180 | |||
181 | #define BLINK_PERIOD (2000) //ms (Blink at 2Hz initially) |
||
182 | |||
183 | #define DW_RX_ON_DELAY (16) //us - the DW RX has 16 us RX on delay before it will receive any data |
||
184 | |||
185 | //this it the delay used for configuring the receiver on delay (wait for response delay)
|
||
186 | //NOTE: this RX_RESPONSE_TURNAROUND is dependent on the microprocessor and code optimisations
|
||
187 | #define RX_RESPONSE_TURNAROUND (300) //this takes into account any turnaround/processing time (reporting received poll and sending the response) |
||
188 | |||
189 | #define PTO_PACS (3) //tag will use PTO to reduce power consumption (if no response coming stop RX) |
||
190 | |||
191 | //Tag will range to 3 or 4 anchors
|
||
192 | //Each ranging exchange will consist of minimum of 3 messages (Poll, Response, Final)
|
||
193 | //and a maximum of 6 messages (Poll, Response x 4, Final)
|
||
194 | //Thus the ranging exchange will take either 28 ms for 110 kbps and 5 ms for 6.81 Mbps.
|
||
195 | //NOTE: the above times are for 110k rate with 64 symb non-standard SFD and 1024 preamble length
|
||
196 | |||
197 | |||
198 | |||
199 | //Anchor to Anchor Ranging
|
||
200 | //1. A0 sends a Poll
|
||
201 | //2. A1 responds (to A0's Poll) after RX_RESPONSE_TURNAROUND (300 us) + response frame length = fixedReplyDelayAnc1 ~= 480 us
|
||
202 | //3. A0 turns its receiver on (after 300 us) expecting A1's response (this is done automatically in 1. by using WAIT4RESP)
|
||
203 | //4. A2 responds (to A0's Poll) after 2*fixedReplyDelayAnc1 ~= 960 us.
|
||
204 | //5. A0 turns its receiver on (last Rx on time + fixedReplyDelayAnc1) expecting A2's response (this is done after reception of A1's response using delayed RX)
|
||
205 | //6. A0 sends a Final this is timed from the Poll TX time = pollTx2FinalTxDelayAnc ~= 1550 us (1250+300)
|
||
206 | //7. A1 and A2 turn on their receivers to expect this Final frame (this is done automatically in 2. AND 4. by using WAIT4RESP)
|
||
207 | |||
208 | |||
209 | //Tag to Anchor Ranging
|
||
210 | //1. Tag sends a Poll
|
||
211 | //2. A0 responds (delayed response) after fixedReplyDelayAnc1, A0 will re-enable its receiver automatically (by using WAIT4RESP)
|
||
212 | //3. A1, A2, A3 re-enble the receiver to receive A0's response
|
||
213 | //4. A1 responds and will re-enable its receiver automatically (by using WAIT4RESP)
|
||
214 | //5. A2, A3 re-enble the receiver to receive A1's response
|
||
215 | //6. A2 responds and will re-enable its receiver automatically (by using WAIT4RESP)
|
||
216 | //7. A0, A3 re-enable the receiver to receive A2's response
|
||
217 | //9. A3 responds and will re-enable its receiver automatically (by using WAIT4RESP)
|
||
218 | //10. A0, A1, A2, A3 - all receive the Final from the tag
|
||
219 | |||
220 | |||
221 | //Tag Discovery mode
|
||
222 | //1. Tag sends a Blink
|
||
223 | //2. A0 responds with Ranging Init giving it short address and slot time correction
|
||
224 | //3. Tag sleeps until the next period and then starts ranging exchange
|
||
225 | |||
226 | |||
227 | typedef enum instanceModes{TAG, ANCHOR, ANCHOR_RNG, NUM_MODES} INST_MODE; |
||
228 | //Tag = Exchanges DecaRanging messages (Poll-Response-Final) with Anchor and enabling Anchor to calculate the range between the two instances
|
||
229 | //Anchor = see above
|
||
230 | //Anchor_Rng = the anchor (assumes a tag function) and ranges to another anchor - used in Anchor to Anchor TWR for auto positioning function
|
||
231 | |||
232 | |||
233 | // instance sending a poll (starting TWR) is INITIATOR
|
||
234 | // instance which receives a poll (and will be involved in the TWR) is RESPONDER
|
||
235 | // instance which does not receive a poll (default state) will be a LISTENER - will send no responses
|
||
236 | typedef enum instanceTWRModes{INITIATOR, RESPONDER_A, RESPONDER_B, RESPONDER_T, LISTENER, GREETER, ATWR_MODES} ATWR_MODE; |
||
237 | |||
238 | |||
239 | #define TOF_REPORT_NUL 0 |
||
240 | #define TOF_REPORT_T2A 1 |
||
241 | #define TOF_REPORT_A2A 2 |
||
242 | |||
243 | #define INVALID_TOF (0xABCDFFFF) |
||
244 | |||
245 | typedef enum inst_states |
||
246 | { |
||
247 | TA_INIT, //0
|
||
248 | |||
249 | TA_TXE_WAIT, //1 - state in which the instance will enter sleep (if ranging finished) or proceed to transmit a message
|
||
250 | TA_TXBLINK_WAIT_SEND, //2 - configuration and sending of Blink message
|
||
251 | TA_TXPOLL_WAIT_SEND, //2 - configuration and sending of Poll message
|
||
252 | TA_TXFINAL_WAIT_SEND, //3 - configuration and sending of Final message
|
||
253 | TA_TXRESPONSE_WAIT_SEND, //4 - a place holder - response is sent from call back
|
||
254 | TA_TX_WAIT_CONF, //5 - confirmation of TX done message
|
||
255 | |||
256 | TA_RXE_WAIT, //6
|
||
257 | TA_RX_WAIT_DATA, //7
|
||
258 | |||
259 | TA_SLEEP_DONE, //8
|
||
260 | TA_TXRESPONSE_SENT_POLLRX, //9
|
||
261 | TA_TXRESPONSE_SENT_RESPRX, //10
|
||
262 | TA_TXRESPONSE_SENT_TORX, //11
|
||
263 | TA_TXRESPONSE_SENT_APOLLRX, //12
|
||
264 | TA_TXRESPONSE_SENT_ARESPRX //13
|
||
265 | |||
266 | } INST_STATES; |
||
267 | |||
268 | |||
269 | // This file defines data and functions for access to Parameters in the Device
|
||
270 | //message structure for Poll, Response and Final message
|
||
271 | |||
272 | typedef struct |
||
273 | { |
||
274 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
275 | uint8_t seqNum; // sequence_number 02
|
||
276 | uint8_t panID[2]; // PAN ID 03-04 |
||
277 | uint8_t destAddr[ADDR_BYTE_SIZE_L]; // 05-12 using 64 bit addresses
|
||
278 | uint8_t sourceAddr[ADDR_BYTE_SIZE_L]; // 13-20 using 64 bit addresses
|
||
279 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_LL] ; // 22-124 (application data and any user payload)
|
||
280 | uint8_t fcs[2] ; // 125-126 we allow space for the CRC as it is logically part of the message. However ScenSor TX calculates and adds these bytes. |
||
281 | } srd_msg_dlsl ; |
||
282 | |||
283 | typedef struct |
||
284 | { |
||
285 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
286 | uint8_t seqNum; // sequence_number 02
|
||
287 | uint8_t panID[2]; // PAN ID 03-04 |
||
288 | uint8_t destAddr[ADDR_BYTE_SIZE_S]; // 05-06
|
||
289 | uint8_t sourceAddr[ADDR_BYTE_SIZE_S]; // 07-08
|
||
290 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_SS] ; // 09-124 (application data and any user payload)
|
||
291 | uint8_t fcs[2] ; // 125-126 we allow space for the CRC as it is logically part of the message. However ScenSor TX calculates and adds these bytes. |
||
292 | } srd_msg_dsss ; |
||
293 | |||
294 | typedef struct |
||
295 | { |
||
296 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
297 | uint8_t seqNum; // sequence_number 02
|
||
298 | uint8_t panID[2]; // PAN ID 03-04 |
||
299 | uint8_t destAddr[ADDR_BYTE_SIZE_L]; // 05-12 using 64 bit addresses
|
||
300 | uint8_t sourceAddr[ADDR_BYTE_SIZE_S]; // 13-14
|
||
301 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_LS] ; // 15-124 (application data and any user payload)
|
||
302 | uint8_t fcs[2] ; // 125-126 we allow space for the CRC as it is logically part of the message. However ScenSor TX calculates and adds these bytes. |
||
303 | } srd_msg_dlss ; |
||
304 | |||
305 | typedef struct |
||
306 | { |
||
307 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
308 | uint8_t seqNum; // sequence_number 02
|
||
309 | uint8_t panID[2]; // PAN ID 03-04 |
||
310 | uint8_t destAddr[ADDR_BYTE_SIZE_S]; // 05-06
|
||
311 | uint8_t sourceAddr[ADDR_BYTE_SIZE_L]; // 07-14 using 64 bit addresses
|
||
312 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_LS] ; // 15-124 (application data and any user payload)
|
||
313 | uint8_t fcs[2] ; // 125-126 we allow space for the CRC as it is logically part of the message. However ScenSor TX calculates and adds these bytes. |
||
314 | } srd_msg_dssl ; |
||
315 | |||
316 | //12 octets for Minimum IEEE ID blink
|
||
317 | typedef struct |
||
318 | { |
||
319 | uint8_t frameCtrl; // frame control bytes 00
|
||
320 | uint8_t seqNum; // sequence_number 01
|
||
321 | uint8_t tagID[BLINK_FRAME_SOURCE_ADDRESS]; // 02-09 64 bit address
|
||
322 | uint8_t fcs[2] ; // 10-11 we allow space for the CRC as it is logically part of the message. However ScenSor TX calculates and adds these bytes. |
||
323 | } iso_IEEE_EUI64_blink_msg ; |
||
324 | |||
325 | |||
326 | typedef struct |
||
327 | { |
||
328 | uint8_t channelNumber ; // valid range is 1 to 11
|
||
329 | uint8_t preambleCode ; // 00 = use NS code, 1 to 24 selects code
|
||
330 | uint8_t pulseRepFreq ; // NOMINAL_4M, NOMINAL_16M, or NOMINAL_64M
|
||
331 | uint8_t dataRate ; // DATA_RATE_1 (110K), DATA_RATE_2 (850K), DATA_RATE_3 (6M81)
|
||
332 | uint8_t preambleLen ; // values expected are 64, (128), (256), (512), 1024, (2048), and 4096
|
||
333 | uint8_t pacSize ; |
||
334 | uint8_t nsSFD ; |
||
335 | uint16_t sfdTO; //!< SFD timeout value (in symbols) e.g. preamble length (128) + SFD(8) - PAC + some margin ~ 135us... DWT_SFDTOC_DEF; //default value
|
||
336 | } instanceConfig_t ; |
||
337 | |||
338 | typedef struct |
||
339 | { |
||
340 | uint16_t slotDuration_ms ; //slot duration (time for 1 tag to range to 4 anchors)
|
||
341 | uint16_t numSlots ; // number of slots in one superframe (number of tags supported)
|
||
342 | uint16_t sfPeriod_ms ; // superframe period in ms
|
||
343 | uint16_t tagPeriod_ms ; // the time during which tag ranges to anchors and then sleeps, should be same as FRAME PERIOD so that tags don't interfere
|
||
344 | uint16_t pollTxToFinalTxDly_us ; //response delay time (Poll to Final delay)
|
||
345 | } sfConfig_t ; |
||
346 | |||
347 | /******************************************************************************************************************
|
||
348 | *******************************************************************************************************************
|
||
349 | *******************************************************************************************************************/
|
||
350 | |||
351 | //size of the event queue, in this application there should be at most 2 unprocessed events,
|
||
352 | //i.e. if there is a transmission with wait for response then the TX callback followed by RX callback could be executed
|
||
353 | //in turn and the event queued up before the instance processed the TX event.
|
||
354 | #define MAX_EVENT_NUMBER (4) |
||
355 | |||
356 | typedef struct |
||
357 | { |
||
358 | uint8_t type; // event type - if 0 there is no event in the queue
|
||
359 | //uint8_t typeSave; // holds the event type - does not clear (used to show what event has been processed)
|
||
360 | uint8_t typePend; // set if there is a pending event (i.e. DW is not in IDLE (TX/RX pending)
|
||
361 | uint16_t rxLength ; // length of RX data (does not apply to TX events)
|
||
362 | |||
363 | uint64_t timeStamp ; // last timestamp (Tx or Rx) - 40 bit DW1000 time
|
||
364 | |||
365 | uint32_t timeStamp32l ; // last tx/rx timestamp - low 32 bits of the 40 bit DW1000 time
|
||
366 | uint32_t timeStamp32h ; // last tx/rx timestamp - high 32 bits of the 40 bit DW1000 time
|
||
367 | |||
368 | uint32_t uTimeStamp ; //32 bit system counter (ms) - STM32 tick time (at time of IRQ)
|
||
369 | |||
370 | union {
|
||
371 | //holds received frame (after a good RX frame event)
|
||
372 | uint8_t frame[STANDARD_FRAME_SIZE]; |
||
373 | srd_msg_dlsl rxmsg_ll ; //64 bit addresses
|
||
374 | srd_msg_dssl rxmsg_sl ; |
||
375 | srd_msg_dlss rxmsg_ls ; |
||
376 | srd_msg_dsss rxmsg_ss ; //16 bit addresses
|
||
377 | iso_IEEE_EUI64_blink_msg rxblinkmsg; |
||
378 | }msgu; |
||
379 | |||
380 | //uint8_t gotit; //stores the instance function which processed the event (used for debug)
|
||
381 | }event_data_t ; |
||
382 | |||
383 | // TX power and PG delay configuration structure
|
||
384 | typedef struct { |
||
385 | uint8_t pgDelay; |
||
386 | |||
387 | //TX POWER
|
||
388 | //31:24 BOOST_0.125ms_PWR
|
||
389 | //23:16 BOOST_0.25ms_PWR-TX_SHR_PWR
|
||
390 | //15:8 BOOST_0.5ms_PWR-TX_PHR_PWR
|
||
391 | //7:0 DEFAULT_PWR-TX_DATA_PWR
|
||
392 | uint32_t txPwr[2]; // |
||
393 | }tx_struct; |
||
394 | |||
395 | typedef struct |
||
396 | { |
||
397 | INST_MODE mode; //instance mode (tag or anchor)
|
||
398 | ATWR_MODE twrMode; |
||
399 | INST_STATES testAppState ; //state machine - current state
|
||
400 | INST_STATES nextState ; //state machine - next state
|
||
401 | INST_STATES previousState ; //state machine - previous state
|
||
402 | |||
403 | //configuration structures
|
||
404 | dwt_config_t configData ; //DW1000 channel configuration
|
||
405 | dwt_txconfig_t configTX ; //DW1000 TX power configuration
|
||
406 | uint16_t txAntennaDelay ; //DW1000 TX antenna delay
|
||
407 | uint16_t rxAntennaDelay ; //DW1000 RX antenna delay
|
||
408 | uint32_t txPower ; //DW1000 TX power
|
||
409 | uint8_t txPowerChanged; //power has been changed - update the register on next TWR exchange
|
||
410 | uint8_t antennaDelayChanged; //antenna delay has been changed - update the register on next TWR exchange
|
||
411 | |||
412 | uint16_t instanceAddress16; //contains tag/anchor 16 bit address
|
||
413 | |||
414 | //timeouts and delays
|
||
415 | int32_t tagPeriod_ms; // in ms, tag ranging + sleeping period
|
||
416 | int32_t tagSleepTime_ms; //in milliseconds - defines the nominal Tag sleep time period
|
||
417 | int32_t tagSleepRnd_ms; //add an extra slot duration to sleep time to avoid collision before getting synced by anchor 0
|
||
418 | |||
419 | //this is the delay used for the delayed transmit
|
||
420 | uint64_t pollTx2FinalTxDelay ; //this is delay from Poll Tx time to Final Tx time in DW1000 units (40-bit)
|
||
421 | uint64_t pollTx2FinalTxDelayAnc ; //this is delay from Poll Tx time to Final Tx time in DW1000 units (40-bit) for Anchor to Anchor ranging
|
||
422 | uint32_t fixedReplyDelayAnc32h ; //this is a delay used for calculating delayed TX/delayed RX on time (units: 32bit of 40bit DW time)
|
||
423 | uint16_t anc1RespTx2FinalRxDelay_sy ; //This is delay for RX on when A1 expecting Final form A0 or A2 expecting Final from A1
|
||
424 | uint16_t anc2RespTx2FinalRxDelay_sy ; //This is delay for RX on when A2 waiting for A0's final (anc to anc ranging)
|
||
425 | uint32_t preambleDuration32h ; //preamble duration in device time (32 MSBs of the 40 bit time)
|
||
426 | uint32_t tagRespRxDelay_sy ; //TX to RX delay time when tag is awaiting response message an another anchor
|
||
427 | uint32_t ancRespRxDelay_sy ; //TX to RX delay time when anchor is awaiting response message an another anchor
|
||
428 | |||
429 | int fwtoTime_sy ; //this is FWTO for response message (used by initiating anchor in anchor to anchor ranging) |
||
430 | int fwto4RespFrame_sy ; //this is a frame wait timeout used when awaiting reception of Response frames (used by both tag/anchor) |
||
431 | int fwto4FinalFrame_sy ; //this is a frame wait timeout used when awaiting reception of Final frames |
||
432 | uint32_t delayedTRXTime32h; // time at which to do delayed TX or delayed RX (note TX time is time of SFD, RX time is RX on time)
|
||
433 | |||
434 | //message structure used for holding the data of the frame to transmit before it is written to the DW1000
|
||
435 | srd_msg_dsss msg_f ; // ranging message frame with 16-bit addresses
|
||
436 | iso_IEEE_EUI64_blink_msg blinkmsg ; // frame structure (used for tx blink message)
|
||
437 | srd_msg_dlss rng_initmsg ; // ranging init message (destination long, source short)
|
||
438 | |||
439 | //Tag function address/message configuration
|
||
440 | uint8_t shortAdd_idx ; // device's 16-bit address low byte (used as index into arrays [0 - 3])
|
||
441 | uint8_t eui64[8]; // device's EUI 64-bit address |
||
442 | uint16_t psduLength ; // used for storing the TX frame length
|
||
443 | uint8_t frameSN; // modulo 256 frame sequence number - it is incremented for each new frame transmission
|
||
444 | uint16_t panID ; // panid used in the frames
|
||
445 | |||
446 | //64 bit timestamps
|
||
447 | //union of TX timestamps
|
||
448 | union {
|
||
449 | uint64_t txTimeStamp ; // last tx timestamp
|
||
450 | uint64_t tagPollTxTime ; // tag's poll tx timestamp
|
||
451 | uint64_t anchorRespTxTime ; // anchor's reponse tx timestamp
|
||
452 | }txu; |
||
453 | uint32_t tagPollTxTime32h ; |
||
454 | uint64_t tagPollRxTime ; // receive time of poll message
|
||
455 | |||
456 | |||
457 | //application control parameters
|
||
458 | uint8_t wait4ack ; // if this is set to DWT_RESPONSE_EXPECTED, then the receiver will turn on automatically after TX completion
|
||
459 | uint8_t wait4final ; |
||
460 | |||
461 | uint8_t instToSleep; // if set the instance will go to sleep before sending the blink/poll message
|
||
462 | uint8_t instanceTimerEn; // enable/start a timer
|
||
463 | uint32_t instanceWakeTime_ms; // micro time at which the tag was waken up
|
||
464 | uint32_t nextWakeUpTime_ms; // micro time at which to wake up tag
|
||
465 | |||
466 | uint8_t rxResponseMaskAnc; // bit mask - bit 0 not used;
|
||
467 | // bit 1 = received response from anchor ID = 1;
|
||
468 | // bit 2 from anchor ID = 2,
|
||
469 | // bit 3 set if two responses (from Anchor 1 and Anchor 2) received and A0 got third response (from A2)
|
||
470 | |||
471 | uint8_t rxResponseMask; // bit mask - bit 0 = received response from anchor ID = 0, bit 1 from anchor ID = 1 etc...
|
||
472 | uint8_t rxResponseMaskReport; // this will be set before outputting range reports to signify which are valid
|
||
473 | uint8_t rangeNum; // incremented for each sequence of ranges (each slot)
|
||
474 | uint8_t rangeNumA[MAX_TAG_LIST_SIZE]; // array which holds last range number from each tag
|
||
475 | uint8_t rangeNumAnc; // incremented for each sequence of ranges (each slot) - anchor to anchor ranging
|
||
476 | uint8_t rangeNumAAnc[MAX_ANCHOR_LIST_SIZE]; //array which holds last range number for each anchor
|
||
477 | |||
478 | int8_t rxResps; // how many responses were received to a poll (in current ranging exchange)
|
||
479 | int8_t remainingRespToRx ; // how many responses remain to be received (in current ranging exchange)
|
||
480 | |||
481 | uint16_t sframePeriod_ms; // superframe period in ms
|
||
482 | uint16_t slotDuration_ms; // slot duration in ms
|
||
483 | uint16_t numSlots; |
||
484 | uint32_t a0SlotTime_ms; // relative time in superframe at which A0 starts ranging (this is start of 2nd last slot)
|
||
485 | uint32_t a1SlotTime_ms; // absolute time in superframe at which A1 starts ranging
|
||
486 | uint32_t a2aStartTime_ms; // absolute time in superframe at which A0 starts ranging
|
||
487 | int32_t tagSleepCorrection_ms; // tag's sleep correction to keep it in it's assigned slot
|
||
488 | |||
489 | //diagnostic counters/data, results and logging
|
||
490 | uint32_t tof[MAX_TAG_LIST_SIZE]; //this is an array which holds last ToF from particular tag (ID 0-(MAX_TAG_LIST_SIZE-1))
|
||
491 | |||
492 | //this is an array which holds last ToF to each anchor it should
|
||
493 | uint32_t tofArray[MAX_ANCHOR_LIST_SIZE]; //contain 4 ToF to 4 anchors all relating to same range number sequence
|
||
494 | |||
495 | uint32_t tofAnc[MAX_ANCHOR_LIST_SIZE]; //this is an array which holds last ToFs from particular anchors (0, 0-1, 0-2, 1-2)
|
||
496 | |||
497 | //this is an array which holds last ToFs of the Anchor to Anchor ranging
|
||
498 | uint32_t tofArrayAnc[MAX_ANCHOR_LIST_SIZE]; //it contains 3 ToFs relating to same range number sequence (0, 0-1, 0-2, 1-2)
|
||
499 | |||
500 | #if (DISCOVERY ==1) |
||
501 | uint8_t tagListLen ; |
||
502 | uint8_t tagList[MAX_TAG_LIST_SIZE][8];
|
||
503 | #endif
|
||
504 | |||
505 | //debug counters
|
||
506 | //int txMsgCount; //number of transmitted messages
|
||
507 | //int rxMsgCount; //number of received messages
|
||
508 | //int rxTimeouts ; //number of received timeout events
|
||
509 | //int lateTX; //number of "LATE" TX events
|
||
510 | //int lateRX; //number of "LATE" RX events
|
||
511 | |||
512 | |||
513 | //ranging counters
|
||
514 | int longTermRangeCount ; //total number of ranges |
||
515 | |||
516 | int newRange; //flag set when there is a new range to report TOF_REPORT_A2A or TOF_REPORT_T2A |
||
517 | int newRangeAncAddress; //last 4 bytes of anchor address - used for printing/range output display |
||
518 | int newRangeTagAddress; //last 4 bytes of tag address - used for printing/range output display |
||
519 | int newRangeTime;
|
||
520 | |||
521 | uint8_t gatewayAnchor ; //set to TRUE = 1 if anchor address == GATEWAY_ANCHOR_ADDR
|
||
522 | |||
523 | //event queue - used to store DW1000 events as they are processed by the dw_isr/callback functions
|
||
524 | event_data_t dwevent[MAX_EVENT_NUMBER]; //this holds any TX/RX events and associated message data
|
||
525 | uint8_t dweventIdxOut; |
||
526 | uint8_t dweventIdxIn; |
||
527 | uint8_t dweventPeek; |
||
528 | uint8_t monitor; |
||
529 | uint32_t timeofTx ; |
||
530 | |||
531 | uint8_t smartPowerEn; |
||
532 | |||
533 | #if (READ_EVENT_COUNTERS == 1) |
||
534 | dwt_deviceentcnts_t ecounters; |
||
535 | #endif
|
||
536 | |||
537 | } instance_data_t ; |
||
538 | |||
539 | //-------------------------------------------------------------------------------------------------------------
|
||
540 | //
|
||
541 | // Functions used in logging/displaying range and status data
|
||
542 | //
|
||
543 | //-------------------------------------------------------------------------------------------------------------
|
||
544 | |||
545 | // function to calculate and the range from given Time of Flight
|
||
546 | int instance_calculate_rangefromTOF(int idx, uint32_t tofx); |
||
547 | |||
548 | void instance_cleardisttable(int idx); |
||
549 | void instance_set_tagdist(int tidx, int aidx); |
||
550 | double instance_get_tagdist(int idx); |
||
551 | |||
552 | double instance_get_idist(int idx); |
||
553 | double instance_get_idistraw(int idx); |
||
554 | int instance_get_idist_mm(int idx); |
||
555 | int instance_get_idistraw_mm(int idx); |
||
556 | uint8_t instance_validranges(void);
|
||
557 | |||
558 | int instance_get_rnum(void); |
||
559 | int instance_get_rnuma(int idx); |
||
560 | int instance_get_rnumanc(int idx); |
||
561 | int instance_get_lcount(void); |
||
562 | |||
563 | int instance_newrangeancadd(void); |
||
564 | int instance_newrangetagadd(void); |
||
565 | int instance_newrangepolltim(void); |
||
566 | int instance_newrange(void); |
||
567 | int instance_newrangetim(void); |
||
568 | |||
569 | int instance_calc_ranges(uint32_t *array, uint16_t size, int reportRange, uint8_t* mask); |
||
570 | |||
571 | // clear the status/ranging data
|
||
572 | void instance_clearcounts(void) ; |
||
573 | |||
574 | void instance_cleardisttableall(void); |
||
575 | //-------------------------------------------------------------------------------------------------------------
|
||
576 | //
|
||
577 | // Functions used in driving/controlling the ranging application
|
||
578 | //
|
||
579 | //-------------------------------------------------------------------------------------------------------------
|
||
580 | |||
581 | // Call init, then call config, then call run.
|
||
582 | // initialise the instance (application) structures and DW1000 device
|
||
583 | int instance_init(int role, DW1000Driver* drv); |
||
584 | // configure the instance and DW1000 device
|
||
585 | void instance_config(instanceConfig_t *config, sfConfig_t *sfconfig) ;
|
||
586 | |||
587 | // configure the MAC address
|
||
588 | void instance_set_16bit_address(uint16_t address) ;
|
||
589 | void instance_config_frameheader_16bit(instance_data_t *inst);
|
||
590 | |||
591 | void tag_process_rx_timeout(instance_data_t *inst);
|
||
592 | |||
593 | // called (periodically or from and interrupt) to process any outstanding TX/RX events and to drive the ranging application
|
||
594 | int tag_run(void) ; |
||
595 | int anch_run(void) ; // returns indication of status report change |
||
596 | |||
597 | // configure TX/RX callback functions that are called from DW1000 ISR
|
||
598 | void rx_ok_cb_tag(const dwt_cb_data_t *cb_data); |
||
599 | void rx_to_cb_tag(const dwt_cb_data_t *cb_data); |
||
600 | void rx_err_cb_tag(const dwt_cb_data_t *cb_data); |
||
601 | //void tx_conf_cb_tag(const dwt_cb_data_t *cb_data);
|
||
602 | |||
603 | void rx_ok_cb_anch(const dwt_cb_data_t *cb_data); |
||
604 | void rx_to_cb_anch(const dwt_cb_data_t *cb_data); |
||
605 | void rx_err_cb_anch(const dwt_cb_data_t *cb_data); |
||
606 | void tx_conf_cb(const dwt_cb_data_t *cb_data); |
||
607 | |||
608 | void instance_set_replydelay(int delayms); |
||
609 | |||
610 | // set/get the instance roles e.g. Tag/Anchor
|
||
611 | // done though instance_init void instance_set_role(int mode) ; //
|
||
612 | int instance_get_role(void) ; |
||
613 | // get the DW1000 device ID (e.g. 0xDECA0130 for DW1000)
|
||
614 | uint32_t instance_readdeviceid(void) ; // Return Device ID reg, enables validation of physical device presence |
||
615 | |||
616 | void rnganch_change_back_to_anchor(instance_data_t *inst);
|
||
617 | int instance_send_delayed_frame(instance_data_t *inst, int delayedTx); |
||
618 | |||
619 | uint64_t instance_convert_usec_to_devtimeu (double microsecu);
|
||
620 | |||
621 | |||
622 | void instance_seteventtime(event_data_t *dw_event, uint8_t* timeStamp);
|
||
623 | |||
624 | int instance_peekevent(void); |
||
625 | |||
626 | void instance_saveevent(event_data_t newevent, uint8_t etype);
|
||
627 | |||
628 | event_data_t instance_getsavedevent(void);
|
||
629 | |||
630 | void instance_putevent(event_data_t newevent, uint8_t etype);
|
||
631 | |||
632 | event_data_t* instance_getevent(int x);
|
||
633 | |||
634 | void instance_clearevents(void); |
||
635 | |||
636 | void instance_notify_DW1000_inIDLE(int idle); |
||
637 | |||
638 | // configure the antenna delays
|
||
639 | void instance_config_antennadelays(uint16_t tx, uint16_t rx);
|
||
640 | void instance_set_antennadelays(void); |
||
641 | uint16_t instance_get_txantdly(void);
|
||
642 | uint16_t instance_get_rxantdly(void);
|
||
643 | |||
644 | // configure the TX power
|
||
645 | void instance_config_txpower(uint32_t txpower);
|
||
646 | void instance_set_txpower(void); |
||
647 | int instance_starttxtest(int framePeriod); |
||
648 | |||
649 | |||
650 | instance_data_t* instance_get_local_structure_ptr(unsigned int x); |
||
651 | |||
652 | #ifdef __cplusplus
|
||
653 | } |
||
654 | #endif
|
||
655 | 8c47f14b | Thomas Schöpping | |
656 | fce9feec | Robin Ewers | #endif /* defined(AMIROLLD_CFG_USE_DW1000) */ |
657 | 8c47f14b | Thomas Schöpping | |
658 | #endif /* DECAINSTANCE_H */ |