X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrain.cpp;h=fed1438b02cf064610c21c793b4b156842fce36b;hb=06c100aacb559fbbe7380e15981c4772092c269b;hp=73b28234bc5d777d6fcb7615e131b8780e59e42d;hpb=6c61179fe09af2f5366d50f10aadbf5f83438087;p=r2c2.git diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index 73b2823..fed1438 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): @@ -13,43 +16,50 @@ Train::Train(TrafficManager &tm, Locomotive &l): trfc_mgr.get_control().signal_sensor_event.connect(sigc::mem_fun(this, &Train::sensor_event)); } +void Train::set_name(const string &n) +{ + name=n; + + signal_name_changed.emit(name); +} + void Train::set_speed(unsigned speed) { target_speed=speed; - if(rsv_sections.empty() && !reserve_more()) + if(rsv_blocks.empty() && !reserve_more()) return; loco.set_speed(speed); } -void Train::place(Section *sect, const Section::Endpoint *entry) +void Train::place(Block *block, const Block::Endpoint *entry) { - for(SectRefSeq::iterator i=rsv_sections.begin(); i!=rsv_sections.end();) + for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();) { - i->section->reserve(0); - i=rsv_sections.erase(i); + i->block->reserve(0); + i=rsv_blocks.erase(i); } - for(SectRefSeq::iterator i=cur_sections.begin(); i!=cur_sections.end();) + for(BlockRefSeq::iterator i=cur_blocks.begin(); i!=cur_blocks.end();) { - i->section->reserve(0); - i=cur_sections.erase(i); + i->block->reserve(0); + i=cur_blocks.erase(i); } - if(!sect->reserve(this)) + if(!block->reserve(this)) return; - cur_sections.push_back(SectionRef(sect, entry)); + cur_blocks.push_back(BlockRef(block, entry)); } -bool Train::free_section(Section *sect) +bool Train::free_block(Block *block) { - for(SectRefSeq::iterator i=rsv_sections.begin(); i!=rsv_sections.end(); ++i) - if(i->section==sect) + for(BlockRefSeq::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) + if(i->block==block) { - while(i!=rsv_sections.end()) + while(i!=rsv_blocks.end()) { - i->section->reserve(0); - i=rsv_sections.erase(i); + i->block->reserve(0); + i=rsv_blocks.erase(i); } return true; } @@ -59,30 +69,38 @@ bool Train::free_section(Section *sect) void Train::sensor_event(unsigned addr, bool state) { + if(!loco.get_speed()) + return; + if(state) { - SectRefSeq::iterator i; - for(i=rsv_sections.begin(); i!=rsv_sections.end(); ++i) - if(i->section->get_sensor_id() && i->section->get_sensor_id()!=addr) + BlockRefSeq::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_sections.splice(cur_sections.begin(), rsv_sections, rsv_sections.begin(), i); + cur_blocks.splice(cur_blocks.end(), rsv_blocks, rsv_blocks.begin(), i); + + cout<<"Train advanced, "<section->get_sensor_id()==addr) + cout<<"Finding blocks to free\n"; + BlockRefSeq::iterator i; + for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i) + if(i->block->get_sensor_id()==addr) break; - if(i!=cur_sections.end()) + if(i!=cur_blocks.end()) { + cout<<"found\n"; ++i; - for(SectRefSeq::iterator j=cur_sections.begin(); j!=i; ++j) - j->section->reserve(0); - cur_sections.erase(cur_sections.begin(), i); + for(BlockRefSeq::iterator j=cur_blocks.begin(); j!=i; ++j) + j->block->reserve(0); + cur_blocks.erase(cur_blocks.begin(), i); + cout<section->traverse(last->entry); - if(exit->link->reserve(this)) + const Block::Endpoint *exit=last->block->traverse(last->entry); + if(exit && exit->link->reserve(this)) { - rsv_sections.push_back(SectionRef(exit->link, exit->link->get_endpoint_by_link(last->section))); - last=&rsv_sections.back(); + rsv_blocks.push_back(BlockRef(exit->link, exit->link->get_endpoint_by_link(last->block))); + last=&rsv_blocks.back(); ++size; result=true; }