]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/vehicle.cpp
Release non-sensor blocks when the tail end of the train has passed far enough
[r2c2.git] / source / libmarklin / vehicle.cpp
index 8d52a7f07816121d071b5d1e6aaf4adc42f23dcd..1f3d3ec178e56a771987264a495b5c20982d80b9 100644 (file)
@@ -23,7 +23,8 @@ Vehicle::Vehicle(Layout &l, const VehicleType &t):
        type(t),
        next(0),
        prev(0),
-       direction(0)
+       direction(0),
+       bogie_dirs(type.get_bogies().size())
 {
        layout.add_vehicle(*this);
 }
@@ -113,6 +114,13 @@ void Vehicle::advance(float d)
        propagate_position();
 }
 
+float Vehicle::get_bogie_direction(unsigned i) const
+{
+       if(i>=bogie_dirs.size())
+               throw InvalidParameterValue("Bogie index out of range");
+       return bogie_dirs[i];
+}
+
 void Vehicle::update_position()
 {
        TrackPoint tp;
@@ -137,13 +145,16 @@ void Vehicle::update_position()
 
                        const vector<VehicleType::Axle> &front_axles = bogies.front().axles;
                        float wheelbase = front_axles.front().position-front_axles.back().position;
-                       Point front_point = get_point(front, wheelbase, -front_axles.back().position/wheelbase).pos;
+                       TrackPoint front_point = get_point(front, wheelbase, -front_axles.back().position/wheelbase);
 
                        const vector<VehicleType::Axle> &back_axles = bogies.back().axles;
                        wheelbase = back_axles.front().position-back_axles.back().position;
-                       Point back_point = get_point(back, wheelbase, -back_axles.back().position/wheelbase).pos;
+                       TrackPoint back_point = get_point(back, wheelbase, -back_axles.back().position/wheelbase);
+
+                       tp = get_point(front_point.pos, back_point.pos, -bogies.back().position/bogie_spacing);
 
-                       tp = get_point(front_point, back_point, -bogies.back().position/bogie_spacing);
+                       bogie_dirs.front() = front_point.dir-tp.dir;
+                       bogie_dirs.back() = back_point.dir-tp.dir;
                }
                else
                        tp = track_pos.get_point();