amiro-lld / drivers / DW1000 / v1 / deca_instance.h @ 14c96f7f
History | View | Annotate | Download (28.291 KB)
| 1 | 69a601a5 | Cung Sang | /*! ----------------------------------------------------------------------------
|
|---|---|---|---|
| 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 | 9466e34d | Thomas Schöpping | #ifndef DECAINSTANCE_H
|
| 14 | #define DECAINSTANCE_H
|
||
| 15 | 69a601a5 | Cung Sang | |
| 16 | #ifdef __cplusplus
|
||
| 17 | extern "C" { |
||
| 18 | #endif
|
||
| 19 | |||
| 20 | #include <amiro-lld.h> |
||
| 21 | #include <alld_DW1000.h> |
||
| 22 | |||
| 23 | /******************************************************************************************************************
|
||
| 24 | ********************* NOTES on DW (MP) features/options ***********************************************************
|
||
| 25 | *******************************************************************************************************************/
|
||
| 26 | #define DEEP_SLEEP (0) //To enable deep-sleep set this to 1 |
||
| 27 | //DEEP_SLEEP mode can be used, for example, by a Tag instance to put the DW1000 into low-power deep-sleep mode:
|
||
| 28 | // when the Anchor is sending the range report back to the Tag, the Tag will enter sleep after a ranging exchange is finished
|
||
| 29 | // once it receives a report or times out, before the next poll message is sent (before next ranging exchange is started).
|
||
| 30 | |||
| 31 | #define CORRECT_RANGE_BIAS (1) // Compensate for small bias due to uneven accumulator growth at close up high power |
||
| 32 | |||
| 33 | |||
| 34 | #define ANCTOANCTWR (1) //if set to 1 then anchor to anchor TWR will be done in the last slot |
||
| 35 | |||
| 36 | #define DISCOVERY (0) //set to 1 to enable tag discovery - tags starts by sending blinks (with own ID) and then |
||
| 37 | //anchor assigns a slot to it and gives it short address
|
||
| 38 | /******************************************************************************************************************
|
||
| 39 | *******************************************************************************************************************
|
||
| 40 | *******************************************************************************************************************/
|
||
| 41 | |||
| 42 | #define NUM_INST 1 |
||
| 43 | #define SPEED_OF_LIGHT (299702547.0) // in m/s in air |
||
| 44 | #define MASK_40BIT (0x00FFFFFFFFFF) // DW1000 counter is 40 bits |
||
| 45 | #define MASK_TXDTS (0x00FFFFFFFE00) //The TX timestamp will snap to 8 ns resolution - mask lower 9 bits. |
||
| 46 | |||
| 47 | //! callback events
|
||
| 48 | #define DWT_SIG_RX_NOERR 0 |
||
| 49 | #define DWT_SIG_TX_DONE 1 // Frame has been sent |
||
| 50 | #define DWT_SIG_RX_OKAY 2 // Frame Received with Good CRC |
||
| 51 | #define DWT_SIG_RX_ERROR 3 // Frame Received but CRC is wrong |
||
| 52 | #define DWT_SIG_RX_TIMEOUT 4 // Timeout on receive has elapsed |
||
| 53 | #define DWT_SIG_TX_AA_DONE 6 // ACK frame has been sent (as a result of auto-ACK) |
||
| 54 | #define DWT_SIG_RX_BLINK 7 // Received ISO EUI 64 blink message |
||
| 55 | #define DWT_SIG_RX_PHR_ERROR 8 // Error found in PHY Header |
||
| 56 | #define DWT_SIG_RX_SYNCLOSS 9 // Un-recoverable error in Reed Solomon Decoder |
||
| 57 | #define DWT_SIG_RX_SFDTIMEOUT 10 // Saw preamble but got no SFD within configured time |
||
| 58 | #define DWT_SIG_RX_PTOTIMEOUT 11 // Got preamble detection timeout (no preamble detected) |
||
| 59 | |||
| 60 | #define DWT_SIG_TX_PENDING 12 // TX is pending |
||
| 61 | #define DWT_SIG_TX_ERROR 13 // TX failed |
||
| 62 | #define DWT_SIG_RX_PENDING 14 // RX has been re-enabled |
||
| 63 | #define DWT_SIG_DW_IDLE 15 // DW radio is in IDLE (no TX or RX pending) |
||
| 64 | |||
| 65 | #define SIG_RX_UNKNOWN 99 // Received an unknown frame |
||
| 66 | |||
| 67 | //DecaRTLS frame function codes
|
||
| 68 | #define RTLS_DEMO_MSG_TAG_POLL (0x81) // Tag poll message |
||
| 69 | #define RTLS_DEMO_MSG_ANCH_RESP (0x70) // Anchor response to poll |
||
| 70 | #define RTLS_DEMO_MSG_ANCH_POLL (0x71) // Anchor to anchor poll message |
||
| 71 | #define RTLS_DEMO_MSG_ANCH_RESP2 (0x72) // Anchor response to poll from anchor |
||
| 72 | #define RTLS_DEMO_MSG_ANCH_FINAL (0x73) // Anchor final massage back to Anchor |
||
| 73 | #define RTLS_DEMO_MSG_TAG_FINAL (0x82) // Tag final massage back to Anchor |
||
| 74 | |||
| 75 | |||
| 76 | //lengths including the Decaranging Message Function Code byte
|
||
| 77 | #define TAG_POLL_MSG_LEN 2 // FunctionCode(1), Range Num (1) |
||
| 78 | #define ANCH_RESPONSE_MSG_LEN 8 // FunctionCode(1), Sleep Correction Time (2), Measured_TOF_Time(4), Range Num (1) (previous) |
||
| 79 | #define TAG_FINAL_MSG_LEN 33 // FunctionCode(1), Range Num (1), Poll_TxTime(5), |
||
| 80 | // Resp0_RxTime(5), Resp1_RxTime(5), Resp2_RxTime(5), Resp3_RxTime(5), Final_TxTime(5), Valid Response Mask (1)
|
||
| 81 | |||
| 82 | #define MAX_MAC_MSG_DATA_LEN (TAG_FINAL_MSG_LEN) //max message len of the above |
||
| 83 | |||
| 84 | #define STANDARD_FRAME_SIZE 127 |
||
| 85 | //#define STANDARD_FRAME_SIZE 80
|
||
| 86 | |||
| 87 | #define ADDR_BYTE_SIZE_L (8) |
||
| 88 | #define ADDR_BYTE_SIZE_S (2) |
||
| 89 | |||
| 90 | #define FRAME_CONTROL_BYTES 2 |
||
| 91 | #define FRAME_SEQ_NUM_BYTES 1 |
||
| 92 | #define FRAME_PANID 2 |
||
| 93 | #define FRAME_CRC 2 |
||
| 94 | #define FRAME_SOURCE_ADDRESS_S (ADDR_BYTE_SIZE_S)
|
||
| 95 | #define FRAME_DEST_ADDRESS_S (ADDR_BYTE_SIZE_S)
|
||
| 96 | #define FRAME_SOURCE_ADDRESS_L (ADDR_BYTE_SIZE_L)
|
||
| 97 | #define FRAME_DEST_ADDRESS_L (ADDR_BYTE_SIZE_L)
|
||
| 98 | #define FRAME_CTRLP (FRAME_CONTROL_BYTES + FRAME_SEQ_NUM_BYTES + FRAME_PANID) //5 |
||
| 99 | #define FRAME_CRTL_AND_ADDRESS_L (FRAME_DEST_ADDRESS_L + FRAME_SOURCE_ADDRESS_L + FRAME_CTRLP) //21 bytes for 64-bit addresses) |
||
| 100 | #define FRAME_CRTL_AND_ADDRESS_S (FRAME_DEST_ADDRESS_S + FRAME_SOURCE_ADDRESS_S + FRAME_CTRLP) //9 bytes for 16-bit addresses) |
||
| 101 | #define FRAME_CRTL_AND_ADDRESS_LS (FRAME_DEST_ADDRESS_L + FRAME_SOURCE_ADDRESS_S + FRAME_CTRLP) //15 bytes for 1 16-bit address and 1 64-bit address) |
||
| 102 | #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 |
||
| 103 | #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 |
||
| 104 | #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 |
||
| 105 | |||
| 106 | //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)
|
||
| 107 | #define MAX_USER_PAYLOAD_STRING MAX_USER_PAYLOAD_STRING_LL
|
||
| 108 | |||
| 109 | #define MAX_TAG_LIST_SIZE (8) |
||
| 110 | #define MAX_ANCHOR_LIST_SIZE (4) //this is limited to 4 in this application |
||
| 111 | #define NUM_EXPECTED_RESPONSES (3) //e.g. MAX_ANCHOR_LIST_SIZE - 1 |
||
| 112 | #define NUM_EXPECTED_RESPONSES_ANC (1) //anchors A0, A1 and A2 are involved in anchor to anchor ranging |
||
| 113 | #define NUM_EXPECTED_RESPONSES_ANC0 (2) //anchor A0 expects response from A1 and A2 |
||
| 114 | |||
| 115 | #define GATEWAY_ANCHOR_ADDR (0x8000) |
||
| 116 | #define A1_ANCHOR_ADDR (0x8001) |
||
| 117 | #define A2_ANCHOR_ADDR (0x8002) |
||
| 118 | #define A3_ANCHOR_ADDR (0x8003) |
||
| 119 | |||
| 120 | |||
| 121 | // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
| 122 | // NOTE: the maximum RX timeout is ~ 65ms
|
||
| 123 | // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
| 124 | |||
| 125 | #define INST_DONE_WAIT_FOR_NEXT_EVENT 1 //this signifies that the current event has been processed and instance is ready for next one |
||
| 126 | #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 |
||
| 127 | //which will trigger if no event coming in specified time
|
||
| 128 | #define INST_NOT_DONE_YET 0 //this signifies that the instance is still processing the current event |
||
| 129 | |||
| 130 | //application data message byte offsets
|
||
| 131 | #define FCODE 0 // Function code is 1st byte of messageData |
||
| 132 | #define PTXT 2 // Poll TX time |
||
| 133 | #define RRXT0 7 // A0 Response RX time |
||
| 134 | #define RRXT1 12 // A1 Response RX time |
||
| 135 | #define RRXT2 17 // A2 Response RX time |
||
| 136 | #define RRXT3 22 // A3 Response RX time |
||
| 137 | #define FTXT 27 // Final TX time |
||
| 138 | #define VRESP 32 // Mask of valid response times (e.g. if bit 1 = A0's response time is valid) |
||
| 139 | #define RES_TAG_SLP0 1 // Response tag sleep correction LSB |
||
| 140 | #define RES_TAG_SLP1 2 // Response tag sleep correction MSB |
||
| 141 | #define TOFR 3 // ToF (n-1) 4 bytes |
||
| 142 | #define TOFRN 7 // range number 1 byte |
||
| 143 | #define POLL_RNUM 1 // Poll message range number |
||
| 144 | |||
| 145 | //this it the delay used for configuring the receiver on delay (wait for response delay)
|
||
| 146 | //NOTE: this RX_RESPONSE_TURNAROUND is dependent on the microprocessor and code optimisations
|
||
| 147 | #define RX_RESPONSEX_TURNAROUND (50) //takes about 100 us for response to come back |
||
| 148 | #define RX_RESPONSE1_TURNAROUND (200) //takes about 200 us for the 1st response to come back (from A0) |
||
| 149 | #define RX_RESPONSE1_TURNAROUND_6M81 (300) //takes about 100 us for response to come back |
||
| 150 | #define RX_RESPONSE1_TURNAROUND_110K (300) //takes about 100 us for response to come back |
||
| 151 | |||
| 152 | //Tag will range to 3 or 4 anchors
|
||
| 153 | //Each ranging exchange will consist of minimum of 3 messages (Poll, Response, Final)
|
||
| 154 | //and a maximum of 6 messages (Poll, Response x 4, Final)
|
||
| 155 | //Thus the ranging exchange will take either 28 ms for 110 kbps and 5 ms for 6.81 Mbps.
|
||
| 156 | //NOTE: the above times are for 110k rate with 64 symb non-standard SFD and 1024 preamble length
|
||
| 157 | |||
| 158 | typedef enum instanceModes{LISTENER, TAG, ANCHOR, ANCHOR_RNG, NUM_MODES} INST_MODE; |
||
| 159 | |||
| 160 | //Listener = in this mode, the instance only receives frames, does not respond
|
||
| 161 | //Tag = Exchanges DecaRanging messages (Poll-Response-Final) with Anchor and enabling Anchor to calculate the range between the two instances
|
||
| 162 | //Anchor = see above
|
||
| 163 | //Anchor_Rng = the anchor (assumes a tag function) and ranges to another anchor - used in Anchor to Anchor TWR for auto positioning function
|
||
| 164 | |||
| 165 | #define TOF_REPORT_NUL 0 |
||
| 166 | #define TOF_REPORT_T2A 1 |
||
| 167 | #define TOF_REPORT_A2A 2 |
||
| 168 | |||
| 169 | #define INVALID_TOF (0xABCDFFFF) |
||
| 170 | |||
| 171 | typedef enum inst_states |
||
| 172 | {
|
||
| 173 | TA_INIT, //0
|
||
| 174 | |||
| 175 | TA_TXE_WAIT, //1 - state in which the instance will enter sleep (if ranging finished) or proceed to transmit a message
|
||
| 176 | TA_TXPOLL_WAIT_SEND, //2 - configuration and sending of Poll message
|
||
| 177 | TA_TXFINAL_WAIT_SEND, //3 - configuration and sending of Final message
|
||
| 178 | TA_TXRESPONSE_WAIT_SEND, //4 - a place holder - response is sent from call back
|
||
| 179 | TA_TX_WAIT_CONF, //6 - confirmation of TX done message
|
||
| 180 | |||
| 181 | TA_RXE_WAIT, //7
|
||
| 182 | TA_RX_WAIT_DATA, //8
|
||
| 183 | |||
| 184 | TA_SLEEP_DONE, //9
|
||
| 185 | TA_TXRESPONSE_SENT_POLLRX, //10
|
||
| 186 | TA_TXRESPONSE_SENT_RESPRX, //11
|
||
| 187 | TA_TXRESPONSE_SENT_TORX //12
|
||
| 188 | |||
| 189 | } INST_STATES; |
||
| 190 | |||
| 191 | |||
| 192 | // This file defines data and functions for access to Parameters in the Device
|
||
| 193 | //message structure for Poll, Response and Final message
|
||
| 194 | |||
| 195 | typedef struct |
||
| 196 | {
|
||
| 197 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
| 198 | uint8_t seqNum; // sequence_number 02
|
||
| 199 | uint8_t panID[2]; // PAN ID 03-04 |
||
| 200 | uint8_t destAddr[ADDR_BYTE_SIZE_L]; // 05-12 using 64 bit addresses
|
||
| 201 | uint8_t sourceAddr[ADDR_BYTE_SIZE_L]; // 13-20 using 64 bit addresses
|
||
| 202 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_LL] ; // 22-124 (application data and any user payload)
|
||
| 203 | 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. |
||
| 204 | } srd_msg_dlsl ; |
||
| 205 | |||
| 206 | typedef struct |
||
| 207 | {
|
||
| 208 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
| 209 | uint8_t seqNum; // sequence_number 02
|
||
| 210 | uint8_t panID[2]; // PAN ID 03-04 |
||
| 211 | uint8_t destAddr[ADDR_BYTE_SIZE_S]; // 05-06
|
||
| 212 | uint8_t sourceAddr[ADDR_BYTE_SIZE_S]; // 07-08
|
||
| 213 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_SS] ; // 09-124 (application data and any user payload)
|
||
| 214 | 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. |
||
| 215 | } srd_msg_dsss ; |
||
| 216 | |||
| 217 | typedef struct |
||
| 218 | {
|
||
| 219 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
| 220 | uint8_t seqNum; // sequence_number 02
|
||
| 221 | uint8_t panID[2]; // PAN ID 03-04 |
||
| 222 | uint8_t destAddr[ADDR_BYTE_SIZE_L]; // 05-12 using 64 bit addresses
|
||
| 223 | uint8_t sourceAddr[ADDR_BYTE_SIZE_S]; // 13-14
|
||
| 224 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_LS] ; // 15-124 (application data and any user payload)
|
||
| 225 | 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. |
||
| 226 | } srd_msg_dlss ; |
||
| 227 | |||
| 228 | typedef struct |
||
| 229 | {
|
||
| 230 | uint8_t frameCtrl[2]; // frame control bytes 00-01 |
||
| 231 | uint8_t seqNum; // sequence_number 02
|
||
| 232 | uint8_t panID[2]; // PAN ID 03-04 |
||
| 233 | uint8_t destAddr[ADDR_BYTE_SIZE_S]; // 05-06
|
||
| 234 | uint8_t sourceAddr[ADDR_BYTE_SIZE_L]; // 07-14 using 64 bit addresses
|
||
| 235 | uint8_t messageData[MAX_USER_PAYLOAD_STRING_LS] ; // 15-124 (application data and any user payload)
|
||
| 236 | 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. |
||
| 237 | } srd_msg_dssl ; |
||
| 238 | |||
| 239 | 26dead12 | Cung Sang | typedef struct __attribute__((packed)) |
| 240 | 69a601a5 | Cung Sang | {
|
| 241 | uint8_t channelNumber ; // valid range is 1 to 11
|
||
| 242 | uint8_t preambleCode ; // 00 = use NS code, 1 to 24 selects code
|
||
| 243 | uint8_t pulseRepFreq ; // NOMINAL_4M, NOMINAL_16M, or NOMINAL_64M
|
||
| 244 | uint8_t dataRate ; // DATA_RATE_1 (110K), DATA_RATE_2 (850K), DATA_RATE_3 (6M81)
|
||
| 245 | uint8_t preambleLen ; // values expected are 64, (128), (256), (512), 1024, (2048), and 4096
|
||
| 246 | uint8_t pacSize ; |
||
| 247 | uint8_t nsSFD ; |
||
| 248 | uint16_t sfdTO; //!< SFD timeout value (in symbols) e.g. preamble length (128) + SFD(8) - PAC + some margin ~ 135us... DWT_SFDTOC_DEF; //default value
|
||
| 249 | } instanceConfig_t ; |
||
| 250 | |||
| 251 | typedef struct |
||
| 252 | {
|
||
| 253 | uint16_t slotPeriod ; //slot period (time for 1 tag to range to 4 anchors)
|
||
| 254 | uint16_t numSlots ; // number of slots in one superframe (number of tags supported)
|
||
| 255 | uint16_t sfPeriod ; // superframe period in ms
|
||
| 256 | |||
| 257 | uint16_t pollSleepDly ; // the minimum SLEEP time should be FRAME PERIOD so that tags don't interfere
|
||
| 258 | uint16_t replyDly ; //response delay time (Tag or Anchor when sending Final/Response messages respectively)
|
||
| 259 | } sfConfig_t ; |
||
| 260 | |||
| 261 | /******************************************************************************************************************
|
||
| 262 | *******************************************************************************************************************
|
||
| 263 | *******************************************************************************************************************/
|
||
| 264 | |||
| 265 | //size of the event queue, in this application there should be at most 2 unprocessed events,
|
||
| 266 | //i.e. if there is a transmission with wait for response then the TX callback followed by RX callback could be executed
|
||
| 267 | //in turn and the event queued up before the instance processed the TX event.
|
||
| 268 | #define MAX_EVENT_NUMBER (6) |
||
| 269 | |||
| 270 | 26dead12 | Cung Sang | typedef struct __attribute__((packed)) |
| 271 | 69a601a5 | Cung Sang | {
|
| 272 | uint8_t type; // event type - if 0 there is no event in the queue
|
||
| 273 | uint8_t type_save; // holds the event type - does not clear (used to show what event has been processed)
|
||
| 274 | uint8_t type_pend; // set if there is a pending event
|
||
| 275 | uint16_t rxLength ; // length of RX data (does not apply to TX events)
|
||
| 276 | |||
| 277 | uint64_t timeStamp ; // last timestamp (Tx or Rx) - 40 bit DW1000 time
|
||
| 278 | |||
| 279 | uint32_t timeStamp32l ; // last tx/rx timestamp - low 32 bits of the 40 bit DW1000 time
|
||
| 280 | uint32_t timeStamp32h ; // last tx/rx timestamp - high 32 bits of the 40 bit DW1000 time
|
||
| 281 | |||
| 282 | uint32_t uTimeStamp ; //32 bit system counter (ms) - STM32 tick time (at time of IRQ)
|
||
| 283 | |||
| 284 | union {
|
||
| 285 | //holds received frame (after a good RX frame event)
|
||
| 286 | uint8_t frame[STANDARD_FRAME_SIZE]; |
||
| 287 | srd_msg_dlsl rxmsg_ll ; //64 bit addresses
|
||
| 288 | srd_msg_dssl rxmsg_sl ; |
||
| 289 | srd_msg_dlss rxmsg_ls ; |
||
| 290 | srd_msg_dsss rxmsg_ss ; //16 bit addresses
|
||
| 291 | }msgu; |
||
| 292 | |||
| 293 | //uint32_t eventtime ;
|
||
| 294 | //uint32_t eventtimeclr ;
|
||
| 295 | uint8_t gotit; //stores the instance function which processed the event (used for debug)
|
||
| 296 | }event_data_t ; |
||
| 297 | |||
| 298 | 26dead12 | Cung Sang | extern event_data_t dw_event_g;
|
| 299 | 69a601a5 | Cung Sang | |
| 300 | // TX power and PG delay configuration structure
|
||
| 301 | 26dead12 | Cung Sang | typedef struct __attribute__((packed)) { |
| 302 | 69a601a5 | Cung Sang | uint8_t PGdelay; |
| 303 | |||
| 304 | //TX POWER
|
||
| 305 | //31:24 BOOST_0.125ms_PWR
|
||
| 306 | //23:16 BOOST_0.25ms_PWR-TX_SHR_PWR
|
||
| 307 | //15:8 BOOST_0.5ms_PWR-TX_PHR_PWR
|
||
| 308 | //7:0 DEFAULT_PWR-TX_DATA_PWR
|
||
| 309 | uint32_t txPwr[2]; // |
||
| 310 | }tx_struct; |
||
| 311 | |||
| 312 | 26dead12 | Cung Sang | typedef struct __attribute__((packed)) |
| 313 | 69a601a5 | Cung Sang | {
|
| 314 | INST_MODE mode; //instance mode (tag or anchor)
|
||
| 315 | |||
| 316 | INST_STATES testAppState ; //state machine - current state
|
||
| 317 | INST_STATES nextState ; //state machine - next state
|
||
| 318 | INST_STATES previousState ; //state machine - previous state
|
||
| 319 | int done ; //done with the current event/wait for next event to arrive |
||
| 320 | |||
| 321 | //configuration structures
|
||
| 322 | dwt_config_t configData ; //DW1000 channel configuration
|
||
| 323 | dwt_txconfig_t configTX ; //DW1000 TX power configuration
|
||
| 324 | uint16_t txAntennaDelay ; //DW1000 TX antenna delay
|
||
| 325 | uint16_t rxAntennaDelay ; //DW1000 RX antenna delay
|
||
| 326 | uint32_t txPower ; //DW1000 TX power
|
||
| 327 | uint8_t txPowerChanged ; //power has been changed - update the register on next TWR exchange
|
||
| 328 | uint8_t antennaDelayChanged; //antenna delay has been changed - update the register on next TWR exchange
|
||
| 329 | |||
| 330 | uint16_t instanceAddress16; //contains tag/anchor address
|
||
| 331 | |||
| 332 | //timeouts and delays
|
||
| 333 | int32_t tagSleepTime_ms; //in milliseconds - defines the nominal Tag sleep time period
|
||
| 334 | int32_t tagSleepRnd; //add an extra slot duration to sleep time to avoid collision before getting synced by anchor 0
|
||
| 335 | |||
| 336 | //this is the delay used for the delayed transmit
|
||
| 337 | uint64_t pollTx2FinalTxDelay ; //this is delay from Poll Tx time to Final Tx time in DW1000 units (40-bit)
|
||
| 338 | uint64_t pollTx2FinalTxDelayAnc ; //this is delay from Poll Tx time to Final Tx time in DW1000 units (40-bit) for Anchor to Anchor ranging
|
||
| 339 | uint64_t fixedReplyDelayAnc ; |
||
| 340 | uint32_t fixedReplyDelayAncP ; |
||
| 341 | int ancRespRxDelay ;
|
||
| 342 | |||
| 343 | int fwtoTime_sy ; //this is final message duration (longest out of ranging messages) |
||
| 344 | int fwtoTimeAnc_sy ;
|
||
| 345 | uint32_t delayedReplyTime; // delayed reply time of ranging-init/response/final message
|
||
| 346 | |||
| 347 | uint32_t rxTimeouts ; |
||
| 348 | |||
| 349 | //message structure used for holding the data of the frame to transmit before it is written to the DW1000
|
||
| 350 | srd_msg_dsss msg_f ; // ranging message frame with 16-bit addresses
|
||
| 351 | |||
| 352 | //Tag function address/message configuration
|
||
| 353 | uint8_t shortAdd_idx ; // device's 16-bit address low byte (used as index into arrays [0 - 3])
|
||
| 354 | uint8_t eui64[8]; // device's EUI 64-bit address |
||
| 355 | uint16_t psduLength ; // used for storing the TX frame length
|
||
| 356 | uint8_t frameSN; // modulo 256 frame sequence number - it is incremented for each new frame transmission
|
||
| 357 | uint16_t panID ; // panid used in the frames
|
||
| 358 | |||
| 359 | //64 bit timestamps
|
||
| 360 | //union of TX timestamps
|
||
| 361 | union {
|
||
| 362 | uint64_t txTimeStamp ; // last tx timestamp
|
||
| 363 | uint64_t tagPollTxTime ; // tag's poll tx timestamp
|
||
| 364 | uint64_t anchorRespTxTime ; // anchor's reponse tx timestamp
|
||
| 365 | }txu; |
||
| 366 | uint64_t tagPollRxTime ; // receive time of poll message
|
||
| 367 | |||
| 368 | |||
| 369 | //application control parameters
|
||
| 370 | uint8_t wait4ack ; // if this is set to DWT_RESPONSE_EXPECTED, then the receiver will turn on automatically after TX completion
|
||
| 371 | |||
| 372 | int8_t responseTO ; |
||
| 373 | uint8_t instToSleep; // if set the instance will go to sleep before sending the blink/poll message
|
||
| 374 | uint8_t stopTimer; // stop/disable an active timer
|
||
| 375 | uint8_t instanceTimerEn; // enable/start a timer
|
||
| 376 | uint32_t instanceWakeTime; //
|
||
| 377 | uint32_t nextSleepPeriod; |
||
| 378 | |||
| 379 | uint8_t gotTO; // got timeout event
|
||
| 380 | |||
| 381 | uint8_t rxResponseMaskAnc; |
||
| 382 | uint8_t rxResponseMask; // bit mask - bit 0 = received response from anchor ID = 0, bit 1 from anchor ID = 1 etc...
|
||
| 383 | uint8_t rxResponseMaskReport; |
||
| 384 | uint8_t rangeNum; // incremented for each sequence of ranges (each slot)
|
||
| 385 | uint8_t rangeNumA[MAX_TAG_LIST_SIZE]; // array which holds last range number from each tag
|
||
| 386 | uint8_t rangeNumAnc; // incremented for each sequence of ranges (each slot) - anchor to anchor ranging
|
||
| 387 | uint8_t rangeNumAAnc[MAX_ANCHOR_LIST_SIZE]; //array which holds last range number for each anchor
|
||
| 388 | uint16_t sframePeriod; |
||
| 389 | uint16_t slotPeriod; |
||
| 390 | uint16_t numSlots; |
||
| 391 | uint32_t a0SlotTime; |
||
| 392 | uint32_t a1SlotTime; |
||
| 393 | int32_t tagSleepCorrection; |
||
| 394 | int32_t tagSleepCorrection2; |
||
| 395 | |||
| 396 | //diagnostic counters/data, results and logging
|
||
| 397 | uint32_t tof[MAX_TAG_LIST_SIZE]; //this is an array which holds last ToF from particular tag (ID 0-7)
|
||
| 398 | |||
| 399 | //this is an array which holds last ToF to each anchor it should
|
||
| 400 | uint32_t tofArray[MAX_ANCHOR_LIST_SIZE]; //contain 4 ToF to 4 anchors all relating to same range number sequence
|
||
| 401 | |||
| 402 | 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)
|
||
| 403 | |||
| 404 | //this is an array which holds last ToFs of the Anchor to Anchor ranging
|
||
| 405 | uint32_t tofArrayAnc[MAX_ANCHOR_LIST_SIZE]; //it contains 3 ToFs relating to same range number sequence (0, 0-1, 0-2, 1-2)
|
||
| 406 | |||
| 407 | int txMsgCount; //number of transmitted messages |
||
| 408 | int rxMsgCount; //number of received messages |
||
| 409 | int lateTX; //number of "LATE" TX events |
||
| 410 | int lateRX; //number of "LATE" RX events |
||
| 411 | |||
| 412 | int longTermRangeCount ; //total number of ranges |
||
| 413 | |||
| 414 | int newRange; //flag set when there is a new range to report TOF_REPORT_A2A or TOF_REPORT_T2A |
||
| 415 | int newRangeAncAddress; //last 4 bytes of anchor address - used for printing/range output display |
||
| 416 | int newRangeTagAddress; //last 4 bytes of tag address - used for printing/range output display |
||
| 417 | 26dead12 | Cung Sang | uint32_t newRangeTime; |
| 418 | 69a601a5 | Cung Sang | |
| 419 | uint8_t gatewayAnchor ; //set to TRUE = 1 if anchor address == GATEWAY_ANCHOR_ADDR
|
||
| 420 | |||
| 421 | //event queue - used to store DW1000 events as they are processed by the dw_isr/callback functions
|
||
| 422 | event_data_t dwevent[MAX_EVENT_NUMBER]; //this holds any TX/RX events and associated message data
|
||
| 423 | event_data_t saved_dwevent; //holds an RX event while the ACK is being sent
|
||
| 424 | uint8_t dweventIdxOut; |
||
| 425 | uint8_t dweventIdxIn; |
||
| 426 | uint8_t dweventPeek; |
||
| 427 | uint8_t monitor; |
||
| 428 | uint32_t timeofTx ; |
||
| 429 | |||
| 430 | uint8_t rxRespsIdx; //index into the array below (current tag (4bits)/seq number(4bits))
|
||
| 431 | int8_t rxResps[256];
|
||
| 432 | |||
| 433 | int dwIDLE; //set to 1 when the RST goes high after wake up (it is set in process_dwRSTn_irq) |
||
| 434 | |||
| 435 | } instance_data_t ; |
||
| 436 | |||
| 437 | //-------------------------------------------------------------------------------------------------------------
|
||
| 438 | //
|
||
| 439 | // Functions used in logging/displaying range and status data
|
||
| 440 | //
|
||
| 441 | //-------------------------------------------------------------------------------------------------------------
|
||
| 442 | |||
| 443 | // function to calculate and report the Time of Flight to the GUI/display
|
||
| 444 | int reportTOF(int idx, uint32_t tofx); |
||
| 445 | void clearDistTable(int idx); |
||
| 446 | void setTagDist(int tidx, int aidx); |
||
| 447 | double getTagDist(int idx); |
||
| 448 | |||
| 449 | // clear the status/ranging data
|
||
| 450 | void instanceclearcounts(void) ; |
||
| 451 | |||
| 452 | //-------------------------------------------------------------------------------------------------------------
|
||
| 453 | //
|
||
| 454 | // Functions used in driving/controlling the ranging application
|
||
| 455 | //
|
||
| 456 | //-------------------------------------------------------------------------------------------------------------
|
||
| 457 | |||
| 458 | void instance_close(void); |
||
| 459 | // Call init, then call config, then call run. call close when finished
|
||
| 460 | // initialise the instance (application) structures and DW1000 device
|
||
| 461 | 26dead12 | Cung Sang | int instance_init(DW1000Driver* drv);
|
| 462 | 33f54213 | Cung Sang | |
| 463 | 69a601a5 | Cung Sang | // configure the instance and DW1000 device
|
| 464 | 4172c48d | Cung Sang | void instance_config(instanceConfig_t *config, sfConfig_t *sfconfig, DW1000Driver* drv) ;
|
| 465 | 69a601a5 | Cung Sang | |
| 466 | // configure the MAC address
|
||
| 467 | void instancesetaddresses(uint16_t address) ;
|
||
| 468 | |||
| 469 | void inst_processrxtimeout(instance_data_t *inst);
|
||
| 470 | |||
| 471 | // called (periodically or from and interrupt) to process any outstanding TX/RX events and to drive the ranging application
|
||
| 472 | int instance_run(void) ; // returns indication of status report change |
||
| 473 | int testapprun(instance_data_t *inst, int message); |
||
| 474 | |||
| 475 | // calls the DW1000 interrupt handler
|
||
| 476 | #define instance_process_irq(x) dwt_isr() //call device interrupt handler |
||
| 477 | // configure TX/RX callback functions that are called from DW1000 ISR
|
||
| 478 | void instance_rxcallback(const dwt_cb_data_t *rxd); |
||
| 479 | void instance_txcallback(const dwt_cb_data_t *txd); |
||
| 480 | void instance_rxtimeoutcallback(const dwt_cb_data_t *rxd); |
||
| 481 | void instance_rxerrorcallback(const dwt_cb_data_t *rxd); |
||
| 482 | |||
| 483 | |||
| 484 | |||
| 485 | // sets the Tag sleep delay time (the time Tag "sleeps" between each ranging attempt)
|
||
| 486 | void instancesettagsleepdelay(int rangingsleep); |
||
| 487 | void instancesetreplydelay(int delayms); |
||
| 488 | |||
| 489 | // set/get the instance roles e.g. Tag/Anchor/Listener
|
||
| 490 | void instancesetrole(int mode) ; // |
||
| 491 | int instancegetrole(void) ; |
||
| 492 | // get the DW1000 device ID (e.g. 0xDECA0130 for DW1000)
|
||
| 493 | uint32_t instancereaddeviceid(void) ; // Return Device ID reg, enables validation of physical device presence |
||
| 494 | |||
| 495 | double instancegetidist(int idx); |
||
| 496 | double instancegetidistraw(int idx); |
||
| 497 | int instancegetidist_mm(int idx); |
||
| 498 | int instancegetidistraw_mm(int idx); |
||
| 499 | uint8_t instancevalidranges(void);
|
||
| 500 | void instancecleardisttableall(void); |
||
| 501 | |||
| 502 | void instance_backtoanchor(instance_data_t *inst);
|
||
| 503 | int instancesenddlypacket(instance_data_t *inst, int delayedTx); |
||
| 504 | |||
| 505 | int instancegetrnum(void); |
||
| 506 | int instancegetrnuma(int idx); |
||
| 507 | int instancegetrnumanc(int idx); |
||
| 508 | int instancegetlcount(void); |
||
| 509 | |||
| 510 | int instancenewrangeancadd(void); |
||
| 511 | int instancenewrangetagadd(void); |
||
| 512 | int instancenewrangepolltim(void); |
||
| 513 | int instancenewrange(void); |
||
| 514 | 26dead12 | Cung Sang | uint32_t instancenewrangetim(void);
|
| 515 | 69a601a5 | Cung Sang | |
| 516 | uint64_t convertmicrosectodevicetimeu (double microsecu);
|
||
| 517 | double convertdevicetimetosec(int32_t dt);
|
||
| 518 | |||
| 519 | |||
| 520 | 33f54213 | Cung Sang | // -------------------------------------------------------------------------------------------------------------------
|
| 521 | // Deca Calibration Values
|
||
| 522 | // -------------------------------------------------------------------------------------------------------------------
|
||
| 523 | |||
| 524 | #define DWT_PRF_64M_RFDLY (514.462f) |
||
| 525 | #define DWT_PRF_16M_RFDLY (513.9067f) |
||
| 526 | |||
| 527 | /* Extern declaration while defining them in .c file */
|
||
| 528 | 69a601a5 | Cung Sang | extern const uint16_t rfDelays[2]; |
| 529 | extern const uint16_t rfDelaysTREK[2]; |
||
| 530 | extern const tx_struct txSpectrumConfig[8]; |
||
| 531 | extern instance_data_t instance_data[NUM_INST] ;
|
||
| 532 | |||
| 533 | 33f54213 | Cung Sang | extern sfConfig_t sfConfig[4]; |
| 534 | extern instanceConfig_t chConfig[4]; |
||
| 535 | |||
| 536 | 69a601a5 | Cung Sang | |
| 537 | int instance_peekevent(void); |
||
| 538 | |||
| 539 | void instance_saveevent(event_data_t newevent, uint8_t etype);
|
||
| 540 | |||
| 541 | event_data_t instance_getsavedevent(void);
|
||
| 542 | |||
| 543 | void instance_putevent(event_data_t newevent, uint8_t etype);
|
||
| 544 | |||
| 545 | event_data_t* instance_getevent(int x);
|
||
| 546 | |||
| 547 | void instance_clearevents(void); |
||
| 548 | |||
| 549 | void instance_notify_DW1000_inIDLE(int idle); |
||
| 550 | |||
| 551 | double dwt_getrangebias(uint8_t chan, float range, uint8_t prf); |
||
| 552 | |||
| 553 | uint32_t dwt_getotptxpower(uint8_t prf, uint8_t chan); |
||
| 554 | |||
| 555 | uint16_t dwt_getTREKOTPantennadelay(uint8_t anchor, uint8_t chan, uint8_t datarate); |
||
| 556 | |||
| 557 | uint16_t dwt_readantennadelay(uint8_t prf); |
||
| 558 | |||
| 559 | // configure TX power
|
||
| 560 | void instanceconfigtxpower(uint32_t txpower);
|
||
| 561 | void instancesettxpower(void); |
||
| 562 | |||
| 563 | // configure the antenna delays
|
||
| 564 | void instanceconfigantennadelays(uint16_t tx, uint16_t rx);
|
||
| 565 | void instancesetantennadelays(void); |
||
| 566 | uint16_t instancetxantdly(void);
|
||
| 567 | uint16_t instancerxantdly(void);
|
||
| 568 | |||
| 569 | int instance_starttxtest(int framePeriod); |
||
| 570 | |||
| 571 | #ifdef __cplusplus
|
||
| 572 | } |
||
| 573 | #endif
|
||
| 574 | |||
| 575 | 9466e34d | Thomas Schöpping | #endif /* DECAINSTANCE_H */ |
| 576 |