1 #include "departures.h"
5 #include "trainrouter.h"
13 bool departure_time_order(const R2C2::Departures::Departure &d1, const R2C2::Departures::Departure &d2)
15 return d1.time<d2.time;
23 Departures::Departures(const Layout &layout, const string &group):
24 zones(layout.get_zones(group))
26 const map<unsigned, Train *> &trains = layout.get_trains();
27 for(map<unsigned, Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
29 Timetable *timetable = i->second->get_ai_of_type<Timetable>();
31 TrainRouter *router = i->second->get_ai_of_type<TrainRouter>();
32 router->signal_route_changed.connect(sigc::bind(sigc::mem_fun(this, &Departures::train_route_changed), sigc::ref(*i->second)));
33 router->signal_departed.connect(sigc::bind(sigc::mem_fun(this, &Departures::train_departed), sigc::ref(*i->second)));
35 update_departures(*i->second);
39 void Departures::train_route_changed(const Route *, Train &train)
41 update_departures(train);
44 void Departures::train_departed(Train &train)
46 update_departures(train);
49 void Departures::update_departures(Train &train)
51 const Clock &clock = train.get_layout().get_clock();
52 Time::TimeDelta t = clock.get_current_time();
53 float rate = clock.get_rate();
55 list<Departure> collected_departures;
57 Timetable *timetable = train.get_ai_of_type<Timetable>();
58 unsigned tt_length = timetable->get_length();
59 for(unsigned i=0; i<tt_length; ++i)
61 const Timetable::Row &row = timetable->get_row(i);
62 if(row.type==Timetable::DEPART)
63 if(Zone *zone = get_attached_zone(*row.target))
65 Time::TimeDelta dt = row.time;
68 collected_departures.push_back(Departure(*zone, train, dt));
72 collected_departures.sort(departure_time_order);
74 TrainRouter *router = train.get_ai_of_type<TrainRouter>();
75 Time::TimeDelta departure_delay = router->get_departure_delay();
77 if(Zone *zone = get_attached_zone(*train.get_block_allocator().last()))
79 Departure dep(*zone, train, t+departure_delay*rate);
81 list<Departure>::iterator i = collected_departures.begin();
82 bool duplicate = false;
83 for(; (i!=collected_departures.end() && !duplicate); ++i)
87 duplicate = (i->time<dep.time+Time::min);
91 duplicate = (i->time+Time::min>dep.time);
95 collected_departures.push_back(dep);
98 merge_departures(train, collected_departures);
101 void Departures::merge_departures(Train &train, const std::list<Departure> &collected_departures)
103 list<Departure>::iterator i = departures.begin();
104 list<Departure>::const_iterator j = collected_departures.begin();
105 while(i!=departures.end() && j!=collected_departures.end())
109 list<Departure>::iterator k = departures.insert(i, *j);
110 signal_departure_added.emit(*k);
113 else if(i->train==&train)
122 signal_departure_removed.emit(*i);
123 departures.erase(i++);
130 for(; j!=collected_departures.end(); ++j)
132 departures.push_back(*j);
133 signal_departure_added.emit(departures.back());
136 for(; i!=departures.end(); )
140 signal_departure_removed.emit(*i);
141 departures.erase(i++);
148 Zone *Departures::get_attached_zone(const TrackChain &chain) const
150 const TrackChain::TrackSet &tracks = chain.get_tracks();
151 for(vector<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
153 for(TrackChain::TrackSet::const_iterator j=tracks.begin(); j!=tracks.end(); ++j)
154 if((*i)->has_track(**j))
162 Departures::Departure::Departure(Zone &z, Train &t, const Time::TimeDelta &m):