X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Flibmarklin%2Ftrain.cpp;h=c2e278cba2870c2543090b906fffdb505ff10f07;hb=52cbe8d99669f843f8f75c51128e2748584dd03a;hp=f69849db54a81cd65db4448d569ead98e4c241e8;hpb=78bc40c2d1a5fcc5715143bd2326716fbb143730;p=r2c2.git diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index f69849d..c2e278c 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -2,6 +2,9 @@ #include "trafficmanager.h" #include "train.h" +#include +using namespace std; + namespace Marklin { Train::Train(TrafficManager &tm, Locomotive &l): @@ -10,7 +13,17 @@ 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) +{ + name=n; + + signal_name_changed.emit(name); } void Train::set_speed(unsigned speed) @@ -21,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); @@ -43,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()) @@ -57,15 +70,22 @@ 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; - cur_blocks.splice(cur_blocks.begin(), rsv_blocks, rsv_blocks.begin(), i); + cur_blocks.splice(cur_blocks.end(), rsv_blocks, rsv_blocks.begin(), i); + + cout<<"Train advanced, "<::iterator i; for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i) if(i->block->get_sensor_id()==addr) break; if(i!=cur_blocks.end()) { + 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->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;