X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrain.cpp;h=c2e278cba2870c2543090b906fffdb505ff10f07;hb=52cbe8d99669f843f8f75c51128e2748584dd03a;hp=fed1438b02cf064610c21c793b4b156842fce36b;hpb=36beacc579d3132642ed4d98ce5a6d99842b5812;p=r2c2.git diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index fed1438..c2e278c 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -13,7 +13,10 @@ Train::Train(TrafficManager &tm, Locomotive &l): target_speed(0) { trfc_mgr.add_train(this); - trfc_mgr.get_control().signal_sensor_event.connect(sigc::mem_fun(this, &Train::sensor_event)); + + const map &sensors=trfc_mgr.get_control().get_sensors(); + for(map::const_iterator i=sensors.begin(); i!=sensors.end(); ++i) + i->second->signal_state_changed.connect(sigc::bind(sigc::mem_fun(this, &Train::sensor_event), i->second)); } void Train::set_name(const string &n) @@ -31,15 +34,15 @@ void Train::set_speed(unsigned speed) loco.set_speed(speed); } -void Train::place(Block *block, const Block::Endpoint *entry) +void Train::place(Block *block, unsigned entry) { - for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();) + for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();) { i->block->reserve(0); i=rsv_blocks.erase(i); } - for(BlockRefSeq::iterator i=cur_blocks.begin(); i!=cur_blocks.end();) + for(list::iterator i=cur_blocks.begin(); i!=cur_blocks.end();) { i->block->reserve(0); i=cur_blocks.erase(i); @@ -53,7 +56,7 @@ void Train::place(Block *block, const Block::Endpoint *entry) bool Train::free_block(Block *block) { - for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) + for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) if(i->block==block) { while(i!=rsv_blocks.end()) @@ -67,14 +70,16 @@ bool Train::free_block(Block *block) return false; } -void Train::sensor_event(unsigned addr, bool state) +void Train::sensor_event(bool state, Sensor *sensor) { if(!loco.get_speed()) return; + unsigned addr=sensor->get_address(); + if(state) { - BlockRefSeq::iterator i; + list::iterator i; for(i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) if(i->block->get_sensor_id() && i->block->get_sensor_id()!=addr) break; @@ -89,7 +94,7 @@ void Train::sensor_event(unsigned addr, bool state) else { cout<<"Finding blocks to free\n"; - BlockRefSeq::iterator i; + list::iterator i; for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i) if(i->block->get_sensor_id()==addr) break; @@ -97,7 +102,7 @@ void Train::sensor_event(unsigned addr, bool state) { cout<<"found\n"; ++i; - for(BlockRefSeq::iterator j=cur_blocks.begin(); j!=i; ++j) + for(list::iterator j=cur_blocks.begin(); j!=i; ++j) j->block->reserve(0); cur_blocks.erase(cur_blocks.begin(), i); cout<block->traverse(last->entry); - if(exit && exit->link->reserve(this)) + int exit=last->block->traverse(last->entry); + if(exit>=0) { - rsv_blocks.push_back(BlockRef(exit->link, exit->link->get_endpoint_by_link(last->block))); - last=&rsv_blocks.back(); - ++size; - result=true; + Block *link=last->block->get_link(exit); + if(link) + { + rsv_blocks.push_back(BlockRef(link, link->get_endpoint_by_link(*last->block))); + last=&rsv_blocks.back(); + ++size; + result=true; + } } else break;