Mbed Development branch for MeasrueWare

Committer:
Vkadaba
Date:
Wed May 20 06:19:06 2020 +0000
Revision:
79:dddd92b3a416
Parent:
78:2301b7437902
Updated Mbed release notes;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vkadaba 15:b5d57daeb7c0 1 /*
Vkadaba 15:b5d57daeb7c0 2 Copyright 2019 (c) Analog Devices, Inc.
Vkadaba 15:b5d57daeb7c0 3
Vkadaba 15:b5d57daeb7c0 4 All rights reserved.
Vkadaba 15:b5d57daeb7c0 5
Vkadaba 15:b5d57daeb7c0 6 Redistribution and use in source and binary forms, with or without
Vkadaba 15:b5d57daeb7c0 7 modification, are permitted provided that the following conditions are met:
Vkadaba 15:b5d57daeb7c0 8 - Redistributions of source code must retain the above copyright
Vkadaba 15:b5d57daeb7c0 9 notice, this list of conditions and the following disclaimer.
Vkadaba 15:b5d57daeb7c0 10 - Redistributions in binary form must reproduce the above copyright
Vkadaba 15:b5d57daeb7c0 11 notice, this list of conditions and the following disclaimer in
Vkadaba 15:b5d57daeb7c0 12 the documentation and/or other materials provided with the
Vkadaba 15:b5d57daeb7c0 13 distribution.
Vkadaba 15:b5d57daeb7c0 14 - Neither the name of Analog Devices, Inc. nor the names of its
Vkadaba 15:b5d57daeb7c0 15 contributors may be used to endorse or promote products derived
Vkadaba 15:b5d57daeb7c0 16 from this software without specific prior written permission.
Vkadaba 15:b5d57daeb7c0 17 - The use of this software may or may not infringe the patent rights
Vkadaba 15:b5d57daeb7c0 18 of one or more patent holders. This license does not release you
Vkadaba 15:b5d57daeb7c0 19 from the requirement that you obtain separate licenses from these
Vkadaba 15:b5d57daeb7c0 20 patent holders to use this software.
Vkadaba 15:b5d57daeb7c0 21 - Use of the software either in source or binary form, must be run
Vkadaba 15:b5d57daeb7c0 22 on or directly connected to an Analog Devices Inc. component.
Vkadaba 15:b5d57daeb7c0 23
Vkadaba 15:b5d57daeb7c0 24 THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
Vkadaba 15:b5d57daeb7c0 25 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
Vkadaba 15:b5d57daeb7c0 26 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Vkadaba 15:b5d57daeb7c0 27 IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
Vkadaba 15:b5d57daeb7c0 28 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Vkadaba 15:b5d57daeb7c0 29 LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
Vkadaba 15:b5d57daeb7c0 30 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Vkadaba 15:b5d57daeb7c0 31 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Vkadaba 15:b5d57daeb7c0 32 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Vkadaba 15:b5d57daeb7c0 33 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Vkadaba 15:b5d57daeb7c0 34 */
Vkadaba 15:b5d57daeb7c0 35
Vkadaba 15:b5d57daeb7c0 36 /*!
Vkadaba 15:b5d57daeb7c0 37 ******************************************************************************
Vkadaba 15:b5d57daeb7c0 38 * @file: utils.c
Vkadaba 15:b5d57daeb7c0 39 * @brief: Interface Utilities for ADMW1001
Vkadaba 15:b5d57daeb7c0 40 *-----------------------------------------------------------------------------
Vkadaba 15:b5d57daeb7c0 41 */
ADIJake 0:85855ecd3257 42 #include <stdlib.h>
ADIJake 0:85855ecd3257 43
ADIJake 0:85855ecd3257 44 #include "utils.h"
Vkadaba 5:0728bde67bdb 45 #include "admw_log.h"
ADIJake 0:85855ecd3257 46
ADIJake 0:85855ecd3257 47 void utils_printStatus(
Vkadaba 5:0728bde67bdb 48 ADMW_STATUS *pStatus)
ADIJake 0:85855ecd3257 49 {
Vkadaba 5:0728bde67bdb 50 ADMW_LOG_INFO("Status Summary:");
Vkadaba 70:420fac5132f5 51
Vkadaba 23:bb685f35b08b 52 if (pStatus->deviceStatus == 0) {
Vkadaba 5:0728bde67bdb 53 ADMW_LOG_INFO("\tNo errors detected");
Vkadaba 23:bb685f35b08b 54 } else {
Vkadaba 5:0728bde67bdb 55 if (pStatus->deviceStatus & ADMW_DEVICE_STATUS_BUSY)
Vkadaba 5:0728bde67bdb 56 ADMW_LOG_INFO("\tCommand running");
Vkadaba 5:0728bde67bdb 57 if (pStatus->deviceStatus & ADMW_DEVICE_STATUS_DATAREADY)
Vkadaba 5:0728bde67bdb 58 ADMW_LOG_INFO("\tData ready");
Vkadaba 5:0728bde67bdb 59 if (pStatus->deviceStatus & ADMW_DEVICE_STATUS_ERROR)
Vkadaba 5:0728bde67bdb 60 ADMW_LOG_INFO("\tActive Errors - RESET REQUIRED");
Vkadaba 5:0728bde67bdb 61 if (pStatus->deviceStatus & ADMW_DEVICE_STATUS_FIFO_ERROR)
Vkadaba 70:420fac5132f5 62 {
Vkadaba 5:0728bde67bdb 63 ADMW_LOG_INFO("\tActive FIFO Errors - ATTENTION REQUIRED");
Vkadaba 67:d36977cbfe90 64 ADMW_LOG_INFO("\tFIFO buffer full");
Vkadaba 71:7b5ebd969aa7 65 ADMW_LOG_INFO("\tExceeding measurements per cycle limit of %d",MAXIMUM_MEASUREMENTS_PER_CYCLE);
Vkadaba 70:420fac5132f5 66 }
Vkadaba 5:0728bde67bdb 67 if (pStatus->deviceStatus & ADMW_DEVICE_STATUS_CONFIG_ERROR)
Vkadaba 5:0728bde67bdb 68 ADMW_LOG_INFO("\tActive Configuration Errors - ATTENTION REQUIRED");
Vkadaba 23:bb685f35b08b 69 if (pStatus->deviceStatus & ADMW_DEVICE_STATUS_ALERT) {
Vkadaba 5:0728bde67bdb 70 ADMW_LOG_INFO("\tActive Alerts - ATTENTION REQUIRED:");
ADIJake 0:85855ecd3257 71
Vkadaba 23:bb685f35b08b 72 for (unsigned i = 0; i < ADMW1001_MAX_CHANNELS; i++) {
ADIJake 0:85855ecd3257 73 if (pStatus->channelAlerts[i] == 0)
ADIJake 0:85855ecd3257 74 continue;
ADIJake 0:85855ecd3257 75
Vkadaba 5:0728bde67bdb 76 ADMW_LOG_INFO("\t\tChannel #%u:", i);
Vkadaba 32:52445bef314d 77 if (pStatus->channelAlerts[i] & ADMW_ALERT_DETAIL_CH_ADC_NEAR_OVERRANGE)
Vkadaba 32:52445bef314d 78 ADMW_LOG_INFO("\t\t\ADC near overrange detected");
Vkadaba 32:52445bef314d 79 if (pStatus->channelAlerts[i] & ADMW_ALERT_DETAIL_CH_SENSOR_UNDERRANGE)
Vkadaba 32:52445bef314d 80 ADMW_LOG_INFO("\t\t\tSensor underrange detected");
Vkadaba 32:52445bef314d 81 if (pStatus->channelAlerts[i] & ADMW_ALERT_DETAIL_CH_SENSOR_OVERRANGE)
Vkadaba 32:52445bef314d 82 ADMW_LOG_INFO("\t\t\tSensor overrange detected");
Vkadaba 32:52445bef314d 83 if (pStatus->channelAlerts[i] & ADMW_ALERT_DETAIL_CH_CJ_SOFT_FAULT)
Vkadaba 32:52445bef314d 84 ADMW_LOG_INFO("\t\t\tCJC soft fault alert detected");
Vkadaba 32:52445bef314d 85 if (pStatus->channelAlerts[i] & ADMW_ALERT_DETAIL_CH_CJ_HARD_FAULT)
Vkadaba 32:52445bef314d 86 ADMW_LOG_INFO("\t\t\tCJC hard fault alert detected");
Vkadaba 32:52445bef314d 87 if (pStatus->channelAlerts[i] & ADMW_ALERT_DETAIL_CH_ADC_INPUT_OVERRANGE)
Vkadaba 32:52445bef314d 88 ADMW_LOG_INFO("\t\t\tADC input overranage alert detected");
Vkadaba 32:52445bef314d 89 if (pStatus->channelAlerts[i] & ADMW_ALERT_DETAIL_CH_SENSOR_HARDFAULT)
Vkadaba 32:52445bef314d 90 ADMW_LOG_INFO("\t\t\tChannel sensor hardfault alert detected");
ADIJake 0:85855ecd3257 91 }
ADIJake 0:85855ecd3257 92 }
Vkadaba 70:420fac5132f5 93
Vkadaba 70:420fac5132f5 94 if ((pStatus->deviceStatus & ADMW_DEVICE_STATUS_ERROR) ||
Vkadaba 70:420fac5132f5 95 (pStatus->deviceStatus & ADMW_DEVICE_STATUS_ALERT)) {
Vkadaba 70:420fac5132f5 96 ADMW_LOG_INFO("\t\tLast Debug Code: %u-%u",
Vkadaba 70:420fac5132f5 97 (pStatus->debugCode >> 16) & 0xFFFF,
Vkadaba 70:420fac5132f5 98 (pStatus->debugCode >> 0) & 0xFFFF);
Vkadaba 70:420fac5132f5 99 }
ADIJake 0:85855ecd3257 100 }
ADIJake 0:85855ecd3257 101 }
ADIJake 0:85855ecd3257 102
rfinnert 74:27a28f452d71 103 void utils_printSamples(
rfinnert 74:27a28f452d71 104 ADMW_DATA_SAMPLE *pSampleBuffer,
rfinnert 74:27a28f452d71 105 uint32_t nNumSamples,
rfinnert 74:27a28f452d71 106 ADMW_MEASUREMENT_MODE eMeasurementMode)
ADIJake 0:85855ecd3257 107 {
Vkadaba 23:bb685f35b08b 108 for (uint32_t i = 0; i < nNumSamples; i++) {
Vkadaba 78:2301b7437902 109 ADMW_LOG_INFO("Sample # %2d Channel_ID # %2d :: Raw_Sample %.9f :: processedValue %f :: flags: ERROR:%X , ALERT:%X",
Vkadaba 23:bb685f35b08b 110 i+1,
Vkadaba 65:d91e1d63153d 111 pSampleBuffer[i].Channel_ID,
Vkadaba 65:d91e1d63153d 112 pSampleBuffer[i].Raw_Sample,
Vkadaba 23:bb685f35b08b 113 pSampleBuffer[i].processedValue,
Vkadaba 65:d91e1d63153d 114 pSampleBuffer[i].Ch_Error,
Vkadaba 65:d91e1d63153d 115 pSampleBuffer[i].Ch_Alert);
Vkadaba 10:14954555be2a 116 }
ADIJake 0:85855ecd3257 117 }
ADIJake 0:85855ecd3257 118
Vkadaba 5:0728bde67bdb 119 static void gpioCallbackFn(ADMW_GPIO_PIN ePinId, void * pArg)
ADIJake 0:85855ecd3257 120 {
ADIJake 0:85855ecd3257 121 volatile bool *pbFlag = (volatile bool *)pArg;
ADIJake 0:85855ecd3257 122 *pbFlag = true;
ADIJake 0:85855ecd3257 123 }
ADIJake 0:85855ecd3257 124
Vkadaba 5:0728bde67bdb 125 ADMW_RESULT utils_registerCallbacks(
Vkadaba 5:0728bde67bdb 126 ADMW_DEVICE_HANDLE hDevice,
ADIJake 0:85855ecd3257 127 volatile bool *pbDataReady,
ADIJake 0:85855ecd3257 128 volatile bool *pbError,
ADIJake 0:85855ecd3257 129 volatile bool *pbAlert)
ADIJake 0:85855ecd3257 130 {
Vkadaba 5:0728bde67bdb 131 ADMW_RESULT res;
ADIJake 0:85855ecd3257 132 bool state;
ADIJake 0:85855ecd3257 133
Vkadaba 5:0728bde67bdb 134 res = admw_RegisterGpioCallback(hDevice, ADMW_GPIO_PIN_DATAREADY,
Vkadaba 23:bb685f35b08b 135 gpioCallbackFn, (void *)pbDataReady);
Vkadaba 23:bb685f35b08b 136 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 137 ADMW_LOG_ERROR("Failed to register DATAREADY callback");
ADIJake 0:85855ecd3257 138 return res;
ADIJake 0:85855ecd3257 139 }
ADIJake 0:85855ecd3257 140
Vkadaba 5:0728bde67bdb 141 res = admw_GetGpioState(hDevice, ADMW_GPIO_PIN_ALERT_ERROR, &state);
Vkadaba 23:bb685f35b08b 142 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 143 ADMW_LOG_ERROR("Failed to get current ERROR state");
ADIJake 0:85855ecd3257 144 return res;
ADIJake 0:85855ecd3257 145 }
Vkadaba 23:bb685f35b08b 146 if (state) {
Vkadaba 5:0728bde67bdb 147 ADMW_LOG_ERROR("ERROR signal already asserted");
Vkadaba 5:0728bde67bdb 148 return ADMW_FAILURE;
ADIJake 0:85855ecd3257 149 }
Vkadaba 5:0728bde67bdb 150 res = admw_RegisterGpioCallback(hDevice, ADMW_GPIO_PIN_ALERT_ERROR,
Vkadaba 23:bb685f35b08b 151 gpioCallbackFn, (void *)pbError);
Vkadaba 23:bb685f35b08b 152 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 153 ADMW_LOG_ERROR("Failed to register ERROR callback");
ADIJake 0:85855ecd3257 154 return res;
ADIJake 0:85855ecd3257 155 }
ADIJake 0:85855ecd3257 156
Vkadaba 5:0728bde67bdb 157 /*res = admw_GetGpioState(hDevice, ADMW_GPIO_PIN_ALERT, &state);
Vkadaba 5:0728bde67bdb 158 if (res != ADMW_SUCCESS)
ADIJake 0:85855ecd3257 159 {
Vkadaba 5:0728bde67bdb 160 ADMW_LOG_ERROR("Failed to get current ALERT state");
ADIJake 0:85855ecd3257 161 return res;
ADIJake 0:85855ecd3257 162 }
ADIJake 0:85855ecd3257 163 if (state)
ADIJake 0:85855ecd3257 164 {
Vkadaba 5:0728bde67bdb 165 ADMW_LOG_ERROR("ALERT signal already asserted");
Vkadaba 5:0728bde67bdb 166 return ADMW_FAILURE;
ADIJake 1:63dd03580de4 167 }*/
Vkadaba 5:0728bde67bdb 168 res = admw_RegisterGpioCallback(hDevice, ADMW_GPIO_PIN_ALERT_ERROR,
Vkadaba 23:bb685f35b08b 169 gpioCallbackFn, (void *)pbAlert);
Vkadaba 23:bb685f35b08b 170 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 171 ADMW_LOG_ERROR("Failed to register ALERT callback");
ADIJake 0:85855ecd3257 172 return res;
ADIJake 0:85855ecd3257 173 }
ADIJake 0:85855ecd3257 174
Vkadaba 5:0728bde67bdb 175 return ADMW_SUCCESS;
ADIJake 0:85855ecd3257 176 }
ADIJake 0:85855ecd3257 177
Vkadaba 5:0728bde67bdb 178 ADMW_RESULT utils_deregisterCallbacks(
Vkadaba 5:0728bde67bdb 179 ADMW_DEVICE_HANDLE hDevice)
ADIJake 0:85855ecd3257 180 {
Vkadaba 5:0728bde67bdb 181 ADMW_RESULT res;
ADIJake 0:85855ecd3257 182
Vkadaba 5:0728bde67bdb 183 res = admw_RegisterGpioCallback(hDevice, ADMW_GPIO_PIN_DATAREADY,
Vkadaba 23:bb685f35b08b 184 NULL, NULL);
Vkadaba 23:bb685f35b08b 185 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 186 ADMW_LOG_ERROR("Failed to deregister DATAREADY callback");
ADIJake 0:85855ecd3257 187 return res;
ADIJake 0:85855ecd3257 188 }
ADIJake 0:85855ecd3257 189
Vkadaba 5:0728bde67bdb 190 res = admw_RegisterGpioCallback(hDevice, ADMW_GPIO_PIN_ALERT_ERROR,
Vkadaba 23:bb685f35b08b 191 NULL, NULL);
Vkadaba 23:bb685f35b08b 192 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 193 ADMW_LOG_ERROR("Failed to deregister ERROR callback");
ADIJake 0:85855ecd3257 194 return res;
ADIJake 0:85855ecd3257 195 }
ADIJake 0:85855ecd3257 196
Vkadaba 5:0728bde67bdb 197 res = admw_RegisterGpioCallback(hDevice, ADMW_GPIO_PIN_ALERT_ERROR,
Vkadaba 23:bb685f35b08b 198 NULL, NULL);
Vkadaba 23:bb685f35b08b 199 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 200 ADMW_LOG_INFO("Failed to deregister ALERT callback");
ADIJake 0:85855ecd3257 201 return res;
ADIJake 0:85855ecd3257 202 }
ADIJake 0:85855ecd3257 203
Vkadaba 5:0728bde67bdb 204 return ADMW_SUCCESS;
ADIJake 0:85855ecd3257 205 }
ADIJake 0:85855ecd3257 206
Vkadaba 5:0728bde67bdb 207 ADMW_RESULT utils_runMeasurement(
Vkadaba 5:0728bde67bdb 208 ADMW_DEVICE_HANDLE hDevice,
Vkadaba 5:0728bde67bdb 209 ADMW_MEASUREMENT_MODE eMeasurementMode)
ADIJake 0:85855ecd3257 210 {
Vkadaba 5:0728bde67bdb 211 ADMW_RESULT res;
ADIJake 0:85855ecd3257 212 volatile bool bDataReady = false;
ADIJake 0:85855ecd3257 213 volatile bool bError = false;
ADIJake 0:85855ecd3257 214 volatile bool bAlert = false;
ADIJake 0:85855ecd3257 215 res = utils_registerCallbacks(hDevice, &bDataReady, &bError, &bAlert);
Vkadaba 5:0728bde67bdb 216 if (res != ADMW_SUCCESS)
ADIJake 0:85855ecd3257 217 return res;
ADIJake 0:85855ecd3257 218
ADIJake 0:85855ecd3257 219 /*
ADIJake 0:85855ecd3257 220 * Retrieve the number of samples per cycle, per DATAREADY pulse, etc. for
ADIJake 0:85855ecd3257 221 * this configuration.
ADIJake 0:85855ecd3257 222 */
Vkadaba 5:0728bde67bdb 223 ADMW1001_OPERATING_MODE eOperatingMode;
Vkadaba 5:0728bde67bdb 224 ADMW1001_DATAREADY_MODE eDataReadyMode;
ADIJake 0:85855ecd3257 225 uint32_t nSamplesPerDataready;
ADIJake 0:85855ecd3257 226 uint32_t nSamplesPerCycle;
ADIJake 0:85855ecd3257 227 uint8_t nBytesPerSample;
Vkadaba 5:0728bde67bdb 228 res = admw1001_GetDataReadyModeInfo(hDevice,
Vkadaba 23:bb685f35b08b 229 eMeasurementMode,
Vkadaba 23:bb685f35b08b 230 &eOperatingMode,
Vkadaba 23:bb685f35b08b 231 &eDataReadyMode,
Vkadaba 23:bb685f35b08b 232 &nSamplesPerDataready,
Vkadaba 23:bb685f35b08b 233 &nSamplesPerCycle,
Vkadaba 23:bb685f35b08b 234 &nBytesPerSample);
Vkadaba 5:0728bde67bdb 235 if (res != ADMW_SUCCESS)
ADIJake 0:85855ecd3257 236 return res;
ADIJake 0:85855ecd3257 237
ADIJake 0:85855ecd3257 238 /*
ADIJake 0:85855ecd3257 239 * Allocate a buffer to store the samples retrieved on each DATAREADY pulse
ADIJake 0:85855ecd3257 240 */
Vkadaba 5:0728bde67bdb 241 ADMW_DATA_SAMPLE *pSampleBuffer;
Vkadaba 5:0728bde67bdb 242 pSampleBuffer = malloc(sizeof(ADMW_DATA_SAMPLE) *
ADIJake 0:85855ecd3257 243 nSamplesPerDataready);
Vkadaba 23:bb685f35b08b 244 if (pSampleBuffer == NULL) {
Vkadaba 5:0728bde67bdb 245 ADMW_LOG_ERROR("Failed to allocate sample buffer");
Vkadaba 5:0728bde67bdb 246 return ADMW_NO_MEM;
ADIJake 0:85855ecd3257 247 }
ADIJake 0:85855ecd3257 248
ADIJake 0:85855ecd3257 249 /*
ADIJake 0:85855ecd3257 250 * Kick off the measurement cycle(s) here
ADIJake 0:85855ecd3257 251 */
Vkadaba 5:0728bde67bdb 252 ADMW_LOG_INFO("Starting measurement");
Vkadaba 5:0728bde67bdb 253 res = admw_StartMeasurement(hDevice, eMeasurementMode);
Vkadaba 23:bb685f35b08b 254 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 255 ADMW_LOG_ERROR("Failed to start measurement");
ADIJake 0:85855ecd3257 256 return res;
ADIJake 0:85855ecd3257 257 }
ADIJake 0:85855ecd3257 258
ADIJake 0:85855ecd3257 259 /*
ADIJake 0:85855ecd3257 260 * Loop continuously unless operating mode is single-cycle
ADIJake 0:85855ecd3257 261 */
ADIJake 0:85855ecd3257 262 uint32_t nSampleCount = 0;
ADIJake 0:85855ecd3257 263 uint32_t nReturned;
Vkadaba 23:bb685f35b08b 264 while (true) {
Vkadaba 70:420fac5132f5 265 ADMW_STATUS status;
ADIJake 0:85855ecd3257 266
ADIJake 0:85855ecd3257 267 /*
ADIJake 0:85855ecd3257 268 * Wait until the next batch of 1 or more samples is ready, continuously
ADIJake 0:85855ecd3257 269 * checking DATAREADY until it is asserted
ADIJake 0:85855ecd3257 270 */
Vkadaba 70:420fac5132f5 271 res = admw_GetStatus(hDevice, &status);
Vkadaba 70:420fac5132f5 272 if (res != ADMW_SUCCESS) {
Vkadaba 70:420fac5132f5 273 ADMW_LOG_ERROR("Failed to retrieve device status");
Vkadaba 70:420fac5132f5 274 }
Vkadaba 70:420fac5132f5 275 if (status.deviceStatus & ADMW_DEVICE_STATUS_FIFO_ERROR)
Vkadaba 70:420fac5132f5 276 {
Vkadaba 70:420fac5132f5 277 utils_printStatus(&status);
Vkadaba 70:420fac5132f5 278 break;
Vkadaba 70:420fac5132f5 279 }
Vkadaba 70:420fac5132f5 280 while (! (bDataReady || bError));
Vkadaba 39:e255f52072fc 281 if (!bError) {
Vkadaba 39:e255f52072fc 282 /*
Vkadaba 39:e255f52072fc 283 * Get data samples from the measurement cycle, if no error has occurred
Vkadaba 39:e255f52072fc 284 */
Vkadaba 39:e255f52072fc 285 bDataReady = false;
Vkadaba 39:e255f52072fc 286 res = admw_GetData(hDevice, eMeasurementMode, pSampleBuffer,
Vkadaba 39:e255f52072fc 287 nBytesPerSample, nSamplesPerDataready,
Vkadaba 39:e255f52072fc 288 &nReturned);
Vkadaba 39:e255f52072fc 289 if (res != ADMW_SUCCESS) {
Vkadaba 39:e255f52072fc 290 if (res == ADMW_INCOMPLETE) {
Vkadaba 39:e255f52072fc 291 /*
Vkadaba 39:e255f52072fc 292 * This is expected in cases where cycleSkipCount may
Vkadaba 39:e255f52072fc 293 * be non-zero for some channels, resulting in
Vkadaba 39:e255f52072fc 294 * variable-length sequences
Vkadaba 39:e255f52072fc 295 */
Vkadaba 55:215da406282b 296
Vkadaba 39:e255f52072fc 297 ADMW_LOG_DEBUG("Retrieved %u of %u requested data samples",
Vkadaba 56:38b36e947602 298 nReturned, nSamplesPerDataready);
Vkadaba 39:e255f52072fc 299 continue;
Vkadaba 39:e255f52072fc 300 } else {
Vkadaba 39:e255f52072fc 301 ADMW_LOG_WARN("Failed to get data samples from device");
Vkadaba 39:e255f52072fc 302 return res;
Vkadaba 39:e255f52072fc 303 }
ADIJake 0:85855ecd3257 304 }
Vkadaba 39:e255f52072fc 305
Vkadaba 39:e255f52072fc 306 /*
Vkadaba 39:e255f52072fc 307 * Display the data samples.
Vkadaba 39:e255f52072fc 308 *
Vkadaba 39:e255f52072fc 309 * NOTE: this requires a sufficient idle time between subsequent
Vkadaba 39:e255f52072fc 310 * DATAREADY pulses to allow printing to occur. Otherwise,
Vkadaba 39:e255f52072fc 311 * subsequent samples may be missed if not retrieved promptly when
Vkadaba 39:e255f52072fc 312 * the next DATAREADY assertion occurs.
Vkadaba 39:e255f52072fc 313 */
Vkadaba 39:e255f52072fc 314 utils_printSamples(pSampleBuffer, nReturned, eMeasurementMode);
Vkadaba 39:e255f52072fc 315 nSampleCount += nReturned;
ADIJake 0:85855ecd3257 316 }
ADIJake 0:85855ecd3257 317
ADIJake 0:85855ecd3257 318 /*
ADIJake 0:85855ecd3257 319 * Check and print device status if errors/alerts have been triggered
ADIJake 0:85855ecd3257 320 */
Vkadaba 23:bb685f35b08b 321 if (bError || bAlert) {
Vkadaba 5:0728bde67bdb 322 res = admw_GetStatus(hDevice, &status);
Vkadaba 23:bb685f35b08b 323 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 324 ADMW_LOG_ERROR("Failed to retrieve device status");
ADIJake 0:85855ecd3257 325 return res;
ADIJake 0:85855ecd3257 326 }
ADIJake 0:85855ecd3257 327
ADIJake 0:85855ecd3257 328 if (status.deviceStatus &
Vkadaba 23:bb685f35b08b 329 (ADMW_DEVICE_STATUS_ERROR | ADMW_DEVICE_STATUS_ALERT)) {
ADIJake 0:85855ecd3257 330 utils_printStatus(&status);
ADIJake 0:85855ecd3257 331
ADIJake 0:85855ecd3257 332 /* Break out of the loop if any errors are raised */
ADIJake 0:85855ecd3257 333 if (bError)
ADIJake 0:85855ecd3257 334 break;
ADIJake 0:85855ecd3257 335 }
ADIJake 0:85855ecd3257 336 }
ADIJake 0:85855ecd3257 337
Vkadaba 23:bb685f35b08b 338 if (eOperatingMode == ADMW1001_OPERATING_MODE_SINGLECYCLE) {
ADIJake 0:85855ecd3257 339 /*
ADIJake 0:85855ecd3257 340 * In this mode, break out of the loop when the measurement command
ADIJake 0:85855ecd3257 341 * has completed.
ADIJake 0:85855ecd3257 342 *
ADIJake 0:85855ecd3257 343 * One option is to check for the expected number of samples to be
ADIJake 0:85855ecd3257 344 * returned for the cycle. However, cycles may have variable-length
ADIJake 0:85855ecd3257 345 * sequences if the cycleSkipCount option is non-zero for any of the
ADIJake 0:85855ecd3257 346 * channels.
ADIJake 0:85855ecd3257 347 *
ADIJake 0:85855ecd3257 348 * So, instead, we check for the command-running status, which
ADIJake 0:85855ecd3257 349 * will de-assert in this mode when the measurement command has
ADIJake 0:85855ecd3257 350 * completed a single cycle.
ADIJake 0:85855ecd3257 351 */
ADIJake 0:85855ecd3257 352 bool bCommandRunning;
Vkadaba 5:0728bde67bdb 353 res = admw_GetCommandRunningState(hDevice, &bCommandRunning);
Vkadaba 23:bb685f35b08b 354 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 355 ADMW_LOG_ERROR("Failed to get command-running status");
ADIJake 0:85855ecd3257 356 return res;
ADIJake 0:85855ecd3257 357 }
ADIJake 0:85855ecd3257 358
ADIJake 0:85855ecd3257 359 if (!bCommandRunning && !bDataReady)
ADIJake 0:85855ecd3257 360 break;
ADIJake 0:85855ecd3257 361 }
ADIJake 0:85855ecd3257 362 }
ADIJake 0:85855ecd3257 363
Vkadaba 5:0728bde67bdb 364 ADMW_LOG_INFO("Stopping measurement");
Vkadaba 5:0728bde67bdb 365 res = admw_StopMeasurement(hDevice);
Vkadaba 23:bb685f35b08b 366 if (res != ADMW_SUCCESS) {
Vkadaba 5:0728bde67bdb 367 ADMW_LOG_ERROR("Failed to send stop measurement");
ADIJake 0:85855ecd3257 368 return res;
ADIJake 0:85855ecd3257 369 }
ADIJake 0:85855ecd3257 370
ADIJake 0:85855ecd3257 371 free(pSampleBuffer);
ADIJake 0:85855ecd3257 372
ADIJake 0:85855ecd3257 373 res = utils_deregisterCallbacks(hDevice);
Vkadaba 5:0728bde67bdb 374 if (res != ADMW_SUCCESS)
ADIJake 0:85855ecd3257 375 return res;
ADIJake 0:85855ecd3257 376
Vkadaba 5:0728bde67bdb 377 return ADMW_SUCCESS;
ADIJake 0:85855ecd3257 378 }
ADIJake 0:85855ecd3257 379