X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrain.cpp;h=d7b422039ea71e43b740f619a59c33a03f9edd6a;hb=39566dc89cdadf4f6e701a14b5d9049f22b591fb;hp=09f587020588bc69fd91c5f51d2747a9094a7110;hpb=f9254f57b736927a57a2fd793ee18f6c9766dd43;p=r2c2.git diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index 09f5870..d7b4220 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -59,20 +59,22 @@ void Train::set_name(const string &n) void Train::set_speed(unsigned speed) { + if(speed==target_speed) + return; if(!target_speed && speed) travel_speed = static_cast(round(speed*speed_scale*87*3.6/5))*5; target_speed = speed; if(!target_speed) { - // XXX We might roll onto a new sensor and get confused - should delay freeing blocks a bit - for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) - i->block->reserve(0); - rsv_blocks.clear(); + trfc_mgr.get_control().set_timer(3*Time::sec).signal_timeout.connect( + sigc::bind_return(sigc::mem_fun(this, &Train::release_reserved_blocks), false)); } else reserve_more(); + signal_target_speed_changed.emit(target_speed); + update_speed(); pure_speed = false; } @@ -241,12 +243,15 @@ void Train::sensor_event(bool state, Sensor *sensor) else { for(list::iterator i=cur_blocks.begin(); i!=cur_blocks.end(); ++i) - if(i->block->get_sensor_id()==addr) + if(unsigned b_addr = i->block->get_sensor_id()) { - ++i; - for(list::iterator j=cur_blocks.begin(); j!=i; ++j) - j->block->reserve(0); - cur_blocks.erase(cur_blocks.begin(), i); + if(b_addr==addr) + { + ++i; + for(list::iterator j=cur_blocks.begin(); j!=i; ++j) + j->block->reserve(0); + cur_blocks.erase(cur_blocks.begin(), i); + } break; } @@ -397,6 +402,13 @@ void Train::set_position(const Block::Endpoint &bep) pos = cur_track->get_endpoint_position(cur_track_ep); } +void Train::release_reserved_blocks() +{ + for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) + i->block->reserve(0); + rsv_blocks.clear(); +} + Train::Loader::Loader(Train &t): DataFile::BasicLoader(t)