CAC_smartcushion / Mbed OS AdiSense1000_V21_Smartcushion

Fork of Sean_AdiSense1000_V21 by Rohan Gurav

Committer:
nfathurr
Date:
Thu Oct 25 08:59:30 2018 +0000
Revision:
36:4aded4b4f060
Parent:
28:4eb837cd71df
modified output into one line

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevin1990 16:e4f2689363bb 1 #include <stdlib.h>
kevin1990 16:e4f2689363bb 2
kevin1990 16:e4f2689363bb 3 #include "utils.h"
kevin1990 16:e4f2689363bb 4 #include "inc/adi_sense_log.h"
kevin1990 16:e4f2689363bb 5
kevin1990 16:e4f2689363bb 6 void utils_printStatus(
kevin1990 16:e4f2689363bb 7 ADI_SENSE_STATUS *pStatus)
kevin1990 16:e4f2689363bb 8 {
kevin1990 16:e4f2689363bb 9 ADI_SENSE_LOG_INFO("Status Summary:");
kevin1990 16:e4f2689363bb 10
kevin1990 16:e4f2689363bb 11 if (pStatus->deviceStatus == 0)
kevin1990 16:e4f2689363bb 12 {
kevin1990 16:e4f2689363bb 13 ADI_SENSE_LOG_INFO("\tNo errors detected");
kevin1990 16:e4f2689363bb 14 }
kevin1990 16:e4f2689363bb 15 else
kevin1990 16:e4f2689363bb 16 {
kevin1990 16:e4f2689363bb 17 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_BUSY)
kevin1990 16:e4f2689363bb 18 ADI_SENSE_LOG_INFO("\tCommand running");
kevin1990 16:e4f2689363bb 19 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_DATAREADY)
kevin1990 16:e4f2689363bb 20 ADI_SENSE_LOG_INFO("\tData ready");
kevin1990 16:e4f2689363bb 21 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_ERROR)
kevin1990 16:e4f2689363bb 22 ADI_SENSE_LOG_INFO("\tActive Errors - RESET REQUIRED");
kevin1990 16:e4f2689363bb 23 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_FIFO_ERROR)
kevin1990 16:e4f2689363bb 24 ADI_SENSE_LOG_INFO("\tActive FIFO Errors - ATTENTION REQUIRED");
kevin1990 16:e4f2689363bb 25 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_CONFIG_ERROR)
kevin1990 16:e4f2689363bb 26 ADI_SENSE_LOG_INFO("\tActive Configuration Errors - ATTENTION REQUIRED");
kevin1990 16:e4f2689363bb 27 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_LUT_ERROR)
kevin1990 16:e4f2689363bb 28 ADI_SENSE_LOG_INFO("\tActive Look-Up Table Errors - ATTENTION REQUIRED");
kevin1990 28:4eb837cd71df 29 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_EXT_FLASH_ERROR)
kevin1990 28:4eb837cd71df 30 ADI_SENSE_LOG_INFO("\tActive External Flash Errors - ATTENTION REQUIRED");
kevin1990 16:e4f2689363bb 31
kevin1990 16:e4f2689363bb 32 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_ERROR)
kevin1990 16:e4f2689363bb 33 {
kevin1990 16:e4f2689363bb 34 ADI_SENSE_LOG_INFO("\tActive Errors - ATTENTION REQUIRED");
kevin1990 16:e4f2689363bb 35 ADI_SENSE_LOG_INFO("\t\tLast Error Code: %u (0x%X)",
kevin1990 16:e4f2689363bb 36 pStatus->errorCode, pStatus->errorCode);
kevin1990 16:e4f2689363bb 37
kevin1990 16:e4f2689363bb 38 if (pStatus->diagnosticsStatus == 0)
kevin1990 16:e4f2689363bb 39 {
kevin1990 16:e4f2689363bb 40 ADI_SENSE_LOG_INFO("\t\tNo diagnostics faults detected");
kevin1990 16:e4f2689363bb 41 }
kevin1990 16:e4f2689363bb 42 else
kevin1990 16:e4f2689363bb 43 {
kevin1990 16:e4f2689363bb 44 ADI_SENSE_LOG_INFO("\t\tActive diagnostics faults:");
kevin1990 16:e4f2689363bb 45
kevin1990 16:e4f2689363bb 46 if (pStatus->diagnosticsStatus & ADI_SENSE_DIAGNOSTICS_STATUS_CHECKSUM_ERROR)
kevin1990 16:e4f2689363bb 47 ADI_SENSE_LOG_INFO("\t\t\tInternal Checksum fault detected");
kevin1990 16:e4f2689363bb 48 if (pStatus->diagnosticsStatus & ADI_SENSE_DIAGNOSTICS_STATUS_COMMS_ERROR)
kevin1990 16:e4f2689363bb 49 ADI_SENSE_LOG_INFO("\t\t\tInternal Communications fault detected");
kevin1990 16:e4f2689363bb 50 if (pStatus->diagnosticsStatus & ADI_SENSE_DIAGNOSTICS_STATUS_SUPPLY_MONITOR_ERROR)
kevin1990 16:e4f2689363bb 51 ADI_SENSE_LOG_INFO("\t\t\tSupply Monitor fault detected");
kevin1990 16:e4f2689363bb 52 if (pStatus->diagnosticsStatus & ADI_SENSE_DIAGNOSTICS_STATUS_SUPPLY_CAP_ERROR)
kevin1990 16:e4f2689363bb 53 ADI_SENSE_LOG_INFO("\t\t\tSupply Regulator Capacitor fault detected");
kevin1990 16:e4f2689363bb 54 if (pStatus->diagnosticsStatus & ADI_SENSE_DIAGNOSTICS_STATUS_CONVERSION_ERROR)
kevin1990 16:e4f2689363bb 55 ADI_SENSE_LOG_INFO("\t\t\tInternal ADC Conversions fault detected");
kevin1990 16:e4f2689363bb 56 if (pStatus->diagnosticsStatus & ADI_SENSE_DIAGNOSTICS_STATUS_CALIBRATION_ERROR)
kevin1990 16:e4f2689363bb 57 ADI_SENSE_LOG_INFO("\t\t\tInternal Device Calibrations fault detected");
kevin1990 16:e4f2689363bb 58 }
kevin1990 16:e4f2689363bb 59 }
kevin1990 16:e4f2689363bb 60
kevin1990 16:e4f2689363bb 61 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_ALERT)
kevin1990 16:e4f2689363bb 62 {
kevin1990 16:e4f2689363bb 63 ADI_SENSE_LOG_INFO("\tActive Alerts - ATTENTION REQUIRED:");
kevin1990 16:e4f2689363bb 64 ADI_SENSE_LOG_INFO("\t\tLast Alert Code: %u (0x%X)",
kevin1990 16:e4f2689363bb 65 pStatus->alertCode, pStatus->alertCode);
kevin1990 16:e4f2689363bb 66
kevin1990 16:e4f2689363bb 67 for (unsigned i = 0; i < ADI_SENSE_1000_MAX_CHANNELS; i++)
kevin1990 16:e4f2689363bb 68 {
kevin1990 16:e4f2689363bb 69 if (pStatus->channelAlerts[i] == 0)
kevin1990 16:e4f2689363bb 70 continue;
kevin1990 16:e4f2689363bb 71
kevin1990 16:e4f2689363bb 72 ADI_SENSE_LOG_INFO("\t\tChannel #%u:", i);
kevin1990 16:e4f2689363bb 73 ADI_SENSE_LOG_INFO("\t\t\tLast Alert Code: %u (0x%X)",
kevin1990 16:e4f2689363bb 74 pStatus->channelAlertCodes[i],
kevin1990 16:e4f2689363bb 75 pStatus->channelAlertCodes[i]);
kevin1990 16:e4f2689363bb 76 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_TIMEOUT)
kevin1990 16:e4f2689363bb 77 ADI_SENSE_LOG_INFO("\t\t\tTimeout alert detected");
kevin1990 16:e4f2689363bb 78 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_UNDER_RANGE)
kevin1990 16:e4f2689363bb 79 ADI_SENSE_LOG_INFO("\t\t\tUnder Range alert detected");
kevin1990 16:e4f2689363bb 80 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_OVER_RANGE)
kevin1990 16:e4f2689363bb 81 ADI_SENSE_LOG_INFO("\t\t\tOver Range alert detected");
kevin1990 16:e4f2689363bb 82 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_LOW_LIMIT)
kevin1990 16:e4f2689363bb 83 ADI_SENSE_LOG_INFO("\t\t\tLow limit alert detected");
kevin1990 16:e4f2689363bb 84 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_HIGH_LIMIT)
kevin1990 16:e4f2689363bb 85 ADI_SENSE_LOG_INFO("\t\t\tHigh Limit alert detected");
kevin1990 16:e4f2689363bb 86 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_SENSOR_OPEN)
kevin1990 16:e4f2689363bb 87 ADI_SENSE_LOG_INFO("\t\t\tSensor Fault alert detected");
kevin1990 16:e4f2689363bb 88 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_REF_DETECT)
kevin1990 16:e4f2689363bb 89 ADI_SENSE_LOG_INFO("\t\t\tReference Detection alert detected");
kevin1990 16:e4f2689363bb 90 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_CONFIG_ERR)
kevin1990 16:e4f2689363bb 91 ADI_SENSE_LOG_INFO("\t\t\tConfiguration Error alert detected");
kevin1990 16:e4f2689363bb 92 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_LUT_ERR)
kevin1990 16:e4f2689363bb 93 ADI_SENSE_LOG_INFO("\t\t\tLook-Up Table Error alert detected");
kevin1990 16:e4f2689363bb 94 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_SENSOR_NOT_READY)
kevin1990 16:e4f2689363bb 95 ADI_SENSE_LOG_INFO("\t\t\tSensor Not Ready alert detected");
kevin1990 16:e4f2689363bb 96 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_COMP_NOT_READY)
kevin1990 16:e4f2689363bb 97 ADI_SENSE_LOG_INFO("\t\t\tCompensation Channel Not Ready alert detected");
kevin1990 16:e4f2689363bb 98 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_LUT_UNDER_RANGE)
kevin1990 16:e4f2689363bb 99 ADI_SENSE_LOG_INFO("\t\t\tUnder Look-Up Table Range alert detected");
kevin1990 16:e4f2689363bb 100 if (pStatus->channelAlerts[i] & ADI_SENSE_CHANNEL_ALERT_LUT_OVER_RANGE)
kevin1990 16:e4f2689363bb 101 ADI_SENSE_LOG_INFO("\t\t\tOver Look-Up Table Range alert detected");
kevin1990 16:e4f2689363bb 102 }
kevin1990 16:e4f2689363bb 103 }
kevin1990 16:e4f2689363bb 104 }
kevin1990 16:e4f2689363bb 105 }
kevin1990 16:e4f2689363bb 106
kevin1990 16:e4f2689363bb 107 void utils_printSamples(
kevin1990 16:e4f2689363bb 108 ADI_SENSE_DATA_SAMPLE *pSampleBuffer,
kevin1990 28:4eb837cd71df 109 uint32_t nNumSamples,
kevin1990 28:4eb837cd71df 110 ADI_SENSE_MEASUREMENT_MODE eMeasurementMode)
kevin1990 16:e4f2689363bb 111 {
kevin1990 28:4eb837cd71df 112 bool fftMode = (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_FFT);
kevin1990 28:4eb837cd71df 113
kevin1990 16:e4f2689363bb 114 for (uint32_t i = 0; i < nNumSamples; i++)
kevin1990 16:e4f2689363bb 115 {
kevin1990 28:4eb837cd71df 116 if (fftMode)
kevin1990 28:4eb837cd71df 117 {
kevin1990 28:4eb837cd71df 118 ADI_SENSE_LOG_INFO("Sample # %2d Channel # %2d :: Bin/Raw %8d :: Magnitude %e :: flags:%s%s",
kevin1990 28:4eb837cd71df 119 i+1,
kevin1990 28:4eb837cd71df 120 pSampleBuffer[i].channelId,
kevin1990 28:4eb837cd71df 121 pSampleBuffer[i].rawValue,
kevin1990 28:4eb837cd71df 122 pSampleBuffer[i].processedValue,
kevin1990 28:4eb837cd71df 123 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ERROR ? " ERROR" : "",
kevin1990 28:4eb837cd71df 124 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ALERT ? " ALERT" : "");
kevin1990 28:4eb837cd71df 125 }
kevin1990 28:4eb837cd71df 126 else
kevin1990 28:4eb837cd71df 127 {
kevin1990 28:4eb837cd71df 128 ADI_SENSE_LOG_INFO("Sample # %2d Channel # %2d :: Raw %8d :: Processed %f :: flags:%s%s",
kevin1990 28:4eb837cd71df 129 i+1,
kevin1990 28:4eb837cd71df 130 pSampleBuffer[i].channelId,
kevin1990 28:4eb837cd71df 131 pSampleBuffer[i].rawValue,
kevin1990 28:4eb837cd71df 132 pSampleBuffer[i].processedValue,
kevin1990 28:4eb837cd71df 133 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ERROR ? " ERROR" : "",
kevin1990 28:4eb837cd71df 134 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ALERT ? " ALERT" : "");
kevin1990 28:4eb837cd71df 135 }
kevin1990 16:e4f2689363bb 136 }
kevin1990 16:e4f2689363bb 137 }
kevin1990 16:e4f2689363bb 138
nfathurr 36:4aded4b4f060 139 /* ===ALTERNATE FUNCTION FOR PRINTING RESULT ===*/
nfathurr 36:4aded4b4f060 140 void utils_printSamples_2(
nfathurr 36:4aded4b4f060 141 ADI_SENSE_DATA_SAMPLE *pSampleBuffer,
nfathurr 36:4aded4b4f060 142 uint32_t nNumSamples,
nfathurr 36:4aded4b4f060 143 ADI_SENSE_MEASUREMENT_MODE eMeasurementMode)
nfathurr 36:4aded4b4f060 144 {
nfathurr 36:4aded4b4f060 145 // bool fftMode = (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_FFT);
nfathurr 36:4aded4b4f060 146
nfathurr 36:4aded4b4f060 147 ADI_SENSE_LOG_INFO("#%.5f#%.5f#%.5f#%.5f#%.5f#%.5f#%.5f#%.5f#%.5f",
nfathurr 36:4aded4b4f060 148 //temp
nfathurr 36:4aded4b4f060 149 pSampleBuffer[0].processedValue,
nfathurr 36:4aded4b4f060 150 //lc1
nfathurr 36:4aded4b4f060 151 pSampleBuffer[1].processedValue,
nfathurr 36:4aded4b4f060 152 //lc2
nfathurr 36:4aded4b4f060 153 pSampleBuffer[2].processedValue,
nfathurr 36:4aded4b4f060 154 //lc3
nfathurr 36:4aded4b4f060 155 pSampleBuffer[3].processedValue,
nfathurr 36:4aded4b4f060 156 //lc4
nfathurr 36:4aded4b4f060 157 pSampleBuffer[4].processedValue,
nfathurr 36:4aded4b4f060 158 //humidity
nfathurr 36:4aded4b4f060 159 pSampleBuffer[5].processedValue,
nfathurr 36:4aded4b4f060 160 //AccX
nfathurr 36:4aded4b4f060 161 pSampleBuffer[6].processedValue,
nfathurr 36:4aded4b4f060 162 //AccY
nfathurr 36:4aded4b4f060 163 pSampleBuffer[7].processedValue,
nfathurr 36:4aded4b4f060 164 //AccZ
nfathurr 36:4aded4b4f060 165 pSampleBuffer[8].processedValue);
nfathurr 36:4aded4b4f060 166 }
nfathurr 36:4aded4b4f060 167
kevin1990 16:e4f2689363bb 168 static void gpioCallbackFn(ADI_SENSE_GPIO_PIN ePinId, void * pArg)
kevin1990 16:e4f2689363bb 169 {
kevin1990 16:e4f2689363bb 170 volatile bool_t *pbFlag = (volatile bool_t *)pArg;
kevin1990 16:e4f2689363bb 171 *pbFlag = true;
kevin1990 16:e4f2689363bb 172 }
kevin1990 16:e4f2689363bb 173
kevin1990 16:e4f2689363bb 174 ADI_SENSE_RESULT utils_registerCallbacks(
kevin1990 16:e4f2689363bb 175 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 16:e4f2689363bb 176 volatile bool_t *pbDataReady,
kevin1990 16:e4f2689363bb 177 volatile bool_t *pbError,
kevin1990 16:e4f2689363bb 178 volatile bool_t *pbAlert)
kevin1990 16:e4f2689363bb 179 {
kevin1990 16:e4f2689363bb 180 ADI_SENSE_RESULT res;
kevin1990 16:e4f2689363bb 181
kevin1990 16:e4f2689363bb 182 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_DATAREADY,
kevin1990 16:e4f2689363bb 183 gpioCallbackFn, (void *)pbDataReady);
kevin1990 16:e4f2689363bb 184 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 185 {
kevin1990 16:e4f2689363bb 186 ADI_SENSE_LOG_ERROR("Failed to register DATAREADY callback");
kevin1990 16:e4f2689363bb 187 return res;
kevin1990 16:e4f2689363bb 188 }
kevin1990 16:e4f2689363bb 189
kevin1990 16:e4f2689363bb 190 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ERROR,
kevin1990 16:e4f2689363bb 191 gpioCallbackFn, (void *)pbError);
kevin1990 16:e4f2689363bb 192 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 193 {
kevin1990 16:e4f2689363bb 194 ADI_SENSE_LOG_ERROR("Failed to register ERROR callback");
kevin1990 16:e4f2689363bb 195 return res;
kevin1990 16:e4f2689363bb 196 }
kevin1990 16:e4f2689363bb 197
kevin1990 16:e4f2689363bb 198 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ALERT,
kevin1990 16:e4f2689363bb 199 gpioCallbackFn, (void *)pbAlert);
kevin1990 16:e4f2689363bb 200 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 201 {
kevin1990 16:e4f2689363bb 202 ADI_SENSE_LOG_ERROR("Failed to register ALERT callback");
kevin1990 16:e4f2689363bb 203 return res;
kevin1990 16:e4f2689363bb 204 }
kevin1990 16:e4f2689363bb 205
kevin1990 16:e4f2689363bb 206 return ADI_SENSE_SUCCESS;
kevin1990 16:e4f2689363bb 207 }
kevin1990 16:e4f2689363bb 208
kevin1990 16:e4f2689363bb 209 ADI_SENSE_RESULT utils_deregisterCallbacks(
kevin1990 16:e4f2689363bb 210 ADI_SENSE_DEVICE_HANDLE hDevice)
kevin1990 16:e4f2689363bb 211 {
kevin1990 16:e4f2689363bb 212 ADI_SENSE_RESULT res;
kevin1990 16:e4f2689363bb 213
kevin1990 16:e4f2689363bb 214 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_DATAREADY,
kevin1990 16:e4f2689363bb 215 NULL, NULL);
kevin1990 16:e4f2689363bb 216 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 217 {
kevin1990 16:e4f2689363bb 218 ADI_SENSE_LOG_ERROR("Failed to deregister DATAREADY callback");
kevin1990 16:e4f2689363bb 219 return res;
kevin1990 16:e4f2689363bb 220 }
kevin1990 16:e4f2689363bb 221
kevin1990 16:e4f2689363bb 222 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ERROR,
kevin1990 16:e4f2689363bb 223 NULL, NULL);
kevin1990 16:e4f2689363bb 224 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 225 {
kevin1990 16:e4f2689363bb 226 ADI_SENSE_LOG_ERROR("Failed to deregister ERROR callback");
kevin1990 16:e4f2689363bb 227 return res;
kevin1990 16:e4f2689363bb 228 }
kevin1990 16:e4f2689363bb 229
kevin1990 16:e4f2689363bb 230 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ALERT,
kevin1990 16:e4f2689363bb 231 NULL, NULL);
kevin1990 16:e4f2689363bb 232 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 233 {
kevin1990 16:e4f2689363bb 234 ADI_SENSE_LOG_INFO("Failed to deregister ALERT callback");
kevin1990 16:e4f2689363bb 235 return res;
kevin1990 16:e4f2689363bb 236 }
kevin1990 16:e4f2689363bb 237
kevin1990 16:e4f2689363bb 238 return ADI_SENSE_SUCCESS;
kevin1990 16:e4f2689363bb 239 }
kevin1990 16:e4f2689363bb 240
kevin1990 16:e4f2689363bb 241 ADI_SENSE_RESULT utils_runMeasurement(
kevin1990 16:e4f2689363bb 242 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 16:e4f2689363bb 243 ADI_SENSE_MEASUREMENT_MODE eMeasurementMode)
kevin1990 16:e4f2689363bb 244 {
kevin1990 16:e4f2689363bb 245 ADI_SENSE_RESULT res;
kevin1990 16:e4f2689363bb 246
kevin1990 16:e4f2689363bb 247 volatile bool_t bDataReady = false;
kevin1990 16:e4f2689363bb 248 volatile bool_t bError = false;
kevin1990 16:e4f2689363bb 249 volatile bool_t bAlert = false;
kevin1990 16:e4f2689363bb 250 res = utils_registerCallbacks(hDevice, &bDataReady, &bError, &bAlert);
kevin1990 16:e4f2689363bb 251 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 252 return res;
kevin1990 16:e4f2689363bb 253
kevin1990 16:e4f2689363bb 254 /*
kevin1990 28:4eb837cd71df 255 * Retrieve the number of samples per cycle, per DATAREADY pulse, etc. for
kevin1990 28:4eb837cd71df 256 * this configuration.
kevin1990 16:e4f2689363bb 257 */
kevin1990 16:e4f2689363bb 258 ADI_SENSE_1000_OPERATING_MODE eOperatingMode;
kevin1990 16:e4f2689363bb 259 ADI_SENSE_1000_DATAREADY_MODE eDataReadyMode;
kevin1990 16:e4f2689363bb 260 uint32_t nSamplesPerDataready;
kevin1990 16:e4f2689363bb 261 uint32_t nSamplesPerCycle;
kevin1990 28:4eb837cd71df 262 uint8_t nBytesPerSample;
kevin1990 16:e4f2689363bb 263 res = adi_sense_1000_GetDataReadyModeInfo(hDevice,
kevin1990 16:e4f2689363bb 264 eMeasurementMode,
kevin1990 16:e4f2689363bb 265 &eOperatingMode,
kevin1990 16:e4f2689363bb 266 &eDataReadyMode,
kevin1990 16:e4f2689363bb 267 &nSamplesPerDataready,
kevin1990 28:4eb837cd71df 268 &nSamplesPerCycle,
kevin1990 28:4eb837cd71df 269 &nBytesPerSample);
kevin1990 16:e4f2689363bb 270 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 271 return res;
kevin1990 16:e4f2689363bb 272
kevin1990 16:e4f2689363bb 273 /*
kevin1990 16:e4f2689363bb 274 * Allocate a buffer to store the samples retrieved on each DATAREADY pulse
kevin1990 16:e4f2689363bb 275 */
kevin1990 16:e4f2689363bb 276 ADI_SENSE_DATA_SAMPLE *pSampleBuffer;
kevin1990 28:4eb837cd71df 277 pSampleBuffer = malloc(sizeof(ADI_SENSE_DATA_SAMPLE) *
kevin1990 28:4eb837cd71df 278 nSamplesPerDataready);
kevin1990 16:e4f2689363bb 279 if (pSampleBuffer == NULL)
kevin1990 16:e4f2689363bb 280 {
kevin1990 16:e4f2689363bb 281 ADI_SENSE_LOG_ERROR("Failed to allocate sample buffer");
kevin1990 16:e4f2689363bb 282 return ADI_SENSE_NO_MEM;
kevin1990 16:e4f2689363bb 283 }
kevin1990 16:e4f2689363bb 284
kevin1990 16:e4f2689363bb 285 /*
kevin1990 16:e4f2689363bb 286 * Kick off the measurement cycle(s) here
kevin1990 16:e4f2689363bb 287 */
kevin1990 16:e4f2689363bb 288 res = adi_sense_StartMeasurement(hDevice, eMeasurementMode);
kevin1990 16:e4f2689363bb 289 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 290 {
kevin1990 16:e4f2689363bb 291 ADI_SENSE_LOG_ERROR("Failed to start measurement");
kevin1990 16:e4f2689363bb 292 return res;
kevin1990 16:e4f2689363bb 293 }
kevin1990 16:e4f2689363bb 294
kevin1990 16:e4f2689363bb 295 /*
kevin1990 16:e4f2689363bb 296 * Loop continuously unless operating mode is single-cycle
kevin1990 16:e4f2689363bb 297 */
kevin1990 28:4eb837cd71df 298 uint32_t nSampleCount = 0;
kevin1990 28:4eb837cd71df 299 while (true)
kevin1990 28:4eb837cd71df 300 {
kevin1990 16:e4f2689363bb 301 ADI_SENSE_STATUS status;
kevin1990 16:e4f2689363bb 302 uint32_t nReturned;
kevin1990 16:e4f2689363bb 303
kevin1990 16:e4f2689363bb 304 /*
kevin1990 28:4eb837cd71df 305 * Wait until the next batch of 1 or more samples is ready, continuously
kevin1990 28:4eb837cd71df 306 * checking DATAREADY until it is asserted
kevin1990 16:e4f2689363bb 307 */
kevin1990 28:4eb837cd71df 308 while (! (bDataReady || bError))
kevin1990 28:4eb837cd71df 309 ;
kevin1990 28:4eb837cd71df 310
kevin1990 28:4eb837cd71df 311 if (!bError)
kevin1990 28:4eb837cd71df 312 {
kevin1990 16:e4f2689363bb 313 /*
kevin1990 28:4eb837cd71df 314 * Get data samples from the measurement cycle, if no error has occurred
kevin1990 16:e4f2689363bb 315 */
kevin1990 28:4eb837cd71df 316 bDataReady = false;
kevin1990 28:4eb837cd71df 317 res = adi_sense_GetData(hDevice, eMeasurementMode, pSampleBuffer,
kevin1990 28:4eb837cd71df 318 nBytesPerSample, nSamplesPerDataready,
kevin1990 28:4eb837cd71df 319 &nReturned);
kevin1990 28:4eb837cd71df 320 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 321 {
kevin1990 28:4eb837cd71df 322 if (res == ADI_SENSE_INCOMPLETE)
kevin1990 16:e4f2689363bb 323 {
kevin1990 28:4eb837cd71df 324 /*
kevin1990 28:4eb837cd71df 325 * This is expected in cases where cycleSkipCount may
kevin1990 28:4eb837cd71df 326 * be non-zero for some channels, resulting in
kevin1990 28:4eb837cd71df 327 * variable-length sequences
kevin1990 28:4eb837cd71df 328 */
kevin1990 28:4eb837cd71df 329 ADI_SENSE_LOG_DEBUG("Retrieved %u of %u requested data samples",
kevin1990 28:4eb837cd71df 330 nReturned, nSamplesPerDataready);
kevin1990 28:4eb837cd71df 331 }
kevin1990 28:4eb837cd71df 332 else
kevin1990 28:4eb837cd71df 333 {
kevin1990 28:4eb837cd71df 334 ADI_SENSE_LOG_WARN("Failed to get data samples from device");
kevin1990 28:4eb837cd71df 335 return res;
kevin1990 16:e4f2689363bb 336 }
kevin1990 16:e4f2689363bb 337 }
kevin1990 16:e4f2689363bb 338
kevin1990 28:4eb837cd71df 339 /*
kevin1990 28:4eb837cd71df 340 * Display the data samples.
kevin1990 28:4eb837cd71df 341 *
kevin1990 28:4eb837cd71df 342 * NOTE: this requires a sufficient idle time between subsequent
kevin1990 28:4eb837cd71df 343 * DATAREADY pulses to allow printing to occur. Otherwise,
kevin1990 28:4eb837cd71df 344 * subsequent samples may be missed if not retrieved promptly when
kevin1990 28:4eb837cd71df 345 * the next DATAREADY assertion occurs.
kevin1990 28:4eb837cd71df 346 */
nfathurr 36:4aded4b4f060 347 utils_printSamples_2(pSampleBuffer, nReturned, eMeasurementMode);
kevin1990 28:4eb837cd71df 348 nSampleCount += nReturned;
kevin1990 28:4eb837cd71df 349 }
kevin1990 16:e4f2689363bb 350
kevin1990 16:e4f2689363bb 351 /*
kevin1990 16:e4f2689363bb 352 * Check and print device status if errors/alerts have been triggered
kevin1990 16:e4f2689363bb 353 */
kevin1990 16:e4f2689363bb 354 if (bError || bAlert)
kevin1990 16:e4f2689363bb 355 {
kevin1990 16:e4f2689363bb 356 res = adi_sense_GetStatus(hDevice, &status);
kevin1990 16:e4f2689363bb 357 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 358 {
kevin1990 16:e4f2689363bb 359 ADI_SENSE_LOG_ERROR("Failed to retrieve device status");
kevin1990 16:e4f2689363bb 360 return res;
kevin1990 16:e4f2689363bb 361 }
kevin1990 16:e4f2689363bb 362
kevin1990 16:e4f2689363bb 363 if (status.deviceStatus &
kevin1990 16:e4f2689363bb 364 (ADI_SENSE_DEVICE_STATUS_ERROR | ADI_SENSE_DEVICE_STATUS_ALERT))
kevin1990 16:e4f2689363bb 365 {
kevin1990 16:e4f2689363bb 366 utils_printStatus(&status);
kevin1990 16:e4f2689363bb 367
kevin1990 16:e4f2689363bb 368 /* Break out of the loop if any errors are raised */
kevin1990 16:e4f2689363bb 369 if (bError)
kevin1990 16:e4f2689363bb 370 break;
kevin1990 16:e4f2689363bb 371 }
kevin1990 16:e4f2689363bb 372 }
kevin1990 28:4eb837cd71df 373
kevin1990 28:4eb837cd71df 374 if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_SINGLECYCLE)
kevin1990 28:4eb837cd71df 375 {
kevin1990 28:4eb837cd71df 376 /*
kevin1990 28:4eb837cd71df 377 * In this mode, break out of the loop when the measurement command
kevin1990 28:4eb837cd71df 378 * has completed.
kevin1990 28:4eb837cd71df 379 *
kevin1990 28:4eb837cd71df 380 * One option is to check for the expected number of samples to be
kevin1990 28:4eb837cd71df 381 * returned for the cycle. However, cycles may have variable-length
kevin1990 28:4eb837cd71df 382 * sequences if the cycleSkipCount option is non-zero for any of the
kevin1990 28:4eb837cd71df 383 * channels.
kevin1990 28:4eb837cd71df 384 *
kevin1990 28:4eb837cd71df 385 * So, instead, we check for the command-running status, which
kevin1990 28:4eb837cd71df 386 * will de-assert in this mode when the measurement command has
kevin1990 28:4eb837cd71df 387 * completed a single cycle.
kevin1990 28:4eb837cd71df 388 */
kevin1990 28:4eb837cd71df 389 bool_t bCommandRunning;
kevin1990 28:4eb837cd71df 390 res = adi_sense_GetCommandRunningState(hDevice, &bCommandRunning);
kevin1990 28:4eb837cd71df 391 if (res != ADI_SENSE_SUCCESS)
kevin1990 28:4eb837cd71df 392 {
kevin1990 28:4eb837cd71df 393 ADI_SENSE_LOG_ERROR("Failed to get command-running status");
kevin1990 28:4eb837cd71df 394 return res;
kevin1990 28:4eb837cd71df 395 }
kevin1990 28:4eb837cd71df 396
kevin1990 28:4eb837cd71df 397 if (!bCommandRunning && !bDataReady)
kevin1990 28:4eb837cd71df 398 break;
kevin1990 28:4eb837cd71df 399 }
kevin1990 28:4eb837cd71df 400 }
kevin1990 16:e4f2689363bb 401
kevin1990 16:e4f2689363bb 402 res = adi_sense_StopMeasurement(hDevice);
kevin1990 16:e4f2689363bb 403 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 404 {
kevin1990 16:e4f2689363bb 405 ADI_SENSE_LOG_ERROR("Failed to send stop measurement");
kevin1990 16:e4f2689363bb 406 return res;
kevin1990 16:e4f2689363bb 407 }
kevin1990 16:e4f2689363bb 408
kevin1990 16:e4f2689363bb 409 free(pSampleBuffer);
kevin1990 16:e4f2689363bb 410
kevin1990 16:e4f2689363bb 411 res = utils_deregisterCallbacks(hDevice);
kevin1990 16:e4f2689363bb 412 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 413 return res;
kevin1990 16:e4f2689363bb 414
kevin1990 16:e4f2689363bb 415 return ADI_SENSE_SUCCESS;
kevin1990 16:e4f2689363bb 416 }