]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/train.cpp
Major code refactoring:
[r2c2.git] / source / libmarklin / train.cpp
index fed1438b02cf064610c21c793b4b156842fce36b..c2e278cba2870c2543090b906fffdb505ff10f07 100644 (file)
@@ -13,7 +13,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<unsigned, Sensor *> &sensors=trfc_mgr.get_control().get_sensors();
+       for(map<unsigned, Sensor *>::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)
@@ -31,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<BlockRef>::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<BlockRef>::iterator i=cur_blocks.begin(); i!=cur_blocks.end();)
        {
                i->block->reserve(0);
                i=cur_blocks.erase(i);
@@ -53,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<BlockRef>::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
                if(i->block==block)
                {
                        while(i!=rsv_blocks.end())
@@ -67,14 +70,16 @@ 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<BlockRef>::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;
@@ -89,7 +94,7 @@ void Train::sensor_event(unsigned addr, bool state)
        else
        {
                cout<<"Finding blocks to free\n";
-               BlockRefSeq::iterator i;
+               list<BlockRef>::iterator i;
                for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
                        if(i->block->get_sensor_id()==addr)
                                break;
@@ -97,7 +102,7 @@ void Train::sensor_event(unsigned addr, bool state)
                {
                        cout<<"found\n";
                        ++i;
-                       for(BlockRefSeq::iterator j=cur_blocks.begin(); j!=i; ++j)
+                       for(list<BlockRef>::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";
@@ -119,15 +124,19 @@ bool Train::reserve_more()
 
        bool result=false;
        unsigned size=rsv_blocks.size();
-       while(size<5)
+       while(size<3)
        {
-               const Block::Endpoint *exit=last->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)
+                       {
+                               rsv_blocks.push_back(BlockRef(link, link->get_endpoint_by_link(*last->block)));
+                               last=&rsv_blocks.back();
+                               ++size;
+                               result=true;
+                       }
                }
                else
                        break;