]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/train.cpp
Add Track::get_endpoint_position to avoid duplicating calculations
[r2c2.git] / source / libmarklin / train.cpp
index f69849db54a81cd65db4448d569ead98e4c241e8..fed1438b02cf064610c21c793b4b156842fce36b 100644 (file)
@@ -2,6 +2,9 @@
 #include "trafficmanager.h"
 #include "train.h"
 
+#include <iostream>
+using namespace std;
+
 namespace Marklin {
 
 Train::Train(TrafficManager &tm, Locomotive &l):
@@ -13,6 +16,13 @@ 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;
@@ -59,13 +69,18 @@ bool Train::free_block(Block *block)
 
 void Train::sensor_event(unsigned addr, bool state)
 {
+       if(!loco.get_speed())
+               return;
+
        if(state)
        {
                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_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, "<<cur_blocks.size()<<" cur_blocks, "<<rsv_blocks.size()<<" rsv_blocks\n";
 
                reserve_more();
                if(rsv_blocks.empty())
@@ -73,16 +88,19 @@ void Train::sensor_event(unsigned addr, bool state)
        }
        else
        {
+               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_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<<cur_blocks.size()<<" cur_blocks\n";
                }
 
                reserve_more();
@@ -104,7 +122,7 @@ bool Train::reserve_more()
        while(size<5)
        {
                const Block::Endpoint *exit=last->block->traverse(last->entry);
-               if(exit->link->reserve(this))
+               if(exit && exit->link->reserve(this))
                {
                        rsv_blocks.push_back(BlockRef(exit->link, exit->link->get_endpoint_by_link(last->block)));
                        last=&rsv_blocks.back();