]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/track.cpp
Move double-address logic to drivers
[r2c2.git] / source / libr2c2 / track.cpp
index 0592731c6bb24aab7cae2b44cbca29437328502f..b157b331a12dc9a8106f1720aceeecaddc549e02 100644 (file)
@@ -25,11 +25,14 @@ Track::Track(Layout &l, const TrackType &t):
        rot(0),
        slope(0),
        flex(false),
-       turnout_id(type.is_turnout() ? layout.allocate_turnout_id(type.is_double_address()) : 0),
+       turnout_id(0),
        sensor_id(0),
        links(type.get_endpoints().size()),
        active_path(0)
 {
+       if(type.is_turnout())
+               turnout_id = layout.allocate_turnout_id();
+
        layout.add_track(*this);
 
        if(layout.has_driver())
@@ -126,11 +129,7 @@ void Track::set_turnout_id(unsigned i)
        layout.create_blocks(*this);
        layout.update_routes();
        if(layout.has_driver() && turnout_id)
-       {
-               layout.get_driver().add_turnout(turnout_id);
-               if(type.is_double_address())
-                       layout.get_driver().add_turnout(turnout_id+1);
-       }
+               layout.get_driver().add_turnout(turnout_id, type);
 }
 
 void Track::set_sensor_id(unsigned i)
@@ -151,11 +150,7 @@ void Track::set_active_path(unsigned p)
        if(!(type.get_paths()&(1<<p)))
                throw InvalidParameterValue("Invalid path");
 
-       layout.get_driver().set_turnout(turnout_id, p&1);
-       if(type.is_double_address())
-               layout.get_driver().set_turnout(turnout_id+1, p&2);
-       else if(type.get_n_paths()>2)
-               active_path = (active_path&1) | (p&2);
+       layout.get_driver().set_turnout(turnout_id, p);
 }
 
 int Track::get_endpoint_by_link(Track &other) const
@@ -347,19 +342,16 @@ void Track::save(list<DataFile::Statement> &st) const
                st.push_back((DataFile::Statement("flex"), true));
 }
 
-void Track::turnout_event(unsigned addr, bool state)
+void Track::turnout_event(unsigned addr, unsigned state)
 {
        if(!turnout_id)
                return;
 
        if(addr==turnout_id)
-               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);
+       {
+               active_path = state;
+               signal_path_changed.emit(active_path);
+       }
 }