- if(executing)
- {
- Row &row = rows[current_row];
- switch(row.type)
- {
- case GOTO_SENSOR:
- arrived = false;
- if(!train.go_to(get_sensor(row.get_param<unsigned>(0))))
- set_enabled(false);
- break;
- case GOTO_ZONE:
- arrived = false;
- if(!train.go_to(get_zone(row.get_param<string>(0))))
- set_enabled(false);
- break;
- case TRAVEL_TO:
- pending_block = &get_sensor(row.get_param<unsigned>(0)).get_block();
- pending_train = &train;
- executing = false;
- break;
- case TRAVEL_PAST:
- pending_block = &get_turnout(row.get_param<unsigned>(0)).get_block();
- pending_train = (pending_block->get_train()==&train ? 0 : &train);
- executing = false;
- break;
- case WAIT_TIME:
- wait_timeout = t+row.get_param<unsigned>(0)*Time::sec;
- executing = false;
- break;
- case WAIT_UNTIL:
- {
- unsigned unixtime = t.to_unixtime();
- unsigned mod = row.get_param<unsigned>(1);
- unsigned secs = ((mod+row.get_param<unsigned>(0))-(unixtime%mod))%mod;
- wait_timeout = t+secs*Time::sec;
- executing = false;
- }
- break;
- case WAIT_TRAIN:
- pending_train = &train.get_layout().get_train(row.get_param<unsigned>(0));
- pending_block = &get_sensor(row.get_param<unsigned>(1)).get_block();
- executing = false;
- break;
- case ARRIVE:
- if(!arrived)
- executing = false;
- arrived = false;
- break;
- case SPEED:
- if(!arrived)
- train.set_control("speed", row.get_param<unsigned>(0)/3.6*train.get_layout().get_catalogue().get_scale());
- break;
- case REVERSE:
- train.set_control("reverse", !train.get_control("reverse"));
- break;
- case ROUTE:
- if(!train.set_route(&train.get_layout().get_route(row.get_param<string>(0))))
- set_enabled(false);
- break;
- }
-
- if(executing)
- current_row = (current_row+1)%rows.size();
- }
-}
-
-void Timetable::save(list<DataFile::Statement> &st) const
-{
- for(vector<Row>::const_iterator i=rows.begin(); i!=rows.end(); ++i)
- st.push_back(i->save());