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

Dependencies:   BurstSPI

Revision:
8:0b408e77b701
Child:
9:326bf149c8bc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DW1000Setup.cpp	Mon Apr 18 16:58:27 2016 +0000
@@ -0,0 +1,262 @@
+
+#include "DW1000Setup.h"
+
+DW1000Setup::DW1000Setup(UWBMode modeToUse)
+{
+    switch (modeToUse) {
+        case user110k:  // values from Matthias Grob & Manuel Stalder - ETH Zürich - library
+
+            setChannel(5);
+            setPRF(prf16MHz);
+            setDataRate(kbps110);
+            setSfd(standard);
+            setPreambleLength(pre1024);
+            setPreambleCode(3);
+            setSmartPower(false);
+//            setTxPower(18);
+            break;
+        case tunedDefault:    // User Manual "2.5.5 Default Configurations that should be modified" p. 22
+        default:
+            setChannel(5);
+            setPRF(prf16MHz);
+            setDataRate(kbps6800);
+            setSfd(standard);
+            setPreambleLength(pre128);
+            setPreambleCode(3);
+            setSmartPower(false);
+//            setTxPower(18);
+            break;
+        case fastLocationC5:
+            setChannel(5);
+            setPRF(prf64MHz);
+            setDataRate(kbps6800);
+            setSfd(standard);
+            setPreambleLength(pre64);
+            setPreambleCode(10);
+            setSmartPower(true);
+//            setTxPower(18);
+            break;
+        case fastLocationC4:
+            setChannel(4);
+            setPRF(prf64MHz);
+            setDataRate(kbps6800);
+            setSfd(standard);
+            setPreambleLength(pre64);
+            setPreambleCode(18);
+            setSmartPower(true);
+//            setTxPower(18);
+            break;
+        case rangeRateCompromise:
+            setChannel(4);
+            setPRF(prf64MHz);
+            setDataRate(kbps850);
+            setSfd(standard);  // for some reason decawave doesn't work.
+            setPreambleLength(pre256);
+            setPreambleCode(18);
+            setSmartPower(false);
+//            setTxPower(18);
+            break;
+    }
+}
+
+
+DW1000Setup::DW1000Setup(DW1000Setup *orij) {
+        channel = orij->getChannel();
+        prf = orij->getPRF();
+        dataRate = orij->getDataRate();
+        sfd = orij->getSfd();
+        preamble = orij->getPreambleLength();
+        preambleCode = orij->getPreambleCode();
+        GPIO_Pins = orij->getGPIO(); // 8 = irq, 7 = sync. Others are GPIO
+        enableSmartPower = orij->getSmartPower();
+        memcpy(&powers,orij->getTxPowers(),4*sizeof(float));
+    }
+
+
+    void DW1000Setup::applyConfig(DW1000Setup *orij) {
+        channel = orij->getChannel();
+        prf = orij->getPRF();
+        dataRate = orij->getDataRate();
+        sfd = orij->getSfd();
+        preamble = orij->getPreambleLength();
+        preambleCode = orij->getPreambleCode();
+        GPIO_Pins = orij->getGPIO(); // 8 = irq, 7 = sync. Others are GPIO
+        enableSmartPower = orij->getSmartPower();
+        memcpy(&powers,orij->getTxPowers(),4*sizeof(float));
+    }
+
+
+bool DW1000Setup::check()
+{
+    int maxCode = 24;
+    int minCode = 1;
+
+    if (prf == prf16MHz)
+        switch (channel) {
+            case 1:
+                maxCode = 2;
+                minCode = 1;
+                break;
+            case 2:
+            case 5:
+                maxCode = 4;
+                minCode = 3;
+                break;
+            case 3:
+                maxCode = 6;
+                minCode = 5;
+                break;
+            case 4:
+            case 7:
+                maxCode = 8;
+                minCode = 7;
+                break;
+            default:
+                return false; // invalid channel
+        }
+    else
+        switch (channel) {
+            case 1:
+            case 2:
+            case 3:
+            case 5:
+                maxCode = 12;
+                minCode = 9;
+                break;
+            case 4:
+            case 7:
+                maxCode = 20;
+                minCode = 17;
+                break;
+            default:
+                return false; // invalid channel
+        }
+
+    if ((preambleCode > maxCode) || (preambleCode < minCode))
+        return false;
+
+    switch (preamble) {
+        default:
+            return false;
+        case pre64:
+        case pre128:
+            if (dataRate != kbps6800)
+                return false;
+            break;
+        case pre256:
+            if (dataRate == kbps110)
+                return false;
+            break;
+        case pre512:
+        case pre1024:
+        case pre1536:
+            if (dataRate != kbps850)
+                return false;
+            break;
+        case pre2048:
+            if (dataRate == kbps6800)
+                return false;
+            break;
+        case pre4096:
+            if (dataRate != kbps110)
+                return false;
+            break;
+    }
+
+    if (enableSmartPower) {
+        if (dataRate != kbps6800)
+            return false;
+    }
+    return true;
+}
+
+void DW1000Setup::getSetupDescription(char *buffer, int len)
+{
+
+    char dataRateString[10];
+    if (dataRate == kbps6800)
+        strcpy(dataRateString,"6.8 Mbps");
+    else if (dataRate == kbps850)
+        strcpy(dataRateString,"850 kbps");
+    else
+        strcpy(dataRateString,"110 kbps");
+
+    char preambleString[8];
+    switch (preamble) {
+        default:
+            strcpy(preambleString,"error");
+            break;
+        case pre64:
+            strcpy(preambleString,"64");
+            break;
+        case pre128:
+            strcpy(preambleString,"128");
+            break;
+        case pre256:
+            strcpy(preambleString,"256");
+            break;
+        case pre512:
+            strcpy(preambleString,"512");
+            break;
+        case pre1024:
+            strcpy(preambleString,"1024");
+            break;
+        case pre1536:
+            strcpy(preambleString,"1536");
+            break;
+        case pre2048:
+            strcpy(preambleString,"2048");
+            break;
+        case pre4096:
+            strcpy(preambleString,"4096");
+            break;
+    }
+
+    snprintf(buffer,len,"Channel:\t%u\r\nPRF:\t%s\r\nData Rate:\t%s\r\nPreamble length:\t%s\r\nPreamble code:\t%u\r\nSmart power:\t%s\r\nSFD:\t%s\r\n",
+             channel,
+             (prf == prf16MHz)?"16 MHz":"64 MHz",
+             dataRateString,
+             preambleString,
+             preambleCode,
+             enableSmartPower?"Enabled":"Disabled",
+             (sfd == standard)?"Standard":"Non-standard");
+}
+
+    bool DW1000Setup::setSmartTxPower(float powerdBm,float power500us,float power250us,float power125us) {
+        if ((powerdBm < 0) || (powerdBm > 33.5))
+            return false;
+
+        powers[0] = powerdBm;
+
+        if ((power500us < powerdBm) || (power500us > 33.5))
+            powers[1] = powers[0];
+        else
+            powers[1] = power500us;
+
+        if ((power250us < power500us) || (power250us > 33.5))
+            powers[2] = powers[1];
+        else
+            powers[2] = power250us;
+
+        if ((power125us < power250us) || (power125us > 33.5))
+            powers[3] = powers[2];
+        else
+            powers[3] = power125us;
+
+        return true;
+    }
+
+    bool DW1000Setup::setTxPower(float powerdBm,float powerPRF) {
+        if ((powerdBm < 0) || (powerdBm > 33.5))
+            return false;
+
+        powers[0] = powerdBm;
+        powers[1] = powerdBm;
+        powers[2] = powerdBm;
+        powers[3] = powerdBm;
+
+        if ((powerPRF > 0) && (powerPRF < 33.5))
+            powers[1] = powerPRF;
+
+        return true;
+    }