3 #include "trafficmanager.h"
13 Section::Section(TrafficManager &tm, Track *start):
21 if(start->get_sensor_id())
23 sensor_id=start->get_sensor_id();
24 const Track::EndpointSeq &eps=start->get_endpoints();
25 for(Track::EndpointSeq::const_iterator i=eps.begin(); i!=eps.end(); ++i)
26 endpoints.push_back(Endpoint(start, &*i));
31 queue.push_back(start);
35 Track *track=queue.front();
36 queue.erase(queue.begin());
38 const Track::EndpointSeq &eps=track->get_endpoints();
39 for(Track::EndpointSeq::const_iterator i=eps.begin(); i!=eps.end(); ++i)
40 if(i->link && tracks.count(i->link)==0)
42 if(!i->link->get_sensor_id())
44 queue.push_back(i->link);
45 tracks.insert(i->link);
48 endpoints.push_back(Endpoint(track, &*i));
54 for(EndpointSeq::iterator i=endpoints.begin(); i!=endpoints.end(); ++i, ++n)
59 find_routes(i->track, i->track_ep, route, visited);
63 const Section::Endpoint *Section::get_endpoint_by_link(const Section *other) const
65 for(EndpointSeq::const_iterator i=endpoints.begin(); i!=endpoints.end(); ++i)
72 const Section::Endpoint *Section::traverse(const Endpoint *ep) const
74 Track *track=ep->track;
75 const Track::Endpoint *track_ep=ep->track_ep;
80 unsigned tid=track->get_turnout_id();
83 Turnout *turnout=trfc_mgr.get_control().get_turnout(tid);
85 cur_route=turnout->get_route();
88 const Track::Endpoint *other_ep=track->traverse(track_ep, cur_route);
92 for(EndpointSeq::const_iterator i=endpoints.begin(); i!=endpoints.end(); ++i)
93 if(i->track==track && i->track_ep==other_ep)
96 track_ep=track->get_endpoint_by_link(other_ep->link);
99 if(tracks.count(track)==0)
104 void Section::check_link(Section &other)
106 for(EndpointSeq::iterator i=endpoints.begin(); i!=endpoints.end(); ++i)
111 for(EndpointSeq::iterator j=other.endpoints.begin(); j!=other.endpoints.end(); ++j)
112 if(j->track==i->track_ep->link && j->track_ep->link==i->track && !j->link)
120 bool Section::reserve(const Train *t)
131 void Section::print_debug()
133 cout<<"Section "<<id;
134 if((*tracks.begin())->get_sensor_id())
135 cout<<", sensor="<<(*tracks.begin())->get_sensor_id();
137 for(EndpointSeq::iterator i=endpoints.begin(); i!=endpoints.end(); ++i)
139 cout<<" Endpoint, link=";
144 cout<<", routes="<<i->routes<<'\n';
148 void Section::find_routes(Track *track, const Track::Endpoint *track_ep, unsigned route, std::set<Marklin::Track *> &visited)
150 visited.insert(track);
152 const Track::EndpointSeq &eps=track->get_endpoints();
153 for(Track::EndpointSeq::const_iterator i=eps.begin(); i!=eps.end(); ++i)
155 if(&*i==track_ep) continue;
156 if(!i->link) continue;
157 if(!(i->routes&track_ep->routes)) continue;
158 if(visited.count(i->link)) continue;
160 if(tracks.count(i->link))
161 find_routes(i->link, i->link->get_endpoint_by_link(track), route, visited);
164 for(EndpointSeq::iterator j=endpoints.begin(); j!=endpoints.end(); ++j)
165 if(j->track==track && j->track_ep==&*i)
170 visited.erase(--visited.end());
173 unsigned Section::next_id=1;
176 Section::Endpoint::Endpoint(Track *t, const Track::Endpoint *e):
183 } // namespace Marklin