From d88bc162df8b34f2ca966524222880033132da0f Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 16 Apr 2010 19:42:44 +0000 Subject: [PATCH] Emit signal for control changes initiated by the control model itself Fix the speed display format in train panel --- source/engineer/trainpanel.cpp | 2 +- source/libmarklin/aicontrol.cpp | 8 ++++++++ source/libmarklin/aicontrol.h | 1 + source/libmarklin/controlmodel.h | 4 ++++ source/libmarklin/simplephysics.cpp | 3 +++ source/libmarklin/train.cpp | 3 ++- 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/source/engineer/trainpanel.cpp b/source/engineer/trainpanel.cpp index 1fd4abe..6685727 100644 --- a/source/engineer/trainpanel.cpp +++ b/source/engineer/trainpanel.cpp @@ -114,7 +114,7 @@ void TrainPanel::train_control_changed(const string &control, float value) { float speed = abs(value)/engineer.get_layout().get_catalogue().get_scale()*3.6; sld_speed->set_value(speed); - lbl_speed->set_text(format("%03.0f", speed)); + lbl_speed->set_text(format("%3.0f", speed)); if(value) tgl_forward->set_value(value>0); } diff --git a/source/libmarklin/aicontrol.cpp b/source/libmarklin/aicontrol.cpp index ae47d41..b97b037 100644 --- a/source/libmarklin/aicontrol.cpp +++ b/source/libmarklin/aicontrol.cpp @@ -41,6 +41,8 @@ void AIControl::set_control(const string &n, float v) target_speed.set(v); if(!blocked) next_model->set_control("speed", target_speed.value); + + signal_control_changed.emit(n, target_speed.value); } else next_model->set_control(n, v); @@ -86,6 +88,12 @@ void AIControl::tick(const Time::TimeDelta &dt) train.set_active(false); } +void AIControl::control_changed(const string &n, float v) +{ + if(n!="speed") + signal_control_changed.emit(n, v); +} + void AIControl::arrived() { set_control("speed", 0); diff --git a/source/libmarklin/aicontrol.h b/source/libmarklin/aicontrol.h index 7c5bf5d..d02011f 100644 --- a/source/libmarklin/aicontrol.h +++ b/source/libmarklin/aicontrol.h @@ -37,6 +37,7 @@ public: virtual void tick(const Msp::Time::TimeDelta &); private: + void control_changed(const std::string &, float); void arrived(); }; diff --git a/source/libmarklin/controlmodel.h b/source/libmarklin/controlmodel.h index d37ef63..a45a30e 100644 --- a/source/libmarklin/controlmodel.h +++ b/source/libmarklin/controlmodel.h @@ -9,6 +9,7 @@ Distributed under the GPL #define LIBMARKLIN_CONTROLMODEL_H_ #include +#include #include namespace Marklin { @@ -17,6 +18,9 @@ class TrainControl; class ControlModel { +public: + sigc::signal signal_control_changed; + protected: ControlModel() { } public: diff --git a/source/libmarklin/simplephysics.cpp b/source/libmarklin/simplephysics.cpp index 3dc8e2e..284e527 100644 --- a/source/libmarklin/simplephysics.cpp +++ b/source/libmarklin/simplephysics.cpp @@ -25,7 +25,10 @@ SimplePhysics::SimplePhysics(): void SimplePhysics::set_control(const string &name, float v) { if(name=="speed") + { target_speed.set(v); + signal_control_changed.emit(name, target_speed.value); + } } const TrainControl &SimplePhysics::get_control(const string &name) const diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index 24ccfa2..307b1b7 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -57,6 +57,8 @@ Train::Train(Layout &l, const LocoType &t, unsigned a): layout.signal_block_reserved.connect(sigc::mem_fun(this, &Train::block_reserved)); layout.get_driver().signal_sensor.connect(sigc::mem_fun(this, &Train::sensor_event)); layout.get_driver().signal_turnout.connect(sigc::mem_fun(this, &Train::turnout_event)); + + control->signal_control_changed.connect(signal_control_changed); } Train::~Train() @@ -90,7 +92,6 @@ const Vehicle &Train::get_vehicle(unsigned i) const void Train::set_control(const string &n, float v) { control->set_control(n, v); - signal_control_changed.emit(n, control->get_control(n).value); } void Train::set_active(bool a) -- 2.45.2