updateValues method

void updateValues()

This method should be called repeatedly with a high frequency to get accurate values.

Implementation

void updateValues() {
  if (_lastUpdateTime == 0) {
    _lastUpdateTime = DateTime.now().millisecondsSinceEpoch;
  }
  // Accelerometer
  var accelerations = readScaledAccelerometerValues();
  _accelAccelerationX = accelerations[0];
  _accelAccelerationY = accelerations[1];
  _accelAccelerationZ = accelerations[2];

  _accelAngleX = _getAccelXAngle(
      _accelAccelerationX, _accelAccelerationY, _accelAccelerationZ);
  _accelAngleY = _getAccelYAngle(
      _accelAccelerationX, _accelAccelerationY, _accelAccelerationZ);
  _accelAngleZ = _getAccelZAngle();

  // Gyroscope
  var angularSpeeds = readScaledGyroscopeValues();
  _gyroAngularSpeedX = angularSpeeds[0] - _gyroAngularSpeedOffsetX;
  _gyroAngularSpeedY = angularSpeeds[1] - _gyroAngularSpeedOffsetY;
  _gyroAngularSpeedZ = angularSpeeds[2] - _gyroAngularSpeedOffsetZ;
  // angular speed * time = angle
  var dt = (DateTime.now().millisecondsSinceEpoch - _lastUpdateTime).abs() /
      1000.0; // s
  var deltaGyroAngleX = _gyroAngularSpeedX * dt;
  var deltaGyroAngleY = _gyroAngularSpeedY * dt;
  var deltaGyroAngleZ = _gyroAngularSpeedZ * dt;

  _lastUpdateTime = DateTime.now().millisecondsSinceEpoch;

  _gyroAngleX += deltaGyroAngleX;
  _gyroAngleY += deltaGyroAngleY;
  _gyroAngleZ += deltaGyroAngleZ;

  // Complementary Filter
  var alpha = 0.96;
  _filteredAngleX = alpha * (_filteredAngleX + deltaGyroAngleX) +
      (1.0 - alpha) * _accelAngleX;
  _filteredAngleY = alpha * (_filteredAngleY + deltaGyroAngleY) +
      (1.0 - alpha) * _accelAngleY;
  _filteredAngleZ = _filteredAngleZ + deltaGyroAngleZ;
}