1 #include <msp/core/except.h>
2 #include <msp/core/maputils.h>
3 #include <msp/time/units.h>
4 #include "simplecontroller.h"
11 SimpleController::SimpleController():
12 target_speed(Control::continuous("speed", 0, 1000)),
13 reverse(Control::binary("reverse")),
20 const char *SimpleController::enumerate_controls(unsigned index) const
23 return target_speed.name.c_str();
25 return reverse.name.c_str();
30 void SimpleController::set_control(const string &name, float v)
32 if(name==target_speed.name)
35 signal_control_changed.emit(target_speed);
37 else if(name==reverse.name)
39 if(target_speed.value || speed)
40 throw InvalidState("Must be stopped to change reverse");
42 signal_control_changed.emit(reverse);
46 const Controller::Control &SimpleController::get_control(const string &name) const
48 if(name==target_speed.name)
50 else if(name==reverse.name)
53 throw key_error(name);
56 float SimpleController::get_braking_distance() const
58 return speed*speed/(2*accel);
61 void SimpleController::tick(const Time::TimeDelta &dt)
63 float secs = dt/Time::sec;
64 if(speed<target_speed.value)
67 if(speed>target_speed.value)
68 speed = target_speed.value;
70 else if(speed>target_speed.value)
73 if(speed<target_speed.value)
74 speed = target_speed.value;