]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/simplecontroller.cpp
Remove a queued block reservation if the block is released
[r2c2.git] / source / libr2c2 / simplecontroller.cpp
index 7f8b3362087ed0cee7a37eb03c55875cc31a4f20..df828d5498832bf480cea9767518dae92dc6014a 100644 (file)
@@ -1,11 +1,4 @@
-/* $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"
 
@@ -23,17 +16,27 @@ SimpleController::SimpleController():
        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);
        }
@@ -41,12 +44,12 @@ void SimpleController::set_control(const string &name, float v)
 
 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
@@ -58,17 +61,9 @@ void SimpleController::tick(const Time::TimeDelta &dt)
 {
        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