DW1000 UWB driver based on work of Matthias Grob & Manuel Stalder - ETH Zürich - 2015

Dependencies:   BurstSPI

Revision:
8:0b408e77b701
Child:
9:326bf149c8bc
diff -r b13881dbb09d -r 0b408e77b701 DW1000Setup.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DW1000Setup.h	Mon Apr 18 16:58:27 2016 +0000
@@ -0,0 +1,278 @@
+#ifndef __DW1000SETUP_H__
+#define __DW1000SETUP_H__
+
+#include "mbed.h"
+/** Class for holding DW1000 config options
+*
+* Defaults are channel 5, 16MHz PRF, 850kb/s, standard SFD, 128 symbol preamble, preamble code 3.
+* All pins are GPIO other than sync and IRQ.
+* Smart power is off.
+*
+*/
+class DW1000Setup
+{
+public:
+
+    /** Supported UWB modes
+    *
+    *  enum for preset mode combinations
+    */
+    typedef enum {fastLocationC5, ///< maximum data speed, short range. Channel 5
+                  fastLocationC4, ///< maximum data speed, short range. Channel 5
+                  tunedDefault,   ///< The power up default config with the recomended changes
+                  user110k,       ///< 110kb/s settings used by Matthias Grob & Manuel Stalder
+                  rangeRateCompromise ///< 850kb/s settings aimed to give a short packet but with far greater range than the fastLocation options
+                 } UWBMode;
+
+    /** Constructor
+    * @param modeToUse The operating mode to set the initial settings to.
+    *
+    */
+    DW1000Setup(UWBMode modeToUse = tunedDefault);
+
+
+/// copy constructor
+    DW1000Setup(DW1000Setup *orij);
+
+/// Update this config to match the supplied one
+    void applyConfig(DW1000Setup *orij);
+
+
+/// enum for PRF options
+    enum prf_e {prf16MHz, ///< PRF rate of 16MHz. Lower power
+                prf64MHz ///< PRF rate of 64MHz. Higher power but more accurate timing.
+               };
+
+/// enum for data rate options
+    enum dataRate_e {kbps110, ///< Data rate of 110kb/s (non-standard)
+                     kbps850,///< Data rate of 850kb/s
+                     kbps6800///< Data rate of 6.8Mb/s
+                    };
+
+    /** enum for SFD options
+    *
+    * To conform to the standard the standard setting should be used.
+    * The decawave setting claimes to give better performance. Doesn't work for me at 850kb/s but does at 6.8Mb/s
+    */
+    enum sfd_e {standard, ///< IEEE standard SFD
+                decaWave, ///< Decawave defined SFD
+                user ///< user defined SFD
+               };
+
+/// enum for preamble length options
+    enum preamble_e { pre64,///< Preamble is 64 symbols
+                      pre128,///< Preamble is 128 symbols (non-standard)
+                      pre256,///< Preamble is 256 symbols (non-standard)
+                      pre512,///< Preamble is 512 symbols (non-standard)
+                      pre1024,///< Preamble is 1024 symbols
+                      pre1536,///< Preamble is 1536 symbols (non-standard)
+                      pre2048, ///< Preamble is 2048 symbols (non-standard)
+                      pre4096///< Preamble is 4096 symbols
+                    };
+
+    /** Set the Transmit power for smartpower operation
+    * @param powerdBm The gain setting in dBm (0-33.5)
+    * @param power500us The gain setting packets under 500us in dBm (0-33.5)
+    * @param power250us The gain setting packets under 250us in dBm (0-33.5)
+    * @param power125us The gain setting packets under 125us in dBm (0-33.5)
+    * @return true if a valid option
+    */
+    bool setSmartTxPower(float powerdBm,float power500us=0,float power250us=0,float power125us=0) ;
+
+    /** Set the Transmit power for non-smartpower operation
+    * @param powerdBm The gain setting in dBm for the main packet(0-33.5)
+    * @param powerPRF The gain setting in dBm for the preamble (0-33.5)
+    * @return true if a valid option
+    */
+    bool setTxPower(float powerdBm,float powerPRF=0);
+
+
+    /** Set the PRF
+    * @return true if a valid option
+    */
+    bool setPRF(enum prf_e newSetting) {
+        prf = newSetting;
+        return true;
+    };
+
+    /** Set the Channel
+    * @return true if a valid option
+    *
+    * channels are 1-5 & 7
+    */
+    bool setChannel(unsigned char newChannel) {
+        if ((newChannel > 0) && ((newChannel <= 5) || (newChannel == 7))) {
+            channel = newChannel;
+            return true;
+        }
+        return false;
+    };
+    /** Set the SFD
+    * @return true if a valid option
+    */
+    bool setSfd(enum sfd_e newSetting) {
+        sfd = newSetting;
+        return true;
+    };
+    /** Set the Preamble length
+    * @return true if a valid option
+    *
+    * For 6.8Mb/s it should be 64 to 256 symbols.
+    * For 850kb/s it should be 256 to 2048 symbols
+    * For 110kb/s it should be >= 2048 symbols.
+    */
+    bool setPreambleLength(enum preamble_e newSetting) {
+        preamble = newSetting;
+        return true;
+    };
+    /** Set the Data rate
+    * @return true if a valid option
+    */
+    bool setDataRate(enum dataRate_e newSetting)  {
+        dataRate = newSetting;
+        return true;
+    };
+    /** Set the Preamble code
+    * @return true if a valid option
+    *
+    * note - not all codes are valid for all channels
+    *
+    *channel 16MHzPrf    64MHzPrf
+    1       1,2         9, 10, 11, 12
+    2       3, 4        9, 10, 11, 12
+    3       5, 6        9, 10, 11, 12
+    4       7, 8        17, 18, 19, 20
+    5       3, 4        9, 10, 11, 12
+    7       7, 8        17, 18, 19, 20
+
+    */
+    bool setPreambleCode(unsigned char newCode) {
+        if ((newCode > 0) && (newCode <= 24)) {
+            preambleCode = newCode;
+            return true;
+        }
+        return false;
+    };
+    /** Set the smartpower state
+    * @return true if a valid option
+    *
+    * only takes effect at 6.8Mb/s
+    */
+    bool setSmartPower(bool enable) {
+        enableSmartPower = enable;
+        return true;
+    };
+
+
+    /** Get the current transmit gains
+    * @return An array containing the power levels
+    *
+    * An array of 4 floats is returned.
+    * For smart power these are the 4 power levels (normal, <500us, <250us, <125us).
+    * For non-smart power the first and last values are ignored, the second is the power for the phy header, the 3rd is the power for the reaminder of the frame.
+    */
+    const float *getTxPowers() {
+        return powers;
+    }
+
+    /** Get the current channel
+    * @return the channel number
+    */
+    unsigned char getChannel() {
+        return channel;
+    };
+    /** Get the current PRF
+    * @return the PRF
+    */
+    enum prf_e getPRF() {
+        return prf;
+    };
+    /** Get the current data rate
+    * @return the data rate
+    */
+    enum dataRate_e getDataRate() {
+        return dataRate;
+    };
+
+    /** Get the current SFD mode
+    * @return the SFD
+    */
+    enum sfd_e getSfd() {
+        return sfd;
+    };
+    /** Get the current preamble length
+    * @return the  preamble length
+    */
+    enum preamble_e getPreambleLength() {
+        return preamble;
+    };
+    /** Get the current preamble code
+    * @return the preamble code
+    */
+    unsigned char getPreambleCode() {
+        return preambleCode;
+    };
+    /** Get the current smart power mode
+    * @return true if smartpower is on
+    */
+    bool getSmartPower() {
+        return  enableSmartPower;
+    };
+
+    /** Set which pins are GPIO
+    *
+    *  @param pins A bitmask of which pins are not to be used as GPIO
+    *
+    *  e.g. 0x01 sets GPIO0 as it's alternative function (RXOKLED) and all other pins to be GPIO.
+    *
+    *  The default is 0x0180 - GPIO 8 = irq, GPIO 7 = sync. All others are GPIO functionality
+    */
+    void setGPIO(uint16_t pins) {
+        GPIO_Pins = pins;
+    };
+
+    /** Get which pins are GPIO
+    *
+    *  @return A bitmask of which pins are not to be used as GPIO
+    *
+    *  e.g. 0x01 Indicates that GPIO0 as it's alternative function (RXOKLED) and all other pins to be GPIO.
+    *
+    *  The default is 0x0180 - GPIO 8 = irq, GPIO 7 = sync. All others are GPIO functionality
+    */
+    uint16_t getGPIO() {
+        return GPIO_Pins;
+    };
+
+    /** Check that the settings are self consistent
+    *
+    * @return true if the settings are valid
+    *
+    * Will check the following:
+    *  - Preamble size is sensible for the data rate
+    *  - Preamble code is valid for the channel
+    *  - That smart power is only enabled at 6.8Mb/s
+    */
+    bool check();
+
+    /** Get setup description
+    *
+    * @param buffer Data buffer to place description in
+    * @param len Length of data buffer
+    *
+    * Places a text string describing the current setup into the suppled buffer.
+    */
+    void getSetupDescription(char *buffer, int len);
+
+private:
+    float powers[4];
+    uint16_t GPIO_Pins;
+    unsigned char channel; // 1-5 , 7
+    enum prf_e prf;
+    enum dataRate_e dataRate;
+    enum sfd_e sfd;
+    enum preamble_e preamble;
+    unsigned char preambleCode; // 1-24. See section 10.5 of user manual for details.
+    bool enableSmartPower;
+};
+
+#endif