/* * This file is part of the OpenSCADA project * Copyright (C) 2006-2011 TH4 SYSTEMS GmbH (http://th4-systems.com) * * OpenSCADA is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenSCADA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenSCADA. If not, see * <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License. */ package org.openscada.da.client.signalgenerator.page; import java.util.Random; import org.openscada.core.Variant; public enum AnalogType { SINE ( Messages.getString ( "AnalogType.TypeSine.label" ) ) //$NON-NLS-1$ { @Override public Variant generate ( final double timeIndex, final double min, final double max, final double period ) { double val = Math.sin ( timeIndex * 1.0 / period ); val = scale ( min, max, val ); return Variant.valueOf ( val ); } }, COSINE ( Messages.getString ( "AnalogType.TypeCosine.label" ) ) //$NON-NLS-1$ { @Override public Variant generate ( final double timeIndex, final double min, final double max, final double period ) { double val = Math.cos ( timeIndex * 1.0 / period ); val = scale ( min, max, val ); return Variant.valueOf ( val ); } }, RANDOM_NORMAL ( Messages.getString ( "AnalogType.TypeRandom.label" ) ) //$NON-NLS-1$ { private final Random r = new Random (); @Override public Variant generate ( final double timeIndex, final double min, final double max, final double period ) { final double range = max - min; return Variant.valueOf ( this.r.nextDouble () * range + min ); } }, RANDOM_GAUSSIAN ( Messages.getString ( "AnalogType.TypeRandomGaussian.label" ) ) //$NON-NLS-1$ { private final Random r = new Random (); @Override public Variant generate ( final double timeIndex, final double min, final double max, final double period ) { return Variant.valueOf ( scale ( min, max, this.r.nextGaussian () / 2.0 ) ); } }, TRIANGLE ( Messages.getString ( "AnalogType.TypeTriangle.label" ) ) //$NON-NLS-1$ { @Override public Variant generate ( final double timeIndex, final double min, final double max, final double period ) { final double range = max - min; final double val = timeIndex / period % range + min; return Variant.valueOf ( val ); } }, SQUARE ( Messages.getString ( "AnalogType.TypeSquare.label" ) ) //$NON-NLS-1$ { @Override public Variant generate ( final double timeIndex, final double min, final double max, final double period ) { final double val = (long)timeIndex / (long)period % 2; return Variant.valueOf ( val == 0 ? min : max ); } }; public abstract Variant generate ( final double timeIndex, final double min, final double max, final double period ); private static double scale ( final double min, final double max, double val ) { final double range = ( max - min ) / 2.0; final double offset = min + range; val = val * range + offset; return val; } private final String label; private AnalogType ( final String label ) { this.label = label; } public String toLabel () { return this.label; } }