X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fblockallocator.cpp;h=7cca79f795a61c9cad6ad11eb2689639f4574098;hb=bb7e754473aea2083c406b94060b9982c66f7473;hp=7e992e00f41b65f6aecdc6afd6e89ec03e899bd0;hpb=7f63edbdf0d3c08893bdd2341ec3e50fb1ccc6f8;p=r2c2.git diff --git a/source/libr2c2/blockallocator.cpp b/source/libr2c2/blockallocator.cpp index 7e992e0..7cca79f 100644 --- a/source/libr2c2/blockallocator.cpp +++ b/source/libr2c2/blockallocator.cpp @@ -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 &tracks = layout.get_all(); for(set::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 &st) const { if(!blocks.empty() && cur_blocks_end!=blocks.begin()) @@ -577,7 +587,7 @@ void BlockAllocator::save(list &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())); } }