Huseyin Berkay Berabi / GA-Test_copy

Dependencies:   mbed-dev

Fork of GA-Test_copy by Alejandro Ungria Hirte

Committer:
bberabi
Date:
Wed Jan 10 16:14:49 2018 +0000
Revision:
2:5adf0b785944
Parent:
0:a3b83d366423
milc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aungriah 0:a3b83d366423 1 /*
aungriah 0:a3b83d366423 2 * DecaWave.cpp
aungriah 0:a3b83d366423 3 *
aungriah 0:a3b83d366423 4 * Created on: 04.11.2015
aungriah 0:a3b83d366423 5 * Author: kauf
aungriah 0:a3b83d366423 6 */
aungriah 0:a3b83d366423 7
aungriah 0:a3b83d366423 8 #include "DecaWave.h"
aungriah 0:a3b83d366423 9 //#include "states.h"
aungriah 0:a3b83d366423 10
aungriah 0:a3b83d366423 11 extern "C" {
aungriah 0:a3b83d366423 12 // TODO: create dedicated struct instead of void pointer
aungriah 0:a3b83d366423 13 #pragma Otime
aungriah 0:a3b83d366423 14 int writetospi(uint16 headerLength, const uint8 *headerBuffer,
aungriah 0:a3b83d366423 15 uint32 bodyLength, const uint8 *bodyBuffer) {
aungriah 0:a3b83d366423 16 uint32_t i = 0;
aungriah 0:a3b83d366423 17 decaIrqStatus_t stat;
aungriah 0:a3b83d366423 18
aungriah 0:a3b83d366423 19 stat = decamutexon();
aungriah 0:a3b83d366423 20
aungriah 0:a3b83d366423 21 // chip select
aungriah 0:a3b83d366423 22 decaWaveCs = 0; // set Cable Select pin low to start transmission
aungriah 0:a3b83d366423 23 for (i = 0; i < headerLength; i++) {
aungriah 0:a3b83d366423 24 decaWaveSpi.write(headerBuffer[i]);
aungriah 0:a3b83d366423 25 }
aungriah 0:a3b83d366423 26 for (i = 0; i < bodyLength; i++) {
aungriah 0:a3b83d366423 27 decaWaveSpi.write(bodyBuffer[i]);
aungriah 0:a3b83d366423 28 }
aungriah 0:a3b83d366423 29 decaWaveCs = 1;
aungriah 0:a3b83d366423 30
aungriah 0:a3b83d366423 31 decamutexoff(stat);
aungriah 0:a3b83d366423 32
aungriah 0:a3b83d366423 33 return 0;
aungriah 0:a3b83d366423 34 }
aungriah 0:a3b83d366423 35
aungriah 0:a3b83d366423 36 #pragma Otime
aungriah 0:a3b83d366423 37 int readfromspi(uint16 headerLength, const uint8 *headerBuffer,
aungriah 0:a3b83d366423 38 uint32 readLength, uint8 *readBuffer) {
aungriah 0:a3b83d366423 39 uint32_t i = 0;
aungriah 0:a3b83d366423 40
aungriah 0:a3b83d366423 41 decaIrqStatus_t stat;
aungriah 0:a3b83d366423 42
aungriah 0:a3b83d366423 43 stat = decamutexon();
aungriah 0:a3b83d366423 44
aungriah 0:a3b83d366423 45 /* Wait for SPIx Tx buffer empty */
aungriah 0:a3b83d366423 46 //while (port_SPIx_busy_sending());
aungriah 0:a3b83d366423 47 decaWaveCs = 0;
aungriah 0:a3b83d366423 48 for (i = 0; i < headerLength; i++) {
aungriah 0:a3b83d366423 49 decaWaveSpi.write(headerBuffer[i]);
aungriah 0:a3b83d366423 50 }
aungriah 0:a3b83d366423 51 for (i = 0; i < readLength; i++) {
aungriah 0:a3b83d366423 52 readBuffer[i] = decaWaveSpi.write(0x00); //port_SPIx_receive_data(); //this clears RXNE bit
aungriah 0:a3b83d366423 53 }
aungriah 0:a3b83d366423 54 decaWaveCs = 1;
aungriah 0:a3b83d366423 55
aungriah 0:a3b83d366423 56 decamutexoff(stat);
aungriah 0:a3b83d366423 57
aungriah 0:a3b83d366423 58 return 0;
aungriah 0:a3b83d366423 59 }
aungriah 0:a3b83d366423 60
aungriah 0:a3b83d366423 61 //#pragma Otime
aungriah 0:a3b83d366423 62 decaIrqStatus_t decamutexon() {
aungriah 0:a3b83d366423 63 decaWaveIrq.disable_irq();
aungriah 0:a3b83d366423 64 return 0;
aungriah 0:a3b83d366423 65 }
aungriah 0:a3b83d366423 66
aungriah 0:a3b83d366423 67 //#pragma Otime
aungriah 0:a3b83d366423 68 void decamutexoff(decaIrqStatus_t s) {
aungriah 0:a3b83d366423 69 decaWaveIrq.enable_irq();
aungriah 0:a3b83d366423 70 }
aungriah 0:a3b83d366423 71
aungriah 0:a3b83d366423 72 void deca_sleep(unsigned int time_ms) {
aungriah 0:a3b83d366423 73 wait_ms(time_ms);
aungriah 0:a3b83d366423 74 }
aungriah 0:a3b83d366423 75
aungriah 0:a3b83d366423 76 }
aungriah 0:a3b83d366423 77
aungriah 0:a3b83d366423 78 DecaWave::DecaWave()
aungriah 0:a3b83d366423 79 {
aungriah 0:a3b83d366423 80
aungriah 0:a3b83d366423 81 decaWaveCs = 1; // deselect chip
aungriah 0:a3b83d366423 82 // decaWaveRst = 1; // make sure that reset pin is high !!!!!!!!!!TODO (haven't the pin definition of the reset pin available
aungriah 0:a3b83d366423 83 decaWaveIrq.enable_irq();
aungriah 0:a3b83d366423 84 decaWaveSpi.format(8, 0); // Setup the spi for standard 8 bit data and SPI-Mode 0 (GPIO5, GPIO6 open circuit or ground on DW1000)
aungriah 0:a3b83d366423 85 decaWaveSpi.frequency(MIN_SPI_FREQ); // during init phase, only clock at 1 MHz
aungriah 0:a3b83d366423 86
aungriah 0:a3b83d366423 87 decaWaveIrq.rise(dwt_isr); // attach interrupt handler to rising edge of interrupt pin from DW1000
aungriah 0:a3b83d366423 88
aungriah 0:a3b83d366423 89 hardreset();
aungriah 0:a3b83d366423 90 dwt_softreset();
aungriah 0:a3b83d366423 91
aungriah 0:a3b83d366423 92 _sequenceNumber = 0;
aungriah 0:a3b83d366423 93 }
aungriah 0:a3b83d366423 94
aungriah 0:a3b83d366423 95 DecaWave::~DecaWave() {
aungriah 0:a3b83d366423 96 // TODO Auto-generated destructor stub
aungriah 0:a3b83d366423 97 }
aungriah 0:a3b83d366423 98
aungriah 0:a3b83d366423 99 void DecaWave::setup(dwt_config_t configdw, dwt_txconfig_t configdw_tx,
aungriah 0:a3b83d366423 100 uint32_t delay, void (*txcallback)(const dwt_cb_data_t *),
aungriah 0:a3b83d366423 101 void (*rxcallback)(const dwt_cb_data_t *)) {
aungriah 0:a3b83d366423 102
aungriah 0:a3b83d366423 103 _deca_config = configdw;
aungriah 0:a3b83d366423 104 _antennadelay = delay;
aungriah 0:a3b83d366423 105 // disable interrupts
aungriah 0:a3b83d366423 106 decamutexon();
aungriah 0:a3b83d366423 107
aungriah 0:a3b83d366423 108 // inittestapplication
aungriah 0:a3b83d366423 109 // setup slow spi
aungriah 0:a3b83d366423 110 decaWaveSpi.frequency(MIN_SPI_FREQ); // during init phase, only clock at 1 MHz
aungriah 0:a3b83d366423 111
aungriah 0:a3b83d366423 112 // instance init
aungriah 0:a3b83d366423 113 dwt_initialise(DWT_LOADUCODE);
aungriah 0:a3b83d366423 114 dwt_geteui(_euid);
aungriah 0:a3b83d366423 115
aungriah 0:a3b83d366423 116 // setinterrupt, callbacks
aungriah 0:a3b83d366423 117 dwt_setinterrupt(DWT_INT_TFRS | DWT_INT_RFCG, 1);
aungriah 0:a3b83d366423 118 dwt_setcallbacks(txcallback, rxcallback, NULL, NULL);
aungriah 0:a3b83d366423 119
aungriah 0:a3b83d366423 120 // inst config
aungriah 0:a3b83d366423 121 dwt_configure(&configdw);
aungriah 0:a3b83d366423 122
aungriah 0:a3b83d366423 123 //Configure TX power
aungriah 0:a3b83d366423 124 uint32_t power = configdw_tx.power;
aungriah 0:a3b83d366423 125 _configTX.PGdly = configdw_tx.PGdly;
aungriah 0:a3b83d366423 126
aungriah 0:a3b83d366423 127 //if smart power is used then the value as read from OTP is used directly
aungriah 0:a3b83d366423 128 //if smart power is used the user needs to make sure to transmit only one frame per 1ms or TX spectrum power will be violated
aungriah 0:a3b83d366423 129 if (configdw.dataRate == DWT_BR_6M8) {
aungriah 0:a3b83d366423 130 _configTX.power = power;
aungriah 0:a3b83d366423 131 dwt_setsmarttxpower(1);
aungriah 0:a3b83d366423 132 } else { //if the smart power is not used, then the low byte value (repeated) is used for the whole TX power register
aungriah 0:a3b83d366423 133 uint8 pow = power & 0xFF;
aungriah 0:a3b83d366423 134 _configTX.power = (pow | (pow << 8) | (pow << 16) | (pow << 24));
aungriah 0:a3b83d366423 135 dwt_setsmarttxpower(0);
aungriah 0:a3b83d366423 136 }
aungriah 0:a3b83d366423 137
aungriah 0:a3b83d366423 138 //configure the tx spectrum parameters (power and PG delay)
aungriah 0:a3b83d366423 139 dwt_configuretxrf(&_configTX);
aungriah 0:a3b83d366423 140
aungriah 0:a3b83d366423 141 _antennadelay += getAntennaDelayOffset(dwt_getpartid());
aungriah 0:a3b83d366423 142 dwt_setrxantennadelay(_antennadelay);
aungriah 0:a3b83d366423 143 dwt_settxantennadelay(_antennadelay);
aungriah 0:a3b83d366423 144
aungriah 0:a3b83d366423 145 if (configdw.txPreambLength == DWT_PLEN_64) { //if preamble length is 64
aungriah 0:a3b83d366423 146 decaWaveSpi.frequency(MIN_SPI_FREQ); //reduce SPI to < 3MHz
aungriah 0:a3b83d366423 147 dwt_loadopsettabfromotp(0);
aungriah 0:a3b83d366423 148 decaWaveSpi.frequency(MAX_SPI_FREQ); //increase SPI to max
aungriah 0:a3b83d366423 149 }
aungriah 0:a3b83d366423 150 wait_ms(10);
aungriah 0:a3b83d366423 151
aungriah 0:a3b83d366423 152 autoreenable();
aungriah 0:a3b83d366423 153
aungriah 0:a3b83d366423 154 // enable event counter & clear
aungriah 0:a3b83d366423 155 dwt_configeventcounters(1);
aungriah 0:a3b83d366423 156
aungriah 0:a3b83d366423 157 decaWaveSpi.frequency(MAX_SPI_FREQ);
aungriah 0:a3b83d366423 158
aungriah 0:a3b83d366423 159 // enable interrupts
aungriah 0:a3b83d366423 160 decamutexoff(0);
aungriah 0:a3b83d366423 161 }
aungriah 0:a3b83d366423 162
aungriah 0:a3b83d366423 163 /*! ------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 164 * Function: autoreenable()
aungriah 0:a3b83d366423 165 *
aungriah 0:a3b83d366423 166 * Set the auto-reenable flag
aungriah 0:a3b83d366423 167 *
aungriah 0:a3b83d366423 168 * arguments:
aungriah 0:a3b83d366423 169 * returns:
aungriah 0:a3b83d366423 170 */
aungriah 0:a3b83d366423 171 void DecaWave::autoreenable() {
aungriah 0:a3b83d366423 172 uint8 byte = 0;
aungriah 0:a3b83d366423 173 dwt_readfromdevice(SYS_CFG_ID, 3, 1, &byte);
aungriah 0:a3b83d366423 174
aungriah 0:a3b83d366423 175 byte |= (SYS_CFG_RXAUTR >> 24);
aungriah 0:a3b83d366423 176
aungriah 0:a3b83d366423 177 dwt_writetodevice(SYS_CFG_ID, 3, 1, &byte) ;
aungriah 0:a3b83d366423 178 }
aungriah 0:a3b83d366423 179
aungriah 0:a3b83d366423 180
aungriah 0:a3b83d366423 181 /*! ------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 182 * Function: sendFrame()
aungriah 0:a3b83d366423 183 *
aungriah 0:a3b83d366423 184 * Send a pre-composed frame:
aungriah 0:a3b83d366423 185 * - Write uint8_t array of with length bytes to register
aungriah 0:a3b83d366423 186 * - set length in register
aungriah 0:a3b83d366423 187 * - if it is scheduled to be sent at a given timestamp, write 40bit delay in timestamps units
aungriah 0:a3b83d366423 188 * - send TX command
aungriah 0:a3b83d366423 189 * - if the receiver turns on after a delay, write this delay in us
aungriah 0:a3b83d366423 190 * - enable (potentially delay) receiver
aungriah 0:a3b83d366423 191 *
aungriah 0:a3b83d366423 192 * arguments: pointer to message (uint8 array) with specified length, dtime transmission time (truncated 32bit deca time), delay (us) until RX turn on
aungriah 0:a3b83d366423 193 * returns DWT_SUCCESS if process was successful, or DWT_ERROR if TX failed.
aungriah 0:a3b83d366423 194 */
aungriah 0:a3b83d366423 195 #pragma Otime
aungriah 0:a3b83d366423 196 int8_t DecaWave::sendFrame(uint8_t* message, uint16_t length, uint32_t dtime,
aungriah 0:a3b83d366423 197 uint32_t delay) {
aungriah 0:a3b83d366423 198 length += 2; // include 2 byte crc in the frame length
aungriah 0:a3b83d366423 199
aungriah 0:a3b83d366423 200 dwt_writetxdata(length, message, 0);
aungriah 0:a3b83d366423 201
aungriah 0:a3b83d366423 202 dwt_writetxfctrl(length, 0, 1);
aungriah 0:a3b83d366423 203
aungriah 0:a3b83d366423 204 if (dtime > 0) {
aungriah 0:a3b83d366423 205 dwt_setdelayedtrxtime(dtime);
aungriah 0:a3b83d366423 206 }
aungriah 0:a3b83d366423 207
aungriah 0:a3b83d366423 208 if (_state == DW_RECEIVE) {
aungriah 0:a3b83d366423 209 uint8_t temp = (uint8)SYS_CTRL_TRXOFF ; // This assumes the bit is in the lowest byte
aungriah 0:a3b83d366423 210 dwt_writetodevice(SYS_CTRL_ID,0,1,&temp) ; // Disable the radio
aungriah 0:a3b83d366423 211 }
aungriah 0:a3b83d366423 212
aungriah 0:a3b83d366423 213 uint8_t mode = (dtime>0)*DWT_START_TX_DELAYED + 0*DWT_RESPONSE_EXPECTED;
aungriah 0:a3b83d366423 214 _state = DW_TRANSMIT;
aungriah 0:a3b83d366423 215 return dwt_starttx(mode);
aungriah 0:a3b83d366423 216 }
aungriah 0:a3b83d366423 217
aungriah 0:a3b83d366423 218 uint32_t DecaWave::getStatus() {
aungriah 0:a3b83d366423 219 uint32_t status;
aungriah 0:a3b83d366423 220 // status = dwt_read32bitreg(SYS_STATUS_ID, this);
aungriah 0:a3b83d366423 221 dwt_readfromdevice(SYS_STATUS_ID, 0x0, 4, (uint8_t*) &status);
aungriah 0:a3b83d366423 222
aungriah 0:a3b83d366423 223 uint32_t temp = SYS_STATUS_MASK_32;
aungriah 0:a3b83d366423 224 dwt_writetodevice(SYS_STATUS_ID, 0x00, 4, (uint8_t*)&temp);
aungriah 0:a3b83d366423 225 return status;
aungriah 0:a3b83d366423 226 }
aungriah 0:a3b83d366423 227
aungriah 0:a3b83d366423 228 uint16_t DecaWave::computeFrameLength_us() {
aungriah 0:a3b83d366423 229
aungriah 0:a3b83d366423 230 //configure the rx delay receive delay time, it is dependent on the message length
aungriah 0:a3b83d366423 231 float msgdatalen = 0;
aungriah 0:a3b83d366423 232 float preamblelen = 0;
aungriah 0:a3b83d366423 233 int sfdlen = 0;
aungriah 0:a3b83d366423 234 int x = 0;
aungriah 0:a3b83d366423 235
aungriah 0:a3b83d366423 236 msgdatalen = 16;//sizeof(FrameHeader_t); //TODO add size of header!
aungriah 0:a3b83d366423 237
aungriah 0:a3b83d366423 238
aungriah 0:a3b83d366423 239 x = (int) ceil(msgdatalen * 8 / 330.0f);
aungriah 0:a3b83d366423 240
aungriah 0:a3b83d366423 241 msgdatalen = msgdatalen * 8 + x * 48;
aungriah 0:a3b83d366423 242
aungriah 0:a3b83d366423 243 //assume PHR length is 172308us for 110k and 21539us for 850k/6.81M
aungriah 0:a3b83d366423 244 if (_deca_config.dataRate == DWT_BR_110K) {
aungriah 0:a3b83d366423 245 msgdatalen *= 8205.13f;
aungriah 0:a3b83d366423 246 msgdatalen += 172308;
aungriah 0:a3b83d366423 247
aungriah 0:a3b83d366423 248 } else if (_deca_config.dataRate == DWT_BR_850K) {
aungriah 0:a3b83d366423 249 msgdatalen *= 1025.64f;
aungriah 0:a3b83d366423 250 msgdatalen += 21539;
aungriah 0:a3b83d366423 251 } else {
aungriah 0:a3b83d366423 252 msgdatalen *= 128.21f;
aungriah 0:a3b83d366423 253 msgdatalen += 21539;
aungriah 0:a3b83d366423 254 }
aungriah 0:a3b83d366423 255
aungriah 0:a3b83d366423 256 //SFD length is 64 for 110k (always)
aungriah 0:a3b83d366423 257 //SFD length is 8 for 6.81M, and 16 for 850k, but can vary between 8 and 16 bytes
aungriah 0:a3b83d366423 258 sfdlen = dwnsSFDlen[_deca_config.dataRate];
aungriah 0:a3b83d366423 259
aungriah 0:a3b83d366423 260 switch (_deca_config.txPreambLength) {
aungriah 0:a3b83d366423 261 case DWT_PLEN_4096:
aungriah 0:a3b83d366423 262 preamblelen = 4096.0f;
aungriah 0:a3b83d366423 263 break;
aungriah 0:a3b83d366423 264 case DWT_PLEN_2048:
aungriah 0:a3b83d366423 265 preamblelen = 2048.0f;
aungriah 0:a3b83d366423 266 break;
aungriah 0:a3b83d366423 267 case DWT_PLEN_1536:
aungriah 0:a3b83d366423 268 preamblelen = 1536.0f;
aungriah 0:a3b83d366423 269 break;
aungriah 0:a3b83d366423 270 case DWT_PLEN_1024:
aungriah 0:a3b83d366423 271 preamblelen = 1024.0f;
aungriah 0:a3b83d366423 272 break;
aungriah 0:a3b83d366423 273 case DWT_PLEN_512:
aungriah 0:a3b83d366423 274 preamblelen = 512.0f;
aungriah 0:a3b83d366423 275 break;
aungriah 0:a3b83d366423 276 case DWT_PLEN_256:
aungriah 0:a3b83d366423 277 preamblelen = 256.0f;
aungriah 0:a3b83d366423 278 break;
aungriah 0:a3b83d366423 279 case DWT_PLEN_128:
aungriah 0:a3b83d366423 280 preamblelen = 128.0f;
aungriah 0:a3b83d366423 281 break;
aungriah 0:a3b83d366423 282 case DWT_PLEN_64:
aungriah 0:a3b83d366423 283 preamblelen = 64.0f;
aungriah 0:a3b83d366423 284 break;
aungriah 0:a3b83d366423 285 }
aungriah 0:a3b83d366423 286
aungriah 0:a3b83d366423 287 //preamble = plen * (994 or 1018) depending on 16 or 64 PRF
aungriah 0:a3b83d366423 288 if (_deca_config.prf == DWT_PRF_16M) {
aungriah 0:a3b83d366423 289 preamblelen = (sfdlen + preamblelen) * 0.99359f;
aungriah 0:a3b83d366423 290 } else {
aungriah 0:a3b83d366423 291 preamblelen = (sfdlen + preamblelen) * 1.01763f;
aungriah 0:a3b83d366423 292 }
aungriah 0:a3b83d366423 293
aungriah 0:a3b83d366423 294 //set the frame wait timeout time - total time the frame takes in symbols
aungriah 0:a3b83d366423 295 return uint16_t(
aungriah 0:a3b83d366423 296 16 + (int) ((preamblelen + (msgdatalen / 1000.0f)) / 1.0256f));
aungriah 0:a3b83d366423 297
aungriah 0:a3b83d366423 298 }
aungriah 0:a3b83d366423 299
aungriah 0:a3b83d366423 300 float DecaWave::getRXLevel(dwt_rxdiag_t *diagnostics) {
aungriah 0:a3b83d366423 301 float A; // 115.72 if PRF 16 MHz, 121.74 if PRF 64 MHz
aungriah 0:a3b83d366423 302 if (_deca_config.prf == DWT_PRF_16M) {
aungriah 0:a3b83d366423 303 A = 115.72f;
aungriah 0:a3b83d366423 304 } else {
aungriah 0:a3b83d366423 305 A = 121.74f;
aungriah 0:a3b83d366423 306 }
aungriah 0:a3b83d366423 307 // RXLevel (dBm) is calculated as P = 10 * log10( C * 2^17 ) / N^2 ) - A
aungriah 0:a3b83d366423 308 // use magic number: 10*log10(2^17)=51.175
aungriah 0:a3b83d366423 309 return 10 * log10(float(diagnostics->maxGrowthCIR)) + 51.175f - 20 * log10(float(diagnostics->rxPreamCount)) - A; // user manual 4.7.2 p.45
aungriah 0:a3b83d366423 310 }
aungriah 0:a3b83d366423 311
aungriah 0:a3b83d366423 312 float DecaWave::getFPLevel() {
aungriah 0:a3b83d366423 313
aungriah 0:a3b83d366423 314 uint32_t frameInfo = dwt_read32bitreg(RX_FINFO_ID);
aungriah 0:a3b83d366423 315
aungriah 0:a3b83d366423 316 uint64_t frameQuality;
aungriah 0:a3b83d366423 317 dwt_readfromdevice(RX_FQUAL_ID, 0, 8, (uint8_t*) &frameQuality);
aungriah 0:a3b83d366423 318
aungriah 0:a3b83d366423 319 uint16_t F1;
aungriah 0:a3b83d366423 320 dwt_readfromdevice(RX_TIME_ID, 7, 2, (uint8_t*) &F1);
aungriah 0:a3b83d366423 321 uint16_t F2 = (frameQuality >> 16) & 0xFFFF;
aungriah 0:a3b83d366423 322 uint16_t F3 = (frameQuality >> 32) & 0xFFFF;
aungriah 0:a3b83d366423 323
aungriah 0:a3b83d366423 324 float A; // 115.72 if PRF 16 MHz, 121.74 if PRF 64 MHz
aungriah 0:a3b83d366423 325 if (_deca_config.prf == DWT_PRF_16M) {
aungriah 0:a3b83d366423 326 A = 115.72f;
aungriah 0:a3b83d366423 327 } else {
aungriah 0:a3b83d366423 328 A = 121.74f;
aungriah 0:a3b83d366423 329 }
aungriah 0:a3b83d366423 330 uint32_t N = (frameInfo >> 20) & 0x7FF;
aungriah 0:a3b83d366423 331
aungriah 0:a3b83d366423 332 // First Path Power Level (dBm) is calculated as P = 10 * log10( F1^2+F2^2+F3^2) / N^2 ) - A
aungriah 0:a3b83d366423 333
aungriah 0:a3b83d366423 334 return 10
aungriah 0:a3b83d366423 335 * log10(
aungriah 0:a3b83d366423 336 float(F1) * float(F1) + float(F2) * float(F2)
aungriah 0:a3b83d366423 337 + float(F3) * float(F3)) - 20 * log10(float(N)) - A; // user manual 4.7.1 p.44
aungriah 0:a3b83d366423 338 }
aungriah 0:a3b83d366423 339
aungriah 0:a3b83d366423 340 void DecaWave::reset() {
aungriah 0:a3b83d366423 341 decaWaveSpi.frequency(MIN_SPI_FREQ);
aungriah 0:a3b83d366423 342 dwt_softreset();
aungriah 0:a3b83d366423 343 decaWaveSpi.frequency(MAX_SPI_FREQ);
aungriah 0:a3b83d366423 344 }
aungriah 0:a3b83d366423 345
aungriah 0:a3b83d366423 346 void DecaWave::hardreset() {//TODO: Check where the reset-pin is and add it!
aungriah 0:a3b83d366423 347 //decaWaveRst = 0;
aungriah 0:a3b83d366423 348 wait_ms(10);
aungriah 0:a3b83d366423 349 // decaWaveRst = 1;
aungriah 0:a3b83d366423 350 }
aungriah 0:a3b83d366423 351
aungriah 0:a3b83d366423 352 int8_t DecaWave::turnonrx() {
aungriah 0:a3b83d366423 353 int8_t result = dwt_rxenable(0);
aungriah 0:a3b83d366423 354 if (result != DWT_ERROR) {
aungriah 0:a3b83d366423 355 _state = DW_RECEIVE;
aungriah 0:a3b83d366423 356 } else {
aungriah 0:a3b83d366423 357 _state = DW_IDLE;
aungriah 0:a3b83d366423 358 }
aungriah 0:a3b83d366423 359 return result;
aungriah 0:a3b83d366423 360 }
aungriah 0:a3b83d366423 361
aungriah 0:a3b83d366423 362 void DecaWave::turnoffrx() {
aungriah 0:a3b83d366423 363 uint8_t temp = (uint8)SYS_CTRL_TRXOFF ; // This assumes the bit is in the lowest byte
aungriah 0:a3b83d366423 364 dwt_writetodevice(SYS_CTRL_ID,0,1,&temp) ; // Disable the radio
aungriah 0:a3b83d366423 365 _state = DW_IDLE;
aungriah 0:a3b83d366423 366 }
aungriah 0:a3b83d366423 367
aungriah 0:a3b83d366423 368 uint8_t DecaWave::getNextSequenceNumber() {
aungriah 0:a3b83d366423 369 return ++_sequenceNumber;
aungriah 0:a3b83d366423 370 }
aungriah 0:a3b83d366423 371
aungriah 0:a3b83d366423 372 uint16_t DecaWave::getAntennaDelay() {
aungriah 0:a3b83d366423 373 return _antennadelay;
aungriah 0:a3b83d366423 374 }
aungriah 0:a3b83d366423 375
aungriah 0:a3b83d366423 376
aungriah 0:a3b83d366423 377 uint8_t DecaWave::getCHAN() {
aungriah 0:a3b83d366423 378 return _deca_config.chan;
aungriah 0:a3b83d366423 379 }
aungriah 0:a3b83d366423 380
aungriah 0:a3b83d366423 381 uint8_t DecaWave::getPRF() {
aungriah 0:a3b83d366423 382 return _deca_config.prf;
aungriah 0:a3b83d366423 383 }
aungriah 0:a3b83d366423 384
aungriah 0:a3b83d366423 385 #define NUM_16M_OFFSET (37)
aungriah 0:a3b83d366423 386 #define NUM_16M_OFFSETWB (68)
aungriah 0:a3b83d366423 387 #define NUM_64M_OFFSET (26)
aungriah 0:a3b83d366423 388 #define NUM_64M_OFFSETWB (59)
aungriah 0:a3b83d366423 389
aungriah 0:a3b83d366423 390 const uint8 chan_idxnb[NUM_CH_SUPPORTED] = {0, 0, 1, 2, 0, 3, 0, 0}; // Only channels 1,2,3 and 5 are in the narrow band tables
aungriah 0:a3b83d366423 391 const uint8 chan_idxwb[NUM_CH_SUPPORTED] = {0, 0, 0, 0, 0, 0, 0, 1}; // Only channels 4 and 7 are in in the wide band tables
aungriah 0:a3b83d366423 392
aungriah 0:a3b83d366423 393 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 394 // Range Bias Correction TABLES of range values in integer units of 25 CM, for 8-bit unsigned storage, MUST END IN 255 !!!!!!
aungriah 0:a3b83d366423 395 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 396
aungriah 0:a3b83d366423 397 // offsets to nearest centimetre for index 0, all rest are +1 cm per value
aungriah 0:a3b83d366423 398
aungriah 0:a3b83d366423 399 #define CM_OFFSET_16M_NB (-23) // For normal band channels at 16 MHz PRF
aungriah 0:a3b83d366423 400 #define CM_OFFSET_16M_WB (-28) // For wider band channels at 16 MHz PRF
aungriah 0:a3b83d366423 401 #define CM_OFFSET_64M_NB (-17) // For normal band channels at 64 MHz PRF
aungriah 0:a3b83d366423 402 #define CM_OFFSET_64M_WB (-30) // For wider band channels at 64 MHz PRF
aungriah 0:a3b83d366423 403
aungriah 0:a3b83d366423 404
aungriah 0:a3b83d366423 405 /*! ------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 406 * Function: getAntennaDelayOffset()
aungriah 0:a3b83d366423 407 *
aungriah 0:a3b83d366423 408 * Get the Offset for the antenna delay
aungriah 0:a3b83d366423 409 *
aungriah 0:a3b83d366423 410 * arguments:
aungriah 0:a3b83d366423 411 * returns:
aungriah 0:a3b83d366423 412 */
aungriah 0:a3b83d366423 413 int16_t DecaWave::getAntennaDelayOffset(uint32_t board_id) {
aungriah 0:a3b83d366423 414 switch(board_id){
aungriah 0:a3b83d366423 415 // Calibrated on 23.03. outside at 15C, windy. 8m side length
aungriah 0:a3b83d366423 416 case 268436898: return -91;
aungriah 0:a3b83d366423 417 case 268445167: return -101;
aungriah 0:a3b83d366423 418 case 268445155: return -106;
aungriah 0:a3b83d366423 419 case 268445158: return -107;
aungriah 0:a3b83d366423 420 case 268436604: return -106;
aungriah 0:a3b83d366423 421 case 268437112: return -102;
aungriah 0:a3b83d366423 422 case 268445165: return -100;
aungriah 0:a3b83d366423 423 case 268444882: return -102;
aungriah 0:a3b83d366423 424 case 268437817: return -87;
aungriah 0:a3b83d366423 425 case 268445163: return -104;
aungriah 0:a3b83d366423 426 case 268436897: return -99;
aungriah 0:a3b83d366423 427 case 268437656: return -106;
aungriah 0:a3b83d366423 428 case 268445154: return -102;
aungriah 0:a3b83d366423 429 case 268436603: return -98;
aungriah 0:a3b83d366423 430 case 268444886: return -112;
aungriah 0:a3b83d366423 431 case 268437847: return -119;
aungriah 0:a3b83d366423 432 case 268437825: return -111;
aungriah 0:a3b83d366423 433
aungriah 0:a3b83d366423 434 default: return -106;
aungriah 0:a3b83d366423 435 }
aungriah 0:a3b83d366423 436 }
aungriah 0:a3b83d366423 437
aungriah 0:a3b83d366423 438 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 439 // range25cm16PRFnb: Range Bias Correction table for narrow band channels at 16 MHz PRF, NB: !!!! each MUST END IN 255 !!!!
aungriah 0:a3b83d366423 440 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 441
aungriah 0:a3b83d366423 442 const uint8 range25cm16PRFnb[4][NUM_16M_OFFSET] =
aungriah 0:a3b83d366423 443 {
aungriah 0:a3b83d366423 444 // Ch 1 - range25cm16PRFnb
aungriah 0:a3b83d366423 445 {
aungriah 0:a3b83d366423 446 1,
aungriah 0:a3b83d366423 447 3,
aungriah 0:a3b83d366423 448 4,
aungriah 0:a3b83d366423 449 5,
aungriah 0:a3b83d366423 450 7,
aungriah 0:a3b83d366423 451 9,
aungriah 0:a3b83d366423 452 11,
aungriah 0:a3b83d366423 453 12,
aungriah 0:a3b83d366423 454 13,
aungriah 0:a3b83d366423 455 15,
aungriah 0:a3b83d366423 456 18,
aungriah 0:a3b83d366423 457 20,
aungriah 0:a3b83d366423 458 23,
aungriah 0:a3b83d366423 459 25,
aungriah 0:a3b83d366423 460 28,
aungriah 0:a3b83d366423 461 30,
aungriah 0:a3b83d366423 462 33,
aungriah 0:a3b83d366423 463 36,
aungriah 0:a3b83d366423 464 40,
aungriah 0:a3b83d366423 465 43,
aungriah 0:a3b83d366423 466 47,
aungriah 0:a3b83d366423 467 50,
aungriah 0:a3b83d366423 468 54,
aungriah 0:a3b83d366423 469 58,
aungriah 0:a3b83d366423 470 63,
aungriah 0:a3b83d366423 471 66,
aungriah 0:a3b83d366423 472 71,
aungriah 0:a3b83d366423 473 76,
aungriah 0:a3b83d366423 474 82,
aungriah 0:a3b83d366423 475 89,
aungriah 0:a3b83d366423 476 98,
aungriah 0:a3b83d366423 477 109,
aungriah 0:a3b83d366423 478 127,
aungriah 0:a3b83d366423 479 155,
aungriah 0:a3b83d366423 480 222,
aungriah 0:a3b83d366423 481 255,
aungriah 0:a3b83d366423 482 255
aungriah 0:a3b83d366423 483 },
aungriah 0:a3b83d366423 484
aungriah 0:a3b83d366423 485 // Ch 2 - range25cm16PRFnb
aungriah 0:a3b83d366423 486 {
aungriah 0:a3b83d366423 487 1,
aungriah 0:a3b83d366423 488 2,
aungriah 0:a3b83d366423 489 4,
aungriah 0:a3b83d366423 490 5,
aungriah 0:a3b83d366423 491 6,
aungriah 0:a3b83d366423 492 8,
aungriah 0:a3b83d366423 493 9,
aungriah 0:a3b83d366423 494 10,
aungriah 0:a3b83d366423 495 12,
aungriah 0:a3b83d366423 496 13,
aungriah 0:a3b83d366423 497 15,
aungriah 0:a3b83d366423 498 18,
aungriah 0:a3b83d366423 499 20,
aungriah 0:a3b83d366423 500 22,
aungriah 0:a3b83d366423 501 24,
aungriah 0:a3b83d366423 502 27,
aungriah 0:a3b83d366423 503 29,
aungriah 0:a3b83d366423 504 32,
aungriah 0:a3b83d366423 505 35,
aungriah 0:a3b83d366423 506 38,
aungriah 0:a3b83d366423 507 41,
aungriah 0:a3b83d366423 508 44,
aungriah 0:a3b83d366423 509 47,
aungriah 0:a3b83d366423 510 51,
aungriah 0:a3b83d366423 511 55,
aungriah 0:a3b83d366423 512 58,
aungriah 0:a3b83d366423 513 62,
aungriah 0:a3b83d366423 514 66,
aungriah 0:a3b83d366423 515 71,
aungriah 0:a3b83d366423 516 78,
aungriah 0:a3b83d366423 517 85,
aungriah 0:a3b83d366423 518 96,
aungriah 0:a3b83d366423 519 111,
aungriah 0:a3b83d366423 520 135,
aungriah 0:a3b83d366423 521 194,
aungriah 0:a3b83d366423 522 240,
aungriah 0:a3b83d366423 523 255
aungriah 0:a3b83d366423 524 },
aungriah 0:a3b83d366423 525
aungriah 0:a3b83d366423 526 // Ch 3 - range25cm16PRFnb
aungriah 0:a3b83d366423 527 {
aungriah 0:a3b83d366423 528 1,
aungriah 0:a3b83d366423 529 2,
aungriah 0:a3b83d366423 530 3,
aungriah 0:a3b83d366423 531 4,
aungriah 0:a3b83d366423 532 5,
aungriah 0:a3b83d366423 533 7,
aungriah 0:a3b83d366423 534 8,
aungriah 0:a3b83d366423 535 9,
aungriah 0:a3b83d366423 536 10,
aungriah 0:a3b83d366423 537 12,
aungriah 0:a3b83d366423 538 14,
aungriah 0:a3b83d366423 539 16,
aungriah 0:a3b83d366423 540 18,
aungriah 0:a3b83d366423 541 20,
aungriah 0:a3b83d366423 542 22,
aungriah 0:a3b83d366423 543 24,
aungriah 0:a3b83d366423 544 26,
aungriah 0:a3b83d366423 545 28,
aungriah 0:a3b83d366423 546 31,
aungriah 0:a3b83d366423 547 33,
aungriah 0:a3b83d366423 548 36,
aungriah 0:a3b83d366423 549 39,
aungriah 0:a3b83d366423 550 42,
aungriah 0:a3b83d366423 551 45,
aungriah 0:a3b83d366423 552 49,
aungriah 0:a3b83d366423 553 52,
aungriah 0:a3b83d366423 554 55,
aungriah 0:a3b83d366423 555 59,
aungriah 0:a3b83d366423 556 63,
aungriah 0:a3b83d366423 557 69,
aungriah 0:a3b83d366423 558 76,
aungriah 0:a3b83d366423 559 85,
aungriah 0:a3b83d366423 560 98,
aungriah 0:a3b83d366423 561 120,
aungriah 0:a3b83d366423 562 173,
aungriah 0:a3b83d366423 563 213,
aungriah 0:a3b83d366423 564 255
aungriah 0:a3b83d366423 565 },
aungriah 0:a3b83d366423 566
aungriah 0:a3b83d366423 567 // Ch 5 - range25cm16PRFnb
aungriah 0:a3b83d366423 568 {
aungriah 0:a3b83d366423 569 1,
aungriah 0:a3b83d366423 570 1,
aungriah 0:a3b83d366423 571 2,
aungriah 0:a3b83d366423 572 3,
aungriah 0:a3b83d366423 573 4,
aungriah 0:a3b83d366423 574 5,
aungriah 0:a3b83d366423 575 6,
aungriah 0:a3b83d366423 576 6,
aungriah 0:a3b83d366423 577 7,
aungriah 0:a3b83d366423 578 8,
aungriah 0:a3b83d366423 579 9,
aungriah 0:a3b83d366423 580 11,
aungriah 0:a3b83d366423 581 12,
aungriah 0:a3b83d366423 582 14,
aungriah 0:a3b83d366423 583 15,
aungriah 0:a3b83d366423 584 16,
aungriah 0:a3b83d366423 585 18,
aungriah 0:a3b83d366423 586 20,
aungriah 0:a3b83d366423 587 21,
aungriah 0:a3b83d366423 588 23,
aungriah 0:a3b83d366423 589 25,
aungriah 0:a3b83d366423 590 27,
aungriah 0:a3b83d366423 591 29,
aungriah 0:a3b83d366423 592 31,
aungriah 0:a3b83d366423 593 34,
aungriah 0:a3b83d366423 594 36,
aungriah 0:a3b83d366423 595 38,
aungriah 0:a3b83d366423 596 41,
aungriah 0:a3b83d366423 597 44,
aungriah 0:a3b83d366423 598 48,
aungriah 0:a3b83d366423 599 53,
aungriah 0:a3b83d366423 600 59,
aungriah 0:a3b83d366423 601 68,
aungriah 0:a3b83d366423 602 83,
aungriah 0:a3b83d366423 603 120,
aungriah 0:a3b83d366423 604 148,
aungriah 0:a3b83d366423 605 255
aungriah 0:a3b83d366423 606 }
aungriah 0:a3b83d366423 607 }; // end range25cm16PRFnb
aungriah 0:a3b83d366423 608
aungriah 0:a3b83d366423 609
aungriah 0:a3b83d366423 610 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 611 // range25cm16PRFwb: Range Bias Correction table for wide band channels at 16 MHz PRF, NB: !!!! each MUST END IN 255 !!!!
aungriah 0:a3b83d366423 612 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 613
aungriah 0:a3b83d366423 614 const uint8 range25cm16PRFwb[2][NUM_16M_OFFSETWB] =
aungriah 0:a3b83d366423 615 {
aungriah 0:a3b83d366423 616 // Ch 4 - range25cm16PRFwb
aungriah 0:a3b83d366423 617 {
aungriah 0:a3b83d366423 618 7,
aungriah 0:a3b83d366423 619 7,
aungriah 0:a3b83d366423 620 8,
aungriah 0:a3b83d366423 621 9,
aungriah 0:a3b83d366423 622 9,
aungriah 0:a3b83d366423 623 10,
aungriah 0:a3b83d366423 624 11,
aungriah 0:a3b83d366423 625 11,
aungriah 0:a3b83d366423 626 12,
aungriah 0:a3b83d366423 627 13,
aungriah 0:a3b83d366423 628 14,
aungriah 0:a3b83d366423 629 15,
aungriah 0:a3b83d366423 630 16,
aungriah 0:a3b83d366423 631 17,
aungriah 0:a3b83d366423 632 18,
aungriah 0:a3b83d366423 633 19,
aungriah 0:a3b83d366423 634 20,
aungriah 0:a3b83d366423 635 21,
aungriah 0:a3b83d366423 636 22,
aungriah 0:a3b83d366423 637 23,
aungriah 0:a3b83d366423 638 24,
aungriah 0:a3b83d366423 639 26,
aungriah 0:a3b83d366423 640 27,
aungriah 0:a3b83d366423 641 28,
aungriah 0:a3b83d366423 642 30,
aungriah 0:a3b83d366423 643 31,
aungriah 0:a3b83d366423 644 32,
aungriah 0:a3b83d366423 645 34,
aungriah 0:a3b83d366423 646 36,
aungriah 0:a3b83d366423 647 38,
aungriah 0:a3b83d366423 648 40,
aungriah 0:a3b83d366423 649 42,
aungriah 0:a3b83d366423 650 44,
aungriah 0:a3b83d366423 651 46,
aungriah 0:a3b83d366423 652 48,
aungriah 0:a3b83d366423 653 50,
aungriah 0:a3b83d366423 654 52,
aungriah 0:a3b83d366423 655 55,
aungriah 0:a3b83d366423 656 57,
aungriah 0:a3b83d366423 657 59,
aungriah 0:a3b83d366423 658 61,
aungriah 0:a3b83d366423 659 63,
aungriah 0:a3b83d366423 660 66,
aungriah 0:a3b83d366423 661 68,
aungriah 0:a3b83d366423 662 71,
aungriah 0:a3b83d366423 663 74,
aungriah 0:a3b83d366423 664 78,
aungriah 0:a3b83d366423 665 81,
aungriah 0:a3b83d366423 666 85,
aungriah 0:a3b83d366423 667 89,
aungriah 0:a3b83d366423 668 94,
aungriah 0:a3b83d366423 669 99,
aungriah 0:a3b83d366423 670 104,
aungriah 0:a3b83d366423 671 110,
aungriah 0:a3b83d366423 672 116,
aungriah 0:a3b83d366423 673 123,
aungriah 0:a3b83d366423 674 130,
aungriah 0:a3b83d366423 675 139,
aungriah 0:a3b83d366423 676 150,
aungriah 0:a3b83d366423 677 164,
aungriah 0:a3b83d366423 678 182,
aungriah 0:a3b83d366423 679 207,
aungriah 0:a3b83d366423 680 238,
aungriah 0:a3b83d366423 681 255,
aungriah 0:a3b83d366423 682 255,
aungriah 0:a3b83d366423 683 255,
aungriah 0:a3b83d366423 684 255,
aungriah 0:a3b83d366423 685 255
aungriah 0:a3b83d366423 686 },
aungriah 0:a3b83d366423 687
aungriah 0:a3b83d366423 688 // Ch 7 - range25cm16PRFwb
aungriah 0:a3b83d366423 689 {
aungriah 0:a3b83d366423 690 4,
aungriah 0:a3b83d366423 691 5,
aungriah 0:a3b83d366423 692 5,
aungriah 0:a3b83d366423 693 5,
aungriah 0:a3b83d366423 694 6,
aungriah 0:a3b83d366423 695 6,
aungriah 0:a3b83d366423 696 7,
aungriah 0:a3b83d366423 697 7,
aungriah 0:a3b83d366423 698 7,
aungriah 0:a3b83d366423 699 8,
aungriah 0:a3b83d366423 700 9,
aungriah 0:a3b83d366423 701 9,
aungriah 0:a3b83d366423 702 10,
aungriah 0:a3b83d366423 703 10,
aungriah 0:a3b83d366423 704 11,
aungriah 0:a3b83d366423 705 11,
aungriah 0:a3b83d366423 706 12,
aungriah 0:a3b83d366423 707 13,
aungriah 0:a3b83d366423 708 13,
aungriah 0:a3b83d366423 709 14,
aungriah 0:a3b83d366423 710 15,
aungriah 0:a3b83d366423 711 16,
aungriah 0:a3b83d366423 712 17,
aungriah 0:a3b83d366423 713 17,
aungriah 0:a3b83d366423 714 18,
aungriah 0:a3b83d366423 715 19,
aungriah 0:a3b83d366423 716 20,
aungriah 0:a3b83d366423 717 21,
aungriah 0:a3b83d366423 718 22,
aungriah 0:a3b83d366423 719 23,
aungriah 0:a3b83d366423 720 25,
aungriah 0:a3b83d366423 721 26,
aungriah 0:a3b83d366423 722 27,
aungriah 0:a3b83d366423 723 29,
aungriah 0:a3b83d366423 724 30,
aungriah 0:a3b83d366423 725 31,
aungriah 0:a3b83d366423 726 32,
aungriah 0:a3b83d366423 727 34,
aungriah 0:a3b83d366423 728 35,
aungriah 0:a3b83d366423 729 36,
aungriah 0:a3b83d366423 730 38,
aungriah 0:a3b83d366423 731 39,
aungriah 0:a3b83d366423 732 40,
aungriah 0:a3b83d366423 733 42,
aungriah 0:a3b83d366423 734 44,
aungriah 0:a3b83d366423 735 46,
aungriah 0:a3b83d366423 736 48,
aungriah 0:a3b83d366423 737 50,
aungriah 0:a3b83d366423 738 52,
aungriah 0:a3b83d366423 739 55,
aungriah 0:a3b83d366423 740 58,
aungriah 0:a3b83d366423 741 61,
aungriah 0:a3b83d366423 742 64,
aungriah 0:a3b83d366423 743 68,
aungriah 0:a3b83d366423 744 72,
aungriah 0:a3b83d366423 745 75,
aungriah 0:a3b83d366423 746 80,
aungriah 0:a3b83d366423 747 85,
aungriah 0:a3b83d366423 748 92,
aungriah 0:a3b83d366423 749 101,
aungriah 0:a3b83d366423 750 112,
aungriah 0:a3b83d366423 751 127,
aungriah 0:a3b83d366423 752 147,
aungriah 0:a3b83d366423 753 168,
aungriah 0:a3b83d366423 754 182,
aungriah 0:a3b83d366423 755 194,
aungriah 0:a3b83d366423 756 205,
aungriah 0:a3b83d366423 757 255
aungriah 0:a3b83d366423 758 }
aungriah 0:a3b83d366423 759 }; // end range25cm16PRFwb
aungriah 0:a3b83d366423 760
aungriah 0:a3b83d366423 761 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 762 // range25cm64PRFnb: Range Bias Correction table for narrow band channels at 64 MHz PRF, NB: !!!! each MUST END IN 255 !!!!
aungriah 0:a3b83d366423 763 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 764
aungriah 0:a3b83d366423 765 const uint8 range25cm64PRFnb[4][NUM_64M_OFFSET] =
aungriah 0:a3b83d366423 766 {
aungriah 0:a3b83d366423 767 // Ch 1 - range25cm64PRFnb
aungriah 0:a3b83d366423 768 {
aungriah 0:a3b83d366423 769 1,
aungriah 0:a3b83d366423 770 2,
aungriah 0:a3b83d366423 771 2,
aungriah 0:a3b83d366423 772 3,
aungriah 0:a3b83d366423 773 4,
aungriah 0:a3b83d366423 774 5,
aungriah 0:a3b83d366423 775 7,
aungriah 0:a3b83d366423 776 10,
aungriah 0:a3b83d366423 777 13,
aungriah 0:a3b83d366423 778 16,
aungriah 0:a3b83d366423 779 19,
aungriah 0:a3b83d366423 780 22,
aungriah 0:a3b83d366423 781 24,
aungriah 0:a3b83d366423 782 27,
aungriah 0:a3b83d366423 783 30,
aungriah 0:a3b83d366423 784 32,
aungriah 0:a3b83d366423 785 35,
aungriah 0:a3b83d366423 786 38,
aungriah 0:a3b83d366423 787 43,
aungriah 0:a3b83d366423 788 48,
aungriah 0:a3b83d366423 789 56,
aungriah 0:a3b83d366423 790 78,
aungriah 0:a3b83d366423 791 101,
aungriah 0:a3b83d366423 792 120,
aungriah 0:a3b83d366423 793 157,
aungriah 0:a3b83d366423 794 255
aungriah 0:a3b83d366423 795 },
aungriah 0:a3b83d366423 796
aungriah 0:a3b83d366423 797 // Ch 2 - range25cm64PRFnb
aungriah 0:a3b83d366423 798 {
aungriah 0:a3b83d366423 799 1,
aungriah 0:a3b83d366423 800 2,
aungriah 0:a3b83d366423 801 2,
aungriah 0:a3b83d366423 802 3,
aungriah 0:a3b83d366423 803 4,
aungriah 0:a3b83d366423 804 4,
aungriah 0:a3b83d366423 805 6,
aungriah 0:a3b83d366423 806 9,
aungriah 0:a3b83d366423 807 12,
aungriah 0:a3b83d366423 808 14,
aungriah 0:a3b83d366423 809 17,
aungriah 0:a3b83d366423 810 19,
aungriah 0:a3b83d366423 811 21,
aungriah 0:a3b83d366423 812 24,
aungriah 0:a3b83d366423 813 26,
aungriah 0:a3b83d366423 814 28,
aungriah 0:a3b83d366423 815 31,
aungriah 0:a3b83d366423 816 33,
aungriah 0:a3b83d366423 817 37,
aungriah 0:a3b83d366423 818 42,
aungriah 0:a3b83d366423 819 49,
aungriah 0:a3b83d366423 820 68,
aungriah 0:a3b83d366423 821 89,
aungriah 0:a3b83d366423 822 105,
aungriah 0:a3b83d366423 823 138,
aungriah 0:a3b83d366423 824 255
aungriah 0:a3b83d366423 825 },
aungriah 0:a3b83d366423 826
aungriah 0:a3b83d366423 827 // Ch 3 - range25cm64PRFnb
aungriah 0:a3b83d366423 828 {
aungriah 0:a3b83d366423 829 1,
aungriah 0:a3b83d366423 830 1,
aungriah 0:a3b83d366423 831 2,
aungriah 0:a3b83d366423 832 3,
aungriah 0:a3b83d366423 833 3,
aungriah 0:a3b83d366423 834 4,
aungriah 0:a3b83d366423 835 5,
aungriah 0:a3b83d366423 836 8,
aungriah 0:a3b83d366423 837 10,
aungriah 0:a3b83d366423 838 13,
aungriah 0:a3b83d366423 839 15,
aungriah 0:a3b83d366423 840 17,
aungriah 0:a3b83d366423 841 19,
aungriah 0:a3b83d366423 842 21,
aungriah 0:a3b83d366423 843 23,
aungriah 0:a3b83d366423 844 25,
aungriah 0:a3b83d366423 845 27,
aungriah 0:a3b83d366423 846 30,
aungriah 0:a3b83d366423 847 33,
aungriah 0:a3b83d366423 848 37,
aungriah 0:a3b83d366423 849 44,
aungriah 0:a3b83d366423 850 60,
aungriah 0:a3b83d366423 851 79,
aungriah 0:a3b83d366423 852 93,
aungriah 0:a3b83d366423 853 122,
aungriah 0:a3b83d366423 854 255
aungriah 0:a3b83d366423 855 },
aungriah 0:a3b83d366423 856
aungriah 0:a3b83d366423 857 // Ch 5 - range25cm64PRFnb
aungriah 0:a3b83d366423 858 {
aungriah 0:a3b83d366423 859 1,
aungriah 0:a3b83d366423 860 1,
aungriah 0:a3b83d366423 861 1,
aungriah 0:a3b83d366423 862 2,
aungriah 0:a3b83d366423 863 2,
aungriah 0:a3b83d366423 864 3,
aungriah 0:a3b83d366423 865 4,
aungriah 0:a3b83d366423 866 6,
aungriah 0:a3b83d366423 867 7,
aungriah 0:a3b83d366423 868 9,
aungriah 0:a3b83d366423 869 10,
aungriah 0:a3b83d366423 870 12,
aungriah 0:a3b83d366423 871 13,
aungriah 0:a3b83d366423 872 15,
aungriah 0:a3b83d366423 873 16,
aungriah 0:a3b83d366423 874 17,
aungriah 0:a3b83d366423 875 19,
aungriah 0:a3b83d366423 876 21,
aungriah 0:a3b83d366423 877 23,
aungriah 0:a3b83d366423 878 26,
aungriah 0:a3b83d366423 879 30,
aungriah 0:a3b83d366423 880 42,
aungriah 0:a3b83d366423 881 55,
aungriah 0:a3b83d366423 882 65,
aungriah 0:a3b83d366423 883 85,
aungriah 0:a3b83d366423 884 255
aungriah 0:a3b83d366423 885 }
aungriah 0:a3b83d366423 886 }; // end range25cm64PRFnb
aungriah 0:a3b83d366423 887
aungriah 0:a3b83d366423 888 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 889 // range25cm64PRFwb: Range Bias Correction table for wide band channels at 64 MHz PRF, NB: !!!! each MUST END IN 255 !!!!
aungriah 0:a3b83d366423 890 //---------------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 891
aungriah 0:a3b83d366423 892 const uint8 range25cm64PRFwb[2][NUM_64M_OFFSETWB] =
aungriah 0:a3b83d366423 893 {
aungriah 0:a3b83d366423 894 // Ch 4 - range25cm64PRFwb
aungriah 0:a3b83d366423 895 {
aungriah 0:a3b83d366423 896 7,
aungriah 0:a3b83d366423 897 8,
aungriah 0:a3b83d366423 898 8,
aungriah 0:a3b83d366423 899 9,
aungriah 0:a3b83d366423 900 9,
aungriah 0:a3b83d366423 901 10,
aungriah 0:a3b83d366423 902 11,
aungriah 0:a3b83d366423 903 12,
aungriah 0:a3b83d366423 904 13,
aungriah 0:a3b83d366423 905 13,
aungriah 0:a3b83d366423 906 14,
aungriah 0:a3b83d366423 907 15,
aungriah 0:a3b83d366423 908 16,
aungriah 0:a3b83d366423 909 16,
aungriah 0:a3b83d366423 910 17,
aungriah 0:a3b83d366423 911 18,
aungriah 0:a3b83d366423 912 19,
aungriah 0:a3b83d366423 913 19,
aungriah 0:a3b83d366423 914 20,
aungriah 0:a3b83d366423 915 21,
aungriah 0:a3b83d366423 916 22,
aungriah 0:a3b83d366423 917 24,
aungriah 0:a3b83d366423 918 25,
aungriah 0:a3b83d366423 919 27,
aungriah 0:a3b83d366423 920 28,
aungriah 0:a3b83d366423 921 29,
aungriah 0:a3b83d366423 922 30,
aungriah 0:a3b83d366423 923 32,
aungriah 0:a3b83d366423 924 33,
aungriah 0:a3b83d366423 925 34,
aungriah 0:a3b83d366423 926 35,
aungriah 0:a3b83d366423 927 37,
aungriah 0:a3b83d366423 928 39,
aungriah 0:a3b83d366423 929 41,
aungriah 0:a3b83d366423 930 43,
aungriah 0:a3b83d366423 931 45,
aungriah 0:a3b83d366423 932 48,
aungriah 0:a3b83d366423 933 50,
aungriah 0:a3b83d366423 934 53,
aungriah 0:a3b83d366423 935 56,
aungriah 0:a3b83d366423 936 60,
aungriah 0:a3b83d366423 937 64,
aungriah 0:a3b83d366423 938 68,
aungriah 0:a3b83d366423 939 74,
aungriah 0:a3b83d366423 940 81,
aungriah 0:a3b83d366423 941 89,
aungriah 0:a3b83d366423 942 98,
aungriah 0:a3b83d366423 943 109,
aungriah 0:a3b83d366423 944 122,
aungriah 0:a3b83d366423 945 136,
aungriah 0:a3b83d366423 946 146,
aungriah 0:a3b83d366423 947 154,
aungriah 0:a3b83d366423 948 162,
aungriah 0:a3b83d366423 949 178,
aungriah 0:a3b83d366423 950 220,
aungriah 0:a3b83d366423 951 249,
aungriah 0:a3b83d366423 952 255,
aungriah 0:a3b83d366423 953 255,
aungriah 0:a3b83d366423 954 255
aungriah 0:a3b83d366423 955 },
aungriah 0:a3b83d366423 956
aungriah 0:a3b83d366423 957 // Ch 7 - range25cm64PRFwb
aungriah 0:a3b83d366423 958 {
aungriah 0:a3b83d366423 959 4,
aungriah 0:a3b83d366423 960 5,
aungriah 0:a3b83d366423 961 5,
aungriah 0:a3b83d366423 962 5,
aungriah 0:a3b83d366423 963 6,
aungriah 0:a3b83d366423 964 6,
aungriah 0:a3b83d366423 965 7,
aungriah 0:a3b83d366423 966 7,
aungriah 0:a3b83d366423 967 8,
aungriah 0:a3b83d366423 968 8,
aungriah 0:a3b83d366423 969 9,
aungriah 0:a3b83d366423 970 9,
aungriah 0:a3b83d366423 971 10,
aungriah 0:a3b83d366423 972 10,
aungriah 0:a3b83d366423 973 10,
aungriah 0:a3b83d366423 974 11,
aungriah 0:a3b83d366423 975 11,
aungriah 0:a3b83d366423 976 12,
aungriah 0:a3b83d366423 977 13,
aungriah 0:a3b83d366423 978 13,
aungriah 0:a3b83d366423 979 14,
aungriah 0:a3b83d366423 980 15,
aungriah 0:a3b83d366423 981 16,
aungriah 0:a3b83d366423 982 16,
aungriah 0:a3b83d366423 983 17,
aungriah 0:a3b83d366423 984 18,
aungriah 0:a3b83d366423 985 19,
aungriah 0:a3b83d366423 986 19,
aungriah 0:a3b83d366423 987 20,
aungriah 0:a3b83d366423 988 21,
aungriah 0:a3b83d366423 989 22,
aungriah 0:a3b83d366423 990 23,
aungriah 0:a3b83d366423 991 24,
aungriah 0:a3b83d366423 992 25,
aungriah 0:a3b83d366423 993 26,
aungriah 0:a3b83d366423 994 28,
aungriah 0:a3b83d366423 995 29,
aungriah 0:a3b83d366423 996 31,
aungriah 0:a3b83d366423 997 33,
aungriah 0:a3b83d366423 998 35,
aungriah 0:a3b83d366423 999 37,
aungriah 0:a3b83d366423 1000 39,
aungriah 0:a3b83d366423 1001 42,
aungriah 0:a3b83d366423 1002 46,
aungriah 0:a3b83d366423 1003 50,
aungriah 0:a3b83d366423 1004 54,
aungriah 0:a3b83d366423 1005 60,
aungriah 0:a3b83d366423 1006 67,
aungriah 0:a3b83d366423 1007 75,
aungriah 0:a3b83d366423 1008 83,
aungriah 0:a3b83d366423 1009 90,
aungriah 0:a3b83d366423 1010 95,
aungriah 0:a3b83d366423 1011 100,
aungriah 0:a3b83d366423 1012 110,
aungriah 0:a3b83d366423 1013 135,
aungriah 0:a3b83d366423 1014 153,
aungriah 0:a3b83d366423 1015 172,
aungriah 0:a3b83d366423 1016 192,
aungriah 0:a3b83d366423 1017 255
aungriah 0:a3b83d366423 1018 }
aungriah 0:a3b83d366423 1019 }; // end range25cm64PRFwb
aungriah 0:a3b83d366423 1020
aungriah 0:a3b83d366423 1021
aungriah 0:a3b83d366423 1022 /*! ------------------------------------------------------------------------------------------------------------------
aungriah 0:a3b83d366423 1023 * @fn dwt_getrangebias()
aungriah 0:a3b83d366423 1024 *
aungriah 0:a3b83d366423 1025 * @brief This function is used to return the range bias correction need for TWR with DW1000 units.
aungriah 0:a3b83d366423 1026 *
aungriah 0:a3b83d366423 1027 * input parameters:
aungriah 0:a3b83d366423 1028 * @param chan - specifies the operating channel (e.g. 1, 2, 3, 4, 5, 6 or 7)
aungriah 0:a3b83d366423 1029 * @param range - the calculated distance before correction
aungriah 0:a3b83d366423 1030 * @param prf - this is the PRF e.g. DWT_PRF_16M or DWT_PRF_64M
aungriah 0:a3b83d366423 1031 *
aungriah 0:a3b83d366423 1032 * output parameters
aungriah 0:a3b83d366423 1033 *
aungriah 0:a3b83d366423 1034 * returns correction needed in meters
aungriah 0:a3b83d366423 1035 */
aungriah 0:a3b83d366423 1036 double dwt_getrangebias(uint8 chan, float range, uint8 prf)
aungriah 0:a3b83d366423 1037 {
aungriah 0:a3b83d366423 1038 // First get the lookup index that corresponds to given range for a particular channel at 16M PRF
aungriah 0:a3b83d366423 1039 int i = 0 ;
aungriah 0:a3b83d366423 1040 int chanIdx ;
aungriah 0:a3b83d366423 1041 int cmoffseti ; // Integer number of CM offset
aungriah 0:a3b83d366423 1042
aungriah 0:a3b83d366423 1043 double mOffset ; // Final offset result in metres
aungriah 0:a3b83d366423 1044
aungriah 0:a3b83d366423 1045 // NB: note we may get some small negitive values e.g. up to -50 cm.
aungriah 0:a3b83d366423 1046
aungriah 0:a3b83d366423 1047 int rangeint25cm = (int) (range * 4.00f) ; // Convert range to integer number of 25cm values.
aungriah 0:a3b83d366423 1048
aungriah 0:a3b83d366423 1049 if (rangeint25cm > 255) rangeint25cm = 255 ; // Make sure it matches largest value in table (all tables end in 255 !!!!)
aungriah 0:a3b83d366423 1050
aungriah 0:a3b83d366423 1051 if (prf == DWT_PRF_16M)
aungriah 0:a3b83d366423 1052 {
aungriah 0:a3b83d366423 1053 switch(chan)
aungriah 0:a3b83d366423 1054 {
aungriah 0:a3b83d366423 1055 case 4:
aungriah 0:a3b83d366423 1056 case 7:
aungriah 0:a3b83d366423 1057 {
aungriah 0:a3b83d366423 1058 chanIdx = chan_idxwb[chan];
aungriah 0:a3b83d366423 1059 while (rangeint25cm > range25cm16PRFwb[chanIdx][i]) i++ ; // Find index in table corresponding to range
aungriah 0:a3b83d366423 1060 cmoffseti = i + CM_OFFSET_16M_WB ; // Nearest centimetre correction
aungriah 0:a3b83d366423 1061 }
aungriah 0:a3b83d366423 1062 break;
aungriah 0:a3b83d366423 1063 default:
aungriah 0:a3b83d366423 1064 {
aungriah 0:a3b83d366423 1065 chanIdx = chan_idxnb[chan];
aungriah 0:a3b83d366423 1066 while (rangeint25cm > range25cm16PRFnb[chanIdx][i]) i++ ; // Find index in table corresponding to range
aungriah 0:a3b83d366423 1067 cmoffseti = i + CM_OFFSET_16M_NB ; // Nearest centimetre correction
aungriah 0:a3b83d366423 1068 }
aungriah 0:a3b83d366423 1069 }//end of switch
aungriah 0:a3b83d366423 1070 }
aungriah 0:a3b83d366423 1071 else // 64M PRF
aungriah 0:a3b83d366423 1072 {
aungriah 0:a3b83d366423 1073 switch(chan)
aungriah 0:a3b83d366423 1074 {
aungriah 0:a3b83d366423 1075 case 4:
aungriah 0:a3b83d366423 1076 case 7:
aungriah 0:a3b83d366423 1077 {
aungriah 0:a3b83d366423 1078 chanIdx = chan_idxwb[chan];
aungriah 0:a3b83d366423 1079 while (rangeint25cm > range25cm64PRFwb[chanIdx][i]) i++ ; // Find index in table corresponding to range
aungriah 0:a3b83d366423 1080 cmoffseti = i + CM_OFFSET_64M_WB ; // Nearest centimetre correction
aungriah 0:a3b83d366423 1081 }
aungriah 0:a3b83d366423 1082 break;
aungriah 0:a3b83d366423 1083 default:
aungriah 0:a3b83d366423 1084 {
aungriah 0:a3b83d366423 1085 chanIdx = chan_idxnb[chan];
aungriah 0:a3b83d366423 1086 while (rangeint25cm > range25cm64PRFnb[chanIdx][i]) i++ ; // Find index in table corresponding to range
aungriah 0:a3b83d366423 1087 cmoffseti = i + CM_OFFSET_64M_NB ; // Nearest centimetre correction
aungriah 0:a3b83d366423 1088 }
aungriah 0:a3b83d366423 1089 }//end of switch
aungriah 0:a3b83d366423 1090 } // end else
aungriah 0:a3b83d366423 1091
aungriah 0:a3b83d366423 1092
aungriah 0:a3b83d366423 1093 mOffset = (float) cmoffseti ; // Offset result in centimetres
aungriah 0:a3b83d366423 1094
aungriah 0:a3b83d366423 1095 mOffset *= 0.01 ; // Convert to metres
aungriah 0:a3b83d366423 1096
aungriah 0:a3b83d366423 1097 return (mOffset) ;
aungriah 0:a3b83d366423 1098 }
aungriah 0:a3b83d366423 1099
aungriah 0:a3b83d366423 1100