This is a library to read out sensor values from Silicon Labs' si70xx-range of relative humidity and temperature sensors.

Dependents:   MemLCD-Temperature-Humidity-Demo lab123

Information

All examples in this repo are considered EXPERIMENTAL QUALITY, meaning this code has been created as one-off proof-of-concept and is suitable as a demonstration for experimental purposes only. This code will not be regularly maintained by Silicon Labs and there is no guarantee that these projects will work across all environments, SDK versions and hardware.

Caution

This library targets mbed's asynchronous transfer APIs, so it can only be used in conjunction with platforms supporting these APIs.

The library is currently compatible with Si7013, Si7020 and Si7021 parts.

Usage

Include mbed low-power to use this driver

#include "mbed.h"
#include "SILABS_RHT.h"
 
I2C sensorI2C(PD6, PD7); //PD6=SDA, PD7=SCL
silabs::SILABS_RHT rhtSensor(&sensorI2C);
 
volatile bool busChecked = false;
 
void respondedCallback( void ) {
    busChecked = true;
}

int main() {
    rhtSensor.check_availability(si7021, respondedCallback);
    while(busChecked == false) sleep();
    
    busChecked = false;
    rhtSensor.measure(si7021, respondedCallback);
    while(busChecked == false) sleep();

    if(rhtSensor.get_active()) {
        printf("Temperature: %d.%03d degC\n", rhtSensor.get_Temperature()/1000, rhtSensor.get_Temperature()%1000);
    } else {
        printf("No sensor found\n");
    }

    while(1) sleep();
}

Datasheets

http://www.silabs.com/products/sensors/humidity-sensors/Pages/si7013-20-21.aspx

Committer:
stevew817
Date:
Tue May 05 14:32:43 2015 +0000
Revision:
2:83a8b7df827f
Parent:
1:f3c25dea392e
CallbackPointer.h got deprecated

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Steven Cooreman 0:9fd18754e0c0 1 /***************************************************************************//**
Steven Cooreman 0:9fd18754e0c0 2 * @file SILABS_RHT.cpp
Steven Cooreman 0:9fd18754e0c0 3 * @brief Driver class for the Silicon Labs si70xx series I2C RHT sensors
Steven Cooreman 0:9fd18754e0c0 4 *******************************************************************************
Steven Cooreman 0:9fd18754e0c0 5 * @section License
Steven Cooreman 0:9fd18754e0c0 6 * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b>
Steven Cooreman 0:9fd18754e0c0 7 *******************************************************************************
Steven Cooreman 0:9fd18754e0c0 8 *
Steven Cooreman 0:9fd18754e0c0 9 * Permission is granted to anyone to use this software for any purpose,
Steven Cooreman 0:9fd18754e0c0 10 * including commercial applications, and to alter it and redistribute it
Steven Cooreman 0:9fd18754e0c0 11 * freely, subject to the following restrictions:
Steven Cooreman 0:9fd18754e0c0 12 *
Steven Cooreman 0:9fd18754e0c0 13 * 1. The origin of this software must not be misrepresented; you must not
Steven Cooreman 0:9fd18754e0c0 14 * claim that you wrote the original software.
Steven Cooreman 0:9fd18754e0c0 15 * 2. Altered source versions must be plainly marked as such, and must not be
Steven Cooreman 0:9fd18754e0c0 16 * misrepresented as being the original software.
Steven Cooreman 0:9fd18754e0c0 17 * 3. This notice may not be removed or altered from any source distribution.
Steven Cooreman 0:9fd18754e0c0 18 *
Steven Cooreman 0:9fd18754e0c0 19 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
Steven Cooreman 0:9fd18754e0c0 20 * obligation to support this Software. Silicon Labs is providing the
Steven Cooreman 0:9fd18754e0c0 21 * Software "AS IS", with no express or implied warranties of any kind,
Steven Cooreman 0:9fd18754e0c0 22 * including, but not limited to, any implied warranties of merchantability
Steven Cooreman 0:9fd18754e0c0 23 * or fitness for any particular purpose or warranties against infringement
Steven Cooreman 0:9fd18754e0c0 24 * of any proprietary rights of a third party.
Steven Cooreman 0:9fd18754e0c0 25 *
Steven Cooreman 0:9fd18754e0c0 26 * Silicon Labs will not be liable for any consequential, incidental, or
Steven Cooreman 0:9fd18754e0c0 27 * special damages, or any other relief, or for any claim by any third party,
Steven Cooreman 0:9fd18754e0c0 28 * arising from your use of this Software.
Steven Cooreman 0:9fd18754e0c0 29 *
Steven Cooreman 0:9fd18754e0c0 30 ******************************************************************************/
Steven Cooreman 0:9fd18754e0c0 31
Steven Cooreman 0:9fd18754e0c0 32 #include <mbed.h>
Steven Cooreman 0:9fd18754e0c0 33 #include "SILABS_RHT.h"
Steven Cooreman 0:9fd18754e0c0 34 #include "I2C.h"
Steven Cooreman 0:9fd18754e0c0 35
Steven Cooreman 0:9fd18754e0c0 36 /*******************************************************************************
Steven Cooreman 0:9fd18754e0c0 37 ******************************* DEFINES ***********************************
Steven Cooreman 0:9fd18754e0c0 38 ******************************************************************************/
Steven Cooreman 0:9fd18754e0c0 39
Steven Cooreman 0:9fd18754e0c0 40 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
Steven Cooreman 0:9fd18754e0c0 41
Steven Cooreman 0:9fd18754e0c0 42 /** Si7013 Read Temperature Command */
Steven Cooreman 0:9fd18754e0c0 43 #define SI7013_READ_TEMP 0xE0 /* Read previous T data from RH measurement
Steven Cooreman 0:9fd18754e0c0 44 command*/
Steven Cooreman 0:9fd18754e0c0 45 /** Si7013 Read RH Command */
Steven Cooreman 0:9fd18754e0c0 46 #define SI7013_READ_RH 0xE5 /* Perform RH (and T) measurement. */
Steven Cooreman 0:9fd18754e0c0 47 /** Si7013 Read ID */
Steven Cooreman 0:9fd18754e0c0 48 #define SI7013_READ_ID1_1 0xFA
Steven Cooreman 0:9fd18754e0c0 49 #define SI7013_READ_ID1_2 0x0F
Steven Cooreman 0:9fd18754e0c0 50 #define SI7013_READ_ID2_1 0xFc
Steven Cooreman 0:9fd18754e0c0 51 #define SI7013_READ_ID2_2 0xc9
Steven Cooreman 0:9fd18754e0c0 52 /** Si7013 Read Firmware Revision */
Steven Cooreman 0:9fd18754e0c0 53 #define SI7013_READ_FWREV_1 0x84
Steven Cooreman 0:9fd18754e0c0 54 #define SI7013_READ_FWREV_2 0xB8
Steven Cooreman 0:9fd18754e0c0 55
Steven Cooreman 0:9fd18754e0c0 56 /** I2C device address for Si7013 */
Steven Cooreman 0:9fd18754e0c0 57 #define SI7013_ADDR 0x82
Steven Cooreman 0:9fd18754e0c0 58 /** I2C device address for Si7021 */
Steven Cooreman 0:9fd18754e0c0 59 #define SI7021_ADDR 0x80
Steven Cooreman 0:9fd18754e0c0 60
Steven Cooreman 0:9fd18754e0c0 61
Steven Cooreman 0:9fd18754e0c0 62 /** Device ID value for Si7013 */
Steven Cooreman 0:9fd18754e0c0 63 #define SI7013_DEVICE_ID 0x0D
Steven Cooreman 0:9fd18754e0c0 64 /** Device ID value for Si7020 */
Steven Cooreman 0:9fd18754e0c0 65 #define SI7020_DEVICE_ID 0x14
Steven Cooreman 0:9fd18754e0c0 66 /** Device ID value for Si7021 */
Steven Cooreman 0:9fd18754e0c0 67 #define SI7021_DEVICE_ID 0x15
Steven Cooreman 0:9fd18754e0c0 68
Steven Cooreman 0:9fd18754e0c0 69 /** @endcond */
Steven Cooreman 0:9fd18754e0c0 70
Steven Cooreman 0:9fd18754e0c0 71 /*******************************************************************************
Steven Cooreman 0:9fd18754e0c0 72 ************************** GLOBAL FUNCTIONS *******************************
Steven Cooreman 0:9fd18754e0c0 73 ******************************************************************************/
Steven Cooreman 0:9fd18754e0c0 74
Steven Cooreman 0:9fd18754e0c0 75 namespace silabs
Steven Cooreman 0:9fd18754e0c0 76 {
Steven Cooreman 0:9fd18754e0c0 77
Steven Cooreman 0:9fd18754e0c0 78 SILABS_RHT::SILABS_RHT(mbed::I2C * i2c)
Steven Cooreman 0:9fd18754e0c0 79 {
Steven Cooreman 0:9fd18754e0c0 80 //Save pointer to i2c peripheral
Steven Cooreman 0:9fd18754e0c0 81 _i2c = i2c;
Steven Cooreman 0:9fd18754e0c0 82 _internalCallback.attach(this, &SILABS_RHT::_cbHandler);
Steven Cooreman 0:9fd18754e0c0 83 _completionCallbackPtr = NULL;
Steven Cooreman 0:9fd18754e0c0 84
Steven Cooreman 0:9fd18754e0c0 85 _address = 0;
Steven Cooreman 0:9fd18754e0c0 86 _rhData = 0;
Steven Cooreman 0:9fd18754e0c0 87 _tData = 0;
Steven Cooreman 0:9fd18754e0c0 88
Steven Cooreman 0:9fd18754e0c0 89 _state = RHT_IDLE;
Steven Cooreman 0:9fd18754e0c0 90 }
Steven Cooreman 0:9fd18754e0c0 91
Steven Cooreman 0:9fd18754e0c0 92 /*
Steven Cooreman 0:9fd18754e0c0 93 * Get device bus address
Steven Cooreman 0:9fd18754e0c0 94 */
Steven Cooreman 0:9fd18754e0c0 95 inline uint8_t SILABS_RHT::get_address(SILABS_RHT_device_t device)
Steven Cooreman 0:9fd18754e0c0 96 {
Steven Cooreman 0:9fd18754e0c0 97 switch(device)
Steven Cooreman 0:9fd18754e0c0 98 {
Steven Cooreman 0:9fd18754e0c0 99 case si7013:
Steven Cooreman 0:9fd18754e0c0 100 return SI7013_ADDR;
Steven Cooreman 0:9fd18754e0c0 101 case si7020:
Steven Cooreman 0:9fd18754e0c0 102 case si7021:
Steven Cooreman 0:9fd18754e0c0 103 return SI7021_ADDR;
Steven Cooreman 0:9fd18754e0c0 104 default:
Steven Cooreman 0:9fd18754e0c0 105 return 0;
Steven Cooreman 0:9fd18754e0c0 106 }
Steven Cooreman 0:9fd18754e0c0 107 }
Steven Cooreman 0:9fd18754e0c0 108
Steven Cooreman 0:9fd18754e0c0 109 /*
Steven Cooreman 0:9fd18754e0c0 110 * Get last measured temperature data
Steven Cooreman 0:9fd18754e0c0 111 */
Steven Cooreman 0:9fd18754e0c0 112 int32_t SILABS_RHT::get_temperature()
Steven Cooreman 0:9fd18754e0c0 113 {
Steven Cooreman 0:9fd18754e0c0 114 return _tData;
Steven Cooreman 0:9fd18754e0c0 115 }
Steven Cooreman 0:9fd18754e0c0 116
Steven Cooreman 0:9fd18754e0c0 117 /*
Steven Cooreman 0:9fd18754e0c0 118 * Get last measured relative humidity data
Steven Cooreman 0:9fd18754e0c0 119 */
Steven Cooreman 0:9fd18754e0c0 120 uint32_t SILABS_RHT::get_humidity()
Steven Cooreman 0:9fd18754e0c0 121 {
Steven Cooreman 0:9fd18754e0c0 122 return _rhData;
Steven Cooreman 0:9fd18754e0c0 123 }
Steven Cooreman 0:9fd18754e0c0 124
Steven Cooreman 0:9fd18754e0c0 125 /*
Steven Cooreman 0:9fd18754e0c0 126 * Get current state of the sensor, active or inactive. Need to call check_availability first.
Steven Cooreman 0:9fd18754e0c0 127 */
Steven Cooreman 0:9fd18754e0c0 128 bool SILABS_RHT::get_active()
Steven Cooreman 0:9fd18754e0c0 129 {
Steven Cooreman 0:9fd18754e0c0 130 if(_state == RHT_IDLE) return false;
Steven Cooreman 0:9fd18754e0c0 131 else return true;
Steven Cooreman 0:9fd18754e0c0 132 }
Steven Cooreman 0:9fd18754e0c0 133
Steven Cooreman 0:9fd18754e0c0 134 /*
Steven Cooreman 0:9fd18754e0c0 135 * Perform measurement
Steven Cooreman 0:9fd18754e0c0 136 */
Steven Cooreman 0:9fd18754e0c0 137 int SILABS_RHT::measure(SILABS_RHT_device_t deviceType, cbptr_t callback)
Steven Cooreman 0:9fd18754e0c0 138 {
Steven Cooreman 0:9fd18754e0c0 139 /* Check to see we're available */
Steven Cooreman 0:9fd18754e0c0 140 if((_state != RHT_IDLE) && (_state != RHT_ACTIVE)) return SILABS_RHT_ERROR_BUSY;
Steven Cooreman 0:9fd18754e0c0 141
Steven Cooreman 0:9fd18754e0c0 142 /* Set internal state */
Steven Cooreman 0:9fd18754e0c0 143 _state = RHT_MEASURING;
Steven Cooreman 0:9fd18754e0c0 144 _completionCallbackPtr = callback;
Steven Cooreman 0:9fd18754e0c0 145
Steven Cooreman 0:9fd18754e0c0 146 _tx_buf[0] = SI7013_READ_RH;
Steven Cooreman 0:9fd18754e0c0 147
Steven Cooreman 0:9fd18754e0c0 148 /* Get device bus address */
Steven Cooreman 0:9fd18754e0c0 149 _address = get_address(deviceType);
Steven Cooreman 0:9fd18754e0c0 150 if (_address == 0)
Steven Cooreman 0:9fd18754e0c0 151 {
Steven Cooreman 0:9fd18754e0c0 152 _state = RHT_IDLE;
Steven Cooreman 0:9fd18754e0c0 153 return SILABS_RHT_ERROR_ARGUMENT;
Steven Cooreman 0:9fd18754e0c0 154 }
Steven Cooreman 0:9fd18754e0c0 155
Steven Cooreman 0:9fd18754e0c0 156 /* Start transfer */
Steven Cooreman 1:f3c25dea392e 157 if(_i2c->transfer(_address, (char*)_tx_buf, 1, (char*)_rx_buf, 2, _internalCallback, I2C_EVENT_ALL) != 0)
Steven Cooreman 0:9fd18754e0c0 158 {
Steven Cooreman 0:9fd18754e0c0 159 _state = RHT_IDLE;
Steven Cooreman 0:9fd18754e0c0 160 return SILABS_RHT_ERROR_I2C_BUSY;
Steven Cooreman 0:9fd18754e0c0 161 }
Steven Cooreman 0:9fd18754e0c0 162
Steven Cooreman 0:9fd18754e0c0 163 return SILABS_RHT_OK;
Steven Cooreman 0:9fd18754e0c0 164 }
Steven Cooreman 0:9fd18754e0c0 165
Steven Cooreman 0:9fd18754e0c0 166 /*
Steven Cooreman 0:9fd18754e0c0 167 * Check if the sensor is active and responding
Steven Cooreman 0:9fd18754e0c0 168 */
Steven Cooreman 0:9fd18754e0c0 169 int SILABS_RHT::check_availability(SILABS_RHT_device_t deviceType, cbptr_t callback)
Steven Cooreman 0:9fd18754e0c0 170 {
Steven Cooreman 0:9fd18754e0c0 171 /* Check to see we're available */
Steven Cooreman 0:9fd18754e0c0 172 if((_state != RHT_IDLE) && (_state != RHT_ACTIVE)) return SILABS_RHT_ERROR_BUSY;
Steven Cooreman 0:9fd18754e0c0 173
Steven Cooreman 0:9fd18754e0c0 174 /* Set internal state */
Steven Cooreman 0:9fd18754e0c0 175 _state = RHT_PINGING;
Steven Cooreman 0:9fd18754e0c0 176 _completionCallbackPtr = callback;
Steven Cooreman 0:9fd18754e0c0 177
Steven Cooreman 0:9fd18754e0c0 178 _tx_buf[0] = SI7013_READ_ID2_1;
Steven Cooreman 0:9fd18754e0c0 179 _tx_buf[1] = SI7013_READ_ID2_2;
Steven Cooreman 0:9fd18754e0c0 180
Steven Cooreman 0:9fd18754e0c0 181 /* Get device bus address */
Steven Cooreman 0:9fd18754e0c0 182 _address = get_address(deviceType);
Steven Cooreman 0:9fd18754e0c0 183 if (_address == 0)
Steven Cooreman 0:9fd18754e0c0 184 {
Steven Cooreman 0:9fd18754e0c0 185 _state = RHT_IDLE;
Steven Cooreman 0:9fd18754e0c0 186 return SILABS_RHT_ERROR_ARGUMENT;
Steven Cooreman 0:9fd18754e0c0 187 }
Steven Cooreman 0:9fd18754e0c0 188
Steven Cooreman 0:9fd18754e0c0 189 /* Start transfer */
Steven Cooreman 1:f3c25dea392e 190 if(_i2c->transfer(_address, (char*)_tx_buf, 2, (char*)_rx_buf, 8, _internalCallback, I2C_EVENT_ALL) != 0)
Steven Cooreman 0:9fd18754e0c0 191 {
Steven Cooreman 0:9fd18754e0c0 192 _state = RHT_IDLE;
Steven Cooreman 0:9fd18754e0c0 193 return SILABS_RHT_ERROR_I2C_BUSY;
Steven Cooreman 0:9fd18754e0c0 194 }
Steven Cooreman 0:9fd18754e0c0 195
Steven Cooreman 0:9fd18754e0c0 196 return SILABS_RHT_OK;
Steven Cooreman 0:9fd18754e0c0 197 }
Steven Cooreman 0:9fd18754e0c0 198
Steven Cooreman 0:9fd18754e0c0 199 void SILABS_RHT::_cbHandlerTimeout( void )
Steven Cooreman 0:9fd18754e0c0 200 {
Steven Cooreman 0:9fd18754e0c0 201 this->_cbHandler(0);
Steven Cooreman 0:9fd18754e0c0 202 }
Steven Cooreman 0:9fd18754e0c0 203
Steven Cooreman 0:9fd18754e0c0 204 void SILABS_RHT::_cbHandler( int event )
Steven Cooreman 0:9fd18754e0c0 205 {
Steven Cooreman 0:9fd18754e0c0 206 if (_state == RHT_IDLE || _state == RHT_ACTIVE)
Steven Cooreman 0:9fd18754e0c0 207 {
Steven Cooreman 0:9fd18754e0c0 208 return;
Steven Cooreman 0:9fd18754e0c0 209 }
Steven Cooreman 0:9fd18754e0c0 210 else if (event & I2C_EVENT_ERROR_NO_SLAVE)
Steven Cooreman 0:9fd18754e0c0 211 {
Steven Cooreman 0:9fd18754e0c0 212 /* Slave is no longer responding */
Steven Cooreman 0:9fd18754e0c0 213 _state = RHT_IDLE;
Steven Cooreman 0:9fd18754e0c0 214 }
Steven Cooreman 0:9fd18754e0c0 215 else if (event & I2C_EVENT_ERROR)
Steven Cooreman 0:9fd18754e0c0 216 {
Steven Cooreman 0:9fd18754e0c0 217 /* Do nothing when an I2C error occurred */
Steven Cooreman 0:9fd18754e0c0 218 }
Steven Cooreman 0:9fd18754e0c0 219 else if (_state == RHT_PINGING)
Steven Cooreman 0:9fd18754e0c0 220 {
Steven Cooreman 0:9fd18754e0c0 221 _state = RHT_ACTIVE;
Steven Cooreman 0:9fd18754e0c0 222
Steven Cooreman 0:9fd18754e0c0 223 /* check ID byte */
Steven Cooreman 0:9fd18754e0c0 224 switch(_rx_buf[0])
Steven Cooreman 0:9fd18754e0c0 225 {
Steven Cooreman 0:9fd18754e0c0 226 case SI7013_DEVICE_ID:
Steven Cooreman 0:9fd18754e0c0 227 case SI7020_DEVICE_ID:
Steven Cooreman 0:9fd18754e0c0 228 case SI7021_DEVICE_ID:
Steven Cooreman 0:9fd18754e0c0 229 /* ID byte indicates one of the supported devices */
Steven Cooreman 0:9fd18754e0c0 230 break;
Steven Cooreman 0:9fd18754e0c0 231 default:
Steven Cooreman 0:9fd18754e0c0 232 /* Unsupported device */
Steven Cooreman 0:9fd18754e0c0 233 _state = RHT_IDLE;
Steven Cooreman 0:9fd18754e0c0 234 }
Steven Cooreman 0:9fd18754e0c0 235 }
Steven Cooreman 0:9fd18754e0c0 236 else if (_state == RHT_MEASURING)
Steven Cooreman 0:9fd18754e0c0 237 {
Steven Cooreman 0:9fd18754e0c0 238 /* Store raw RH info */
Steven Cooreman 0:9fd18754e0c0 239 _rhData = ((uint32_t)_rx_buf[0] << 8) + (_rx_buf[1] & 0xFC);
Steven Cooreman 0:9fd18754e0c0 240 /* Convert value to milli-percent */
Steven Cooreman 0:9fd18754e0c0 241 _rhData = (((_rhData) * 15625L) >> 13) - 6000;
Steven Cooreman 0:9fd18754e0c0 242
Steven Cooreman 0:9fd18754e0c0 243 /* Read back the temperature value */
Steven Cooreman 0:9fd18754e0c0 244 _state = RHT_TEMPERATURE;
Steven Cooreman 0:9fd18754e0c0 245
Steven Cooreman 0:9fd18754e0c0 246 _tx_buf[0] = SI7013_READ_TEMP;
Steven Cooreman 0:9fd18754e0c0 247
Steven Cooreman 1:f3c25dea392e 248 if(_i2c->transfer(_address, (char*)_tx_buf, 1, (char*)_rx_buf, 2, _internalCallback, I2C_EVENT_ALL) == 0)
Steven Cooreman 0:9fd18754e0c0 249 {
Steven Cooreman 0:9fd18754e0c0 250 // Succeeded in adding the transfer, so return here to avoid calling the callback.
Steven Cooreman 0:9fd18754e0c0 251 return;
Steven Cooreman 0:9fd18754e0c0 252 }
Steven Cooreman 0:9fd18754e0c0 253
Steven Cooreman 0:9fd18754e0c0 254 // Did not succeed in adding the temperature transfer, so bail.
Steven Cooreman 0:9fd18754e0c0 255 _state = RHT_ACTIVE;
Steven Cooreman 0:9fd18754e0c0 256 }
Steven Cooreman 0:9fd18754e0c0 257 else if (_state == RHT_TEMPERATURE)
Steven Cooreman 0:9fd18754e0c0 258 {
Steven Cooreman 0:9fd18754e0c0 259 /* Store raw temperature info */
Steven Cooreman 0:9fd18754e0c0 260 _tData = ((uint32_t)_rx_buf[0] << 8) + (_rx_buf[1] & 0xFC);
Steven Cooreman 0:9fd18754e0c0 261 /* Convert to milli-degC */
Steven Cooreman 0:9fd18754e0c0 262 _tData = (((_tData) * 21965L) >> 13) - 46850;
Steven Cooreman 0:9fd18754e0c0 263
Steven Cooreman 0:9fd18754e0c0 264 /* Go back to idling */
Steven Cooreman 0:9fd18754e0c0 265 _state = RHT_ACTIVE;
Steven Cooreman 0:9fd18754e0c0 266 }
Steven Cooreman 0:9fd18754e0c0 267 else if (_state == RHT_FWREV)
Steven Cooreman 0:9fd18754e0c0 268 {
Steven Cooreman 0:9fd18754e0c0 269 _state = RHT_ACTIVE;
Steven Cooreman 0:9fd18754e0c0 270 }
Steven Cooreman 0:9fd18754e0c0 271
Steven Cooreman 0:9fd18754e0c0 272 /* If a callback has been registered, call it */
Steven Cooreman 0:9fd18754e0c0 273 if (_completionCallbackPtr != NULL)
Steven Cooreman 0:9fd18754e0c0 274 {
Steven Cooreman 0:9fd18754e0c0 275 _completionCallbackPtr();
Steven Cooreman 0:9fd18754e0c0 276 _completionCallbackPtr = NULL;
Steven Cooreman 0:9fd18754e0c0 277 }
Steven Cooreman 0:9fd18754e0c0 278 }
Steven Cooreman 0:9fd18754e0c0 279
Steven Cooreman 0:9fd18754e0c0 280 } // namespace silabs