// Process data coming from the accelerometer void Accelerometer_ReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { this.Dispatcher.BeginInvoke(delegate() { bool canCalibrateX = this.calibrateX && AccelerometerHelper.Instance.CanCalibrate(this.calibrateX, false); bool canCalibrateY = this.calibrateY && AccelerometerHelper.Instance.CanCalibrate(false, this.calibrateY); // Update the enabled state and text of the calibration button this.CalibrateButton.IsEnabled = canCalibrateX || canCalibrateY; if (canCalibrateX && canCalibrateY) this.CalibrateButton.Content = "calibrate (flat)"; else if (canCalibrateX) this.CalibrateButton.Content = "calibrate (portrait)"; else if (canCalibrateY) this.CalibrateButton.Content = "calibrate (landscape)"; else this.CalibrateButton.Content = "calibrate"; this.WarningText.Visibility = this.CalibrateButton.IsEnabled ? Visibility.Collapsed : Visibility.Visible; }); }
private void OnAccelerometerHelperReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { var x = e.AverageAcceleration.X * -64.0; var y = e.AverageAcceleration.Y * 64.0; Dispatcher.BeginInvoke(() => { BackgroundTransform.X = Math.Max(-24, Math.Min(24, x)); BackgroundTransform.Y = Math.Max(-24, Math.Min(24, y)); }); }
/// <summary> /// Called on accelerometer sensor sample available. /// Main accelerometer data filtering routine /// </summary> /// <param name="sender">Sender of the event.</param> /// <param name="e">AccelerometerReadingAsyncEventArgs</param> private void sensor_ReadingChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) { _rawAcceleration.Set(e.SensorReading.Acceleration.X, e.SensorReading.Acceleration.Y, e.SensorReading.Acceleration.Z); lock (_sampleBuffer) { if (!_initialized) { // Initialize file with 1st value _sampleSum = _rawAcceleration * SamplesCount; _averageAcceleration = _rawAcceleration; // Initialize file with 1st value for (int i = 0; i < SamplesCount; i++) { _sampleBuffer[i] = _averageAcceleration; } _previousLowPassOutput = _averageAcceleration; _previousOptimalFilterOutput = _averageAcceleration; _initialized = true; } // low-pass filter _lowPassFilteredAcceleration.Set( LowPassFilter(_rawAcceleration.X, _previousLowPassOutput.X), LowPassFilter(_rawAcceleration.Y, _previousLowPassOutput.Y), LowPassFilter(_rawAcceleration.Z, _previousLowPassOutput.Z)); _previousLowPassOutput = _lowPassFilteredAcceleration; // optimal filter _optimalFilteredAcceleration.Set( FastLowAmplitudeNoiseFilter(_rawAcceleration.X, _previousOptimalFilterOutput.X), FastLowAmplitudeNoiseFilter(_rawAcceleration.Y, _previousOptimalFilterOutput.Y), FastLowAmplitudeNoiseFilter(_rawAcceleration.Z, _previousOptimalFilterOutput.Z)); _previousOptimalFilterOutput = _optimalFilteredAcceleration; // Increment circular buffer insertion index _sampleIndex++; if (_sampleIndex >= SamplesCount) _sampleIndex = 0; // if at max SampleCount then wrap samples back to the beginning position in the list // Add new and remove old at _sampleIndex Simple3DVector newVect = _optimalFilteredAcceleration; _sampleSum += newVect; _sampleSum -= _sampleBuffer[_sampleIndex]; _sampleBuffer[_sampleIndex] = newVect; _averageAcceleration = _sampleSum / SamplesCount; // Stability check // If current low-pass filtered sample is deviating for more than 1/100 g from average (max of 0.5 deg inclination noise if device steady) // then reset the stability counter. // The calibration will be prevented until the counter is reaching the sample count size (calibration enabled only if entire // sampling buffer is "stable" Simple3DVector deltaAcceleration = _averageAcceleration - _optimalFilteredAcceleration; if ((Math.Abs(deltaAcceleration.X) > _maximumStabilityDeltaOffset) || (Math.Abs(deltaAcceleration.Y) > _maximumStabilityDeltaOffset) || (Math.Abs(deltaAcceleration.Z) > _maximumStabilityDeltaOffset)) { // Unstable _deviceStableCount = 0; } else { if (_deviceStableCount < SamplesCount) ++_deviceStableCount; } // Add calibrations _rawAcceleration += ZeroAccelerationCalibrationOffset; _lowPassFilteredAcceleration += ZeroAccelerationCalibrationOffset; _optimalFilteredAcceleration += ZeroAccelerationCalibrationOffset; _averageAcceleration += ZeroAccelerationCalibrationOffset; } if (ReadingChanged != null) { AccelerometerHelperReadingEventArgs readingEventArgs = new AccelerometerHelperReadingEventArgs(); readingEventArgs.RawAcceleration = _rawAcceleration; readingEventArgs.LowPassFilteredAcceleration = _lowPassFilteredAcceleration; readingEventArgs.OptimallyFilteredAcceleration = _optimalFilteredAcceleration; readingEventArgs.AverageAcceleration = _averageAcceleration; ReadingChanged(this, readingEventArgs); } }
/// <summary> /// Called when the accelerometer provides a new value /// </summary> private void OnAccelerometerHelperReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { // work with optimal vector (without noise) Simple3DVector currentVector = e.OptimalyFilteredAcceleration; // check if this vector is considered a shake vector bool isShakeMagnitude = (Math.Abs(_lastStillVector.Magnitude - currentVector.Magnitude) > ShakeMagnitudeWithoutGravitationThreshold); // following is a state machine for detection of shake signal start and end // if still --> shake if ((!_isInShakeState) && (isShakeMagnitude)) { // set shake state flag _isInShakeState = true; // clear old shake signal ClearShakeSignal(); // process still signal ProcessStillSignal(); // add vector to shake signal AddVectorToShakeSignal(currentVector); } // if still --> still else if ((!_isInShakeState) && (!isShakeMagnitude)) { // add vector to still signal AddVectorToStillSignal(currentVector); } // if shake --> shake else if ((_isInShakeState) && (isShakeMagnitude)) { // add vector to shake signal AddVectorToShakeSignal(currentVector); // reset still counter _stillCounter = 0; // try to process shake signal if (ProcessShakeSignal()) { // shake signal generated, clear used data ClearShakeSignal(); } } // if shake --> still else if ((_isInShakeState) && (!isShakeMagnitude)) { // add vector to shake signal AddVectorToShakeSignal(currentVector); // count still vectors _stillCounter++; // if too much still samples if (_stillCounter > StillCounterThreshold) { // clear old still signal _stillSignal.Clear(); // add still vectors from shake signal to still signal for (int i = 0; i < StillCounterThreshold; ++i) { // calculate current index element int currentSampleIndex = _shakeSignal.Count - StillCounterThreshold + i; // add vector to still signal AddVectorToStillSignal(currentVector); } // remove last samples from shake signal _shakeSignal.RemoveRange(_shakeSignal.Count - StillCounterThreshold, StillCounterThreshold); // reset shake state flag _isInShakeState = false; _stillCounter = 0; // try to process shake signal if (ProcessShakeSignal()) { ClearShakeSignal(); } } } }
private void OnAccelerometerHelperReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { if (e.OptimalyFilteredAcceleration.X >= 0.6 && e.OptimalyFilteredAcceleration.X <= 1) { if (saberState == SaberState.On) { LightSaberSwing(); } else if( saberState == SaberState.Off) { saberState = SaberState.Starting; LightSaberSwitch(); } } }
/// <summary> /// Called on accelerometer sensor sample available. /// Main accelerometer data filtering routine /// </summary> /// <param name="sender">Sender of the event.</param> /// <param name="e">AccelerometerReadingAsyncEventArgs</param> private void sensor_ReadingChanged(object sender, AccelerometerReadingEventArgs e) { Simple3DVector lowPassFilteredAcceleration; Simple3DVector optimalFilteredAcceleration; Simple3DVector averagedAcceleration; Simple3DVector rawAcceleration = new Simple3DVector(e.X, e.Y, e.Z); lock (_sampleBuffer) { if (!_initialized) { // Initialize file with 1st value _sampleSum = rawAcceleration * SamplesCount; _averageAcceleration = rawAcceleration; // Initialize file with 1st value for (int i = 0; i < SamplesCount; i++) { _sampleBuffer[i] = _averageAcceleration; } _previousLowPassOutput = _averageAcceleration; _previousOptimalFilterOutput = _averageAcceleration; _initialized = true; } // low-pass filter lowPassFilteredAcceleration = new Simple3DVector( LowPassFilter(rawAcceleration.X, _previousLowPassOutput.X), LowPassFilter(rawAcceleration.Y, _previousLowPassOutput.Y), LowPassFilter(rawAcceleration.Z, _previousLowPassOutput.Z)); _previousLowPassOutput = lowPassFilteredAcceleration; // optimal filter optimalFilteredAcceleration = new Simple3DVector( FastLowAmplitudeNoiseFilter(rawAcceleration.X, _previousOptimalFilterOutput.X), FastLowAmplitudeNoiseFilter(rawAcceleration.Y, _previousOptimalFilterOutput.Y), FastLowAmplitudeNoiseFilter(rawAcceleration.Z, _previousOptimalFilterOutput.Z)); _previousOptimalFilterOutput = optimalFilteredAcceleration; // Increment circular buffer insertion index _sampleIndex++; if (_sampleIndex >= SamplesCount) { _sampleIndex = 0; // if at max SampleCount then wrap samples back to the beginning position in the list } // Add new and remove old at _sampleIndex Simple3DVector newVect = optimalFilteredAcceleration; _sampleSum += newVect; _sampleSum -= _sampleBuffer[_sampleIndex]; _sampleBuffer[_sampleIndex] = newVect; averagedAcceleration = _sampleSum / SamplesCount; _averageAcceleration = averagedAcceleration; // Stablity check // If current low-pass filtered sample is deviating for more than 1/100 g from average (max of 0.5 deg inclination noise if device steady) // then reset the stability counter. // The calibration will be prevented until the counter is reaching the sample count size (calibration enabled only if entire // sampling buffer is "stable" Simple3DVector deltaAcceleration = averagedAcceleration - optimalFilteredAcceleration; if ((Math.Abs(deltaAcceleration.X) > _maximumStabilityDeltaOffset) || (Math.Abs(deltaAcceleration.Y) > _maximumStabilityDeltaOffset) || (Math.Abs(deltaAcceleration.Z) > _maximumStabilityDeltaOffset)) { // Unstable _deviceStableCount = 0; } else { if (_deviceStableCount < SamplesCount) { ++_deviceStableCount; } } // Add calibrations rawAcceleration += ZeroAccelerationCalibrationOffset; lowPassFilteredAcceleration += ZeroAccelerationCalibrationOffset; optimalFilteredAcceleration += ZeroAccelerationCalibrationOffset; averagedAcceleration += ZeroAccelerationCalibrationOffset; } if (ReadingChanged != null) { AccelerometerHelperReadingEventArgs readingEventArgs = new AccelerometerHelperReadingEventArgs(); readingEventArgs.RawAcceleration = rawAcceleration; readingEventArgs.LowPassFilteredAcceleration = lowPassFilteredAcceleration; readingEventArgs.OptimallyFilteredAcceleration = optimalFilteredAcceleration; readingEventArgs.AverageAcceleration = averagedAcceleration; ReadingChanged(this, readingEventArgs); } }
/// <summary> /// Aggiorna la posizione del cursore ridefinendone i margini /// </summary> void UpdateImagePos(AccelerometerHelperReadingEventArgs e) { /* Vado a fare data smoothing dei dati presi dall'accelerometro */ timerX = Math.Round(e.OptimalyFilteredAcceleration.X, 3); timerY = Math.Round(e.OptimalyFilteredAcceleration.Y, 3); Cursor.Margin = new Thickness(getX(), getY(), (width - (getX() + Cursor.Width)), (height - (getY() + Cursor.Height))); if (collisione()) { timer.Stop(); Formica1.Source = null; //MessageBox.Show("formica distrutta" + "getX=" + getX() + " getX+Cursor.Width=" + (getX() + Cursor.Width) + " _timerX=" + _timerX + " _timerX+Formica.Width=" + (_timerX + Formica.Width)); } }
/// <summary> /// Ogni 50 volte al secondo (frequenza di campionamento dell'accelerometro) /// vado a chiamare il metodo UpdateImagePos /// </summary> private void OnAccelerometerHelperReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { Deployment.Current.Dispatcher.BeginInvoke(() => UpdateImagePos(e)); }
/// <summary> /// Called on accelerometer sensor sample available. /// </summary> /// <param name="sender">Sender of the event.</param> /// <param name="e">AccelerometerHelperReadingEventArgs</param> private void accelerometerHelper_ReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { CheckOrientation(e.LowPassFilteredAcceleration); }
void AccelerometerReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { Player.AccelerometerInput(e.OptimalyFilteredAcceleration.X, e.OptimalyFilteredAcceleration.Y, e.OptimalyFilteredAcceleration.Magnitude); }
private void accelerometerHelper_ReadingChanged(object sender, AccelerometerHelperReadingEventArgs e) { this.CheckOrientation(e.LowPassFilteredAcceleration); }