001package jmri.implementation;
002
003import javax.annotation.Nonnull;
004
005import jmri.JmriException;
006import jmri.CurrentMeter;
007import jmri.Meter;
008import jmri.VoltageMeter;
009
010/**
011 * Abstract base class for current meter objects.
012 *
013 * @author Mark Underwood    (C) 2015
014 * @author Daniel Bergqvist  (C) 2020
015 */
016public class DefaultMeter extends AbstractAnalogIO implements Meter {
017    
018    private final MeterUpdateTask _updateTask;
019    @Nonnull private final Unit _unit;
020    private final double _min;
021    private final double _max;
022    private final double _resolution;
023    
024    public DefaultMeter(
025            @Nonnull String sys,
026            @Nonnull Unit unit,
027            double min, double max, double resolution,
028            MeterUpdateTask updateTask) { // null is valid if no updater needed
029        super(sys, true);
030        this._unit = unit;
031        this._updateTask = updateTask;
032        this._min = min;
033        this._max = max;
034        this._resolution = resolution;
035        if (_updateTask != null)  {
036            _updateTask.addMeter(DefaultMeter.this);
037        }
038    }
039    
040    /** {@inheritDoc} */
041    @Override
042    public void enable() {
043        log.debug("Enabling meter.");
044        if (_updateTask != null) _updateTask.enable(this);
045    }
046
047    /** {@inheritDoc} */
048    @Override
049    public void disable() {
050        log.debug("Disabling meter.");
051        if (_updateTask != null) _updateTask.disable(this);
052    }
053
054    /**
055     * {@inheritDoc}
056     * <p>
057     * Override this if the meter can send value to the layout.
058     */
059    @Override
060    protected void sendValueToLayout(double value) throws JmriException {
061        // Do nothing
062    }
063    
064    /** {@inheritDoc} */
065    @Override
066    protected boolean cutOutOfBoundsValues() {
067        return true;
068    }
069    
070    /** {@inheritDoc} */
071    @Override
072    public void setState(int s) throws JmriException {
073        throw new UnsupportedOperationException("Not supported.");
074    }
075
076    /** {@inheritDoc} */
077    @Override
078    public int getState() {
079        throw new UnsupportedOperationException("Not supported.");
080    }
081
082    /** {@inheritDoc} */
083    @Override
084    public String getBeanType() {
085        return Bundle.getMessage("BeanNameMeter");
086    }
087
088    /** {@inheritDoc} */
089    @Override
090    public Unit getUnit() {
091        return _unit;
092    }
093
094    /** {@inheritDoc} */
095    @Override
096    public double getMin() {
097        return _min;
098    }
099
100    /** {@inheritDoc} */
101    @Override
102    public double getMax() {
103        return _max;
104    }
105
106    /** {@inheritDoc} */
107    @Override
108    public double getResolution() {
109        return _resolution;
110    }
111
112    /** {@inheritDoc} */
113    @Override
114    public AbsoluteOrRelative getAbsoluteOrRelative() {
115        return _unit == Unit.Percent ? AbsoluteOrRelative.RELATIVE : AbsoluteOrRelative.ABSOLUTE;
116    }
117    
118    /** {@inheritDoc} */
119    @Override
120    public void dispose() {
121        if (_updateTask != null)_updateTask.removeMeter(this);
122        super.dispose();
123    }
124    
125    /**
126     * Request an update from the layout.
127     */
128    @Override
129    public void requestUpdateFromLayout() {
130        if (_updateTask != null)_updateTask.requestUpdateFromLayout();
131    }
132    
133    
134    /**
135     * Default implementation of a voltage meter.
136     */
137    public static class DefaultVoltageMeter extends DefaultMeter implements VoltageMeter
138    {
139        public DefaultVoltageMeter(@Nonnull String sys, Unit unit, double min, double max, double resolution, MeterUpdateTask updateTask) {
140            super(sys, unit, min, max, resolution, updateTask);
141        }
142    }
143    
144    
145    /**
146     * Default implementation of a current meter.
147     */
148    public static class DefaultCurrentMeter extends DefaultMeter implements CurrentMeter
149    {
150        public DefaultCurrentMeter(@Nonnull String sys, Unit unit, double min, double max, double resolution, MeterUpdateTask updateTask) {
151            super(sys, unit, min, max, resolution, updateTask);
152        }
153    }
154    
155    
156    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DefaultMeter.class);
157}