#include "locotype.h"
#include "route.h"
#include "simplephysics.h"
+#include "timetable.h"
#include "tracktype.h"
#include "train.h"
#include "vehicle.h"
address(a),
pending_block(0),
control(new AIControl(*this, new SimplePhysics)),
+ timetable(0),
active(false),
current_speed(0),
speed_changing(false),
layout.signal_block_reserved.connect(sigc::mem_fun(this, &Train::block_reserved));
layout.get_driver().signal_sensor.connect(sigc::mem_fun(this, &Train::sensor_event));
layout.get_driver().signal_turnout.connect(sigc::mem_fun(this, &Train::turnout_event));
+
+ control->signal_control_changed.connect(signal_control_changed);
}
Train::~Train()
void Train::set_control(const string &n, float v)
{
control->set_control(n, v);
- signal_control_changed.emit(n, control->get_control(n).value);
}
void Train::set_active(bool a)
stop_timeout = Time::TimeStamp();
}
+ if(timetable)
+ timetable->tick(t);
control->tick(dt);
float speed = control->get_speed();
unsigned speed_notch = find_speed(abs(speed));
vehicles[0]->advance(reverse ? -d : d);
}
}
+ else if(end_of_route)
+ set_route(0);
}
void Train::save(list<DataFile::Statement> &st) const
if(route)
st.push_back((DataFile::Statement("route"), route->get_name()));
+
+ if(timetable)
+ {
+ DataFile::Statement ss("timetable");
+ timetable->save(ss.sub);
+ st.push_back(ss);
+ }
}
void Train::loco_speed_event(unsigned addr, unsigned speed, bool)
{
unsigned nsens = reserve_more();
if(!nsens && end_of_route)
- {
signal_arrived.emit();
- set_route(0);
- }
}
}
}
if(i->block->get_sensor_id())
++nsens;
+ if(end_of_route)
+ return nsens;
+
const Route *cur_route = 0;
if(route)
{
- unsigned exit = last->block->traverse(last->entry);
- Track *track = last->block->get_endpoints()[exit].track;
- if(route->get_tracks().count(track))
- cur_route = route;
- else if(next_route && next_route->get_tracks().count(track))
- cur_route = next_route;
+ const set<Track *> &tracks = last->block->get_tracks();
+ for(set<Track *>::const_iterator i=tracks.begin(); (cur_route!=route && i!=tracks.end()); ++i)
+ {
+ if(route->get_tracks().count(*i))
+ cur_route = route;
+ else if(next_route && next_route->get_tracks().count(*i))
+ cur_route = next_route;
+ }
}
bool got_more = false;
add("name", &Loader::name);
add("real_speed", &Loader::real_speed);
add("route", &Loader::route);
+ add("timetable", &Loader::timetable);
}
void Train::Loader::block(unsigned id)
obj.set_route(&obj.layout.get_route(n));
}
+void Train::Loader::timetable()
+{
+ if(obj.timetable)
+ throw InvalidState("A timetable has already been loaded");
+
+ obj.timetable = new Timetable(obj);
+ load_sub(*obj.timetable);
+}
+
} // namespace Marklin