getValues method
Returns a BME680result with temperature, pressure, humidity and IAQ or throws an exception after sensorReadRetryCounter retries to read sensor data.
Implementation
BME680result getValues() {
setPowerMode(PowerMode.forced);
var retries = sensorReadRetryCounter;
do {
var buffer = i2c.readBytesReg(i2cAddress, field0Address, fieldLenth);
// Set to 1 during measurements, goes to 0 when measurements are completed
var newData = (buffer[0] & newDataMask) == 0 ? true : false;
if (newData) {
_gasMeasurementIndex = buffer[0] & gasIndexMask;
_measureIndex = buffer[1];
// Read the raw data from the sensor
var adcPres = ((buffer[2] & 0xff) << 12) |
((buffer[3] & 0xff) << 4) |
((buffer[4] & 0xff) >> 4);
var adcTemp = ((buffer[5] & 0xff) << 12) |
((buffer[6] & 0xff) << 4) |
((buffer[7] & 0xff) >> 4);
var adcHum = (buffer[8] << 8) | (buffer[9] & 0xff);
var adcGasResistance =
((buffer[13] & 0xff) << 2) | ((buffer[14] & 0xff) >> 6);
var gasRange = buffer[14] & gasRangeMask;
_gasMeasurementValid = (buffer[14] & gasmValidMask) > 0;
_heaterTempStable = (buffer[14] & heatStableMask) > 0;
var temperature = _calculateTemperature(adcTemp);
_temperature = temperature / 100.0;
// Save for heater calculations
_ambientTemperature = temperature;
_pressure = _calculatePressure(adcPres) / 100.0;
_humidity = _calculateHumidity(adcHum) / 1000.0;
_gasResistance =
_calculateGasResistance(adcGasResistance, gasRange).toDouble();
_airQualityScore =
_calculateAirQuality(adcGasResistance, _humidity.toInt());
return BME680result(
_temperature,
_pressure,
_humidity,
_gasResistance,
_airQualityScore,
_heaterTempStable,
_gasMeasurementValid,
_gasMeasurementIndex,
_measureIndex);
}
// Delay to poll the data
sleep(Duration(milliseconds: pollPeriodMilliseconds));
} while (--retries > 0);
throw BME680exception(
'No data available: Give up after $sensorReadRetryCounter tries');
}