2 #include "trafficmanager.h"
7 Train::Train(TrafficManager &tm, Locomotive &l):
12 trfc_mgr.add_train(this);
13 trfc_mgr.get_control().signal_sensor_event.connect(sigc::mem_fun(this, &Train::sensor_event));
16 void Train::set_speed(unsigned speed)
19 if(rsv_sections.empty() && !reserve_more())
21 loco.set_speed(speed);
24 void Train::place(Section *sect, const Section::Endpoint *entry)
26 for(SectRefSeq::iterator i=rsv_sections.begin(); i!=rsv_sections.end();)
28 i->section->reserve(0);
29 i=rsv_sections.erase(i);
32 for(SectRefSeq::iterator i=cur_sections.begin(); i!=cur_sections.end();)
34 i->section->reserve(0);
35 i=cur_sections.erase(i);
38 if(!sect->reserve(this))
41 cur_sections.push_back(SectionRef(sect, entry));
44 bool Train::free_section(Section *sect)
46 for(SectRefSeq::iterator i=rsv_sections.begin(); i!=rsv_sections.end(); ++i)
49 while(i!=rsv_sections.end())
51 i->section->reserve(0);
52 i=rsv_sections.erase(i);
60 void Train::sensor_event(unsigned addr, bool state)
64 SectRefSeq::iterator i;
65 for(i=rsv_sections.begin(); i!=rsv_sections.end(); ++i)
66 if(i->section->get_sensor_id() && i->section->get_sensor_id()!=addr)
68 cur_sections.splice(cur_sections.begin(), rsv_sections, rsv_sections.begin(), i);
71 if(rsv_sections.empty())
76 SectRefSeq::iterator i;
77 for(i=cur_sections.begin(); i!=cur_sections.end(); ++i)
78 if(i->section->get_sensor_id()==addr)
80 if(i!=cur_sections.end())
83 for(SectRefSeq::iterator j=cur_sections.begin(); j!=i; ++j)
84 j->section->reserve(0);
85 cur_sections.erase(cur_sections.begin(), i);
92 bool Train::reserve_more()
95 if(!rsv_sections.empty())
96 last=&rsv_sections.back();
97 else if(!cur_sections.empty())
98 last=&cur_sections.back();
103 unsigned size=rsv_sections.size();
106 const Section::Endpoint *exit=last->section->traverse(last->entry);
107 if(exit->link->reserve(this))
109 rsv_sections.push_back(SectionRef(exit->link, exit->link->get_endpoint_by_link(last->section)));
110 last=&rsv_sections.back();
121 } // namespace Marklin