]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/track.cpp
Framework for supporting multiple control protocols in a single driver
[r2c2.git] / source / libmarklin / track.cpp
index 0a9f1ac83f8977f02935fd6f5838d93265a62278..fbe3f0a709ffe1d2030c37fccee15b78ac134095 100644 (file)
@@ -7,6 +7,7 @@ Distributed under the GPL
 
 #include <cmath>
 #include "block.h"
+#include "catalogue.h"
 #include "driver.h"
 #include "layout.h"
 #include "track.h"
@@ -194,9 +195,16 @@ float Track::get_endpoint_direction(unsigned epi) const
        return rot+ep.dir;
 }
 
-bool Track::snap_to(Track &other, bool link)
+bool Track::snap_to(Track &other, bool link, float limit)
 {
-       float limit = (link && !flex && !other.get_flex()) ? 1e-6 : 1e-4;
+       if(!limit || link)
+       {
+               limit = layout.get_catalogue().get_gauge();
+               if(link && !flex && !other.get_flex())
+                       limit /= 10;
+       }
+       limit *= limit;
+
        const vector<TrackType::Endpoint> &eps = type.get_endpoints();
        const vector<TrackType::Endpoint> &other_eps = other.get_type().get_endpoints();
 
@@ -212,7 +220,8 @@ bool Track::snap_to(Track &other, bool link)
                        Point epp2 = other.get_endpoint_position(j);
                        float dx = epp2.x-epp.x;
                        float dy = epp2.y-epp.y;
-                       if(dx*dx+dy*dy<limit)
+                       float dz = epp2.z-epp.z;
+                       if(dx*dx+dy*dy<limit && dz*dz<limit)
                        {
                                if(!link || (!flex && !other.get_flex()))
                                {
@@ -347,6 +356,10 @@ void Track::turnout_event(unsigned addr, bool state)
                active_path = (active_path&2) | (state ? 1 : 0);
        else if(type.is_double_address() && addr==turnout_id+1)
                active_path = (active_path&1) | (state ? 2 : 0);
+       else
+               return;
+
+       signal_path_changed.emit(active_path);
 }