X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrain.cpp;h=c42448176e814f0032e2810732aadf5a3f216bc5;hb=aead7f2da831199fbb8f6950b067656b2965c2fa;hp=c2e278cba2870c2543090b906fffdb505ff10f07;hpb=52cbe8d99669f843f8f75c51128e2748584dd03a;p=r2c2.git diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index c2e278c..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; @@ -29,7 +33,13 @@ 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); } @@ -70,6 +80,20 @@ bool Train::free_block(Block *block) return false; } +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()) @@ -85,27 +109,29 @@ void Train::sensor_event(bool state, Sensor *sensor) 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(list::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>=0) { Block *link=last->block->get_link(exit); - if(link) + 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<<" "<