2 #include "trafficmanager.h"
10 Train::Train(TrafficManager &tm, Locomotive &l):
15 trfc_mgr.add_train(this);
17 const map<unsigned, Sensor *> &sensors=trfc_mgr.get_control().get_sensors();
18 for(map<unsigned, Sensor *>::const_iterator i=sensors.begin(); i!=sensors.end(); ++i)
19 i->second->signal_state_changed.connect(sigc::bind(sigc::mem_fun(this, &Train::sensor_event), i->second));
22 void Train::set_name(const string &n)
26 signal_name_changed.emit(name);
29 void Train::set_speed(unsigned speed)
32 if(rsv_blocks.empty() && !reserve_more())
34 loco.set_speed(speed);
37 void Train::place(Block *block, unsigned entry)
39 for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();)
42 i=rsv_blocks.erase(i);
45 for(list<BlockRef>::iterator i=cur_blocks.begin(); i!=cur_blocks.end();)
48 i=cur_blocks.erase(i);
51 if(!block->reserve(this))
54 cur_blocks.push_back(BlockRef(block, entry));
57 bool Train::free_block(Block *block)
59 for(list<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
62 while(i!=rsv_blocks.end())
65 i=rsv_blocks.erase(i);
73 void Train::sensor_event(bool state, Sensor *sensor)
78 unsigned addr=sensor->get_address();
82 list<BlockRef>::iterator i;
83 for(i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
84 if(i->block->get_sensor_id() && i->block->get_sensor_id()!=addr)
86 cur_blocks.splice(cur_blocks.end(), rsv_blocks, rsv_blocks.begin(), i);
88 cout<<"Train advanced, "<<cur_blocks.size()<<" cur_blocks, "<<rsv_blocks.size()<<" rsv_blocks\n";
91 if(rsv_blocks.empty())
96 cout<<"Finding blocks to free\n";
97 list<BlockRef>::iterator i;
98 for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
99 if(i->block->get_sensor_id()==addr)
101 if(i!=cur_blocks.end())
105 for(list<BlockRef>::iterator j=cur_blocks.begin(); j!=i; ++j)
106 j->block->reserve(0);
107 cur_blocks.erase(cur_blocks.begin(), i);
108 cout<<cur_blocks.size()<<" cur_blocks\n";
115 bool Train::reserve_more()
118 if(!rsv_blocks.empty())
119 last=&rsv_blocks.back();
120 else if(!cur_blocks.empty())
121 last=&cur_blocks.back();
126 unsigned size=rsv_blocks.size();
129 int exit=last->block->traverse(last->entry);
132 Block *link=last->block->get_link(exit);
135 rsv_blocks.push_back(BlockRef(link, link->get_endpoint_by_link(*last->block)));
136 last=&rsv_blocks.back();
148 } // namespace Marklin