001    /*----------------------------------------------------------------------------*/
002    /* Copyright (c) FIRST 2008-2012. All Rights Reserved.                        */
003    /* Open Source Software - may be modified and shared by FRC teams. The code   */
004    /* must be accompanied by the FIRST BSD license file in the root directory of */
005    /* the project.                                                               */
006    /*----------------------------------------------------------------------------*/
007    
008    package edu.wpi.first.wpilibj.smartdashboard;
009    
010    import edu.wpi.first.wpilibj.NamedSendable;
011    import edu.wpi.first.wpilibj.Sendable;
012    import edu.wpi.first.wpilibj.networktables.NetworkTable;
013    import edu.wpi.first.wpilibj.networktables.NetworkTableKeyNotDefined;
014    import edu.wpi.first.wpilibj.tables.ITable;
015    import edu.wpi.first.wpilibj.tables.TableKeyNotDefinedException;
016    import java.util.Hashtable;
017    import java.util.NoSuchElementException;
018    
019    /**
020     * The {@link SmartDashboard} class is the bridge between robot programs and the SmartDashboard on the
021     * laptop.
022     *
023     * <p>When a value is put into the SmartDashboard here, it pops up on the SmartDashboard on the laptop.
024     * Users can put values into and get values from the SmartDashboard</p>
025     * 
026     * @author Joe Grinstead
027     */
028    public class SmartDashboard {
029        //TODO usage reporting
030        /** The {@link NetworkTable} used by {@link SmartDashboard} */
031        private static final NetworkTable table = NetworkTable.getTable("SmartDashboard");
032        /** 
033         * A table linking tables in the SmartDashboard to the {@link SmartDashboardData} objects
034         * they came from.
035         */
036        private static final Hashtable tablesToData = new Hashtable();
037    
038        /**
039         * Maps the specified key to the specified value in this table.
040         * The key can not be null.
041         * The value can be retrieved by calling the get method with a key that is equal to the original key.
042         * @param key the key
043         * @param data the value
044         * @throws IllegalArgumentException if key is null
045         */
046        public static void putData(String key, Sendable data) {
047            ITable dataTable = table.getSubTable(key);
048            dataTable.putString("~TYPE~", data.getSmartDashboardType());
049            data.initTable(dataTable);
050            tablesToData.put(data, key);
051        }
052    
053        
054        //TODO should we reimplement NamedSendable?
055        /**
056         * Maps the specified key (where the key is the name of the {@link SmartDashboardNamedData}
057         * to the specified value in this table.
058         * The value can be retrieved by calling the get method with a key that is equal to the original key.
059         * @param value the value
060         * @throws IllegalArgumentException if key is null
061         */
062        public static void putData(NamedSendable value) {
063            putData(value.getName(), value);
064        }
065    
066        /**
067         * Returns the value at the specified key.
068         * @param key the key
069         * @return the value
070         * @throws NetworkTableKeyNotDefined if there is no value mapped to by the key
071         * @throws IllegalArgumentException if the value mapped to by the key is not a {@link SmartDashboardData}
072         * @throws IllegalArgumentException if the key is null
073         */
074    //TODO    public static SmartDashboardData getData(String key) {
075    //        NetworkTable subtable = table.getSubTable(key);
076    //        Object data = tablesToData.get(subtable);
077    //        if (data == null) {
078    //            throw new IllegalArgumentException("Value at \"" + key + "\" is not a boolean");
079    //        } else {
080    //            return (SmartDashboardData) data;
081    //        }
082    //    }
083    
084        /**
085         * Maps the specified key to the specified value in this table.
086         * The key can not be null.
087         * The value can be retrieved by calling the get method with a key that is equal to the original key.
088         * @param key the key
089         * @param value the value
090         * @throws IllegalArgumentException if key is null
091         */
092        public static void putBoolean(String key, boolean value) {
093            table.putBoolean(key, value);
094        }
095    
096        /**
097         * Returns the value at the specified key.
098         * @param key the key
099         * @return the value
100         * @throws NetworkTableKeyNotDefined if there is no value mapped to by the key
101         * @throws IllegalArgumentException if the value mapped to by the key is not a boolean
102         * @throws IllegalArgumentException if the key is null
103         */
104        public static boolean getBoolean(String key) throws TableKeyNotDefinedException{
105            return table.getBoolean(key);
106        }
107    
108        /**
109         * Returns the value at the specified key.
110         * @param key the key
111         * @param defaultValue returned if the key doesn't exist
112         * @return the value
113         * @throws IllegalArgumentException if the value mapped to by the key is not a boolean
114         * @throws IllegalArgumentException if the key is null
115         */
116        public static boolean getBoolean(String key, boolean defaultValue) {
117            return table.getBoolean(key, defaultValue);
118        }
119    
120        /**
121         * Maps the specified key to the specified value in this table.
122         * The key can not be null.
123         * The value can be retrieved by calling the get method with a key that is equal to the original key.
124         * @param key the key
125         * @param value the value
126         * @throws IllegalArgumentException if key is null
127         */
128        public static void putNumber(String key, double value) {
129            table.putNumber(key, value);
130        }
131    
132        /**
133         * Returns the value at the specified key.
134         * @param key the key
135         * @return the value
136         * @throws TableKeyNotDefinedException if there is no value mapped to by the key
137         * @throws IllegalArgumentException if the value mapped to by the key is not a double
138         * @throws IllegalArgumentException if the key is null
139         */
140        public static double getNumber(String key) throws TableKeyNotDefinedException{
141            return table.getNumber(key);
142        }
143    
144        /**
145         * Returns the value at the specified key.
146         * @param key the key
147         * @param defaultValue the value returned if the key is undefined
148         * @return the value
149         * @throws NoSuchEleNetworkTableKeyNotDefinedmentException if there is no value mapped to by the key
150         * @throws IllegalArgumentException if the value mapped to by the key is not a double
151         * @throws IllegalArgumentException if the key is null
152         */
153        public static double getNumber(String key, double defaultValue) {
154            return table.getNumber(key, defaultValue);
155        }
156    
157        /**
158         * Maps the specified key to the specified value in this table.
159         * Neither the key nor the value can be null.
160         * The value can be retrieved by calling the get method with a key that is equal to the original key.
161         * @param key the key
162         * @param value the value
163         * @throws IllegalArgumentException if key or value is null
164         */
165        public static void putString(String key, String value) {
166            table.putString(key, value);
167        }
168    
169        /**
170         * Returns the value at the specified key.
171         * @param key the key
172         * @return the value
173         * @throws NetworkTableKeyNotDefined if there is no value mapped to by the key
174         * @throws IllegalArgumentException if the value mapped to by the key is not a string
175         * @throws IllegalArgumentException if the key is null
176         */
177        public static String getString(String key) throws TableKeyNotDefinedException{
178            return table.getString(key);
179        }
180    
181            /**
182         * Returns the value at the specified key.
183         * @param key the key
184         * @param defaultValue  The value returned if the key is undefined
185         * @return the value
186         * @throws NetworkTableKeyNotDefined if there is no value mapped to by the key
187         * @throws IllegalArgumentException if the value mapped to by the key is not a string
188         * @throws IllegalArgumentException if the key is null
189         */
190        public static String getString(String key, String defaultValue) {
191            return table.getString(key, defaultValue);
192        }
193        
194        
195        
196        
197        
198        
199        
200        
201    
202        /*
203         * Deprecated Methods
204         */
205        /**
206         * Maps the specified key to the specified value in this table.
207         * 
208         * The key can not be null.
209         * The value can be retrieved by calling the get method with a key that is equal to the original key.
210         * 
211         * @deprecated Use {@link #putNumber(java.lang.String, double) putNumber method} instead
212         * @param key the key
213         * @param value the value
214         * @throws IllegalArgumentException if key is null
215         */
216        public static void putInt(String key, int value) {
217            table.putNumber(key, value);
218        }
219    
220        /**
221         * Returns the value at the specified key.
222         * 
223         * @deprecated Use {@link #getNumber(java.lang.String) getNumber} instead
224         * @param key the key
225         * @return the value
226         * @throws TableKeyNotDefinedException if there is no value mapped to by the key
227         * @throws IllegalArgumentException if the value mapped to by the key is not an int
228         * @throws IllegalArgumentException if the key is null
229         */
230        public static int getInt(String key) throws TableKeyNotDefinedException{
231            return (int) table.getNumber(key);
232        }
233    
234        /**
235         * Returns the value at the specified key.  
236         * 
237         * @deprecated Use {@link #getNumber(java.lang.String, double) getNumber} instead
238         * @param key the key
239         * @param defaultValue the value returned if the key is undefined
240         * @return the value
241         * @throws NetworkTableKeyNotDefined if there is no value mapped to by the key
242         * @throws IllegalArgumentException if the value mapped to by the key is not an int
243         * @throws IllegalArgumentException if the key is null
244         */
245        public static int getInt(String key, int defaultValue) throws TableKeyNotDefinedException{
246            try {
247                return (int) table.getNumber(key);
248            } catch (NoSuchElementException ex) {
249                return defaultValue;
250            }
251        }
252    
253        /**
254         * Maps the specified key to the specified value in this table.
255         * 
256         * The key can not be null.
257         * The value can be retrieved by calling the get method with a key that is equal to the original key.
258         * 
259         * @deprecated Use{@link #putNumber(java.lang.String, double) putNumber} instead
260         * @param key the key
261         * @param value the value
262         * @throws IllegalArgumentException if key is null
263         */
264        public static void putDouble(String key, double value) {
265            table.putNumber(key, value);
266        }
267    
268        /**
269         * Returns the value at the specified key.
270         * 
271         * @deprecated Use {@link #getNumber(java.lang.String) getNumber} instead
272         * @param key the key
273         * @return the value
274         * @throws NoSuchEleNetworkTableKeyNotDefinedmentException if there is no value mapped to by the key
275         * @throws IllegalArgumentException if the value mapped to by the key is not a double
276         * @throws IllegalArgumentException if the key is null
277         */
278        public static double getDouble(String key) throws TableKeyNotDefinedException{
279            return table.getNumber(key);
280        }
281    
282        /**
283         * Returns the value at the specified key.
284         * 
285         * @deprecated Use {@link #getNumber(java.lang.String, double) getNumber} instead.
286         * @param key the key
287         * @param defaultValue the value returned if the key is undefined
288         * @return the value
289         * @throws NoSuchEleNetworkTableKeyNotDefinedmentException if there is no value mapped to by the key
290         * @throws IllegalArgumentException if the value mapped to by the key is not a double
291         * @throws IllegalArgumentException if the key is null
292         */
293        public static double getDouble(String key, double defaultValue) {
294            return table.getNumber(key, defaultValue);
295        }
296        
297    }