target_speed(0)
{
trfc_mgr.add_train(this);
- trfc_mgr.get_control().signal_sensor_event.connect(sigc::mem_fun(this, &Train::sensor_event));
+
+ const map<unsigned, Sensor *> &sensors=trfc_mgr.get_control().get_sensors();
+ for(map<unsigned, Sensor *>::const_iterator i=sensors.begin(); i!=sensors.end(); ++i)
+ i->second->signal_state_changed.connect(sigc::bind(sigc::mem_fun(this, &Train::sensor_event), i->second));
}
void Train::set_name(const string &n)
loco.set_speed(speed);
}
-void Train::place(Block *block, const Block::Endpoint *entry)
+void Train::place(Block *block, unsigned entry)
{
- for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();)
+ for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();)
{
i->block->reserve(0);
i=rsv_blocks.erase(i);
}
- for(BlockRefSeq::iterator i=cur_blocks.begin(); i!=cur_blocks.end();)
+ for(list<BlockRef>::iterator i=cur_blocks.begin(); i!=cur_blocks.end();)
{
i->block->reserve(0);
i=cur_blocks.erase(i);
bool Train::free_block(Block *block)
{
- for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
+ for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
if(i->block==block)
{
while(i!=rsv_blocks.end())
return false;
}
-void Train::sensor_event(unsigned addr, bool state)
+void Train::sensor_event(bool state, Sensor *sensor)
{
if(!loco.get_speed())
return;
+ unsigned addr=sensor->get_address();
+
if(state)
{
- BlockRefSeq::iterator i;
+ list<BlockRef>::iterator i;
for(i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
if(i->block->get_sensor_id() && i->block->get_sensor_id()!=addr)
break;
else
{
cout<<"Finding blocks to free\n";
- BlockRefSeq::iterator i;
+ list<BlockRef>::iterator i;
for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
if(i->block->get_sensor_id()==addr)
break;
{
cout<<"found\n";
++i;
- for(BlockRefSeq::iterator j=cur_blocks.begin(); j!=i; ++j)
+ for(list<BlockRef>::iterator j=cur_blocks.begin(); j!=i; ++j)
j->block->reserve(0);
cur_blocks.erase(cur_blocks.begin(), i);
cout<<cur_blocks.size()<<" cur_blocks\n";
bool result=false;
unsigned size=rsv_blocks.size();
- while(size<5)
+ while(size<3)
{
- const Block::Endpoint *exit=last->block->traverse(last->entry);
- if(exit && exit->link->reserve(this))
+ int exit=last->block->traverse(last->entry);
+ if(exit>=0)
{
- rsv_blocks.push_back(BlockRef(exit->link, exit->link->get_endpoint_by_link(last->block)));
- last=&rsv_blocks.back();
- ++size;
- result=true;
+ Block *link=last->block->get_link(exit);
+ if(link)
+ {
+ rsv_blocks.push_back(BlockRef(link, link->get_endpoint_by_link(*last->block)));
+ last=&rsv_blocks.back();
+ ++size;
+ result=true;
+ }
}
else
break;