]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicle.h
Provide some telemetry values from ArduControl
[r2c2.git] / source / libr2c2 / vehicle.h
index 54054bb50e325cb1babf87408fbbf637999a3ca4..b522b429125f1fecc3a65d92526c4f643a7da847 100644 (file)
@@ -3,12 +3,14 @@
 
 #include "geometry.h"
 #include "object.h"
+#include "trackoffsetiter.h"
+#include "vehicleplacement.h"
 #include "vehicletype.h"
 
 namespace R2C2 {
 
 class Layout;
-class Track;
+class Train;
 
 class attachment_error: public std::logic_error
 {
@@ -21,19 +23,10 @@ public:
 class Vehicle: public Object
 {
 public:
-       enum PlaceMode
-       {
-               CENTER,
-               FRONT_AXLE,
-               FRONT_BUFFER,
-               BACK_AXLE,
-               BACK_BUFFER
-       };
-
        struct Axle
        {
                const VehicleType::Axle *type;
-               float angle;
+               Angle angle;
 
                Axle(const VehicleType::Axle &);
        };
@@ -41,8 +34,8 @@ public:
        struct Bogie
        {
                const VehicleType::Bogie *type;
-               float direction;
-               std::vector<Axle> axles;
+               Angle direction;
+               std::vector<Axle *> axles;
 
                Bogie(const VehicleType::Bogie &);
        };
@@ -51,29 +44,19 @@ public:
        {
                const VehicleType::Rod *type;
                Vector position;
-               float angle;
+               Angle angle;
 
                Rod(const VehicleType::Rod &);
        };
 
 private:
-       struct TrackPosition
-       {
-               Track *track;
-               unsigned ep;
-               float offs;
-
-               TrackPosition();
-               TrackPosition(Track *, unsigned, float);
-               void advance(float);
-               TrackPoint get_point() const;
-       };
-
        const VehicleType &type;
+       Train *train;
        Vehicle *next;
        Vehicle *prev;
-       TrackPosition track_pos;
+       VehiclePlacement placement;
        std::vector<Axle> axles;
+       std::vector<Axle *> fixed_axles;
        std::vector<Bogie> bogies;
        std::vector<Rod> rods;
        unsigned front_sensor;
@@ -86,6 +69,8 @@ public:
        virtual Vehicle *clone(Layout * = 0) const;
        virtual const VehicleType &get_type() const { return type; }
 
+       void set_train(Train *);
+       Train *get_train() const { return train; }
        void attach_back(Vehicle &);
        void attach_front(Vehicle &);
        void detach_back();
@@ -95,33 +80,35 @@ public:
 
        // TODO implement these - should call place() with suitable parameters
        virtual void set_position(const Vector &) { }
-       virtual void set_rotation(float) { }
-       void place(Track &, unsigned, float, PlaceMode = CENTER);
+       virtual void set_rotation(const Angle &) { }
+       virtual void set_tilt(const Angle &) { }
+       void place(const TrackOffsetIter &, VehiclePlacement::Anchor = VehiclePlacement::CENTER);
        void unplace();
        void advance(float);
-       Track *get_track() const { return track_pos.track; }
-       unsigned get_entry() const { return track_pos.ep; }
-       float get_offset() const { return track_pos.offs; }
+       const VehiclePlacement &get_placement() const { return placement; }
+       bool is_placed() const { return placement.is_placed(); }
+       const Axle &get_axle(unsigned) const;
        const Axle &get_fixed_axle(unsigned) const;
        const Bogie &get_bogie(unsigned) const;
        const Axle &get_bogie_axle(unsigned, unsigned) const;
        const Rod &get_rod(unsigned) const;
 private:
-       void update_position();
+       void update_position(int);
        void update_position_from(const Vehicle &);
        void propagate_position();
        void propagate_forward();
        void propagate_backward();
-       void check_sensor(float, unsigned &);
+       void check_sensor(const TrackOffsetIter &, unsigned &, bool);
        void turn_axles(float);
        void update_rods();
-
-       void adjust_for_distance(TrackPosition &, TrackPosition &, float, float = 0.5) const;
-       TrackPoint get_point(const Vector &, const Vector &, float = 0.5) const;
-       TrackPoint get_point(const TrackPosition &, float, float = 0.5) const;
+       float resolve_rod_constraint(Rod &, const VehicleType::RodConstraint &);
 
 public:
-       virtual bool collide_ray(const Vector &, const Vector &) const { return false; }
+       virtual unsigned get_n_link_slots() const;
+       virtual Vehicle *get_link(unsigned) const;
+       virtual int get_link_slot(const Object &) const;
+
+       virtual bool collide_ray(const Ray &, float * = 0) const;
 };
 
 } // namespace R2C2