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