]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/train.cpp
Change the control system to separate speed and reverse
[r2c2.git] / source / libmarklin / train.cpp
index c53f30f66e6de0f05cca61da9b24f20486579e13..93470997133a6e534736f6f6d71b256e0533bc13 100644 (file)
@@ -66,7 +66,7 @@ Train::Train(Layout &l, const VehicleType &t, unsigned a):
 
        layout.get_driver().signal_halt.connect(sigc::mem_fun(this, &Train::halt_event));
 
-       control->signal_control_changed.connect(signal_control_changed);
+       control->signal_control_changed.connect(sigc::mem_fun(this, &Train::control_changed));
 }
 
 Train::~Train()
@@ -163,6 +163,16 @@ void Train::set_function(unsigned func, bool state)
                layout.get_driver().set_loco_function(address+1, func-4, state);
 }
 
+float Train::get_control(const string &ctrl) const
+{
+       return control->get_control(ctrl).value;
+}
+
+float Train::get_speed() const
+{
+       return control->get_speed();
+}
+
 bool Train::get_function(unsigned func) const
 {
        return (functions>>func)&1;
@@ -358,7 +368,7 @@ void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt)
                timetable->tick(t);
        control->tick(dt);
        float speed = control->get_speed();
-       unsigned speed_notch = find_speed(abs(speed));
+       unsigned speed_notch = find_speed(speed);
 
        if(control->get_reverse()!=reverse)
        {
@@ -408,8 +418,11 @@ void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt)
                        }
                }
        }
-       else if(end_of_route)
+       else if(end_of_route && rsv_blocks.empty())
+       {
+               signal_arrived.emit();
                set_route(0);
+       }
 
        if(!cur_blocks.empty() && !cur_blocks.front().block->get_sensor_id())
        {
@@ -501,6 +514,11 @@ void Train::save(list<DataFile::Statement> &st) const
        }
 }
 
+void Train::control_changed(const TrainControl &ctrl)
+{
+       signal_control_changed.emit(ctrl.name, ctrl.value);
+}
+
 void Train::loco_speed_event(unsigned addr, unsigned speed, bool)
 {
        if(addr==address)
@@ -609,11 +627,7 @@ void Train::sensor_event(unsigned addr, bool state)
 
                        // Try to get more blocks if we're moving
                        if(active)
-                       {
-                               unsigned nsens = reserve_more();
-                               if(!nsens && end_of_route)
-                                       signal_arrived.emit();
-                       }
+                               reserve_more();
                }
                else if(result==3)
                        layout.emergency("Sensor for "+name+" triggered out of order");