Ross O'Halloran / Mbed OS AdiSense1000_SmartBabySeat

Fork of AdiSense1000_SmartBabySeat by SDMP_IOT

Committer:
Dan O'Donovan
Date:
Tue Jun 12 21:27:34 2018 +0100
Branch:
v2.0
Revision:
30:119ff4f3aef6
Parent:
29:57edca10d78c
Child:
31:de49744b57a6
Adding host library and example code for v2.0 release to v2.0 branch

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 29:57edca10d78c 29 if (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_EXT_FLASH_ERROR)
kevin1990 29:57edca10d78c 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 }
Dan O'Donovan 30:119ff4f3aef6 104
Dan O'Donovan 30:119ff4f3aef6 105 if ((pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_ERROR) ||
Dan O'Donovan 30:119ff4f3aef6 106 (pStatus->deviceStatus & ADI_SENSE_DEVICE_STATUS_ALERT))
Dan O'Donovan 30:119ff4f3aef6 107 {
Dan O'Donovan 30:119ff4f3aef6 108 ADI_SENSE_LOG_INFO("\t\tLast Debug Code: %u-%u",
Dan O'Donovan 30:119ff4f3aef6 109 (pStatus->debugCode >> 16) & 0xFFFF,
Dan O'Donovan 30:119ff4f3aef6 110 (pStatus->debugCode >> 0) & 0xFFFF);
Dan O'Donovan 30:119ff4f3aef6 111 }
kevin1990 16:e4f2689363bb 112 }
kevin1990 16:e4f2689363bb 113 }
kevin1990 16:e4f2689363bb 114
kevin1990 16:e4f2689363bb 115 void utils_printSamples(
kevin1990 16:e4f2689363bb 116 ADI_SENSE_DATA_SAMPLE *pSampleBuffer,
Dan O'Donovan 27:567abf893938 117 uint32_t nNumSamples,
Dan O'Donovan 27:567abf893938 118 ADI_SENSE_MEASUREMENT_MODE eMeasurementMode)
kevin1990 16:e4f2689363bb 119 {
Dan O'Donovan 27:567abf893938 120 bool fftMode = (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_FFT);
Dan O'Donovan 27:567abf893938 121
kevin1990 16:e4f2689363bb 122 for (uint32_t i = 0; i < nNumSamples; i++)
kevin1990 16:e4f2689363bb 123 {
Dan O'Donovan 27:567abf893938 124 if (fftMode)
Dan O'Donovan 27:567abf893938 125 {
Dan O'Donovan 27:567abf893938 126 ADI_SENSE_LOG_INFO("Sample # %2d Channel # %2d :: Bin/Raw %8d :: Magnitude %e :: flags:%s%s",
Dan O'Donovan 27:567abf893938 127 i+1,
Dan O'Donovan 27:567abf893938 128 pSampleBuffer[i].channelId,
Dan O'Donovan 27:567abf893938 129 pSampleBuffer[i].rawValue,
Dan O'Donovan 27:567abf893938 130 pSampleBuffer[i].processedValue,
Dan O'Donovan 27:567abf893938 131 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ERROR ? " ERROR" : "",
Dan O'Donovan 27:567abf893938 132 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ALERT ? " ALERT" : "");
Dan O'Donovan 27:567abf893938 133 }
Dan O'Donovan 27:567abf893938 134 else
Dan O'Donovan 27:567abf893938 135 {
Dan O'Donovan 27:567abf893938 136 ADI_SENSE_LOG_INFO("Sample # %2d Channel # %2d :: Raw %8d :: Processed %f :: flags:%s%s",
Dan O'Donovan 27:567abf893938 137 i+1,
Dan O'Donovan 27:567abf893938 138 pSampleBuffer[i].channelId,
Dan O'Donovan 27:567abf893938 139 pSampleBuffer[i].rawValue,
Dan O'Donovan 27:567abf893938 140 pSampleBuffer[i].processedValue,
Dan O'Donovan 27:567abf893938 141 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ERROR ? " ERROR" : "",
Dan O'Donovan 27:567abf893938 142 pSampleBuffer[i].status & ADI_SENSE_DEVICE_STATUS_ALERT ? " ALERT" : "");
Dan O'Donovan 27:567abf893938 143 }
kevin1990 16:e4f2689363bb 144 }
kevin1990 16:e4f2689363bb 145 }
kevin1990 16:e4f2689363bb 146
kevin1990 16:e4f2689363bb 147 static void gpioCallbackFn(ADI_SENSE_GPIO_PIN ePinId, void * pArg)
kevin1990 16:e4f2689363bb 148 {
Dan O'Donovan 30:119ff4f3aef6 149 volatile bool *pbFlag = (volatile bool *)pArg;
kevin1990 16:e4f2689363bb 150 *pbFlag = true;
kevin1990 16:e4f2689363bb 151 }
kevin1990 16:e4f2689363bb 152
kevin1990 16:e4f2689363bb 153 ADI_SENSE_RESULT utils_registerCallbacks(
kevin1990 16:e4f2689363bb 154 ADI_SENSE_DEVICE_HANDLE hDevice,
Dan O'Donovan 30:119ff4f3aef6 155 volatile bool *pbDataReady,
Dan O'Donovan 30:119ff4f3aef6 156 volatile bool *pbError,
Dan O'Donovan 30:119ff4f3aef6 157 volatile bool *pbAlert)
kevin1990 16:e4f2689363bb 158 {
kevin1990 16:e4f2689363bb 159 ADI_SENSE_RESULT res;
Dan O'Donovan 30:119ff4f3aef6 160 bool state;
kevin1990 16:e4f2689363bb 161
kevin1990 16:e4f2689363bb 162 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_DATAREADY,
kevin1990 16:e4f2689363bb 163 gpioCallbackFn, (void *)pbDataReady);
kevin1990 16:e4f2689363bb 164 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 165 {
kevin1990 16:e4f2689363bb 166 ADI_SENSE_LOG_ERROR("Failed to register DATAREADY callback");
kevin1990 16:e4f2689363bb 167 return res;
kevin1990 16:e4f2689363bb 168 }
kevin1990 16:e4f2689363bb 169
Dan O'Donovan 30:119ff4f3aef6 170 res = adi_sense_GetGpioState(hDevice, ADI_SENSE_GPIO_PIN_ERROR, &state);
Dan O'Donovan 30:119ff4f3aef6 171 if (res != ADI_SENSE_SUCCESS)
Dan O'Donovan 30:119ff4f3aef6 172 {
Dan O'Donovan 30:119ff4f3aef6 173 ADI_SENSE_LOG_ERROR("Failed to get current ERROR state");
Dan O'Donovan 30:119ff4f3aef6 174 return res;
Dan O'Donovan 30:119ff4f3aef6 175 }
Dan O'Donovan 30:119ff4f3aef6 176 if (state)
Dan O'Donovan 30:119ff4f3aef6 177 {
Dan O'Donovan 30:119ff4f3aef6 178 ADI_SENSE_LOG_ERROR("ERROR signal already asserted");
Dan O'Donovan 30:119ff4f3aef6 179 return ADI_SENSE_FAILURE;
Dan O'Donovan 30:119ff4f3aef6 180 }
kevin1990 16:e4f2689363bb 181 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ERROR,
kevin1990 16:e4f2689363bb 182 gpioCallbackFn, (void *)pbError);
kevin1990 16:e4f2689363bb 183 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 184 {
kevin1990 16:e4f2689363bb 185 ADI_SENSE_LOG_ERROR("Failed to register ERROR callback");
kevin1990 16:e4f2689363bb 186 return res;
kevin1990 16:e4f2689363bb 187 }
kevin1990 16:e4f2689363bb 188
Dan O'Donovan 30:119ff4f3aef6 189 res = adi_sense_GetGpioState(hDevice, ADI_SENSE_GPIO_PIN_ALERT, &state);
Dan O'Donovan 30:119ff4f3aef6 190 if (res != ADI_SENSE_SUCCESS)
Dan O'Donovan 30:119ff4f3aef6 191 {
Dan O'Donovan 30:119ff4f3aef6 192 ADI_SENSE_LOG_ERROR("Failed to get current ALERT state");
Dan O'Donovan 30:119ff4f3aef6 193 return res;
Dan O'Donovan 30:119ff4f3aef6 194 }
Dan O'Donovan 30:119ff4f3aef6 195 if (state)
Dan O'Donovan 30:119ff4f3aef6 196 {
Dan O'Donovan 30:119ff4f3aef6 197 ADI_SENSE_LOG_ERROR("ALERT signal already asserted");
Dan O'Donovan 30:119ff4f3aef6 198 return ADI_SENSE_FAILURE;
Dan O'Donovan 30:119ff4f3aef6 199 }
kevin1990 16:e4f2689363bb 200 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ALERT,
kevin1990 16:e4f2689363bb 201 gpioCallbackFn, (void *)pbAlert);
kevin1990 16:e4f2689363bb 202 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 203 {
kevin1990 16:e4f2689363bb 204 ADI_SENSE_LOG_ERROR("Failed to register ALERT callback");
kevin1990 16:e4f2689363bb 205 return res;
kevin1990 16:e4f2689363bb 206 }
kevin1990 16:e4f2689363bb 207
kevin1990 16:e4f2689363bb 208 return ADI_SENSE_SUCCESS;
kevin1990 16:e4f2689363bb 209 }
kevin1990 16:e4f2689363bb 210
kevin1990 16:e4f2689363bb 211 ADI_SENSE_RESULT utils_deregisterCallbacks(
kevin1990 16:e4f2689363bb 212 ADI_SENSE_DEVICE_HANDLE hDevice)
kevin1990 16:e4f2689363bb 213 {
kevin1990 16:e4f2689363bb 214 ADI_SENSE_RESULT res;
kevin1990 16:e4f2689363bb 215
kevin1990 16:e4f2689363bb 216 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_DATAREADY,
kevin1990 16:e4f2689363bb 217 NULL, NULL);
kevin1990 16:e4f2689363bb 218 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 219 {
kevin1990 16:e4f2689363bb 220 ADI_SENSE_LOG_ERROR("Failed to deregister DATAREADY callback");
kevin1990 16:e4f2689363bb 221 return res;
kevin1990 16:e4f2689363bb 222 }
kevin1990 16:e4f2689363bb 223
kevin1990 16:e4f2689363bb 224 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ERROR,
kevin1990 16:e4f2689363bb 225 NULL, NULL);
kevin1990 16:e4f2689363bb 226 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 227 {
kevin1990 16:e4f2689363bb 228 ADI_SENSE_LOG_ERROR("Failed to deregister ERROR callback");
kevin1990 16:e4f2689363bb 229 return res;
kevin1990 16:e4f2689363bb 230 }
kevin1990 16:e4f2689363bb 231
kevin1990 16:e4f2689363bb 232 res = adi_sense_RegisterGpioCallback(hDevice, ADI_SENSE_GPIO_PIN_ALERT,
kevin1990 16:e4f2689363bb 233 NULL, NULL);
kevin1990 16:e4f2689363bb 234 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 235 {
kevin1990 16:e4f2689363bb 236 ADI_SENSE_LOG_INFO("Failed to deregister ALERT callback");
kevin1990 16:e4f2689363bb 237 return res;
kevin1990 16:e4f2689363bb 238 }
kevin1990 16:e4f2689363bb 239
kevin1990 16:e4f2689363bb 240 return ADI_SENSE_SUCCESS;
kevin1990 16:e4f2689363bb 241 }
kevin1990 16:e4f2689363bb 242
kevin1990 16:e4f2689363bb 243 ADI_SENSE_RESULT utils_runMeasurement(
kevin1990 16:e4f2689363bb 244 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 16:e4f2689363bb 245 ADI_SENSE_MEASUREMENT_MODE eMeasurementMode)
kevin1990 16:e4f2689363bb 246 {
kevin1990 16:e4f2689363bb 247 ADI_SENSE_RESULT res;
kevin1990 16:e4f2689363bb 248
Dan O'Donovan 30:119ff4f3aef6 249 volatile bool bDataReady = false;
Dan O'Donovan 30:119ff4f3aef6 250 volatile bool bError = false;
Dan O'Donovan 30:119ff4f3aef6 251 volatile bool bAlert = false;
kevin1990 16:e4f2689363bb 252 res = utils_registerCallbacks(hDevice, &bDataReady, &bError, &bAlert);
kevin1990 16:e4f2689363bb 253 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 254 return res;
kevin1990 16:e4f2689363bb 255
kevin1990 16:e4f2689363bb 256 /*
Dan O'Donovan 27:567abf893938 257 * Retrieve the number of samples per cycle, per DATAREADY pulse, etc. for
Dan O'Donovan 27:567abf893938 258 * this configuration.
kevin1990 16:e4f2689363bb 259 */
kevin1990 16:e4f2689363bb 260 ADI_SENSE_1000_OPERATING_MODE eOperatingMode;
kevin1990 16:e4f2689363bb 261 ADI_SENSE_1000_DATAREADY_MODE eDataReadyMode;
kevin1990 16:e4f2689363bb 262 uint32_t nSamplesPerDataready;
kevin1990 16:e4f2689363bb 263 uint32_t nSamplesPerCycle;
Dan O'Donovan 27:567abf893938 264 uint8_t nBytesPerSample;
kevin1990 16:e4f2689363bb 265 res = adi_sense_1000_GetDataReadyModeInfo(hDevice,
kevin1990 16:e4f2689363bb 266 eMeasurementMode,
kevin1990 16:e4f2689363bb 267 &eOperatingMode,
kevin1990 16:e4f2689363bb 268 &eDataReadyMode,
kevin1990 16:e4f2689363bb 269 &nSamplesPerDataready,
Dan O'Donovan 27:567abf893938 270 &nSamplesPerCycle,
Dan O'Donovan 27:567abf893938 271 &nBytesPerSample);
kevin1990 16:e4f2689363bb 272 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 273 return res;
kevin1990 16:e4f2689363bb 274
kevin1990 16:e4f2689363bb 275 /*
kevin1990 16:e4f2689363bb 276 * Allocate a buffer to store the samples retrieved on each DATAREADY pulse
kevin1990 16:e4f2689363bb 277 */
kevin1990 16:e4f2689363bb 278 ADI_SENSE_DATA_SAMPLE *pSampleBuffer;
Dan O'Donovan 27:567abf893938 279 pSampleBuffer = malloc(sizeof(ADI_SENSE_DATA_SAMPLE) *
Dan O'Donovan 27:567abf893938 280 nSamplesPerDataready);
kevin1990 16:e4f2689363bb 281 if (pSampleBuffer == NULL)
kevin1990 16:e4f2689363bb 282 {
kevin1990 16:e4f2689363bb 283 ADI_SENSE_LOG_ERROR("Failed to allocate sample buffer");
kevin1990 16:e4f2689363bb 284 return ADI_SENSE_NO_MEM;
kevin1990 16:e4f2689363bb 285 }
kevin1990 16:e4f2689363bb 286
kevin1990 16:e4f2689363bb 287 /*
kevin1990 16:e4f2689363bb 288 * Kick off the measurement cycle(s) here
kevin1990 16:e4f2689363bb 289 */
Dan O'Donovan 30:119ff4f3aef6 290 ADI_SENSE_LOG_INFO("Starting measurement");
kevin1990 16:e4f2689363bb 291 res = adi_sense_StartMeasurement(hDevice, eMeasurementMode);
kevin1990 16:e4f2689363bb 292 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 293 {
kevin1990 16:e4f2689363bb 294 ADI_SENSE_LOG_ERROR("Failed to start measurement");
kevin1990 16:e4f2689363bb 295 return res;
kevin1990 16:e4f2689363bb 296 }
kevin1990 16:e4f2689363bb 297
kevin1990 16:e4f2689363bb 298 /*
kevin1990 16:e4f2689363bb 299 * Loop continuously unless operating mode is single-cycle
kevin1990 16:e4f2689363bb 300 */
Dan O'Donovan 27:567abf893938 301 uint32_t nSampleCount = 0;
Dan O'Donovan 30:119ff4f3aef6 302 uint32_t nReturned;
Dan O'Donovan 27:567abf893938 303 while (true)
Dan O'Donovan 27:567abf893938 304 {
kevin1990 16:e4f2689363bb 305 ADI_SENSE_STATUS status;
kevin1990 16:e4f2689363bb 306
kevin1990 16:e4f2689363bb 307 /*
Dan O'Donovan 27:567abf893938 308 * Wait until the next batch of 1 or more samples is ready, continuously
Dan O'Donovan 27:567abf893938 309 * checking DATAREADY until it is asserted
kevin1990 16:e4f2689363bb 310 */
Dan O'Donovan 27:567abf893938 311 while (! (bDataReady || bError))
Dan O'Donovan 27:567abf893938 312 ;
Dan O'Donovan 27:567abf893938 313
kevin1990 29:57edca10d78c 314 if (!bError)
Dan O'Donovan 27:567abf893938 315 {
kevin1990 29:57edca10d78c 316 /*
kevin1990 29:57edca10d78c 317 * Get data samples from the measurement cycle, if no error has occurred
kevin1990 29:57edca10d78c 318 */
kevin1990 29:57edca10d78c 319 bDataReady = false;
kevin1990 29:57edca10d78c 320 res = adi_sense_GetData(hDevice, eMeasurementMode, pSampleBuffer,
kevin1990 29:57edca10d78c 321 nBytesPerSample, nSamplesPerDataready,
kevin1990 29:57edca10d78c 322 &nReturned);
kevin1990 29:57edca10d78c 323 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 324 {
kevin1990 29:57edca10d78c 325 if (res == ADI_SENSE_INCOMPLETE)
kevin1990 29:57edca10d78c 326 {
kevin1990 29:57edca10d78c 327 /*
kevin1990 29:57edca10d78c 328 * This is expected in cases where cycleSkipCount may
kevin1990 29:57edca10d78c 329 * be non-zero for some channels, resulting in
kevin1990 29:57edca10d78c 330 * variable-length sequences
kevin1990 29:57edca10d78c 331 */
kevin1990 29:57edca10d78c 332 ADI_SENSE_LOG_DEBUG("Retrieved %u of %u requested data samples",
kevin1990 29:57edca10d78c 333 nReturned, nSamplesPerDataready);
kevin1990 29:57edca10d78c 334 }
kevin1990 29:57edca10d78c 335 else
kevin1990 29:57edca10d78c 336 {
kevin1990 29:57edca10d78c 337 ADI_SENSE_LOG_WARN("Failed to get data samples from device");
kevin1990 29:57edca10d78c 338 return res;
kevin1990 29:57edca10d78c 339 }
Dan O'Donovan 27:567abf893938 340 }
kevin1990 29:57edca10d78c 341
kevin1990 29:57edca10d78c 342 /*
kevin1990 29:57edca10d78c 343 * Display the data samples.
kevin1990 29:57edca10d78c 344 *
kevin1990 29:57edca10d78c 345 * NOTE: this requires a sufficient idle time between subsequent
kevin1990 29:57edca10d78c 346 * DATAREADY pulses to allow printing to occur. Otherwise,
kevin1990 29:57edca10d78c 347 * subsequent samples may be missed if not retrieved promptly when
kevin1990 29:57edca10d78c 348 * the next DATAREADY assertion occurs.
kevin1990 29:57edca10d78c 349 */
kevin1990 29:57edca10d78c 350 utils_printSamples(pSampleBuffer, nReturned, eMeasurementMode);
kevin1990 29:57edca10d78c 351 nSampleCount += nReturned;
Dan O'Donovan 27:567abf893938 352 }
kevin1990 16:e4f2689363bb 353
kevin1990 16:e4f2689363bb 354 /*
kevin1990 16:e4f2689363bb 355 * Check and print device status if errors/alerts have been triggered
kevin1990 16:e4f2689363bb 356 */
kevin1990 16:e4f2689363bb 357 if (bError || bAlert)
kevin1990 16:e4f2689363bb 358 {
kevin1990 16:e4f2689363bb 359 res = adi_sense_GetStatus(hDevice, &status);
kevin1990 16:e4f2689363bb 360 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 361 {
kevin1990 16:e4f2689363bb 362 ADI_SENSE_LOG_ERROR("Failed to retrieve device status");
kevin1990 16:e4f2689363bb 363 return res;
kevin1990 16:e4f2689363bb 364 }
kevin1990 16:e4f2689363bb 365
kevin1990 16:e4f2689363bb 366 if (status.deviceStatus &
kevin1990 16:e4f2689363bb 367 (ADI_SENSE_DEVICE_STATUS_ERROR | ADI_SENSE_DEVICE_STATUS_ALERT))
kevin1990 16:e4f2689363bb 368 {
kevin1990 16:e4f2689363bb 369 utils_printStatus(&status);
kevin1990 16:e4f2689363bb 370
kevin1990 16:e4f2689363bb 371 /* Break out of the loop if any errors are raised */
kevin1990 16:e4f2689363bb 372 if (bError)
kevin1990 16:e4f2689363bb 373 break;
kevin1990 16:e4f2689363bb 374 }
kevin1990 16:e4f2689363bb 375 }
Dan O'Donovan 27:567abf893938 376
Dan O'Donovan 27:567abf893938 377 if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_SINGLECYCLE)
Dan O'Donovan 27:567abf893938 378 {
Dan O'Donovan 27:567abf893938 379 /*
Dan O'Donovan 27:567abf893938 380 * In this mode, break out of the loop when the measurement command
Dan O'Donovan 27:567abf893938 381 * has completed.
Dan O'Donovan 27:567abf893938 382 *
Dan O'Donovan 27:567abf893938 383 * One option is to check for the expected number of samples to be
Dan O'Donovan 27:567abf893938 384 * returned for the cycle. However, cycles may have variable-length
Dan O'Donovan 27:567abf893938 385 * sequences if the cycleSkipCount option is non-zero for any of the
Dan O'Donovan 27:567abf893938 386 * channels.
Dan O'Donovan 27:567abf893938 387 *
Dan O'Donovan 27:567abf893938 388 * So, instead, we check for the command-running status, which
Dan O'Donovan 27:567abf893938 389 * will de-assert in this mode when the measurement command has
Dan O'Donovan 27:567abf893938 390 * completed a single cycle.
Dan O'Donovan 27:567abf893938 391 */
Dan O'Donovan 30:119ff4f3aef6 392 bool bCommandRunning;
Dan O'Donovan 27:567abf893938 393 res = adi_sense_GetCommandRunningState(hDevice, &bCommandRunning);
Dan O'Donovan 27:567abf893938 394 if (res != ADI_SENSE_SUCCESS)
Dan O'Donovan 27:567abf893938 395 {
Dan O'Donovan 27:567abf893938 396 ADI_SENSE_LOG_ERROR("Failed to get command-running status");
Dan O'Donovan 27:567abf893938 397 return res;
Dan O'Donovan 27:567abf893938 398 }
Dan O'Donovan 27:567abf893938 399
Dan O'Donovan 27:567abf893938 400 if (!bCommandRunning && !bDataReady)
Dan O'Donovan 27:567abf893938 401 break;
Dan O'Donovan 27:567abf893938 402 }
Dan O'Donovan 27:567abf893938 403 }
kevin1990 16:e4f2689363bb 404
Dan O'Donovan 30:119ff4f3aef6 405 ADI_SENSE_LOG_INFO("Stopping measurement");
kevin1990 16:e4f2689363bb 406 res = adi_sense_StopMeasurement(hDevice);
kevin1990 16:e4f2689363bb 407 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 408 {
kevin1990 16:e4f2689363bb 409 ADI_SENSE_LOG_ERROR("Failed to send stop measurement");
kevin1990 16:e4f2689363bb 410 return res;
kevin1990 16:e4f2689363bb 411 }
kevin1990 16:e4f2689363bb 412
kevin1990 16:e4f2689363bb 413 free(pSampleBuffer);
kevin1990 16:e4f2689363bb 414
kevin1990 16:e4f2689363bb 415 res = utils_deregisterCallbacks(hDevice);
kevin1990 16:e4f2689363bb 416 if (res != ADI_SENSE_SUCCESS)
kevin1990 16:e4f2689363bb 417 return res;
kevin1990 16:e4f2689363bb 418
kevin1990 16:e4f2689363bb 419 return ADI_SENSE_SUCCESS;
kevin1990 16:e4f2689363bb 420 }