X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fsignal.cpp;h=bece13d7c6078cd3dac8e300cc0ec5417b33fe89;hb=7b4155fa0581d7c5fe198e4fb1dea61fa0846eec;hp=72b35a737015f0d74349380cde8ac3a81c92b9bf;hpb=b28062f2dc88e082ee5a28b2e1f7c4c8bd989023;p=r2c2.git diff --git a/source/libr2c2/signal.cpp b/source/libr2c2/signal.cpp index 72b35a7..bece13d 100644 --- a/source/libr2c2/signal.cpp +++ b/source/libr2c2/signal.cpp @@ -17,6 +17,7 @@ Signal::Signal(Layout &l, const SignalType &t): TrackAttachment(l), type(t), address(0), + id(0), train(0), check_allocated_blocks(false), passing(false) @@ -28,8 +29,8 @@ Signal::Signal(Layout &l, const SignalType &t): Signal::~Signal() { - if(layout.has_driver() && address) - layout.get_driver().remove_sensor(address); + if(layout.has_driver() && id) + layout.get_driver().remove_signal(id); layout.remove(*this); } @@ -45,11 +46,13 @@ void Signal::set_address(unsigned a) { Driver *driver = (layout.has_driver() ? &layout.get_driver() : 0); - if(driver && address) - driver->remove_signal(address); + if(driver && id) + driver->remove_signal(id); address = a; if(driver && address) - driver->add_signal(address, type); + id = driver->add_signal(address, type); + else + id = 0; } void Signal::set_position(const Vector &p) @@ -70,7 +73,7 @@ void Signal::set_rotation(const Angle &r) void Signal::update_attachment() { - attach_to_closest(layout.get_catalogue().get_gauge()*2); + attach_to_closest(2); if(track) block = track.block_iter(); @@ -107,12 +110,16 @@ void Signal::tick(const Time::TimeDelta &) if(check_allocated_blocks) { unsigned n_blocks = 0; - BlockIter iter = block.next(); - while(iter && iter->get_train()==train) + const Block *last = train->get_block_allocator().last().block(); + if(block.block()!=last) { - if(iter->get_sensor_address()) - ++n_blocks; - iter=iter.next(); + BlockIter iter = block.next(); + while(iter && iter->get_train()==train && iter.block()!=last) + { + if(iter->get_sensor_address()) + ++n_blocks; + iter = iter.next(); + } } check_allocated_blocks = false; @@ -125,7 +132,7 @@ void Signal::tick(const Time::TimeDelta &) break; } - layout.get_driver().set_signal(address, aspect); + layout.get_driver().set_signal(id, aspect); } } @@ -148,7 +155,7 @@ void Signal::block_reserved(const Block &b, Train *t) } else { - layout.get_driver().set_signal(address, type.get_indications().back().aspect); + layout.get_driver().set_signal(id, type.get_indications().back().aspect); reset(); } } @@ -162,7 +169,7 @@ void Signal::train_advanced(Block &b) passing = true; else if(passing && b.get_sensor_address()) { - layout.get_driver().set_signal(address, type.get_indications().back().aspect); + layout.get_driver().set_signal(id, type.get_indications().back().aspect); reset(); } }