X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrain.cpp;h=c42448176e814f0032e2810732aadf5a3f216bc5;hb=aead7f2da831199fbb8f6950b067656b2965c2fa;hp=fed1438b02cf064610c21c793b4b156842fce36b;hpb=06c100aacb559fbbe7380e15981c4772092c269b;p=r2c2.git diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index fed1438..c424481 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -1,7 +1,11 @@ +#include +#include #include "control.h" #include "trafficmanager.h" #include "train.h" +using namespace Msp; + #include using namespace std; @@ -13,7 +17,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) @@ -26,20 +33,26 @@ void Train::set_name(const string &n) void Train::set_speed(unsigned speed) { target_speed=speed; - if(rsv_blocks.empty() && !reserve_more()) + if(!target_speed) + { + for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) + i->block->reserve(0); + rsv_blocks.clear(); + } + else if(rsv_blocks.empty() && !reserve_more()) return; 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 +66,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,40 +80,58 @@ bool Train::free_block(Block *block) return false; } -void Train::sensor_event(unsigned addr, bool state) +void Train::tick(const Time::TimeStamp &t) +{ + if(try_reserve && t>try_reserve) + { + if(reserve_more()) + { + loco.set_speed(target_speed); + try_reserve=Time::TimeStamp(); + } + else + try_reserve=t+2*Time::sec; + } +} + +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.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) - j->block->reserve(0); - cur_blocks.erase(cur_blocks.begin(), i); - cout<block->get_sensor_id()==addr) + { + ++i; + for(list::iterator j=cur_blocks.begin(); j!=i; ++j) + j->block->reserve(0); + 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 && link->reserve(this)) + { + rsv_blocks.push_back(BlockRef(link, link->get_endpoint_by_link(*last->block))); + last=&rsv_blocks.back(); + ++size; + result=true; + } + else + break; } else break; } + cout<<" "<