3 This file is part of R²C²
4 Copyright © 2010 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
8 #include <msp/core/except.h>
9 #include <msp/time/units.h>
10 #include "simplecontroller.h"
17 SimpleController::SimpleController():
18 target_speed(Control::continuous("speed", 0, 1000)),
19 reverse(Control::binary("reverse")),
26 const char *SimpleController::enumerate_controls(unsigned index) const
29 return target_speed.name.c_str();
31 return reverse.name.c_str();
36 void SimpleController::set_control(const string &name, float v)
38 if(name==target_speed.name)
41 signal_control_changed.emit(target_speed);
43 else if(name==reverse.name)
45 if(target_speed.value || speed)
46 throw InvalidState("Must be stopped to change reverse");
48 signal_control_changed.emit(reverse);
52 const Controller::Control &SimpleController::get_control(const string &name) const
54 if(name==target_speed.name)
56 else if(name==reverse.name)
59 throw KeyError("Unknown control", name);
62 float SimpleController::get_braking_distance() const
64 return speed*speed/(2*accel);
67 void SimpleController::tick(const Time::TimeDelta &dt)
69 float secs = dt/Time::sec;
70 if(speed<target_speed.value)
73 if(speed>target_speed.value)
74 speed = target_speed.value;
76 else if(speed>target_speed.value)
79 if(speed<target_speed.value)
80 speed = target_speed.value;