-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
-#include <msp/core/except.h>
+#include <msp/core/maputils.h>
#include <msp/time/units.h>
#include "simplecontroller.h"
target_speed.set(0);
}
+const char *SimpleController::enumerate_controls(unsigned index) const
+{
+ if(index==0)
+ return target_speed.name.c_str();
+ else if(index==1)
+ return reverse.name.c_str();
+ else
+ return 0;
+}
+
void SimpleController::set_control(const string &name, float v)
{
- if(name=="speed")
+ if(name==target_speed.name)
{
target_speed.set(v);
signal_control_changed.emit(target_speed);
}
- else if(name=="reverse")
+ else if(name==reverse.name)
{
if(target_speed.value || speed)
- throw InvalidState("Must be stopped to change reverse");
+ throw logic_error("Must be stopped to change reverse");
reverse.set(v);
signal_control_changed.emit(reverse);
}
const Controller::Control &SimpleController::get_control(const string &name) const
{
- if(name=="speed")
+ if(name==target_speed.name)
return target_speed;
- else if(name=="reverse")
+ else if(name==reverse.name)
return reverse;
else
- throw KeyError("Unknown control", name);
+ throw key_error(name);
}
float SimpleController::get_braking_distance() const
{
float secs = dt/Time::sec;
if(speed<target_speed.value)
- {
- speed += secs*accel;
- if(speed>target_speed.value)
- speed = target_speed.value;
- }
+ speed = min(speed+secs*accel, target_speed.value);
else if(speed>target_speed.value)
- {
- speed -= secs*accel;
- if(speed<target_speed.value)
- speed = target_speed.value;
- }
+ speed = max(speed-secs*accel, target_speed.value);
}
} // namespace R2C2