- unsigned out = cur_track->traverse(cur_track_ep, path);
- Track *next = cur_track->get_link(out);
+ ++block;
+ if(block==cur_blocks.end())
+ block = rsv_blocks.begin();
+ if(block==rsv_blocks.end())
+ return result;
+ }
+
+ entry = next->get_endpoint_by_link(*track);
+ track = next;
+ }
+}
+
+void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt)
+{
+ if(!active && stop_timeout && t>=stop_timeout)
+ {
+ release_blocks(rsv_blocks);
+ end_of_route = false;
+ stop_timeout = Time::TimeStamp();
+ }
+
+ Driver &driver = layout.get_driver();
+
+ if(timetable)
+ timetable->tick(t);
+ control->tick(dt);
+ float speed = control->get_speed();
+ unsigned speed_notch = find_speed(abs(speed));
+
+ if(control->get_reverse()!=reverse)
+ {
+ reverse = control->get_reverse();
+ driver.set_loco_reverse(address, reverse);
+
+ release_blocks(rsv_blocks);
+ reverse_blocks(cur_blocks);
+
+ reserve_more();
+ }
+ if(speed_notch!=current_speed && !speed_changing && !driver.is_halted() && driver.get_power())
+ {
+ speed_changing = true;
+ driver.set_loco_speed(address, speed_notch);