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}