if(!target_speed)
{
trfc_mgr.get_control().set_timer(3*Time::sec).signal_timeout.connect(
- sigc::bind_return(sigc::mem_fun(this, &Train::release_reserved_blocks), false));
+ sigc::bind_return(sigc::bind(sigc::mem_fun(this, &Train::release_blocks), sigc::ref(rsv_blocks)), false));
}
else
reserve_more();
signal_route_changed.emit(route);
}
-void Train::place(Block *block, unsigned entry)
+void Train::place(Block &block, unsigned entry)
{
- for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();)
- {
- i->block->reserve(0);
- i = rsv_blocks.erase(i);
- }
+ if(target_speed)
+ set_speed(0);
- for(list<BlockRef>::iterator i=cur_blocks.begin(); i!=cur_blocks.end();)
- {
- i->block->reserve(0);
- i = cur_blocks.erase(i);
- }
+ release_blocks(rsv_blocks);
+ release_blocks(cur_blocks);
- if(!block->reserve(this))
+ if(!block.reserve(this))
{
set_status("Unplaced");
return;
}
- cur_blocks.push_back(BlockRef(block, entry));
- set_position(block->get_endpoints()[entry]);
+ cur_blocks.push_back(BlockRef(&block, entry));
+ set_position(block.get_endpoints()[entry]);
set_status("Stopped");
}
-bool Train::free_block(Block *block)
+bool Train::free_block(Block &block)
{
unsigned nsens = 0;
for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
{
- if(i->block==block)
+ if(i->block==&block)
{
if(nsens<1)
return false;
- while(i!=rsv_blocks.end())
- {
- i->block->reserve(0);
- i = rsv_blocks.erase(i);
- }
+ for(list<BlockRef>::iterator j=i; j!=rsv_blocks.end(); ++j)
+ j->block->reserve(0);
+ rsv_blocks.erase(i, rsv_blocks.end());
update_speed();
return true;
}
return false;
}
-int Train::get_entry_to_block(Block *block) const
+int Train::get_entry_to_block(Block &block) const
{
for(list<BlockRef>::const_iterator i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
- if(i->block==block)
+ if(i->block==&block)
return i->entry;
for(list<BlockRef>::const_iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
- if(i->block==block)
+ if(i->block==&block)
return i->entry;
return -1;
}
if(!link->reserve(this))
{
// If we found another train going in the same direction as us, we can keep the blocks we got
- int other_entry = link->get_train()->get_entry_to_block(link);
+ int other_entry = link->get_train()->get_entry_to_block(*link);
if(other_entry==entry || link->traverse(entry)==link->traverse(other_entry))
{
good = last;
pos = cur_track->get_endpoint_position(cur_track_ep);
}
-void Train::release_reserved_blocks()
+void Train::release_blocks(list<BlockRef> &blocks)
{
- for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
+ for(list<BlockRef>::iterator i=blocks.begin(); i!=blocks.end(); ++i)
i->block->reserve(0);
- rsv_blocks.clear();
+ blocks.clear();
}
const Route *get_route() const { return route; }
const std::string &get_status() const { return status; }
const Point &get_position() const { return pos; }
- void place(Block *, unsigned);
- bool free_block(Block *);
- int get_entry_to_block(Block *) const;
+ void place(Block &, unsigned);
+ bool free_block(Block &);
+ int get_entry_to_block(Block &) const;
void tick(const Msp::Time::TimeStamp &, const Msp::Time::TimeDelta &);
void save(std::list<Msp::DataFile::Statement> &) const;
private:
unsigned find_speed(float) const;
void set_status(const std::string &);
void set_position(const Block::Endpoint &);
- void release_reserved_blocks();
+ void release_blocks(std::list<BlockRef> &);
};
} // namespace Marklin