Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: measure.cpp
- 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; + } +} + +