if(layout.has_driver())
layout.get_driver().signal_turnout.connect(sigc::mem_fun(this, &Track::turnout_event));
+
+ for(unsigned paths = type.get_paths(); !(paths&1); ++active_path, paths>>=1) ;
}
Track::~Track()
turnout_id = i;
layout.create_blocks(*this);
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);
+ }
}
void Track::set_sensor_id(unsigned i)
throw InvalidParameterValue("Invalid path");
layout.get_driver().set_turnout(turnout_id, p&1);
- if(type.get_n_paths()>2)
+ 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);
}
int Track::get_endpoint_by_link(const Track &other) const
throw Exception("Track endpoint did not have a counterpart");
}
+unsigned Track::traverse(unsigned i) const
+{
+ return traverse(i, active_path);
+}
+
TrackPoint Track::get_point(unsigned epi, unsigned path, float d) const
{
TrackPoint p = type.get_point(epi, path, d);
float s = sin(rot);
p.pos = Point(pos.x+c*p.pos.x-s*p.pos.y, pos.y+s*p.pos.x+c*p.pos.y, 0);
+ p.dir += rot;
if(type.get_endpoints().size()==2)
{
float len = type.get_path_length(path);
return p;
}
+TrackPoint Track::get_point(unsigned epi, float d) const
+{
+ return get_point(epi, active_path, d);
+}
+
void Track::save(list<DataFile::Statement> &st) const
{
st.push_back((DataFile::Statement("position"), pos.x, pos.y, pos.z));