]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/blockallocator.cpp
Follow the same path until another is significantly better
[r2c2.git] / source / libr2c2 / blockallocator.cpp
index 7e992e00f41b65f6aecdc6afd6e89ec03e899bd0..7cca79f795a61c9cad6ad11eb2689639f4574098 100644 (file)
@@ -39,6 +39,7 @@ BlockAllocator::BlockAllocator(Train &t):
        Layout &layout = train.get_layout();
        layout.signal_block_reserved.connect(sigc::mem_fun(this, &BlockAllocator::block_reserved));
        layout.signal_sensor_state_changed.connect(sigc::mem_fun(this, &BlockAllocator::sensor_state_changed));
+       layout.get_driver().signal_halt.connect(sigc::mem_fun(this, &BlockAllocator::halt_event));
 
        const set<Track *> &tracks = layout.get_all<Track>();
        for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
@@ -190,6 +191,9 @@ void BlockAllocator::reserve_more()
        if(blocks.empty())
                throw logic_error("no blocks");
 
+       if(train.get_layout().get_driver().is_halted())
+               return;
+
        BlockIter start = blocks.back();
        if(&*start==stop_at_block)
                return;
@@ -561,6 +565,12 @@ void BlockAllocator::update_next_sensor(Sensor *after)
        next_sensor = 0;
 }
 
+void BlockAllocator::halt_event(bool halted)
+{
+       if(active && !halted)
+               reserve_more();
+}
+
 void BlockAllocator::save(list<DataFile::Statement> &st) const
 {
        if(!blocks.empty() && cur_blocks_end!=blocks.begin())
@@ -577,7 +587,7 @@ void BlockAllocator::save(list<DataFile::Statement> &st) const
 
                st.push_back((DataFile::Statement("hint"), prev->get_id()));
 
-               for(BlockList::const_iterator i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
+               for(BlockList::const_iterator i=cur_blocks.begin(); (i!=cur_blocks.end() && i->block()!=pending_block); ++i)
                        st.push_back((DataFile::Statement("block"), (*i)->get_id()));
        }
 }