X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fsimplecontroller.cpp;fp=source%2Flibr2c2%2Fsimplecontroller.cpp;h=7f8b3362087ed0cee7a37eb03c55875cc31a4f20;hb=1ff06c5bc46a677fa389ef86c6b26664368f1653;hp=0000000000000000000000000000000000000000;hpb=9b05c573a38639827697fe393d55b7c76f5bde45;p=r2c2.git diff --git a/source/libr2c2/simplecontroller.cpp b/source/libr2c2/simplecontroller.cpp new file mode 100644 index 0000000..7f8b336 --- /dev/null +++ b/source/libr2c2/simplecontroller.cpp @@ -0,0 +1,74 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include +#include +#include "simplecontroller.h" + +using namespace std; +using namespace Msp; + +namespace R2C2 { + +SimpleController::SimpleController(): + target_speed(Control::continuous("speed", 0, 1000)), + reverse(Control::binary("reverse")), + accel(0.07), + speed(0) +{ + target_speed.set(0); +} + +void SimpleController::set_control(const string &name, float v) +{ + if(name=="speed") + { + target_speed.set(v); + signal_control_changed.emit(target_speed); + } + else if(name=="reverse") + { + if(target_speed.value || speed) + throw InvalidState("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") + return target_speed; + else if(name=="reverse") + return reverse; + else + throw KeyError("Unknown control", name); +} + +float SimpleController::get_braking_distance() const +{ + return speed*speed/(2*accel); +} + +void SimpleController::tick(const Time::TimeDelta &dt) +{ + float secs = dt/Time::sec; + if(speedtarget_speed.value) + speed = target_speed.value; + } + else if(speed>target_speed.value) + { + speed -= secs*accel; + if(speed