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())
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)
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
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);
+ }
}