]> git.tdb.fi Git - r2c2.git/commitdiff
Measure and display train speeds
authorMikko Rasa <tdb@tdb.fi>
Mon, 2 Jun 2008 12:20:45 +0000 (12:20 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 2 Jun 2008 12:20:45 +0000 (12:20 +0000)
source/libmarklin/block.cpp
source/libmarklin/block.h
source/libmarklin/tracktype.cpp
source/libmarklin/tracktype.h
source/libmarklin/train.cpp
source/libmarklin/train.h

index 87654e4387df997ac5b125dac1643a4bdd1cf47c..3ca744ca0c287796396263c825130977be3e4e7f 100644 (file)
@@ -59,7 +59,7 @@ int Block::get_endpoint_by_link(const Block &other) const
        return -1;
 }
 
-int Block::traverse(unsigned epi) const
+int Block::traverse(unsigned epi, float *len) const
 {
        if(epi>=endpoints.size())
                throw InvalidParameterValue("Endpoint index out of range");
@@ -68,6 +68,9 @@ int Block::traverse(unsigned epi) const
        Track *track=ep.track;
        unsigned track_ep=ep.track_ep;
 
+       if(len)
+               *len=0;
+
        while(1)
        {
                unsigned cur_route=0;
@@ -78,9 +81,12 @@ int Block::traverse(unsigned epi) const
                        cur_route=turnout.get_route();
                }
 
+               if(len)
+                       *len+=track->get_type().get_route_length(cur_route);
+
                int other_ep=track->traverse(track_ep, cur_route);
                if(other_ep<0)
-                       return 0;
+                       return -1;
 
                for(unsigned i=0; i<endpoints.size(); ++i)
                        if(endpoints[i].track==track && endpoints[i].track_ep==static_cast<unsigned>(other_ep))
index 076637240a21835c2579a269ef1fa05aba0503ab..568d1736dbd85228d707559aed803f0056e546fa 100644 (file)
@@ -38,7 +38,7 @@ public:
        const std::set<Track *> &get_tracks() const { return tracks; }
        const std::vector<Endpoint> &get_endpoints() const { return endpoints; }
        int get_endpoint_by_link(const Block &) const;
-       int traverse(unsigned) const;
+       int traverse(unsigned, float * =0) const;
        void check_link(Block &);
        Block *get_link(unsigned) const;
        bool reserve(const Train *);
index 70d031699ff71ed3fcca68b28b2b254a45f064f4..cd832eb1997140e95c9e68eca7910c4d1c90dc6c 100644 (file)
@@ -10,15 +10,21 @@ TrackType::TrackType(unsigned a):
 { }
 
 float TrackType::get_total_length() const
+{
+       return get_route_length(-1);
+}
+
+float TrackType::get_route_length(int r) const
 {
        float len=0;
        for(vector<TrackPart>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
-       {
-               float l=i->length;
-               if(i->radius)
-                       l*=i->radius;
-               len+=l;
-       }
+               if(r<0 || i->route==static_cast<unsigned>(r))
+               {
+                       float l=i->length;
+                       if(i->radius)
+                               l*=abs(i->radius);
+                       len+=l;
+               }
        return len;
 }
 
index 9822fb26c72b66af71b64c354677328ae293e173..df6ba022caf6addea2cc3ad511c4153bb98fcffc 100644 (file)
@@ -37,6 +37,7 @@ public:
        unsigned get_article_number() const { return art_nr; }
        const std::string &get_description() const { return description; }
        float get_total_length() const;
+       float get_route_length(int) const;
        unsigned get_n_routes() const;
        const std::vector<TrackPart> &get_parts() const { return parts; }
        const std::vector<Endpoint>  &get_endpoints() const { return endpoints; }
index 8b34e849a2d96dd29504fe54a02d83f7ea6113c4..2485c4cec83f45d55febe40a34366593ce2e1f8e 100644 (file)
@@ -1,3 +1,5 @@
+#include <cmath>
+#include <msp/strings/formatter.h>
 #include <msp/time/units.h>
 #include <msp/time/utils.h>
 #include "control.h"
@@ -15,7 +17,9 @@ Train::Train(TrafficManager &tm, Locomotive &l):
        trfc_mgr(tm),
        loco(l),
        target_speed(0),
-       status("Unplaced")
+       status("Unplaced"),
+       travel_dist(0),
+       real_speed(0)
 {
        trfc_mgr.add_train(this);
 
@@ -33,6 +37,8 @@ void Train::set_name(const string &n)
 
 void Train::set_speed(unsigned speed)
 {
+       unsigned old_speed=target_speed;
+
        target_speed=speed;
        if(!target_speed)
        {
@@ -46,7 +52,10 @@ void Train::set_speed(unsigned speed)
                return;
 
        loco.set_speed(speed);
-       set_status(target_speed ? "Traveling" : "Stopped");
+       if(!old_speed && target_speed)
+               set_status("Traveling --- kmh");
+       else if(old_speed && !target_speed)
+               set_status("Stopped");
 }
 
 void Train::place(Block *block, unsigned entry)
@@ -97,7 +106,7 @@ void Train::tick(const Time::TimeStamp &t)
                if(reserve_more() || !rsv_blocks.empty())
                {
                        loco.set_speed(target_speed);
-                       set_status("Traveling");
+                       set_status("Traveling --- kmh");
                        try_reserve=Time::TimeStamp();
                }
                else
@@ -118,11 +127,24 @@ void Train::sensor_event(bool state, Sensor *sensor)
 
                if(i!=rsv_blocks.begin())
                {
+                       real_speed=static_cast<int>(round(travel_dist/((Time::now()-last_entry_time)/Time::sec)*87*3.6/5))*5;
+                       set_status(format("Traveling %3d kmh", real_speed));
+
+                       travel_dist=0;
+                       float block_len;
+                       for(list<BlockRef>::iterator j=rsv_blocks.begin(); j!=i; ++j)
+                       {
+                               j->block->traverse(j->entry, &block_len);
+                               cout<<"Advancing: block "<<j->block<<" (sensor "<<j->block->get_sensor_id()<<") length "<<block_len<<'\n';
+                               travel_dist+=block_len;
+                       }
+                       last_entry_time=Time::now();
+
                        cur_blocks.splice(cur_blocks.end(), rsv_blocks, rsv_blocks.begin(), i);
                        cout<<"Train "<<name<<" advanced, "<<cur_blocks.size()<<" cur_blocks, "<<rsv_blocks.size()<<" rsv_blocks\n";
                }
 
-               if(target_speed && rsv_blocks.empty() && !reserve_more())
+               if(target_speed && !reserve_more() && rsv_blocks.empty())
                {
                        loco.set_speed(0);
                        try_reserve=Time::now()+2*Time::sec;
index 24c9db9fc04acb238cf5e265ccee9e02d5f6b2b2..0b88d8ac6af6fef6f5fee5af9da7cd51be8d52b7 100644 (file)
@@ -31,6 +31,9 @@ private:
        unsigned target_speed;
        Msp::Time::TimeStamp try_reserve;
        std::string status;
+       Msp::Time::TimeStamp last_entry_time;
+       float travel_dist;
+       unsigned real_speed;
 
 public:
        sigc::signal<void, const std::string &> signal_name_changed;