SDMP_IOT / Mbed OS AdiSense1000_SmartBabySeat

Fork of Babyseat_NewFirmware_copy_sean by Ross O'Halloran

Committer:
danodonovan
Date:
Mon Jan 22 17:40:50 2018 +0000
Revision:
24:5a2272a25ff1
Updating example to adisense1000 v1.0.1

Who changed what in which revision?

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