MagneticFluxDensityTriadStaticIntervalDetector.java

/*
 * Copyright (C) 2020 Alberto Irurueta Carro (alberto@irurueta.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.irurueta.navigation.inertial.calibration.intervals;

import com.irurueta.navigation.inertial.calibration.MagneticFluxDensityTriad;
import com.irurueta.navigation.inertial.calibration.noise.AccumulatedMagneticFluxDensityTriadNoiseEstimator;
import com.irurueta.navigation.inertial.calibration.noise.WindowedMagneticFluxDensityTriadNoiseEstimator;
import com.irurueta.units.MagneticFluxDensity;
import com.irurueta.units.MagneticFluxDensityConverter;
import com.irurueta.units.MagneticFluxDensityUnit;

/**
 * This detector is in charge of determining when a static period of
 * magnetic flux density measurements starts and finishes.
 * Static periods are periods of time where the device is considered
 * to remain static (no movement applied to it).
 */
public class MagneticFluxDensityTriadStaticIntervalDetector extends
        TriadStaticIntervalDetector<MagneticFluxDensityUnit, MagneticFluxDensity, MagneticFluxDensityTriad,
                MagneticFluxDensityTriadStaticIntervalDetector,
                MagneticFluxDensityTriadStaticIntervalDetectorListener> {

    /**
     * Constructor.
     */
    public MagneticFluxDensityTriadStaticIntervalDetector() {
        super(new WindowedMagneticFluxDensityTriadNoiseEstimator(),
                new AccumulatedMagneticFluxDensityTriadNoiseEstimator());
    }

    /**
     * Constructor.
     *
     * @param listener listener to handle events generated by this detector.
     */
    public MagneticFluxDensityTriadStaticIntervalDetector(
            final MagneticFluxDensityTriadStaticIntervalDetectorListener listener) {
        super(new WindowedMagneticFluxDensityTriadNoiseEstimator(),
                new AccumulatedMagneticFluxDensityTriadNoiseEstimator(), listener);
    }

    /**
     * Converts provided magnetic flux density value expressed in provided unit
     * to Teslas (T).
     *
     * @param value value to be converted.
     * @param unit  unit of value to be converted.
     * @return converted value.
     */
    @Override
    protected double convertMeasurement(final double value, final MagneticFluxDensityUnit unit) {
        return MagneticFluxDensityConverter.convert(value, unit, MagneticFluxDensityUnit.TESLA);
    }

    /**
     * Creates a magnetic flux density instance using provided value and unit.
     *
     * @param value value of measurement.
     * @param unit  unit of value.
     * @return created magnetic flux density.
     */
    @Override
    protected MagneticFluxDensity createMeasurement(final double value, final MagneticFluxDensityUnit unit) {
        return new MagneticFluxDensity(value, unit);
    }

    /**
     * Gets default unit for magnetic flux density, which is Teslas (T).
     *
     * @return default unit for magnetic flux density.
     */
    @Override
    protected MagneticFluxDensityUnit getDefaultUnit() {
        return MagneticFluxDensityUnit.TESLA;
    }

    /**
     * Creates a magnetic flux density triad.
     *
     * @param valueX x-coordinate value.
     * @param valueY y-coordinate value.
     * @param valueZ z-coordinate value.
     * @param unit   unit of values.
     * @return created triad.
     */
    @Override
    protected MagneticFluxDensityTriad createTriad(
            final double valueX, final double valueY, final double valueZ, final MagneticFluxDensityUnit unit) {
        return new MagneticFluxDensityTriad(unit, valueX, valueY, valueZ);
    }
}