Alejandro Ungria Hirte / GA-Test

Dependencies:   mbed-dev

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

Who changed what in which revision?

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