X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrain.cpp;h=5cc47058b19f4d0f124b1af27871fb65f4bb91b5;hb=212bc6eb3ab2dbad39725984ac715c64f8de29ff;hp=e992f418ed4cc324a4ff84d900ded8ac37700a0d;hpb=80dcfa55c913037066e43fa115ae56fa51b974f2;p=r2c2.git diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index e992f41..5cc4705 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -49,6 +49,8 @@ Train::Train(TrafficManager &tm, Locomotive &l): i->second->signal_path_changing.connect(sigc::bind(sigc::mem_fun(this, &Train::turnout_path_changing), i->second)); i->second->signal_path_changed.connect(sigc::bind(sigc::mem_fun(this, &Train::turnout_path_changed), i->second)); } + + trfc_mgr.signal_block_reserved.connect(sigc::mem_fun(this, &Train::block_reserved)); } void Train::set_name(const string &n) @@ -67,8 +69,11 @@ void Train::set_speed(unsigned speed) target_speed = speed; if(!target_speed) { + pending_block = 0; trfc_mgr.get_control().set_timer(3*Time::sec).signal_timeout.connect( - sigc::bind_return(sigc::bind(sigc::mem_fun(this, &Train::release_blocks), sigc::ref(rsv_blocks)), false)); + sigc::bind_return(sigc::bind( + sigc::mem_fun(this, static_cast &)>(&Train::release_blocks)), + sigc::ref(rsv_blocks)), false)); } else reserve_more(); @@ -119,9 +124,7 @@ bool Train::free_block(Block &block) { if(nsens<1) return false; - for(list::iterator j=i; j!=rsv_blocks.end(); ++j) - j->block->reserve(0); - rsv_blocks.erase(i, rsv_blocks.end()); + release_blocks(rsv_blocks, i, rsv_blocks.end()); update_speed(); return true; } @@ -143,11 +146,8 @@ int Train::get_entry_to_block(Block &block) const return -1; } -void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt) +void Train::tick(const Time::TimeStamp &, const Time::TimeDelta &dt) { - if(try_reserve && t>try_reserve) - reserve_more(); - if(cur_track) { unsigned path = 0; @@ -206,9 +206,7 @@ void Train::save(list &st) const void Train::locomotive_reverse_changed(bool) { - for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) - i->block->reserve(0); - rsv_blocks.clear(); + release_blocks(rsv_blocks); reverse_blocks(cur_blocks); reserve_more(); @@ -284,14 +282,8 @@ void Train::sensor_event(bool state, Sensor *sensor) { // Free blocks up to the last inactive sensor ++end; - for(list::iterator i=cur_blocks.begin(); i!=end; ++i) - i->block->reserve(0); - cur_blocks.erase(cur_blocks.begin(), end); + release_blocks(cur_blocks, cur_blocks.begin(), end); } - - // XXX Should watch for trfc_mgr.signal_block_reserved rather than sensors - if(target_speed && pending_block && addr==pending_block->get_sensor_id()) - reserve_more(); } } @@ -322,11 +314,7 @@ void Train::turnout_path_changed(unsigned, Turnout *turnout) for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) if(i->block->get_turnout_id()==tid) { - while(i!=rsv_blocks.end()) - { - i->block->reserve(0); - i = rsv_blocks.erase(i); - } + release_blocks(rsv_blocks, i, rsv_blocks.end()); reserve_more(); return; } @@ -335,6 +323,12 @@ void Train::turnout_path_changed(unsigned, Turnout *turnout) reserve_more(); } +void Train::block_reserved(const Block &block, const Train *train) +{ + if(&block==pending_block && !train) + reserve_more(); +} + unsigned Train::reserve_more() { BlockRef *last = 0; @@ -444,7 +438,6 @@ void Train::update_speed() if(!target_speed) { loco.set_speed(0); - try_reserve = Time::TimeStamp(); set_status("Stopped"); } else @@ -459,20 +452,17 @@ void Train::update_speed() { loco.set_speed(0); pure_speed = false; - try_reserve = Time::now()+2*Time::sec; set_status("Blocked"); } else if(nsens==1 && target_speed>slow_speed) { loco.set_speed(slow_speed); pure_speed = false; - try_reserve = Time::now()+2*Time::sec; set_status("Slow"); } else { loco.set_speed(target_speed); - try_reserve = Time::TimeStamp(); set_status(format("Traveling %d kmh", travel_speed)); } } @@ -550,9 +540,17 @@ void Train::set_position(const Block::Endpoint &bep) void Train::release_blocks(list &blocks) { - for(list::iterator i=blocks.begin(); i!=blocks.end(); ++i) - i->block->reserve(0); - blocks.clear(); + release_blocks(blocks, blocks.begin(), blocks.end()); +} + +void Train::release_blocks(list &blocks, list::iterator begin, list::iterator end) +{ + while(begin!=end) + { + Block *block = begin->block; + blocks.erase(begin++); + block->reserve(0); + } } void Train::reverse_blocks(list &blocks) const