getValues method

BME680result getValues()

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');
}