- current_row = (current_row+1)%rows.size();
- executing = true;
- }
- else
- arrived = true;
-}
-
-
-Timetable::Row::Row(RowType t):
- type(t)
-{ }
-
-template<typename T>
-Timetable::Row::Row(RowType t, const T &p):
- type(t)
-{
- params.push_back(p);
-}
-
-template<typename T>
-const T &Timetable::Row::get_param(unsigned i) const
-{
- if(i>=params.size())
- throw out_of_range("Timetable::Row::get_param");
- return params[i].value<T>();
-}
-
-string Timetable::Row::str() const
-{
- switch(type)
- {
- case GOTO_SENSOR:
- return format("set route to sensor %d", get_param<unsigned>(0));
- case GOTO_ZONE:
- return "set route to "+get_param<string>(0);
- case TRAVEL_TO:
- return format("travel to sensor %d", get_param<unsigned>(0));
- case TRAVEL_PAST:
- return format("travel past turnout %d", get_param<unsigned>(0));
- case WAIT_TIME:
- return format("wait for %d seconds", get_param<unsigned>(0));
- case WAIT_UNTIL:
- return format("wait until %d mod %d seconds", get_param<unsigned>(0), get_param<unsigned>(1));
- case WAIT_TRAIN:
- return format("wait for train %d at sensor %d", get_param<unsigned>(0), get_param<unsigned>(1));
- case ARRIVE:
- return "travel until arrival";
- case SPEED:
- return format("set speed %d km/h", get_param<unsigned>(0));
- case REVERSE:
- return "reverse";
- case ROUTE:
- return "set route "+get_param<string>(0);
- default:
- return "invalid row";
- }
-}
-
-DataFile::Statement Timetable::Row::save() const
-{
- switch(type)
- {
- case GOTO_SENSOR:
- return DataFile::Statement("goto_sensor"), get_param<unsigned>(0);
- case GOTO_ZONE:
- return DataFile::Statement("goto_zone"), get_param<string>(0);
- case TRAVEL_TO:
- return DataFile::Statement("travel_to"), get_param<unsigned>(0);
- case TRAVEL_PAST:
- return DataFile::Statement("travel_past"), get_param<unsigned>(0);
- case WAIT_TIME:
- return DataFile::Statement("wait"), get_param<unsigned>(0);
- case WAIT_UNTIL:
- return DataFile::Statement("wait_until"), get_param<unsigned>(0), get_param<unsigned>(1);
- case WAIT_TRAIN:
- return DataFile::Statement("wait_train"), get_param<unsigned>(0), get_param<unsigned>(1);
- case ARRIVE:
- return DataFile::Statement("arrive");
- case SPEED:
- return DataFile::Statement("speed"), get_param<unsigned>(0);
- case REVERSE:
- return DataFile::Statement("reverse");
- case ROUTE:
- return DataFile::Statement("route"), get_param<string>(0);
- default:
- return DataFile::Statement();
- }
-}
-
-Timetable::Row Timetable::Row::parse(const string &s)
-{
- if(!s.compare(0, 7, "travel "))
- {
- if(!s.compare(7, 10, "to sensor "))
- return Row(TRAVEL_TO, lexical_cast<unsigned>(s.substr(17)));
- else if(!s.compare(7, 13, "past turnout "))
- return Row(TRAVEL_PAST, lexical_cast<unsigned>(s.substr(20)));
- else if(!s.compare(7, string::npos, "until arrival"))
- return Row(ARRIVE);
- }
- else if(!s.compare(0, 9, "wait for "))
- {
- if(isdigit(s[9]))