]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/train.cpp
Block reservation fixes
[r2c2.git] / source / libmarklin / train.cpp
index 09f587020588bc69fd91c5f51d2747a9094a7110..d7b422039ea71e43b740f619a59c33a03f9edd6a 100644 (file)
@@ -59,20 +59,22 @@ void Train::set_name(const string &n)
 
 void Train::set_speed(unsigned speed)
 {
+       if(speed==target_speed)
+               return;
        if(!target_speed && speed)
                travel_speed = static_cast<int>(round(speed*speed_scale*87*3.6/5))*5;
 
        target_speed = speed;
        if(!target_speed)
        {
-               // XXX We might roll onto a new sensor and get confused - should delay freeing blocks a bit
-               for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
-                       i->block->reserve(0);
-               rsv_blocks.clear();
+               trfc_mgr.get_control().set_timer(3*Time::sec).signal_timeout.connect(
+                       sigc::bind_return(sigc::mem_fun(this, &Train::release_reserved_blocks), false));
        }
        else
                reserve_more();
 
+       signal_target_speed_changed.emit(target_speed);
+
        update_speed();
        pure_speed = false;
 }
@@ -241,12 +243,15 @@ void Train::sensor_event(bool state, Sensor *sensor)
        else
        {
                for(list<BlockRef>::iterator i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
-                       if(i->block->get_sensor_id()==addr)
+                       if(unsigned b_addr = i->block->get_sensor_id())
                        {
-                               ++i;
-                               for(list<BlockRef>::iterator j=cur_blocks.begin(); j!=i; ++j)
-                                       j->block->reserve(0);
-                               cur_blocks.erase(cur_blocks.begin(), i);
+                               if(b_addr==addr)
+                               {
+                                       ++i;
+                                       for(list<BlockRef>::iterator j=cur_blocks.begin(); j!=i; ++j)
+                                               j->block->reserve(0);
+                                       cur_blocks.erase(cur_blocks.begin(), i);
+                               }
                                break;
                        }
 
@@ -397,6 +402,13 @@ void Train::set_position(const Block::Endpoint &bep)
        pos = cur_track->get_endpoint_position(cur_track_ep);
 }
 
+void Train::release_reserved_blocks()
+{
+       for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
+               i->block->reserve(0);
+       rsv_blocks.clear();
+}
+
 
 Train::Loader::Loader(Train &t):
        DataFile::BasicLoader<Train>(t)