All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.epics.pvmanager.sim.Noise Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2010-14 pvmanager developers. See COPYRIGHT.TXT
 * All rights reserved. Use is subject to license terms. See LICENSE.TXT
 */
package org.epics.pvmanager.sim;

import java.util.Random;
import org.epics.vtype.VDouble;
import static org.epics.vtype.ValueFactory.*;
import org.epics.util.time.Timestamp;

/**
 * Function to simulate a signal that has a uniform distribution. The warning
 * limits are set at 80% of the range and the alarm at 90% the range.
 * All values are going to have no alarm status, with the timestamp set at the
 * moment the sample was generated.
 *
 * @author carcassi
 */
public class Noise extends SimFunction {

    private Random rand = new Random();
    private double min;
    private double max;
    private double range;
    private VDouble lastValue;

    /**
     * Creates a signal uniformly distributed between -5.0 and 5.0, updating
     * every 100ms (10Hz).
     */
    public Noise() {
        this(-5.0, 5.0, 1.0);
    }
    
    /**
     * Do not use: only provided to provide some sort of error message
     * for people migrating from utility.pv.
     * 
     * @param min minimum value
     * @param max maximum value
     * @param step ignored
     * @param interval interval between samples in seconds
     */
    public Noise(Double min, Double max, Double step, Double interval) {
        super(interval, VDouble.class);
        throw new IllegalArgumentException("Please rename to noise(" + min + ", " + max + ", " + interval + ")");
    }

    /**
     * Creates a signal uniformly distributed between min and max, updating
     * every interval seconds.
     *
     * @param min minimum value
     * @param max maximum value
     * @param interval interval between samples in seconds
     */
    public Noise(Double min, Double max, Double interval) {
        super(interval, VDouble.class);
        if (interval <= 0.0) {
            throw new IllegalArgumentException("Interval must be greater than zero (was " + interval + ")");
        }
        this.min = min;
        this.max = max;
        range = this.max - this.min;
        lastValue = newVDouble(min, alarmNone(), timeNow(),
                newDisplay(min, min + range * 0.1, min + range * 0.2, "x", Constants.DOUBLE_FORMAT,
                min + range * 0.8, min + range * 0.9, max, min, max));
    }

    @Override
    VDouble nextValue() {
        return newValue(min + rand.nextDouble() * range, lastValue);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy