Revision 26dead12

View differences:

include/DW1000/v1/alld_dw1000_v1.h
62 62
#define NUM_CH_SUPPORTED 8  //supported channels are '0', 1, 2, 3, 4, 5, '6', 7
63 63
#define PCODES 25           //supported preamble codes
64 64

  
65
#define NUM_16M_OFFSET  (37)
66
#define NUM_16M_OFFSETWB  (68)
67
#define NUM_64M_OFFSET  (26)
68
#define NUM_64M_OFFSETWB  (59)
69

  
70
#define SPIBUFFLEN     (32)
71

  
72

  
65 73
extern const uint8_t chan_idx[NUM_CH_SUPPORTED];
74
extern const uint16_t lde_replicaCoeff[PCODES];
75
extern const uint8_t chan_idxnb[NUM_CH_SUPPORTED];
76
extern const uint8_t chan_idxwb[NUM_CH_SUPPORTED];
77
extern const uint8_t range25cm16PRFnb[4][NUM_16M_OFFSET];
78
extern const uint8_t range25cm16PRFwb[2][NUM_16M_OFFSETWB];
79
extern const uint8_t range25cm64PRFnb[4][NUM_64M_OFFSET];
80
extern const uint8_t range25cm64PRFwb[2][NUM_64M_OFFSETWB];
66 81

  
67 82

  
68 83
/**
......
74 89
  const apalControlGpio_t* gpio_reset;  /**< @brief The GPIO indicating reset sig*/
75 90
//  const apalGpio_t* gpio_exti;    /**< @brief The GPIO indicating external interrupt */
76 91
//  const apalGpio_t* gpio_reset;  /**< @brief The GPIO indicating reset sig*/
77
  /* TODO: better apalControlGpio_t instead of apalGpio_t ? */
78
  /* TODO: EXTI, GPIO (RESET) */
79 92
} DW1000Driver;
80 93

  
81 94

  
......
238 251
    uint8_t nsSFD ;          //!< Boolean should we use non-standard SFD for better performance
239 252
    uint8_t dataRate ;       //!< Data Rate {DWT_BR_110K, DWT_BR_850K or DWT_BR_6M8}
240 253
    uint8_t phrMode ;        //!< PHR mode {0x0 - standard DWT_PHRMODE_STD, 0x3 - extended frames DWT_PHRMODE_EXT}
241
    uint8_t smartPowerEn ;  //!< Smart Power enable / disable (TODO: Added smartPowerEn in this struct )
254
    uint8_t smartPowerEn ;  //!< Smart Power enable / disable
242 255
    uint16_t sfdTO ;         //!< SFD timeout value (in symbols)    
243 256
} dwt_config_t ;
244 257

  
......
477 490
 *
478 491
 * returns DWT_SUCCESS for success, or DWT_ERROR for error
479 492
 */
480
//int dwt_initialise(uint16_t config) ;   // TODO
481 493
int dwt_initialise(uint16_t config, DW1000Driver* drv) ;
482 494

  
483 495
/*! ------------------------------------------------------------------------------------------------------------------
include/DW1000/v1/deca_instance_v1.h
151 151
#define RX_RESPONSE1_TURNAROUND_6M81 (300) //takes about 100 us for response to come back
152 152
#define RX_RESPONSE1_TURNAROUND_110K (300) //takes about 100 us for response to come back
153 153

  
154
  /* For TAG HAL F1 */
155
  //#define RX_RESPONSE1_TURNAROUND (200) //takes about 200 us for the 1st response to come back (from A0)
156
  //#define RX_RESPONSE1_TURNAROUND_6M81 (300) //takes about 100 us for response to come back
157
  //#define RX_RESPONSE1_TURNAROUND_110K (18700) //takes about 100 us for response to come back
158

  
159
  /* For ANCHOR HAL F1 */
160
  //#define RX_RESPONSE1_TURNAROUND (300) //takes about 200 us for the 1st response to come back (from A0)
161
  //#define RX_RESPONSE1_TURNAROUND_6M81 (300) //takes about 100 us for response to come back
162
  //#define RX_RESPONSE1_TURNAROUND_110K (4700) //takes about 100 us for response to come back
163

  
164 154
  //Tag will range to 3 or 4 anchors
165 155
  //Each ranging exchange will consist of minimum of 3 messages (Poll, Response, Final)
166 156
  //and a maximum of 6 messages (Poll, Response x 4, Final)
......
248 238
    uint8_t fcs[2] ;                              	//  125-126  we allow space for the CRC as it is logically part of the message. However ScenSor TX calculates and adds these bytes.
249 239
  } srd_msg_dssl ;
250 240

  
251
  typedef struct
241
  typedef struct  __attribute__((packed))
252 242
  {
253 243
    uint8_t channelNumber ;       // valid range is 1 to 11
254 244
    uint8_t preambleCode ;        // 00 = use NS code, 1 to 24 selects code
......
279 269
  //in turn and the event queued up before the instance processed the TX event.
280 270
#define MAX_EVENT_NUMBER (6)
281 271

  
282
  typedef struct
272
  typedef struct  __attribute__((packed))
283 273
  {
284 274
    uint8_t  type;			// event type - if 0 there is no event in the queue
285 275
    uint8_t  type_save;		// holds the event type - does not clear (used to show what event has been processed)
......
307 297
    uint8_t gotit;			//stores the instance function which processed the event (used for debug)
308 298
  }event_data_t ;
309 299

  
310
extern event_data_t dw_event_g;   // TODO
300
extern event_data_t dw_event_g;
311 301

  
312 302
  // TX power and PG delay configuration structure
313
  typedef struct {
303
  typedef struct  __attribute__((packed)) {
314 304
    uint8_t PGdelay;
315 305

  
316 306
    //TX POWER
......
321 311
    uint32_t txPwr[2]; //
322 312
  }tx_struct;
323 313

  
324
  typedef struct
314
  typedef struct __attribute__((packed))
325 315
  {
326 316
    INST_MODE mode;				//instance mode (tag or anchor)
327 317

  
......
426 416
    int newRange;			//flag set when there is a new range to report TOF_REPORT_A2A or TOF_REPORT_T2A
427 417
    int newRangeAncAddress; //last 4 bytes of anchor address - used for printing/range output display
428 418
    int newRangeTagAddress; //last 4 bytes of tag address - used for printing/range output display
429
    int newRangeTime;
419
    uint32_t newRangeTime;
430 420

  
431 421
    uint8_t gatewayAnchor ; //set to TRUE = 1 if anchor address == GATEWAY_ANCHOR_ADDR
432 422

  
......
470 460
  void instance_close(void);
471 461
  // Call init, then call config, then call run. call close when finished
472 462
  // initialise the instance (application) structures and DW1000 device
473
//  int instance_init(void);
474
  int instance_init(DW1000Driver* drv);     //TODO
463
  int instance_init(DW1000Driver* drv);
475 464

  
476 465
  // configure the instance and DW1000 device
477 466
  void instance_config(instanceConfig_t *config, sfConfig_t *sfconfig, DW1000Driver* drv) ;
......
490 479
  // configure TX/RX callback functions that are called from DW1000 ISR
491 480
  void instance_rxcallback(const dwt_cb_data_t *rxd);
492 481
  void instance_txcallback(const dwt_cb_data_t *txd);
493
  /*TODO: add callbacks */
494 482
  void instance_rxtimeoutcallback(const dwt_cb_data_t *rxd);
495 483
  void instance_rxerrorcallback(const dwt_cb_data_t *rxd);
496 484

  
......
525 513
  int instancenewrangetagadd(void);
526 514
  int instancenewrangepolltim(void);
527 515
  int instancenewrange(void);
528
  int instancenewrangetim(void);
516
  uint32_t instancenewrangetim(void);
529 517

  
530 518
  uint64_t convertmicrosectodevicetimeu (double microsecu);
531 519
  double convertdevicetimetosec(int32_t dt);
......
562 550

  
563 551
  void instance_notify_DW1000_inIDLE(int idle);
564 552

  
565

  
566
  // TODO: The following Functions are added in user applciation (previously on the API )
567

  
568 553
  double dwt_getrangebias(uint8_t chan, float range, uint8_t prf);
569 554

  
570 555
  uint32_t dwt_getotptxpower(uint8_t prf, uint8_t chan);
......
573 558

  
574 559
  uint16_t dwt_readantennadelay(uint8_t prf);
575 560

  
576

  
577
  /* End of user application functions (Previously on API) */
578

  
579

  
580 561
  // configure TX power
581 562
  void instanceconfigtxpower(uint32_t txpower);
582 563
  void instancesettxpower(void);
source/DW1000/v1/alld_dw1000_v1.c
32 32
#if (defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1)) || defined(__DOXYGEN__)
33 33

  
34 34
#include <v1/alld_dw1000_regs_v1.h>
35
#include <aos_thread.h>
36 35
#include <assert.h>
37 36
#include <string.h>
38 37
#include <stdlib.h>
......
241 240
};
242 241

  
243 242

  
244
#define NUM_16M_OFFSET  (37)
245
#define NUM_16M_OFFSETWB  (68)
246
#define NUM_64M_OFFSET  (26)
247
#define NUM_64M_OFFSETWB  (59)
248

  
249 243
const uint8_t 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
250 244
const uint8_t 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
251 245

  
......
845 839
}; // end range25cm64PRFwb
846 840

  
847 841

  
848

  
849

  
850

  
851 842
/*! ------------------------------------------------------------------------------------------------------------------
852 843
 * Function: dwt_getrangebias()
853 844
 *
......
873 864

  
874 865
    // NB: note we may get some small negitive values e.g. up to -50 cm.
875 866

  
876
    int rangeint25cm = (int) (range * 4.00) ;       // convert range to integer number of 25cm values.
867
    int rangeint25cm = (int) ((double)range * 4.00) ;       // convert range to integer number of 25cm values.
877 868

  
878 869
    if (rangeint25cm > 255) rangeint25cm = 255 ;    // make sure it matches largest value in table (all tables end in 255 !!!!)
879 870

  
......
919 910
    } // end else
920 911

  
921 912

  
922
    mOffset = (float) cmoffseti ;                                       // offset result in centimmetres
913
    mOffset = (double) cmoffseti ;                                       // offset result in centimmetres
923 914

  
924 915
    mOffset *= 0.01 ;                                                   // convert to metres
925 916

  
926 917
    return (mOffset) ;
927 918
}
928 919

  
929

  
930

  
931 920
// -------------------------------------------------------------------------------------------------------------------
932 921
//
933 922
// Internal functions for controlling and configuring the device
......
943 932
// Read non-volatile memory
944 933
uint32_t _dwt_otpread(uint32_t address);
945 934
// Program the non-volatile memory
946
uint32_t _dwt_otpprogword32(uint32_t data, uint16_t address);
935
int32_t _dwt_otpprogword32(uint32_t data, uint16_t address);
947 936
// Upload the device configuration into always on memory
948 937
void _dwt_aonarrayupload(void);
949 938
// -------------------------------------------------------------------------------------------------------------------
......
1025 1014
    pdw1000local->cbRxTo = NULL;
1026 1015
    pdw1000local->cbRxErr = NULL;
1027 1016

  
1028
    pdw1000local->driver = drv;  // TODO:
1017
    pdw1000local->driver = drv;
1029 1018

  
1030 1019
    // Read and validate device ID return -1 if not recognised
1031 1020
    if (DWT_DEVICE_ID != dwt_readdevid()) // MP IC ONLY (i.e. DW1000) FOR THIS CODE
......
1346 1335
    pdw1000local->longFrames = config->phrMode ;
1347 1336

  
1348 1337
    pdw1000local->sysCFGreg &= ~SYS_CFG_PHR_MODE_11;
1349
    pdw1000local->sysCFGreg |= (SYS_CFG_PHR_MODE_11 & (config->phrMode << SYS_CFG_PHR_MODE_SHFT));
1338
    pdw1000local->sysCFGreg |= (SYS_CFG_PHR_MODE_11 & (uint32_t)(config->phrMode << SYS_CFG_PHR_MODE_SHFT));
1350 1339

  
1351 1340
    dwt_write32bitreg(SYS_CFG_ID,pdw1000local->sysCFGreg) ;
1352 1341
    // Set the lde_replicaCoeff
......
1413 1402
        nsSfd_result = 3 ;
1414 1403
        useDWnsSFD = 1 ;
1415 1404
    }
1416
    regval =  (CHAN_CTRL_TX_CHAN_MASK & (chan << CHAN_CTRL_TX_CHAN_SHIFT)) | // Transmit Channel
1417
              (CHAN_CTRL_RX_CHAN_MASK & (chan << CHAN_CTRL_RX_CHAN_SHIFT)) | // Receive Channel
1418
              (CHAN_CTRL_RXFPRF_MASK & (config->prf << CHAN_CTRL_RXFPRF_SHIFT)) | // RX PRF
1419
              ((CHAN_CTRL_TNSSFD|CHAN_CTRL_RNSSFD) & (nsSfd_result << CHAN_CTRL_TNSSFD_SHIFT)) | // nsSFD enable RX&TX
1420
              (CHAN_CTRL_DWSFD & (useDWnsSFD << CHAN_CTRL_DWSFD_SHIFT)) | // Use DW nsSFD
1421
              (CHAN_CTRL_TX_PCOD_MASK & (config->txCode << CHAN_CTRL_TX_PCOD_SHIFT)) | // TX Preamble Code
1422
              (CHAN_CTRL_RX_PCOD_MASK & (config->rxCode << CHAN_CTRL_RX_PCOD_SHIFT)) ; // RX Preamble Code
1405
    regval =  (CHAN_CTRL_TX_CHAN_MASK & (uint32_t)(chan << CHAN_CTRL_TX_CHAN_SHIFT)) | // Transmit Channel
1406
              (CHAN_CTRL_RX_CHAN_MASK & (uint32_t)(chan << CHAN_CTRL_RX_CHAN_SHIFT)) | // Receive Channel
1407
              (CHAN_CTRL_RXFPRF_MASK & (uint32_t)(config->prf << CHAN_CTRL_RXFPRF_SHIFT)) | // RX PRF
1408
              ((CHAN_CTRL_TNSSFD|CHAN_CTRL_RNSSFD) & (uint32_t)(nsSfd_result << CHAN_CTRL_TNSSFD_SHIFT)) | // nsSFD enable RX&TX
1409
              (CHAN_CTRL_DWSFD & (uint32_t)(useDWnsSFD << CHAN_CTRL_DWSFD_SHIFT)) | // Use DW nsSFD
1410
              (CHAN_CTRL_TX_PCOD_MASK & (uint32_t)(config->txCode << CHAN_CTRL_TX_PCOD_SHIFT)) | // TX Preamble Code
1411
              (CHAN_CTRL_RX_PCOD_MASK & (uint32_t)(config->rxCode << CHAN_CTRL_RX_PCOD_SHIFT)) ; // RX Preamble Code
1423 1412

  
1424 1413
    dwt_write32bitreg(CHAN_CTRL_ID,regval) ;
1425 1414

  
1426 1415
    // Set up TX Preamble Size, PRF and Data Rate
1427
    pdw1000local->txFCTRL = ((config->txPreambLength | config->prf) << TX_FCTRL_TXPRF_SHFT) | (config->dataRate << TX_FCTRL_TXBR_SHFT);
1416
    pdw1000local->txFCTRL = (uint32_t)(((config->txPreambLength | config->prf) << TX_FCTRL_TXPRF_SHFT) | (config->dataRate << TX_FCTRL_TXBR_SHFT));
1428 1417
    dwt_write32bitreg(TX_FCTRL_ID, pdw1000local->txFCTRL);
1429 1418

  
1430 1419
    // The SFD transmit pattern is initialised by the DW1000 upon a user TX request, but (due to an IC issue) it is not done for an auto-ACK TX. The
......
1538 1527

  
1539 1528
    // Write the frame length to the TX frame control register
1540 1529
    // pdw1000local->txFCTRL has kept configured bit rate information
1541
    uint32_t reg32 = pdw1000local->txFCTRL | txFrameLength | (txBufferOffset << TX_FCTRL_TXBOFFS_SHFT) | (ranging << TX_FCTRL_TR_SHFT);
1530
    uint32_t reg32 = pdw1000local->txFCTRL | txFrameLength | (uint16_t)(txBufferOffset << TX_FCTRL_TXBOFFS_SHFT) | (uint16_t)(ranging << TX_FCTRL_TR_SHFT);
1542 1531
    dwt_write32bitreg(TX_FCTRL_ID, reg32);
1543 1532
} // end dwt_writetxfctrl()
1544 1533

  
......
1789 1778
    // Write message header selecting WRITE operation and addresses as appropriate (this is one to three bytes long)
1790 1779
    if (index == 0) // For index of 0, no sub-index is required
1791 1780
    {
1792
        header[cnt++] = 0x80 | recordNumber ; // Bit-7 is WRITE operation, bit-6 zero=NO sub-addressing, bits 5-0 is reg file id
1781
        header[cnt++] = 0x80 | (uint8_t)recordNumber ; // Bit-7 is WRITE operation, bit-6 zero=NO sub-addressing, bits 5-0 is reg file id
1793 1782
    }
1794 1783
    else
1795 1784
    {
1796 1785
#ifdef DWT_API_ERROR_CHECK
1797 1786
        assert((index <= 0x7FFF) && ((index + length) <= 0x7FFF)); // Index and sub-addressable area are limited to 15-bits.
1798 1787
#endif
1799
        header[cnt++] = 0xC0 | recordNumber ; // Bit-7 is WRITE operation, bit-6 one=sub-address follows, bits 5-0 is reg file id
1788
        header[cnt++] = 0xC0 | (uint8_t)recordNumber ; // Bit-7 is WRITE operation, bit-6 one=sub-address follows, bits 5-0 is reg file id
1800 1789

  
1801 1790
        if (index <= 127) // For non-zero index < 127, just a single sub-index byte is required
1802 1791
        {
......
1810 1799
    }
1811 1800

  
1812 1801
    // Write it to the SPI
1813
    writetospi(cnt,header,length,buffer);
1802
    writetospi((uint16_t)cnt,header,length,buffer);
1814 1803
} // end dwt_writetodevice()
1815 1804

  
1816 1805
/*! ------------------------------------------------------------------------------------------------------------------
......
1874 1863
    }
1875 1864

  
1876 1865
    // Do the read from the SPI
1877
    readfromspi(cnt, header, length, buffer);
1866
    readfromspi((uint16_t)cnt, header, length, buffer);
1878 1867
} // end dwt_readfromdevice()
1879 1868

  
1880 1869

  
......
1898 1887
    int     j ;
1899 1888
    uint8_t   buffer[4] ;
1900 1889

  
1901
    dwt_readfromdevice(regFileID,regOffset,4,buffer); // Read 4 bytes (32-bits) register into buffer
1890
    dwt_readfromdevice((uint16_t)regFileID, (uint16_t)regOffset,4,buffer); // Read 4 bytes (32-bits) register into buffer
1902 1891

  
1903 1892
    for (j = 3 ; j >= 0 ; j --)
1904 1893
    {
......
1926 1915
    uint16_t  regval = 0 ;
1927 1916
    uint8_t   buffer[2] ;
1928 1917

  
1929
    dwt_readfromdevice(regFileID,regOffset,2,buffer); // Read 2 bytes (16-bits) register into buffer
1918
    dwt_readfromdevice((uint16_t)regFileID, (uint16_t)regOffset,2,buffer); // Read 2 bytes (16-bits) register into buffer
1930 1919

  
1931
    regval = (buffer[1] << 8) + buffer[0] ;
1920
    regval = (uint16_t)((buffer[1] << 8) + buffer[0] );
1932 1921
    return regval ;
1933 1922

  
1934 1923
} // end dwt_read16bitoffsetreg()
......
1950 1939
{
1951 1940
    uint8_t regval;
1952 1941

  
1953
    dwt_readfromdevice(regFileID, regOffset, 1, &regval);
1942
    dwt_readfromdevice((uint16_t)regFileID, (uint16_t)regOffset, 1, &regval);
1954 1943

  
1955 1944
    return regval ;
1956 1945
}
......
1971 1960
 */
1972 1961
void dwt_write8bitoffsetreg(int regFileID, int regOffset, uint8_t regval)
1973 1962
{
1974
    dwt_writetodevice(regFileID, regOffset, 1, &regval);
1963
    dwt_writetodevice((uint16_t)regFileID, (uint16_t)regOffset, 1, &regval);
1975 1964
}
1976 1965

  
1977 1966
/*! ------------------------------------------------------------------------------------------------------------------
......
1995 1984
    buffer[0] = regval & 0xFF;
1996 1985
    buffer[1] = regval >> 8 ;
1997 1986

  
1998
    dwt_writetodevice(regFileID,regOffset,2,buffer);
1987
    dwt_writetodevice((uint16_t)regFileID, (uint16_t)regOffset,2,buffer);
1999 1988
} // end dwt_write16bitoffsetreg()
2000 1989

  
2001 1990
/*! ------------------------------------------------------------------------------------------------------------------
......
2023 2012
        regval >>= 8 ;
2024 2013
    }
2025 2014

  
2026
    dwt_writetodevice(regFileID,regOffset,4,buffer);
2015
    dwt_writetodevice((uint16_t)regFileID,(uint16_t)regOffset,4,buffer);
2027 2016
} // end dwt_write32bitoffsetreg()
2028 2017

  
2029 2018
/*! ------------------------------------------------------------------------------------------------------------------
......
2157 2146

  
2158 2147
    for(i=0; i<length; i++)
2159 2148
    {
2160
        array[i] = _dwt_otpread(address + i) ;
2149
        array[i] = _dwt_otpread(address + (uint32_t)i) ;
2161 2150
    }
2162 2151

  
2163 2152
    _dwt_enableclocks(ENABLE_ALL_SEQ); // Restore system clock to PLL
......
2182 2171
    uint32_t ret_data;
2183 2172

  
2184 2173
    // Write the address
2185
    dwt_write16bitoffsetreg(OTP_IF_ID, OTP_ADDR, address);
2174
    dwt_write16bitoffsetreg(OTP_IF_ID, OTP_ADDR, (uint16_t)address);
2186 2175

  
2187 2176
    // Perform OTP Read - Manual read mode has to be set
2188 2177
    dwt_write8bitoffsetreg(OTP_IF_ID, OTP_CTRL, OTP_CTRL_OTPREAD | OTP_CTRL_OTPRDEN);
......
2215 2204
 *
2216 2205
 * returns DWT_SUCCESS for success, or DWT_ERROR for error
2217 2206
 */
2218
uint32_t _dwt_otpsetmrregs(int mode)
2207
int32_t _dwt_otpsetmrregs(int mode)
2219 2208
{
2220 2209
    uint8_t rd_buf[4];
2221 2210
    uint8_t wr_buf[4];
......
2381 2370
 *
2382 2371
 * returns DWT_SUCCESS for success, or DWT_ERROR for error
2383 2372
 */
2384
uint32_t _dwt_otpprogword32(uint32_t data, uint16_t address)
2373
int32_t _dwt_otpprogword32(uint32_t data, uint16_t address)
2385 2374
{
2386 2375
    uint8_t rd_buf[1];
2387 2376
    uint8_t wr_buf[4];
......
3538 3527
    if (enable)
3539 3528
    {
3540 3529
        /* Configure ON/OFF times and enable PLL2 on/off sequencing by SNIFF mode. */
3541
        uint16_t sniff_reg = ((timeOff << 8) | timeOn) & RX_SNIFF_MASK;
3530
        uint16_t sniff_reg = (uint16_t)((timeOff << 8) | timeOn) & RX_SNIFF_MASK;
3542 3531
        dwt_write16bitoffsetreg(RX_SNIFF_ID, RX_SNIFF_OFFSET, sniff_reg);
3543 3532
        pmsc_reg = dwt_read32bitoffsetreg(PMSC_ID, PMSC_CTRL0_OFFSET);
3544 3533
        pmsc_reg |= PMSC_CTRL0_PLL2_SEQ_EN;
......
4099 4088
    wr_buf[0] = 0x00; // Clear SAR enable
4100 4089
    dwt_writetodevice(TX_CAL_ID, TC_SARL_SAR_C,1,wr_buf);
4101 4090

  
4102
    return ((temp_raw<<8)|(vbat_raw));
4091
    return (uint16_t)((temp_raw<<8)|(vbat_raw));
4103 4092
}
4104 4093

  
4105 4094
/*! ------------------------------------------------------------------------------------------------------------------
......
4198 4187
        curr_bw = curr_bw | bit_field;
4199 4188

  
4200 4189
        // Write bw setting to PG_DELAY register
4201
        dwt_write8bitoffsetreg(TX_CAL_ID, TC_PGDELAY_OFFSET, curr_bw);
4190
        dwt_write8bitoffsetreg(TX_CAL_ID, TC_PGDELAY_OFFSET,(uint8_t)curr_bw);
4202 4191

  
4203 4192
        // Set cal direction and time
4204 4193
        dwt_write8bitoffsetreg(TX_CAL_ID, TC_PGCCTRL_OFFSET, TC_PGCCTRL_DIR_CONV | TC_PGCCTRL_TMEAS_MASK);
......
4284 4273
            }
4285 4274
        }
4286 4275

  
4287
        new_da_attn = current_da_attn + da_attn_change;
4288
        new_mixer_gain = current_mixer_gain + mixer_gain_change;
4276
        new_da_attn = current_da_attn + (uint8_t)da_attn_change;
4277
        new_mixer_gain = current_mixer_gain + (uint8_t)mixer_gain_change;
4289 4278

  
4290 4279
        new_regval |= ((uint32_t) ((new_da_attn << 5) | new_mixer_gain)) << (i * 8);
4291 4280
    }
......
4394 4383
    dwt_write16bitoffsetreg(PMSC_ID, PMSC_CTRL1_OFFSET, old_pmsc_ctrl1);
4395 4384
    dwt_write32bitreg(RF_CONF_ID, old_rf_conf_txpow_mask);
4396 4385

  
4397
    average_count = (int)(sum_count / NUM_SAMPLES);
4386
    average_count = (uint16_t)(sum_count / NUM_SAMPLES);
4398 4387
    return average_count;
4399 4388
}
4400 4389

  
......
4405 4394

  
4406 4395
    0xDECA0130                               // DW1000 - MP
4407 4396

  
4408
   ===============================================================================================
4409
*/
4397
   =============================================================================================== */
4410 4398

  
4411 4399
/****************************************************************************************************************************************************
4412 4400
 *
......
4429 4417
 */
4430 4418
#pragma GCC optimize ("O3")
4431 4419
static int writetospi(uint16_t headerLength,
4432
               const	uint8_t *headerBuffer,
4433
               uint32_t bodyLength,
4434
               const	uint8_t *bodyBuffer)
4435
{
4436

  
4437
    uint8_t buffer[bodyLength + 3];
4438
    memcpy(buffer, headerBuffer, headerLength); //copy data to buffer
4439
    memcpy(&buffer[headerLength], bodyBuffer, bodyLength); //copy data to buffer
4440

  
4441
    apalSPITransmit(pdw1000local->driver->spid,
4442
                    buffer,
4443
                    bodyLength + headerLength); // send header and data
4444

  
4445
    return 0;
4420
                      const	uint8_t *headerBuffer,
4421
                      uint32_t bodyLength,
4422
                      const	uint8_t *bodyBuffer)
4423
{   
4424
  uint8_t buffer[SPIBUFFLEN];
4425
  memcpy(buffer, headerBuffer, headerLength); //copy header (register id no.) to the buffer
4426
  memcpy(&buffer[headerLength], bodyBuffer, bodyLength); //copy data to the buffer
4427

  
4428
  apalSPITransmit(pdw1000local->driver->spid,
4429
                  buffer,
4430
                  bodyLength + headerLength); // send header (register id) and data
4431

  
4432
  return 0;
4446 4433
} // end writetospi()
4447 4434

  
4448 4435

  
......
4533 4520
/*! @brief sleep or idle the thread in millisecond */
4534 4521
void deca_sleep(unsigned int time_ms)
4535 4522
{
4536
  aosThdMSleep(time_ms);
4523
  usleep(time_ms * 1000);
4537 4524
}
4538 4525

  
4539 4526
/*! @brief sleep or idle the thread in millisecond */
4540 4527
void Sleep(unsigned int time_ms)
4541 4528
{
4542
  aosThdMSleep(time_ms);
4529
  usleep(time_ms * 1000);
4543 4530
}
4544 4531

  
4545 4532

  
......
4552 4539
  return chVTGetSystemTimeX();
4553 4540
}
4554 4541

  
4555
//inline uint32_t portGetTickCnt(){
4556
//    return (uint32_t) chVTGetSystemTimeX();
4557
//}
4558

  
4559

  
4560 4542
/*! @brief Disable the interrupt handler */
4561 4543
void port_DisableEXT_IRQ(void){   
4562 4544
  nvicDisableVector(DW1000_EXTI_IRQn);
4563

  
4564 4545
}
4565 4546

  
4566 4547
/*! @brief Enable the interrupt handler */
source/DW1000/v1/deca_instance_common_v1.c
202 202
//these are default antenna delays for EVB1000, these can be used if there is no calibration data in the DW1000,
203 203
//or instead of the calibration data
204 204
const uint16_t rfDelays[2] = {
205
        (uint16_t) ((DWT_PRF_16M_RFDLY/ 2.0) * 1e-9 / DWT_TIME_UNITS),//PRF 16
206
        (uint16_t) ((DWT_PRF_64M_RFDLY/ 2.0) * 1e-9 / DWT_TIME_UNITS)
205
        (uint16_t) (((double)DWT_PRF_16M_RFDLY/ 2.0) * 1e-9 / DWT_TIME_UNITS),//PRF 16
206
        (uint16_t) (((double)DWT_PRF_64M_RFDLY/ 2.0) * 1e-9 / DWT_TIME_UNITS)
207 207
};
208 208

  
209 209
//these are default TREK Tag/Anchor antenna delays
210 210
const uint16_t rfDelaysTREK[2] = {
211
        (uint16_t) ((514.83f/ 2.0) * 1e-9 / DWT_TIME_UNITS),//channel 2
212
        (uint16_t) ((514.65f/ 2.0) * 1e-9 / DWT_TIME_UNITS) //channel 5
211
        (uint16_t) (((double)514.83f/ 2.0) * 1e-9 / DWT_TIME_UNITS),//channel 2
212
        (uint16_t) (((double)514.65f/ 2.0) * 1e-9 / DWT_TIME_UNITS) //channel 5
213 213
};
214 214

  
215
//int instance_starttxtest(int framePeriod)
216
//{
217
//    //define some test data for the tx buffer
218
//    uint8 msg[127] = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the l";
219

  
220
//    //NOTE: SPI frequency must be < 3MHz
221
//    port_set_dw1000_slowrate();  //max SPI before PLLs configured is ~4M
222

  
223
//    // the value here 0x1000 gives a period of 32.82 µs
224
//    //this is setting 0x1000 as frame period (125MHz clock cycles) (time from Tx en - to next - Tx en)
225
//    dwt_configcontinuousframemode(framePeriod);
226

  
227
//    dwt_writetxdata(127, (uint8 *)  msg, 0) ;
228
//    dwt_writetxfctrl(127, 0, 0);
229

  
230
//    //to start the first frame - set TXSTRT
231
//    dwt_starttx(DWT_START_TX_IMMEDIATE);
232

  
233
//    //measure the power
234
//    //Spectrum Analyser set:
235
//    //FREQ to be channel default e.g. 3.9936 GHz for channel 2
236
//    //SPAN to 1GHz
237
//    //SWEEP TIME 1s
238
//    //RBW and VBW 1MHz
239
//    //measure channel power
240

  
241
//    return DWT_SUCCESS ;
242
//}
243 215

  
244 216
// -------------------------------------------------------------------------------------------------------------------
245 217
//      Data Definitions
......
251 223
static double inst_idist[MAX_ANCHOR_LIST_SIZE] ;
252 224
static double inst_idistraw[MAX_ANCHOR_LIST_SIZE] ;
253 225

  
254
// TODO: Instance_data declaration in .c. Not on .h (extern only)
255 226
instance_data_t instance_data[NUM_INST] ;
256 227

  
257
/* TODO: Custom data declarations */
258
typedef struct
228
typedef struct __attribute__((packed))
259 229
{
260 230
    uint32_t      deviceID ;
261 231
    uint8_t       chan;               // added chan here - used in the reading of acc
......
282 252
  uint64_t dt;
283 253
  long double dtime;
284 254

  
285
  dtime = (microsecu / (double) DWT_TIME_UNITS) / 1e6 ;
255
  dtime = (long double)((microsecu / (double) DWT_TIME_UNITS) / 1e6);
286 256

  
287 257
  dt =  (uint64_t) (dtime) ;
288 258

  
......
302 272
  double distance ;
303 273
  double distance_to_correct;
304 274
  double tof ;
305
  int32_t tofi ;
275
  int64_t tofi ;
306 276

  
307 277
  // check for negative results and accept them making them proper negative integers
308 278
  tofi = (int32_t) tofx ; // make it signed
......
311 281
  }
312 282

  
313 283
  // convert to seconds (as floating point)
314
  tof = convertdevicetimetosec(tofi) ;          //this is divided by 4 to get single time of flight
284
  tof = convertdevicetimetosec((int32_t)tofi) ;          //this is divided by 4 to get single time of flight
315 285
  inst_idistraw[idx] = distance = tof * SPEED_OF_LIGHT;
316 286

  
317 287
#if (CORRECT_RANGE_BIAS == 1)
......
376 346
// Set this instance role as the Tag, Anchor or Listener
377 347
void instancesetrole(int inst_mode){
378 348
  // assume instance 0, for this
379
  instance_data[0].mode =  inst_mode;                   // set the role
349
  instance_data[0].mode =  (INST_MODE)inst_mode;                   // set the role
380 350
}
381 351

  
382 352
int instancegetrole(void){
383
  return instance_data[0].mode;
353
  return (int)instance_data[0].mode;
384 354
}
385 355

  
386 356
int instancenewrange(void){
......
397 367
  return instance_data[0].newRangeTagAddress;
398 368
}
399 369

  
400
int instancenewrangetim(void){
370
uint32_t instancenewrangetim(void){
401 371
  return instance_data[0].newRangeTime;
402 372
}
403 373

  
......
447 417
  //dwt_softreset();
448 418

  
449 419
  //this initialises DW1000 and uses specified configurations from OTP/ROM
450
  result = dwt_initialise(DWT_LOADUCODE, drv) ;    // TODO
451
//  result = dwt_initialise(DWT_LOADUCODE) ;
420
  result = dwt_initialise(DWT_LOADUCODE, drv);
452 421

  
453 422
  //this is platform dependent - only program if DW EVK/EVB
454 423
  dwt_setleds(3) ; //configure the GPIOs which control the leds on EVBs
......
768 737

  
769 738
  dw_event.uTimeStamp = portGetTickCnt();
770 739

  
771
//  chprintf((BaseSequentialStream *)&SD2, " TX callback! \r\n");
772

  
773
//  if(txevent == DWT_SIG_TX_DONE) {
774
    //uint32_t txtimestamp = 0;
775

  
776
    //NOTE - we can only get TX good (done) while here
777
    //dwt_readtxtimestamp((uint8*) &instance_data[instance].txu.txTimeStamp);
778

  
779
    dwt_readtxtimestamp(txTimeStamp) ;
780
    dw_event.timeStamp32l = (uint32_t)txTimeStamp[0] + ((uint32_t)txTimeStamp[1] << 8) + ((uint32_t)txTimeStamp[2] << 16) + ((uint32_t)txTimeStamp[3] << 24);
781
    dw_event.timeStamp = txTimeStamp[4];
782
    dw_event.timeStamp <<= 32;
783
    dw_event.timeStamp += dw_event.timeStamp32l;
784
    dw_event.timeStamp32h = ((uint32_t)txTimeStamp[4] << 24) + (dw_event.timeStamp32l >> 8);
740
  dwt_readtxtimestamp(txTimeStamp) ;
741
  dw_event.timeStamp32l = (uint32_t)txTimeStamp[0] + ((uint32_t)txTimeStamp[1] << 8) + ((uint32_t)txTimeStamp[2] << 16) + ((uint32_t)txTimeStamp[3] << 24);
742
  dw_event.timeStamp = txTimeStamp[4];
743
  dw_event.timeStamp <<= 32;
744
  dw_event.timeStamp += dw_event.timeStamp32l;
745
  dw_event.timeStamp32h = ((uint32_t)txTimeStamp[4] << 24) + (dw_event.timeStamp32l >> 8);
785 746

  
786
    instance_data[instance].stopTimer = 0;
747
  instance_data[instance].stopTimer = 0;
787 748

  
788
    dw_event.rxLength = instance_data[instance].psduLength;
789
    dw_event.type =  0;
790
    dw_event.type_pend =  0;
791
    dw_event.type_save = DWT_SIG_TX_DONE;
749
  dw_event.rxLength = instance_data[instance].psduLength;
750
  dw_event.type =  0;
751
  dw_event.type_pend =  0;
752
  dw_event.type_save = DWT_SIG_TX_DONE;
792 753

  
793
    memcpy((uint8_t *)&dw_event.msgu.frame[0], (uint8_t *)&instance_data[instance].msg_f, instance_data[instance].psduLength);
754
  memcpy((uint8_t *)&dw_event.msgu.frame[0], (uint8_t *)&instance_data[instance].msg_f, instance_data[instance].psduLength);
794 755

  
795
    instance_putevent(dw_event, DWT_SIG_TX_DONE);
756
  instance_putevent(dw_event, DWT_SIG_TX_DONE);
796 757

  
797
    instance_data[instance].txMsgCount++;
798
//  }
799
//  else if(txevent == DWT_SIG_TX_AA_DONE)  {
800
//    //auto ACK confirmation
801
//    dw_event.rxLength = 0;
802
//    dw_event.type =  0;
803
//    dw_event.type_save = DWT_SIG_TX_AA_DONE;
804
//
805
//    instance_putevent(dw_event, DWT_SIG_TX_AA_DONE);
806
//
807
//    //printf("TX AA time %f ecount %d\n",convertdevicetimetosecu(instance_data[instance].txu.txTimeStamp), instance_data[instance].dweventCnt);
808
//  }
758
  instance_data[instance].txMsgCount++;
809 759

  
810 760
  instance_data[instance].monitor = 0;
811 761
}
......
834 784
  case 2:
835 785
  default:
836 786
    if(instance_data[instance].responseTO > 0) {  //can get here as result of error frame so need to check
837
      dwt_setrxtimeout((uint16_t)instance_data[instance].fwtoTime_sy * instance_data[instance].responseTO); //reconfigure the timeout
787
      dwt_setrxtimeout((uint16_t)(instance_data[instance].fwtoTime_sy * instance_data[instance].responseTO)); //reconfigure the timeout
838 788
      dwt_rxenable(DWT_START_RX_IMMEDIATE) ;
839 789
      type_pend = DWT_SIG_RX_PENDING ;
840 790
    }
......
1056 1006
  instance_data[instance].msg_f.seqNum = instance_data[instance].frameSN++;
1057 1007

  
1058 1008
  //set the delayed rx on time (the final message will be sent after this delay)
1059
  dwt_setrxaftertxdelay(instance_data[instance].ancRespRxDelay);  //units are 1.0256us - wait for wait4respTIM before RX on (delay RX)
1009
  dwt_setrxaftertxdelay((uint32_t)instance_data[instance].ancRespRxDelay);  //units are 1.0256us - wait for wait4respTIM before RX on (delay RX)
1060 1010

  
1061 1011
  instance_data[instance].tagSleepCorrection = 0;
1062 1012
  instance_data[instance].msg_f.messageData[RES_TAG_SLP0] = 0 ;
......
1093 1043

  
1094 1044
  //we have our range - update the own mask entry...
1095 1045
  if(instance_data[instance].tof[tof_idx] != INVALID_TOF) { //check the last ToF entry is valid and copy into the current array
1096
    instance_data[instance].rxResponseMask = (0x1 << instance_data[instance].shortAdd_idx);
1046
    instance_data[instance].rxResponseMask = (uint8_t)(0x1 << instance_data[instance].shortAdd_idx);
1097 1047
    instance_data[instance].tofArray[instance_data[instance].shortAdd_idx] = instance_data[instance].tof[tof_idx];
1098 1048
  }
1099 1049
  else	{  //reset response mask
......
1101 1051
    instance_data[instance].rxResponseMask = 0;	//reset the mask of received responses when rx poll
1102 1052
  }
1103 1053
  //set the delayed rx on time (the final message will be sent after this delay)
1104
  dwt_setrxaftertxdelay(instance_data[instance].ancRespRxDelay);  //units are 1.0256us - wait for wait4respTIM before RX on (delay RX)
1054
  dwt_setrxaftertxdelay((uint32_t)instance_data[instance].ancRespRxDelay);  //units are 1.0256us - wait for wait4respTIM before RX on (delay RX)
1105 1055

  
1106 1056
  //if this is gateway anchor - calculate the slot period correction
1107 1057
  if(instance_data[instance].gatewayAnchor)  {
......
1187 1137

  
1188 1138
  //if Listener then just report the received frame to the instance (application)
1189 1139
  if(rxd_event == DWT_SIG_RX_OKAY) { //Process good/known frame types
1190
    uint16_t sourceAddress = (((uint16_t)dw_event.msgu.frame[srcAddr_index+1]) << 8) + dw_event.msgu.frame[srcAddr_index];
1140
    uint16_t sourceAddress = (uint16_t)(((uint16_t)dw_event.msgu.frame[srcAddr_index+1]) << 8) + (uint16_t)(dw_event.msgu.frame[srcAddr_index]);
1191 1141

  
1192 1142
    if(instance_data[instance].mode != LISTENER)      {
1193 1143
      if(instance_data[instance].mode == TAG) //if tag got a good frame - this is probably a response, but could also be some other non-ranging frame
......
1251 1201
          instance_data[instance].rxMsgCount++;
1252 1202
          return;
1253 1203
        }
1254
        instance_data[instance].rxRespsIdx = (int8_t) ((dw_event.msgu.frame[POLL_RNUM+fcode_index] & 0xf)
1204
        instance_data[instance].rxRespsIdx = (uint8_t) ((dw_event.msgu.frame[POLL_RNUM+fcode_index] & 0xf)
1255 1205
            + ((sourceAddress&0x7) << 4));
1256 1206
        instance_data[instance].rxResps[instance_data[instance].rxRespsIdx] = 0;
1257 1207

  
......
1352 1302
          instance_data[instance].rxMsgCount++;
1353 1303
          return;
1354 1304
        }
1355
      break;  // TODO: fallthourgh for anchor
1305
      break;
1356 1306
//        __attribute__ ((fallthrough));
1357 1307

  
1358 1308
        //if anchor fall into case below and process the frame
......
1376 1326
}
1377 1327

  
1378 1328

  
1379
/*TODO: Callback funtion for RX timeout (available from newer driver version) */
1329
/*! Callback funtion for RX timeout (available from newer driver version) */
1380 1330
#pragma GCC optimize ("O3")
1381 1331
void instance_rxtimeoutcallback(const dwt_cb_data_t *rxd){
1382 1332

  
......
1410 1360
}
1411 1361

  
1412 1362

  
1413
/*TODO: Callback funtion for RX error (available from newer driver version) */
1363
/*! Callback funtion for RX error (available from newer driver version) */
1414 1364
#pragma GCC optimize ("O3")
1415 1365
void instance_rxerrorcallback(const dwt_cb_data_t *rxd) {
1416 1366

  
......
1503 1453
  dw_event_g.type = instance_data[instance].dwevent[indexOut].type ;
1504 1454

  
1505 1455

  
1506
  instance_data[instance].dwevent[indexOut].gotit = x;
1456
  instance_data[instance].dwevent[indexOut].gotit = (uint8_t)x;
1507 1457

  
1508 1458
  //instance_data[instance].dwevent[indexOut].eventtimeclr = portGetTickCnt();
1509 1459

  
......
1555 1505
    message = 0;
1556 1506
  }
1557 1507

  
1558

  
1559

  
1560 1508
  if(done == INST_DONE_WAIT_FOR_NEXT_EVENT_TO) { //we are in RX and need to timeout (Tag needs to send another poll if no Rx frame)
1561 1509
    if(instance_data[instance].mode == TAG) { //Tag (is either in RX or sleeping)
1562 1510
      int32_t nextPeriod ;
......
1664 1612
  instance_data[0].txPower = txpower ;
1665 1613

  
1666 1614
  instance_data[0].txPowerChanged = 1;
1667

  
1668 1615
}
1669 1616

  
1670 1617
void instancesettxpower(void){
......
1709 1656
#endif
1710 1657

  
1711 1658

  
1712
/*! TODO: the following Functions are added for user application (previously on the API )*/
1659
/*! The following Functions are added for user application (previously on the API )*/
1713 1660

  
1714 1661
/*! ------------------------------------------------------------------------------------------------------------------
1715 1662
 * @fn dwt_getotptxpower()
source/DW1000/v1/deca_instance_tag_anchor_v1.c
17 17

  
18 18
#include <v1/deca_instance_v1.h>
19 19
#include <string.h>
20
#include<math.h>
20
#include <math.h>
21 21
#include "module.h"
22 22

  
23 23
// -------------------------------------------------------------------------------------------------------------------
24
//      Data Definitions
25
// -------------------------------------------------------------------------------------------------------------------
26

  
27
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28
// NOTE: the maximum RX timeout is ~ 65ms
29
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
30

  
31

  
32
// -------------------------------------------------------------------------------------------------------------------
33
// Functions
34
// -------------------------------------------------------------------------------------------------------------------
35

  
36
// -------------------------------------------------------------------------------------------------------------------
37 24
//
38 25
// function to construct the message/frame header bytes
39 26
//
......
61 48
  }
62 49

  
63 50
  //begin delayed TX of frame
64
  if (dwt_starttx(delayedTx | inst->wait4ack)){ // delayed start was too late
51
  if (dwt_starttx((uint8_t)(delayedTx | inst->wait4ack))){ // delayed start was too late
65 52
    result = 1; //late/error
66 53
    inst->lateTX++;
67 54
  }
......
72 59
  return result;                                              // state changes
73 60
}
74 61

  
75

  
76 62
int instance_calcranges(uint32_t *array, uint16_t size, int reportRange, uint8_t* mask){
77 63
  int i;
78 64
  int newRange = TOF_REPORT_NUL;
......
135 121

  
136 122
      sleep_mode = (DWT_LOADUCODE|DWT_PRESRV_SLEEP|DWT_CONFIG|DWT_TANDV);
137 123

  
138
      /* TODO: No need anymore since the driver handle itself */
139
//      if((dwt_getldotune() != 0)) //if we need to use LDO tune value from OTP kick it after sleep
140
//        sleep_mode |= DWT_LOADOPSET;
141

  
142 124
      if(inst->configData.txPreambLength == DWT_PLEN_64)  //if using 64 length preamble then use the corresponding OPSet
143 125
        sleep_mode |= DWT_LOADOPSET;
144 126

  
......
255 237
        dwt_seteui(inst->eui64);
256 238
      }
257 239
#else
258
      Sleep(3); //to approximate match the time spent in the #if above  //TODO: 3ms default
240
      Sleep(3); //to approximate match the time spent in the #if above
259 241
#endif
260 242

  
261 243
      instancesetantennadelays(); //this will update the antenna delay if it has changed
......
426 408
          else {  //for anchor make the final half the delay ..... (this is ok, as A0 awaits 2 responses)
427 409
            tagCalculatedFinalTxTime =  (inst->txu.txTimeStamp + inst->pollTx2FinalTxDelayAnc) & MASK_TXDTS;
428 410
          }
429
          inst->delayedReplyTime = tagCalculatedFinalTxTime >> 8; //high 32-bits
411
          inst->delayedReplyTime = (uint32_t)(tagCalculatedFinalTxTime >> 8); //high 32-bits
430 412
          // Calculate Time Final message will be sent and write this field of Final message
431 413
          // Sending time will be delayedReplyTime, snapped to ~125MHz or ~250MHz boundary by
432 414
          // zeroing its low 9 bits, and then having the TX antenna delay added
......
451 433
        message = 0;
452 434
        //fall into the next case (turn on the RX)
453 435
      }
454

  
455 436
    }
456
    // TODO: fall through to the next case statement in case of debugging
457 437
    break ; // end case TA_TX_WAIT_CONF
458 438

  
459 439

  
......
476 456
      // end case TA_RXE_WAIT, don't break, but fall through into the TA_RX_WAIT_DATA state to process it immediately.
477 457
      if(message == 0) break;
478 458
    }
479
    // TODO: fall through to the next case statement in case of debugging
480 459
    break;
481 460

  
482
    case TA_RX_WAIT_DATA :                                                                     // Wait RX data
461
    case TA_RX_WAIT_DATA :   // Wait RX data
483 462
      //printf("TA_RX_WAIT_DATA %d", message) ;
484 463
      switch (message){
485 464

  
......
493 472
        //int srclen = 0;
494 473
        //int fctrladdr_len;
495 474
        uint8_t tof_idx  = 0;
496
        uint8_t *messageData;
475
        uint8_t *messageData = NULL;
497 476

  
498 477
        inst->stopTimer = 0; //clear the flag, as we have received a message
499 478

  
......
629 608
                }
630 609
              }
631 610
            }
632
            /*else
633
                                {
634
                                    //stay in RX wait for next frame...
635
                                    inst->testAppState = TA_RXE_WAIT ;              // wait for next frame
636
                                }*/
637 611

  
638 612
            if(fcode == RTLS_DEMO_MSG_ANCH_RESP) { //tag to anchor mode
639 613
              if(currentRangeNum == inst->rangeNum) { //these are the previous ranges...
......
692 666
            uint64_t tagFinalRxTime  = 0;
693 667
            uint64_t tagPollTxTime  = 0;
694 668
            uint64_t anchorRespRxTime  = 0;
695
            uint64_t tof = INVALID_TOF;
669
            int32_t tof = (int32_t)INVALID_TOF;
696 670

  
697 671
            double RaRbxDaDb = 0;
698 672
            double RbyDb = 0;
......
758 732

  
759 733
              RayDa = ((double)Ra + (double)Da);
760 734

  
761
              tof = (int32_t) ( RaRbxDaDb/(RbyDb + RayDa) );
735
              tof = (int32_t)(RaRbxDaDb/(RbyDb + RayDa));
762 736
            }
763 737

  
764 738
            //tag to anchor ranging
765 739
            if(RTLS_DEMO_MSG_TAG_FINAL == fcode) {
766 740
              inst->newRangeTagAddress = srcAddr[0] + ((uint16_t) srcAddr[1] << 8);
767 741
              //time-of-flight
768
              inst->tof[inst->newRangeTagAddress & 0x7] = tof;
742
              inst->tof[inst->newRangeTagAddress & 0x7] = (uint32_t)tof;
769 743
              //calculate all tag - anchor ranges... and report
770 744
              inst->newRange = instance_calcranges(&inst->tofArray[0], MAX_ANCHOR_LIST_SIZE, TOF_REPORT_T2A, &inst->rxResponseMask);
771 745
              inst->rxResponseMaskReport = inst->rxResponseMask; //copy the valid mask to report
772 746
              inst->rxResponseMask = 0;
773 747
              //we have our range - update the own mask entry...
774
              if(tof != INVALID_TOF) { //check the last ToF entry is valid and copy into the current array
748
              if(tof != (int32_t)INVALID_TOF) { //check the last ToF entry is valid and copy into the current array
775 749
                setTagDist(srcAddr[0], inst->shortAdd_idx); //copy distance from this anchor to the tag into array
776 750

  
777
                inst->rxResponseMask = (0x1 << inst->shortAdd_idx);
778
                inst->tofArray[inst->shortAdd_idx] = tof;
751
                inst->rxResponseMask = (uint8_t)(0x1 << inst->shortAdd_idx);
752
                inst->tofArray[inst->shortAdd_idx] = (uint32_t)tof;
779 753
              }
780 754
              inst->newRangeTime = dw_event->uTimeStamp ;
781 755
            }
782 756
            else { //anchor to anchor ranging
783 757
              inst->newRangeTagAddress = srcAddr[0] + ((uint16_t) srcAddr[1] << 8);
784 758
              //time-of-flight
785
              inst->tofAnc[tof_idx] = tof;
759
              inst->tofAnc[tof_idx] = (uint32_t)tof;
786 760
            }
787 761

  
788 762
            //reset the response count
......
884 858
  float msgdatalen = 0;
885 859
  float preamblelen = 0;
886 860
  int sfdlen = 0;
887
  int x = 0;
861
  float x = 0;
888 862

  
889 863
  //Set the RX timeouts based on the longest expected message - the Final message
890 864
  //Poll = 13, Response = 20, Final = 44 bytes
891 865
  //msgdatalen = TAG_FINAL_MSG_LEN + FRAME_CRTL_AND_ADDRESS_S + FRAME_CRC;
892 866
  msgdatalen = ANCH_RESPONSE_MSG_LEN + FRAME_CRTL_AND_ADDRESS_S + FRAME_CRC;
893 867

  
894
  x = (int) ceil(msgdatalen*8/330.0f);
868
  x = (float)ceil((double)(msgdatalen*8)/(double)330.0f);
895 869

  
896 870
  msgdatalen = msgdatalen*8 + x*48;
897 871

  
898 872
  //add some margin so we don't timeout too soon
899 873
  margin = 0; //(TAG_FINAL_MSG_LEN - TAG_POLL_MSG_LEN);
900 874

  
901
  x = (int) ceil(margin*8/330.0f);
875
  x = (float) ceil((double)(margin*8)/(double)330.0f);
902 876

  
903
  margin = margin*8 + x*48;
877
  margin = (int) (margin*8 + x*48);
904 878

  
905 879
  //assume PHR length is 172308ns for 110k and 21539ns for 850k/6.81M
906 880
  if(instance_data[instance].configData.dataRate == DWT_BR_110K) {
......
946 920
    preamblelen = (sfdlen + preamblelen) * 1.01763f;
947 921
  }
948 922

  
949
  respframe_sy = (16 + (int)((preamblelen + ((msgdatalen + margin)/1000.0))/ 1.0256)) ;
923
  respframe_sy = (16 + (int)((double)((double)preamblelen + ((double)(msgdatalen + margin)/1000.0))/ 1.0256)) ;
950 924

  
951 925
  //this is the delay used for the delayed transmit (when sending the response, and final messages)
952 926
  instance_data[instance].pollTx2FinalTxDelay = convertmicrosectodevicetimeu (delayus);
......
959 933
  //andhor 3 will have the delay set to 3 * fixedReplyDelayAnc and so on...
960 934
  //this delay depends on how quickly the tag can receive and process the message from previous anchor
961 935
  //(and also the frame length of course)
962
  respframe = (int)(preamblelen + (msgdatalen/1000.0)); //length of response frame (micro seconds)
936
  respframe = (int)((double)preamblelen + ((double)msgdatalen/1000.0)); //length of response frame (micro seconds)
963 937
  if(instance_data[instance].configData.dataRate == DWT_BR_110K) {
964 938

  
965 939
    //set the frame wait timeout time - total time the frame takes in symbols
......
967 941

  
968 942
    instance_data[instance].fwtoTimeAnc_sy = respframe_sy; //add some margin so we don't timeout too soon
969 943
    instance_data[instance].fixedReplyDelayAnc = convertmicrosectodevicetimeu (respframe + RX_RESPONSE1_TURNAROUND_110K);
970
    instance_data[instance].fixedReplyDelayAncP = (uint32_t) (((uint64_t) convertmicrosectodevicetimeu (preamblelen)) >> 8) + 16;
944
    instance_data[instance].fixedReplyDelayAncP = (uint32_t) (((uint64_t) convertmicrosectodevicetimeu ((double)preamblelen)) >> 8) + 16;
971 945

  
972 946
    instance_data[instance].ancRespRxDelay = RX_RESPONSE1_TURNAROUND_110K ;
973 947
  }
......
978 952

  
979 953
    instance_data[instance].fwtoTimeAnc_sy =  respframe_sy;
980 954
    instance_data[instance].fixedReplyDelayAnc = convertmicrosectodevicetimeu (respframe + RX_RESPONSE1_TURNAROUND_6M81);
981
    instance_data[instance].fixedReplyDelayAncP = (uint32_t) (((uint64_t) convertmicrosectodevicetimeu (preamblelen)) >> 8) + 16;
955
    instance_data[instance].fixedReplyDelayAncP = (uint32_t) (((uint64_t) convertmicrosectodevicetimeu ((double)preamblelen)) >> 8) + 16;
982 956

  
983 957
    instance_data[instance].ancRespRxDelay = RX_RESPONSE1_TURNAROUND_6M81 ;
984 958
  }
985

  
986 959
}
987 960

  
988 961
// -------------------------------------------------------------------------------------------------------------------

Also available in: Unified diff