Nisarg Sheth / Mbed OS EVAL-ADMX2001

Dependencies:   ADMX2001

Revision:
5:746e78113d7d
Child:
8:bd0b93e35392
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/measure.cpp	Wed Oct 27 06:58:57 2021 +0000
@@ -0,0 +1,238 @@
+/* Copyright (c) 2021 Analog Devices, Inc.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+  - Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+  - Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+  - Modified versions of the software must be conspicuously marked as such.
+  - This software is licensed solely and exclusively for use with processors/products
+  manufactured by or for Analog Devices, Inc.
+  - This software may not be combined or merged with other code in any manner
+  that would cause the software to become subject to terms and conditions which
+  differ from those listed here.
+  - Neither the name of Analog Devices, Inc. nor the names of its contributors
+  may be used to endorse or promote products derived from this software without
+  specific prior written permission.
+  - The use of this software may or may not infringe the patent rights of one or
+  more patent holders.  This license does not release you from the requirement
+  that you obtain separate licenses from these patent holders to use this software.
+
+THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
+TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL
+PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+2021-01-10-7CBSD SLA
+*/
+
+/*=============  I N C L U D E S   =============*/
+#include "ADMX2001.h"
+#include "ADMX2001_commands.h"
+#include "message.h"
+#include "measure.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/**  maximum length for buffer for string operation */
+#define MAX_DISPLAY_LENGTH 128
+/**  maximum length for buffer for storing measurement values */
+#define MAX_MEASUREMENT_BUFFER 512
+/**  buffer for string operation */
+char displayString[MAX_DISPLAY_LENGTH];
+/** Array to store measurement values*/
+double measurementBuffer[MAX_MEASUREMENT_BUFFER];
+/** Array to store sweep points*/
+double sweepPoints[MAX_MEASUREMENT_BUFFER];
+
+extern Admx200xDev admx200xDev;
+                                 
+static int32_t GetAttributeInt32(uint32_t attributeID, int32_t *pValue);
+
+static int32_t ReadAndDisplay(SWEEP_TYPE sweepType);
+
+static void DisplayMeasuredValue(double displayVal1, double displayVal2,
+                                 double sweepVar);
+
+int32_t GetAttributeInt32(uint32_t attributeID, int32_t *pValue)
+{
+    int32_t status = ADMX_STATUS_SUCCESS;
+    uint8_t cmdID;
+    uint16_t addr = 0;
+
+    uint32_t statReg;
+    uint32_t data;
+    cmdID = attributeID;
+    cmdID |= CMD_READ_BITM;
+    status = Admx200xSendCmd(&admx200xDev, &cmdID, &addr, &data, &statReg);
+    if (status == ADMX_STATUS_SUCCESS)
+    {
+        status = (int32_t)(statReg & ADMX200X_STATUS_CODE_BITM);
+        cmdID = CMD_RESULT_READ;
+        status = Admx200xReadData(&admx200xDev, cmdID, (uint32_t *)pValue);
+    }
+
+    return status;
+}
+
+/**
+ * @brief  Dsiplays the output value
+ * \ref DisplayMeasuredValue
+ */
+void DisplayMeasuredValue(double displayVal1, double displayVal2,
+                          double sweepVar)
+{
+    snprintf(&displayString[0], MAX_DISPLAY_LENGTH,
+             "%d,%0.6e,%0.6e\n\r", (int32_t)sweepVar, displayVal1,
+             displayVal2);
+    printf("%s", &displayString[0]);
+}
+
+/**
+ * @brief  Function to read and display measured values
+ */
+int32_t ReadAndDisplay(SWEEP_TYPE sweepType)
+{
+    int32_t i;
+    int32_t status = ADMX_STATUS_SUCCESS;
+
+    Admx200xDev *pAdmx200x = &admx200xDev;
+    uint8_t cmdId = 0;
+    uint16_t addr = 0;
+    uint32_t statReg;
+
+    int32_t numValues =
+        sizeof(measurementBuffer) / sizeof(measurementBuffer[0]);
+
+    if (status == 0)
+    {
+        status = Admx200xReadFifo(pAdmx200x, &measurementBuffer[0], &numValues);
+    }
+    // Read sweep points
+    if (status == 0)
+    {
+        cmdId = CMD_READ_SWEEP_POINTS;
+        numValues /= 2;
+        status = Admx200xSendCmd(pAdmx200x, &cmdId, &addr,
+                                 (uint32_t *)&numValues, &statReg);
+    }
+    // Read sweep points
+    if (status == 0)
+    {
+        status = Admx200xReadFifo(pAdmx200x, &sweepPoints[0], &numValues);
+    }
+
+    if (status == 0)
+    {
+        for (i = 0; i < numValues; i++)
+        {
+            DisplayMeasuredValue(measurementBuffer[2 * i],
+                                 measurementBuffer[2 * i + 1], sweepPoints[i]);
+        }
+    }
+
+    return status;
+}
+
+int32_t TriggerAndMeasure()
+{
+    int32_t status = 0;
+    int32_t warningStatus = 0;
+    uint8_t cmdId;
+    uint16_t addr;
+    uint32_t data;
+    uint32_t statReg;
+    Admx200xDev *pAdmx200x = &admx200xDev;
+    uint32_t measureStatus;
+    int32_t sweepType;
+    addr = 0;
+    data = 0;
+
+    /** These are required to display the output **/
+
+    /*
+    if (status == ADMX_STATUS_SUCCESS)
+    {
+        status = GetAttributeInt32((0x20 + 37), &resistanceMode);
+    }
+    */
+    
+    if (status == ADMX_STATUS_SUCCESS)
+    {
+        cmdId = CMD_Z;
+        warningStatus =
+            Admx200xSendCmd(pAdmx200x, &cmdId, &addr, &data, &statReg);
+        if (warningStatus == ADMX_STATUS_INVALID_CURRENT_GAIN ||
+            warningStatus == ADMX_STATUS_INVALID_DISPLAY_MODE ||
+            warningStatus == ADMX_STATUS_UNCOMMITED_CAL ||
+            warningStatus == ADMX_STATUS_SUCCESS)
+        {
+            warningStatus = Admx200xWaitForStatus(
+                pAdmx200x, SPI_TIMEOUT, ADMX200X_STATUS_MEASURE_DONE_BITM,
+                &measureStatus);
+        }
+        else
+        {
+            status = warningStatus;
+        }
+        //PrintWarningMessages();
+    }
+
+    if (warningStatus == ADMX_STATUS_INVALID_CURRENT_GAIN ||
+        warningStatus == ADMX_STATUS_INVALID_DISPLAY_MODE ||
+        warningStatus == ADMX_STATUS_UNCOMMITED_CAL ||
+        warningStatus == ADMX_STATUS_SUCCESS)
+    {
+        status = ReadAndDisplay((SWEEP_TYPE)sweepType);
+    }
+    else
+    {
+        // Clear the error
+        Admx200xClearSPI(pAdmx200x);
+        // Send abort command to bring state machine to IDLE if it got stuck
+        cmdId = CMD_ABORT;
+        Admx200xSendCmd(pAdmx200x, &cmdId, &addr, &data, &statReg);
+    }
+
+    if (status == ADMX_STATUS_SUCCESS)
+    {
+        status = warningStatus;
+    }
+
+    return status;
+}
+
+void PrintMeasureStatusMessage(int32_t status)
+{
+    switch (status)
+    {
+    case ADMX_STATUS_SUCCESS:
+        break;
+    case ADMX_STATUS_INVALID_CURRENT_GAIN:
+        WARN_MSG("DC Resistance Mode: invalid current gain");
+        break;
+    case ADMX_STATUS_INVALID_DISPLAY_MODE:
+        /** Admittance mode is not supported.Only impedance*/
+        WARN_MSG("DC Resistance Mode: invalid display type");
+        break;
+    case ADMX_STATUS_UNCOMMITED_CAL:
+        WARN_MSG("Uncommitted calibration coefficients found for (vg, ig)");
+        INFO_MSG("Use cal commit to save this to flash");
+        break;
+    default:
+        ERROR_MSG("Measurement failed");
+        break;
+    }
+}
+
+