]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/blockallocator.cpp
Avoid advancing to a pending block
[r2c2.git] / source / libr2c2 / blockallocator.cpp
index 2e816775f7dfa7c86683a559e3f1f638e436b33f..6e2a11cde0bedf77295b089f97961d8467859c98 100644 (file)
@@ -28,6 +28,7 @@ struct BlockAllocator::BlockMatch
 
 BlockAllocator::BlockAllocator(Train &t):
        train(t),
+       active(false),
        cur_blocks_end(blocks.end()),
        next_sensor(0),
        pending_block(0),
@@ -41,7 +42,7 @@ BlockAllocator::BlockAllocator(Train &t):
 
        const set<Track *> &tracks = layout.get_all<Track>();
        for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
-               if((*i)->get_turnout_id())
+               if((*i)->get_turnout_address())
                {
                        (*i)->signal_path_changing.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &BlockAllocator::turnout_path_changing), sigc::ref(**i))));
                        (*i)->signal_path_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &BlockAllocator::turnout_path_changed), sigc::ref(**i))));
@@ -79,7 +80,7 @@ bool BlockAllocator::start_from(const BlockIter &block)
                        break;
                blocks_to_reserve.push_back(b);
                for(TrackIter t=b.track_iter(); (t && &t->get_block()==&*b); t=t.next())
-                       remaining_length -= t->get_type().get_path_length(t->get_active_path());
+                       remaining_length -= t->get_path_length();
                if(remaining_length<=0)
                        break;
        }
@@ -206,7 +207,7 @@ void BlockAllocator::reserve_more()
        float dist = 0;
        for(BlockList::const_iterator i=cur_blocks_end; i!=blocks.end(); ++i)
        {
-               if((*i)->get_sensor_id())
+               if((*i)->get_sensor_address())
                        ++nsens;
                if(nsens>0)
                        dist += (*i)->get_path_length(i->entry());
@@ -227,7 +228,7 @@ void BlockAllocator::reserve_more()
                        // The track ends here
                        break;
 
-               if(block->get_turnout_id() && !prev->get_turnout_id())
+               if(block->get_turnout_address() && !prev->get_turnout_address())
                {
                        /* We are arriving at a turnout.  See if we have enough blocks and
                        distance reserved. */
@@ -278,7 +279,7 @@ void BlockAllocator::reserve_more()
                if(&*block==stop_at_block)
                        break;
 
-               if(block->get_sensor_id())
+               if(block->get_sensor_address())
                        ++nsens;
                if(nsens>0)
                        dist += block->get_path_length(block.entry());
@@ -338,6 +339,9 @@ void BlockAllocator::advance_front(const Block *block, bool inclusive)
        else
                end = blocks.end();
 
+       if(end==blocks.end() && blocks.back().block()==pending_block)
+               --end;
+
        SetFlag setf(advancing);
        BlockList::iterator i = cur_blocks_end;
        // Update cur_blocks_end first to keep things consistent.
@@ -610,8 +614,8 @@ void BlockAllocator::Loader::block(unsigned id)
        obj.blocks.push_back(BlockIter(blk, entry));
        blk->reserve(&obj.train);
 
-       if(blk->get_sensor_id())
-               obj.train.get_layout().get_driver().set_sensor(blk->get_sensor_id(), true);
+       if(blk->get_sensor_address())
+               obj.train.get_layout().get_driver().set_sensor(blk->get_sensor_address(), true);
 
        prev_block = blk;
 }