Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
common/utils.c@24:5a2272a25ff1, 2018-01-22 (annotated)
- 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?
| User | Revision | Line number | New 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 |