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 package edu.wpi.first.wpilibj.smartdashboard;
008
009 import edu.wpi.first.wpilibj.Sendable;
010 import edu.wpi.first.wpilibj.command.Command;
011 import edu.wpi.first.wpilibj.networktables2.type.StringArray;
012 import edu.wpi.first.wpilibj.networktables2.util.List;
013 import edu.wpi.first.wpilibj.tables.ITable;
014
015 /**
016 * The {@link SendableChooser} class is a useful tool for presenting a selection
017 * of options to the {@link SmartDashboard}.
018 *
019 * <p>For instance, you may wish to be able to select between multiple
020 * autonomous modes. You can do this by putting every possible {@link Command}
021 * you want to run as an autonomous into a {@link SendableChooser} and then put
022 * it into the {@link SmartDashboard} to have a list of options appear on the
023 * laptop. Once autonomous starts, simply ask the {@link SendableChooser} what
024 * the selected value is.</p>
025 *
026 * @author Joe Grinstead
027 */
028 public class SendableChooser implements Sendable {
029
030 /**
031 * The key for the default value
032 */
033 private static final String DEFAULT = "default";
034 /**
035 * The key for the selected option
036 */
037 private static final String SELECTED = "selected";
038 /**
039 * The key for the option array
040 */
041 private static final String OPTIONS = "options";
042 /**
043 * A table linking strings to the objects the represent
044 */
045 private StringArray choices = new StringArray();
046 private List values = new List();
047 private String defaultChoice = null;
048 private Object defaultValue = null;
049
050 /**
051 * Instantiates a {@link SendableChooser}.
052 */
053 public SendableChooser() {
054 }
055
056 /**
057 * Adds the given object to the list of options. On the
058 * {@link SmartDashboard} on the desktop, the object will appear as the
059 * given name.
060 *
061 * @param name the name of the option
062 * @param object the option
063 */
064 public void addObject(String name, Object object) {
065 //if we don't have a default, set the default automatically
066 if (defaultChoice == null) {
067 addDefault(name, object);
068 return;
069 }
070 for (int i = 0; i < choices.size(); ++i) {
071 if (choices.get(i).equals(name)) {
072 choices.set(i, name);
073 values.set(i, object);
074 return;
075 }
076 }
077 //not found
078 choices.add(name);
079 values.add(object);
080 if (table != null) {
081 table.putValue(OPTIONS, choices);
082 }
083 }
084
085 /**
086 * Add the given object to the list of options and marks it as the default.
087 * Functionally, this is very close to
088 * {@link SendableChooser#addObject(java.lang.String, java.lang.Object) addObject(...)}
089 * except that it will use this as the default option if none other is
090 * explicitly selected.
091 *
092 * @param name the name of the option
093 * @param object the option
094 */
095 public void addDefault(String name, Object object) {
096 if (name == null) {
097 throw new NullPointerException("Name cannot be null");
098 }
099 defaultChoice = name;
100 defaultValue = object;
101 if (table != null) {
102 table.putString(DEFAULT, defaultChoice);
103 }
104 addObject(name, object);
105 }
106
107 /**
108 * Returns the selected option. If there is none selected, it will return
109 * the default. If there is none selected and no default, then it will
110 * return {@code null}.
111 *
112 * @return the option selected
113 */
114 public Object getSelected() {
115 String selected = table.getString(SELECTED, null);
116 for (int i = 0; i < values.size(); ++i) {
117 if (choices.get(i).equals(selected)) {
118 return values.get(i);
119 }
120 }
121 return defaultValue;
122
123 }
124
125 public String getSmartDashboardType() {
126 return "String Chooser";
127 }
128 private ITable table;
129
130 public void initTable(ITable table) {
131 this.table = table;
132 if (table != null) {
133 table.putValue(OPTIONS, choices);
134 if (defaultChoice != null) {
135 table.putString(DEFAULT, defaultChoice);
136 }
137 }
138 }
139
140 /**
141 * {@inheritDoc}
142 */
143 public ITable getTable() {
144 return table;
145 }
146 }