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");
Track *track=ep.track;
unsigned track_ep=ep.track_ep;
+ if(len)
+ *len=0;
+
while(1)
{
unsigned cur_route=0;
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))
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 *);
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; }
+#include <cmath>
+#include <msp/strings/formatter.h>
#include <msp/time/units.h>
#include <msp/time/utils.h>
#include "control.h"
trfc_mgr(tm),
loco(l),
target_speed(0),
- status("Unplaced")
+ status("Unplaced"),
+ travel_dist(0),
+ real_speed(0)
{
trfc_mgr.add_train(this);
void Train::set_speed(unsigned speed)
{
+ unsigned old_speed=target_speed;
+
target_speed=speed;
if(!target_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)
if(reserve_more() || !rsv_blocks.empty())
{
loco.set_speed(target_speed);
- set_status("Traveling");
+ set_status("Traveling --- kmh");
try_reserve=Time::TimeStamp();
}
else
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;