]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/block.cpp
Change terminology to better distinguish routes on the layout from paths across track...
[r2c2.git] / source / libmarklin / block.cpp
index 94be126c77d088c1b44ba63303a99253a0338957..9a9164ea292770380548aea3a2c517ac4fbe327d 100644 (file)
@@ -17,10 +17,13 @@ using namespace Msp;
 
 namespace Marklin {
 
+unsigned Block::next_id = 1;
+
 Block::Block(TrafficManager &tm, Track &start):
        trfc_mgr(tm),
        id(next_id++),
        sensor_id(start.get_sensor_id()),
+       turnout_id(start.get_turnout_id()),
        train(0)
 {
        tracks.insert(&start);
@@ -30,14 +33,14 @@ Block::Block(TrafficManager &tm, Track &start):
 
        while(!queue.empty())
        {
-               Track *track=queue.front();
+               Track *track = queue.front();
                queue.erase(queue.begin());
 
-               const vector<Track *> &links=track->get_links();
+               const vector<Track *> &links = track->get_links();
                for(unsigned i=0; i<links.size(); ++i)
                        if(links[i] && !tracks.count(links[i]))
                        {
-                               if(links[i]->get_sensor_id()==sensor_id && !links[i]->get_turnout_id() && !track->get_turnout_id())
+                               if(links[i]->get_sensor_id()==sensor_id && links[i]->get_turnout_id()==turnout_id)
                                {
                                        queue.push_back(links[i]);
                                        tracks.insert(links[i]);
@@ -49,10 +52,10 @@ Block::Block(TrafficManager &tm, Track &start):
 
        for(unsigned i=0; i<endpoints.size(); ++i)
        {
-               unsigned route=1<<i;
-               endpoints[i].routes|=route;
+               unsigned path = 1<<i;
+               endpoints[i].paths |= path;
                set<Track *> visited;
-               find_routes(*endpoints[i].track, endpoints[i].track_ep, route, visited);
+               find_paths(*endpoints[i].track, endpoints[i].track_ep, path, visited);
        }
 }
 
@@ -70,27 +73,27 @@ int Block::traverse(unsigned epi, float *len) const
        if(epi>=endpoints.size())
                throw InvalidParameterValue("Endpoint index out of range");
 
-       const Endpoint &ep=endpoints[epi];
-       Track *track=ep.track;
-       unsigned track_ep=ep.track_ep;
+       const Endpoint &ep = endpoints[epi];
+       Track *track = ep.track;
+       unsigned track_ep = ep.track_ep;
 
        if(len)
-               *len=0;
+               *len = 0;
 
        while(1)
        {
-               unsigned cur_route=0;
-               unsigned tid=track->get_turnout_id();
+               unsigned cur_path = 0;
+               unsigned tid = track->get_turnout_id();
                if(tid)
                {
-                       Turnout &turnout=trfc_mgr.get_control().get_turnout(tid);
-                       cur_route=turnout.get_route();
+                       Turnout &turnout = trfc_mgr.get_control().get_turnout(tid);
+                       cur_path = turnout.get_path();
                }
 
                if(len)
-                       *len+=track->get_type().get_route_length(cur_route);
+                       *len += track->get_type().get_path_length(cur_path);
 
-               int other_ep=track->traverse(track_ep, cur_route);
+               int other_ep = track->traverse(track_ep, cur_path);
                if(other_ep<0)
                        return -1;
 
@@ -98,11 +101,11 @@ int Block::traverse(unsigned epi, float *len) const
                        if(endpoints[i].track==track && endpoints[i].track_ep==static_cast<unsigned>(other_ep))
                                return i;
 
-               Track *next=track->get_link(other_ep);
+               Track *next = track->get_link(other_ep);
                if(tracks.count(next)==0)
                        return -1;
-               track_ep=next->get_endpoint_by_link(*track);
-               track=next;
+               track_ep = next->get_endpoint_by_link(*track);
+               track = next;
        }
 }
 
@@ -116,8 +119,8 @@ void Block::check_link(Block &other)
                for(vector<Endpoint>::iterator j=other.endpoints.begin(); j!=other.endpoints.end(); ++j)
                        if(j->track==i->track->get_link(i->track_ep) && j->track->get_link(j->track_ep)==i->track && !j->link)
                        {
-                               i->link=&other;
-                               j->link=this;
+                               i->link = &other;
+                               j->link = this;
                        }
        }
 }
@@ -133,7 +136,7 @@ bool Block::reserve(const Train *t)
 {
        if(!t || !train)
        {
-               train=t;
+               train = t;
                trfc_mgr.signal_block_reserved.emit(*this, train);
                return true;
        }
@@ -154,42 +157,40 @@ void Block::print_debug()
                        cout<<i->link->id;
                else
                        cout<<"none";
-               cout<<", routes="<<i->routes<<'\n';
+               cout<<", paths="<<i->paths<<'\n';
        }
 }
 
-void Block::find_routes(Track &track, unsigned track_ep, unsigned route, set<Track *> &visited)
+void Block::find_paths(Track &track, unsigned track_ep, unsigned path, set<Track *> &visited)
 {
        visited.insert(&track);
 
-       const vector<Marklin::Endpoint> &eps=track.get_type().get_endpoints();
+       const vector<Marklin::Endpoint> &eps = track.get_type().get_endpoints();
        for(unsigned i=0; i<eps.size(); ++i)
        {
                if(i==track_ep) continue;
-               Track *link=track.get_link(i);
+               Track *link = track.get_link(i);
                if(!link) continue;
                if(visited.count(link)) continue;
-               if(!(eps[i].routes&eps[track_ep].routes)) continue;
+               if(!(eps[i].paths&eps[track_ep].paths)) continue;
 
                if(tracks.count(link))
-                       find_routes(*link, link->get_endpoint_by_link(track), route, visited);
+                       find_paths(*link, link->get_endpoint_by_link(track), path, visited);
                else
                {
                        for(vector<Endpoint>::iterator j=endpoints.begin(); j!=endpoints.end(); ++j)
                                if(j->track==&track && j->track_ep==i)
-                                       j->routes|=route;
+                                       j->paths |= path;
                }
        }
 }
 
-unsigned Block::next_id=1;
-
 
 Block::Endpoint::Endpoint(Track *t, unsigned e):
        track(t),
        track_ep(e),
        link(0),
-       routes(0)
+       paths(0)
 { }
 
 } // namespace Marklin