package aima.gui.swing.applications.robotics.simple;
import aima.gui.swing.applications.robotics.GenericMonteCarloLocalization2DApp;
import aima.gui.swing.applications.robotics.components.AbstractSettingsListener;
import aima.gui.swing.applications.robotics.components.Settings;
/**
* This settings listener is used for the environment in {@code aima.gui.swing.demo.robotics.simple}.
* It applies all setting changes in the settings GUI on the corresponding parameters except the particle count which is managed internally in the {@link GenericMonteCarloLocalization2DApp}.
* It is extending the {@link AbstractSettingsListener}.
*
* @author Arno von Borries
* @author Jan Phillip Kretzschmar
* @author Andreas Walscheid
*
*/
@SuppressWarnings("javadoc")
public final class SimpleSettingsListener extends AbstractSettingsListener {
public static final String MIN_MOVE_DISTANCE_KEY = "MIN_MOVE_DISTANCE";
public static final String MAX_MOVE_DISTANCE_KEY = "MAX_MOVE_DISTANCE";
public static final String MOVE_ROTATION_NOISE_KEY = "MOVE_ROTATION_NOISE";
public static final String MOVE_DISTANCE_NOISE_KEY = "MOVE_DISTANCE_NOISE";
public static final String RANGE_READING_NOISE_KEY = "RANGE_READING_NOISE";
public static final String BAD_DELTA_KEY = "BAD_DELTA";
private VirtualRobot robot;
/**
* @param settingsGui the {@link Settings} on which this class should register itself.
*/
public SimpleSettingsListener(Settings settingsGui) {
super(settingsGui);
}
/**
* Sets the {@link VirtualRobot} on which the settings will be updated.
* @param robot the robot to be kept up to date with the correct parameters.
*/
public void setRobot(VirtualRobot robot) {
this.robot = robot;
}
@Override
public void createSettings() {
settingsGui.registerSetting(PARTICLE_COUNT_KEY, "Particle count", "2000");
settingsGui.registerSetting(MIN_WEIGHT_KEY, "Min. particle weight", "0.0");
settingsGui.registerSetting(MAX_DISTANCE_KEY, "Max. particle distance", "35.0");
settingsGui.registerSetting(SENSOR_RANGE_KEY, "Max. sensor range", "800.0");
settingsGui.registerSetting(MOVE_ROTATION_NOISE_KEY, "Move rotation noise (rad)", "0.12");
settingsGui.registerSetting(MOVE_DISTANCE_NOISE_KEY, "Move distance noise", "3.0");
settingsGui.registerSetting(RANGE_READING_NOISE_KEY, "Range reading noise", "1.0");
settingsGui.registerSetting(MIN_MOVE_DISTANCE_KEY, "Min. move distance", "10.0");
settingsGui.registerSetting(MAX_MOVE_DISTANCE_KEY, "Max. move distance", "40.0");
settingsGui.registerSetting(BAD_DELTA_KEY, "Bad range delta", "35.0");
registerAbstractListener();
registerSimpleListener();
}
/**
* Registers this object as a listener for its settings.
*/
protected void registerSimpleListener() {
settingsGui.registerListener(MOVE_ROTATION_NOISE_KEY, this);
settingsGui.registerListener(MOVE_DISTANCE_NOISE_KEY, this);
settingsGui.registerListener(RANGE_READING_NOISE_KEY, this);
settingsGui.registerListener(MIN_MOVE_DISTANCE_KEY, this);
settingsGui.registerListener(MAX_MOVE_DISTANCE_KEY, this);
settingsGui.registerListener(BAD_DELTA_KEY, this);
}
@Override
public boolean notifySetting(String key, String value) {
final boolean superCall = super.notifySetting(key, value);
try {
final double valueNumber = Double.parseDouble(value);
if(key.equals(SENSOR_RANGE_KEY)) {
SimpleRangeReading.setSensorRange(valueNumber);
} else if(key.equals(MOVE_ROTATION_NOISE_KEY)) {
SimpleMove.setRotationNoise(valueNumber);
} else if(key.equals(MOVE_DISTANCE_NOISE_KEY)) {
SimpleMove.setMovementNoise(valueNumber);
} else if(key.equals(RANGE_READING_NOISE_KEY)) {
SimpleRangeReading.setRangeNoise(valueNumber);
} else if(key.equals(MIN_MOVE_DISTANCE_KEY)) {
robot.setMinMoveDistance(valueNumber);
} else if(key.equals(MAX_MOVE_DISTANCE_KEY)) {
robot.setMaxMoveDistance(valueNumber);
} else if(key.equals(BAD_DELTA_KEY)) {
SimpleRangeReading.setBadDelta(valueNumber);
} else {
throw new NumberFormatException();
}
} catch(NumberFormatException e) {
return superCall;
}
return true;
}
}