]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/train.cpp
Handle vehicle positioning while going backwards
[r2c2.git] / source / libmarklin / train.cpp
index a87717480bf7806d77b0e014bb2baf2b54e94d0b..f05799265ef9e186c3f553ffc28f6a045ec3d6c9 100644 (file)
@@ -119,8 +119,6 @@ void Train::set_reverse(bool rev)
 
        release_blocks(rsv_blocks);
        reverse_blocks(cur_blocks);
-
-       // XXX Do something about the vehicles
 }
 
 void Train::set_function(unsigned func, bool state)
@@ -213,7 +211,19 @@ void Train::place(Block &block, unsigned entry)
        }
 
        cur_blocks.push_back(BlockRef(&block, entry));
-       set_position(block.get_endpoints()[entry]);
+       if(reverse)
+       {
+               unsigned exit = block.traverse(entry);
+               const Block::Endpoint &bep = block.get_endpoints()[exit];
+               Track *track = bep.track->get_link(bep.track_ep);
+               unsigned ep = track->get_endpoint_by_link(*bep.track);
+               vehicles.front()->place(track, ep, 0, Vehicle::FRONT_BUFFER);
+       }
+       else
+       {
+               const Block::Endpoint &bep = block.get_endpoints()[entry];
+               vehicles.front()->place(bep.track, bep.track_ep, 0, Vehicle::BACK_BUFFER);
+       }
 
        set_status("Stopped");
 }
@@ -267,7 +277,10 @@ void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt)
                        ok = i->block->get_tracks().count(track);
 
                if(ok)
-                       vehicles[0]->advance(get_real_speed(current_speed)*(dt/Time::sec));
+               {
+                       float d = get_real_speed(current_speed)*(dt/Time::sec);
+                       vehicles[0]->advance(reverse ? -d : d);
+               }
        }
 }
 
@@ -352,7 +365,17 @@ void Train::sensor_event(unsigned addr, bool state)
                                travel_dist += block_len;
 
                                if(j->block->get_sensor_id()==addr)
-                                       set_position(j->block->get_endpoints()[j->entry]);
+                               {
+                                       const Block::Endpoint &bep = j->block->get_endpoints()[j->entry];
+                                       if(reverse)
+                                       {
+                                               Track *track = bep.track->get_link(bep.track_ep);
+                                               unsigned ep = track->get_endpoint_by_link(*bep.track);
+                                               vehicles.back()->place(track, ep, 0, Vehicle::BACK_AXLE);
+                                       }
+                                       else
+                                               vehicles.front()->place(bep.track, bep.track_ep, 0, Vehicle::FRONT_AXLE);
+                               }
                        }
                        last_entry_time = Time::now();
                        pure_speed = true;
@@ -662,11 +685,6 @@ void Train::set_status(const string &s)
        signal_status_changed.emit(s);
 }
 
-void Train::set_position(const Block::Endpoint &bep)
-{
-       vehicles[0]->place(bep.track, bep.track_ep, 0, Vehicle::FRONT_AXLE);
-}
-
 void Train::release_blocks(list<BlockRef> &blocks)
 {
        release_blocks(blocks, blocks.begin(), blocks.end());
@@ -744,7 +762,11 @@ void Train::Loader::block(unsigned id)
        blk.reserve(&obj);
        obj.cur_blocks.push_back(BlockRef(&blk, entry));
        obj.set_status("Stopped");
-       obj.set_position(blk.get_endpoints()[entry]);
+       const Block::Endpoint &bep = blk.get_endpoints()[entry];
+       obj.vehicles.back()->place(bep.track, bep.track_ep, 0, Vehicle::BACK_BUFFER);
+
+       if(blk.get_sensor_id())
+               obj.layout.get_driver().set_sensor(blk.get_sensor_id(), true);
 
        prev_block = &blk;
 }