- 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:
- {
- Block *block = &get_sensor(row.get_param<unsigned>(0)).get_block();
- if(block->get_train()!=&train || block->get_state()<Block::MAYBE_ACTIVE)
- {
- pending_block = 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:
- {
- Train *other_train = &train.get_layout().get_train(row.get_param<unsigned>(0));
- Block *block = &get_sensor(row.get_param<unsigned>(1)).get_block();
- if(block->get_train()!=other_train || block->get_state()<Block::MAYBE_ACTIVE)
- {
- pending_train = other_train;
- pending_block = block;
- executing = false;
- }
- }
- break;
- case ARRIVE:
- if(!arrived)
- executing = false;
- arrived = false;
- break;
- case SPEED:
- if(!arrived)
- {
- float speed = row.get_param<unsigned>(0)/3.6*train.get_layout().get_catalogue().get_scale();
- train.ai_message(Message("set-target-speed", speed));
- }
- break;
- case REVERSE:
- train.ai_message(Message("toggle-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();
- }