// 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;
      });
    }
Exemplo n.º 2
0
        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));
            });
        }
Exemplo n.º 3
0
        /// <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);
            }
        }
Exemplo n.º 4
0
        /// <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();
                    }
                }
            }
        }
Exemplo n.º 5
0
        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();
                }

            }
        }
Exemplo n.º 6
0
        /// <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);
            }
        }
Exemplo n.º 7
0
 /// <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));
     }
 }
Exemplo n.º 8
0
 /// <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);
 }
Exemplo n.º 10
0
 void AccelerometerReadingChanged(object sender, AccelerometerHelperReadingEventArgs e)
 {
     Player.AccelerometerInput(e.OptimalyFilteredAcceleration.X, e.OptimalyFilteredAcceleration.Y, e.OptimalyFilteredAcceleration.Magnitude);     
 }
Exemplo n.º 11
0
 private void accelerometerHelper_ReadingChanged(object sender, AccelerometerHelperReadingEventArgs e)
 {
     this.CheckOrientation(e.LowPassFilteredAcceleration);
 }