X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fblockallocator.cpp;h=cb6b912de53481552990bb5f76936bf5ee801778;hb=refs%2Fheads%2Fmaster;hp=79274b77ded54cd6df67fb7e38329e36a2a4b03a;hpb=1c1f8e0c2ce41bc6f943b450a510cc6bac7ef2e4;p=r2c2.git diff --git a/source/libr2c2/blockallocator.cpp b/source/libr2c2/blockallocator.cpp index 79274b7..cb6b912 100644 --- a/source/libr2c2/blockallocator.cpp +++ b/source/libr2c2/blockallocator.cpp @@ -34,7 +34,8 @@ BlockAllocator::BlockAllocator(Train &t): pending_block(0), stop_at_block(0), reserving(false), - advancing(false) + advancing(false), + reserve_pending(false) { Layout &layout = train.get_layout(); layout.signal_block_reserved.connect(sigc::mem_fun(this, &BlockAllocator::block_reserved)); @@ -59,6 +60,7 @@ void BlockAllocator::set_active(bool a) { release_blocks_end(cur_blocks_end); pending_block = 0; + reserve_pending = false; } } @@ -186,6 +188,15 @@ bool BlockAllocator::is_block_current(const Block &block) const return find_if(blocks.begin(), end, BlockMatch(block))!=cur_blocks_end; } +void BlockAllocator::tick() +{ + if(reserve_pending) + { + reserve_pending = false; + reserve_more(); + } +} + void BlockAllocator::reserve_more() { if(blocks.empty()) @@ -483,13 +494,13 @@ void BlockAllocator::turnout_path_changing(Track &track) void BlockAllocator::turnout_path_changed(Track &track) { if(&track.get_block()==pending_block && !reserving) - reserve_more(); + reserve_pending = true; } void BlockAllocator::block_reserved(Block &block, const Train *tr) { if(&block==pending_block && !tr && !reserving) - reserve_more(); + reserve_pending = true; } void BlockAllocator::sensor_state_changed(Sensor &sensor, Sensor::State state) @@ -508,7 +519,7 @@ void BlockAllocator::sensor_state_changed(Sensor &sensor, Sensor::State state) advance_front(next_sensor); if(active) - reserve_more(); + reserve_pending = true; } else if(!is_block_current(*block)) train.get_layout().emergency(block, "Sensor for "+train.get_name()+" triggered out of order"); @@ -587,7 +598,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())); } }