X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fsignal.cpp;h=02a07d76bc9585861b4c7df0a0954f3060772d7c;hb=4655bb74f9d6d7f6db8fca9e22721e6c0e1ada12;hp=96c44d831d225cec9c06613c2500e779a8495558;hpb=895fdb9568cda40898e5bb646061c14a41dc0124;p=r2c2.git diff --git a/source/libr2c2/signal.cpp b/source/libr2c2/signal.cpp index 96c44d8..02a07d7 100644 --- a/source/libr2c2/signal.cpp +++ b/source/libr2c2/signal.cpp @@ -28,6 +28,8 @@ Signal::Signal(Layout &l, const SignalType &t): Signal::~Signal() { + if(layout.has_driver() && address) + layout.get_driver().remove_sensor(address); layout.remove(*this); } @@ -41,10 +43,13 @@ Signal *Signal::clone(Layout *to_layout) const void Signal::set_address(unsigned a) { + Driver *driver = (layout.has_driver() ? &layout.get_driver() : 0); + + if(driver && address) + driver->remove_signal(address); address = a; - - if(layout.has_driver() && address) - layout.get_driver().add_signal(address, type); + if(driver && address) + driver->add_signal(address, type); } void Signal::set_position(const Vector &p) @@ -65,7 +70,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(); @@ -102,12 +107,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_id()) - ++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; @@ -155,7 +164,7 @@ void Signal::train_advanced(Block &b) { if(&b==block.block()) passing = true; - else if(passing && b.get_sensor_id()) + else if(passing && b.get_sensor_address()) { layout.get_driver().set_signal(address, type.get_indications().back().aspect); reset();