2 #include "trafficmanager.h"
10 Train::Train(TrafficManager &tm, Locomotive &l):
15 trfc_mgr.add_train(this);
16 trfc_mgr.get_control().signal_sensor_event.connect(sigc::mem_fun(this, &Train::sensor_event));
19 void Train::set_name(const string &n)
23 signal_name_changed.emit(name);
26 void Train::set_speed(unsigned speed)
29 if(rsv_blocks.empty() && !reserve_more())
31 loco.set_speed(speed);
34 void Train::place(Block *block, const Block::Endpoint *entry)
36 for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();)
39 i=rsv_blocks.erase(i);
42 for(BlockRefSeq::iterator i=cur_blocks.begin(); i!=cur_blocks.end();)
45 i=cur_blocks.erase(i);
48 if(!block->reserve(this))
51 cur_blocks.push_back(BlockRef(block, entry));
54 bool Train::free_block(Block *block)
56 for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
59 while(i!=rsv_blocks.end())
62 i=rsv_blocks.erase(i);
70 void Train::sensor_event(unsigned addr, bool state)
77 BlockRefSeq::iterator i;
78 for(i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
79 if(i->block->get_sensor_id() && i->block->get_sensor_id()!=addr)
81 cur_blocks.splice(cur_blocks.end(), rsv_blocks, rsv_blocks.begin(), i);
83 cout<<"Train advanced, "<<cur_blocks.size()<<" cur_blocks, "<<rsv_blocks.size()<<" rsv_blocks\n";
86 if(rsv_blocks.empty())
91 cout<<"Finding blocks to free\n";
92 BlockRefSeq::iterator i;
93 for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
94 if(i->block->get_sensor_id()==addr)
96 if(i!=cur_blocks.end())
100 for(BlockRefSeq::iterator j=cur_blocks.begin(); j!=i; ++j)
101 j->block->reserve(0);
102 cur_blocks.erase(cur_blocks.begin(), i);
103 cout<<cur_blocks.size()<<" cur_blocks\n";
110 bool Train::reserve_more()
113 if(!rsv_blocks.empty())
114 last=&rsv_blocks.back();
115 else if(!cur_blocks.empty())
116 last=&cur_blocks.back();
121 unsigned size=rsv_blocks.size();
124 const Block::Endpoint *exit=last->block->traverse(last->entry);
125 if(exit && exit->link->reserve(this))
127 rsv_blocks.push_back(BlockRef(exit->link, exit->link->get_endpoint_by_link(last->block)));
128 last=&rsv_blocks.back();
139 } // namespace Marklin