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)
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;
const Vehicle &veh = train.get_vehicle(rev ? 0 : train.get_n_vehicles()-1);
const Block &veh_block = veh.get_placement().get_position(rev ? VehiclePlacement::FRONT_AXLE : VehiclePlacement::BACK_AXLE)->get_block();
+ bool pending_cleared = false;
+
/* Sensors aren't guaranteed to be detriggered in order. Go through the
block list and locate the first sensor that's still active. */
BlockList::iterator end = blocks.end();
end = i;
}
+ if(block==pending_block)
+ pending_cleared = true;
+
// Stop if we encounter an active sensor or the train's last vehicle
if(block==&veh_block || active_sensor)
{
release_blocks_begin(end);
signal_rear_advanced.emit(*last());
}
+
+ if(pending_cleared)
+ reserve_more();
+
return;
}
}
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())