001 package edu.wpi.first.wpilibj;
002 import edu.wpi.first.wpilibj.interfaces.Potentiometer;
003 import edu.wpi.first.wpilibj.livewindow.LiveWindowSendable;
004 import edu.wpi.first.wpilibj.tables.ITable;
005
006 /**
007 * Class for reading analog potentiometers. Analog potentiometers read
008 * in an analog voltage that corresponds to a position. Usually the
009 * position is either degrees or meters. However, if no conversion is
010 * given it remains volts.
011 *
012 * @author Alex Henning
013 */
014 public class AnalogPotentiometer implements Potentiometer, LiveWindowSendable {
015 private int m_module, m_channel;
016 private double m_scale, m_offset;
017 private AnalogChannel m_analog_channel;
018
019 /**
020 * Common initialization code called by all constructors.
021 */
022 private void initPot(final int slot, final int channel, double scale, double offset) {
023 this.m_module = slot;
024 this.m_channel = channel;
025 this.m_scale = scale;
026 this.m_offset = offset;
027 m_analog_channel = new AnalogChannel(slot, channel);
028 }
029
030 /**
031 * AnalogPotentiometer constructor.
032 *
033 * Use the scaling and offset values so that the output produces
034 * meaningful values. I.E: you have a 270 degree potentiometer and
035 * you want the output to be degrees with the halfway point as 0
036 * degrees. The scale value is 270.0(degrees)/5.0(volts) and the
037 * offset is -135.0 since the halfway point after scaling is 135
038 * degrees.
039 *
040 * @param slot The analog module this potentiometer is plugged into.
041 * @param channel The analog channel this potentiometer is plugged into.
042 * @param scale The scaling to multiply the voltage by to get a meaningful unit.
043 * @param offset The offset to add to the scaled value for controlling the zero value
044 */
045 public AnalogPotentiometer(final int slot, final int channel, double scale, double offset) {
046 initPot(slot, channel, scale, offset);
047 }
048
049 /**
050 * AnalogPotentiometer constructor.
051 *
052 * Use the scaling and offset values so that the output produces
053 * meaningful values. I.E: you have a 270 degree potentiometer and
054 * you want the output to be degrees with the halfway point as 0
055 * degrees. The scale value is 270.0(degrees)/5.0(volts) and the
056 * offset is -135.0 since the halfway point after scaling is 135
057 * degrees.
058 *
059 * @param channel The analog channel this potentiometer is plugged into.
060 * @param scale The scaling to multiply the voltage by to get a meaningful unit.
061 * @param offset The offset to add to the scaled value for controlling the zero value
062 */
063 public AnalogPotentiometer(final int channel, double scale, double offset) {
064 initPot(1, channel, scale, offset);
065 }
066
067 /**
068 * AnalogPotentiometer constructor.
069 *
070 * Use the scaling and offset values so that the output produces
071 * meaningful values. I.E: you have a 270 degree potentiometer and
072 * you want the output to be degrees with the halfway point as 0
073 * degrees. The scale value is 270.0(degrees)/5.0(volts) and the
074 * offset is -135.0 since the halfway point after scaling is 135
075 * degrees.
076 *
077 * @param channel The analog channel this potentiometer is plugged into.
078 * @param scale The scaling to multiply the voltage by to get a meaningful unit.
079 */
080 public AnalogPotentiometer(final int channel, double scale) {
081 initPot(1, channel, scale, 0);
082 }
083
084 /**
085 * AnalogPotentiometer constructor.
086 *
087 * @param channel The analog channel this potentiometer is plugged into.
088 */
089 public AnalogPotentiometer(final int channel) {
090 initPot(1, channel, 1, 0);
091 }
092
093 /**
094 * Get the current reading of the potentiomere.
095 *
096 * @return The current position of the potentiometer.
097 */
098 public double get() {
099 return m_analog_channel.getVoltage() * m_scale + m_offset;
100 }
101
102
103 /**
104 * Implement the PIDSource interface.
105 *
106 * @return The current reading.
107 */
108 public double pidGet() {
109 return get();
110 }
111
112 /*
113 * Live Window code, only does anything if live window is activated.
114 */
115 public String getSmartDashboardType(){
116 return "Analog Input";
117 }
118 private ITable m_table;
119
120 /**
121 * {@inheritDoc}
122 */
123 public void initTable(ITable subtable) {
124 m_table = subtable;
125 updateTable();
126 }
127
128 /**
129 * {@inheritDoc}
130 */
131 public void updateTable() {
132 if (m_table != null) {
133 m_table.putNumber("Value", get());
134 }
135 }
136
137 /**
138 * {@inheritDoc}
139 */
140 public ITable getTable(){
141 return m_table;
142 }
143
144 /**
145 * Analog Channels don't have to do anything special when entering the LiveWindow.
146 * {@inheritDoc}
147 */
148 public void startLiveWindowMode() {}
149
150 /**
151 * Analog Channels don't have to do anything special when exiting the LiveWindow.
152 * {@inheritDoc}
153 */
154 public void stopLiveWindowMode() {}
155 }