Block::Block(Layout &l, Track &start):
TrackChain(l),
id(0),
- sensor_id(start.get_sensor_id()),
- turnout_id(start.get_turnout_id()),
+ sensor_addr(start.get_sensor_address()),
+ turnout_addr(start.get_turnout_address()),
+ conflict(false),
sensor(0),
train(0)
{
determine_id();
- if(sensor_id)
+ const set<Block *> &blocks = layout.get_all<Block>();
+ for(set<Block *>::const_iterator i=blocks.begin(); (!conflict && i!=blocks.end()); ++i)
+ conflict = (id==(*i)->get_id());
+
+ if(!conflict && sensor_addr)
sensor = new TrackCircuit(layout, *this);
layout.add(*this);
TrackChain::Validity Block::check_validity(Track &track) const
{
- if(track.get_sensor_id()!=sensor_id || track.get_turnout_id()!=turnout_id)
+ if(track.get_sensor_address()!=sensor_addr || track.get_turnout_address()!=turnout_addr)
return INCOMPATIBLE;
return TrackChain::check_validity(track);
void Block::determine_id()
{
- if(sensor_id)
- id = 0x1000|sensor_id;
- else if(turnout_id)
- id = 0x2000|turnout_id;
+ if(sensor_addr)
+ id = 0x1000|sensor_addr;
+ else if(turnout_addr)
+ id = 0x2000|turnout_addr;
else if(endpoints.size()==2)
{
unsigned id1 = endpoints[0].link ? endpoints[0].link->get_id() : 1;