A turnout state change signal is emitted even if a failure is detected,
to indicate the end of the operation. Resuming allocation in such a case
would cause the train to stray to an incorrect path. It's better to wait
until the user has resolved the situation and removed the halt state.
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 &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)
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(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;
BlockIter start = blocks.back();
if(&*start==stop_at_block)
return;
+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())
void BlockAllocator::save(list<DataFile::Statement> &st) const
{
if(!blocks.empty() && cur_blocks_end!=blocks.begin())
void block_reserved(Block &, const Train *);
void sensor_state_changed(Sensor &, Sensor::State);
void update_next_sensor(Sensor *);
void block_reserved(Block &, const Train *);
void sensor_state_changed(Sensor &, Sensor::State);
void update_next_sensor(Sensor *);
public:
void save(std::list<Msp::DataFile::Statement> &) const;
public:
void save(std::list<Msp::DataFile::Statement> &) const;