bool Train::free_block(Block &block)
{
- float margin = 10*layout.get_catalogue().get_scale();
- if(get_reserved_distance_until(&block, false)<controller->get_braking_distance()*1.3+margin)
+ if(get_reserved_distance_until(&block, false)<controller->get_braking_distance()*1.3)
return false;
unsigned nsens = 0;
float Train::get_reserved_distance() const
{
- return get_reserved_distance_until(0, false);
+ if(blocks.empty())
+ return 0;
+
+ float margin = 0;
+ TrackIter next = blocks.back().next().track_iter();
+ if(next->get_type().is_turnout())
+ margin = 15*layout.get_catalogue().get_scale();
+
+ return max(get_reserved_distance_until(0, false)-margin, 0.0f);
}
void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt)
}
// Move blocks up to the next sensor to our current blocks
+ for(BlockList::iterator j=cur_blocks_end; j!=end; ++j)
+ signal_advanced.emit(**j);
cur_blocks_end = end;
// Try to get more blocks if we're moving
if(real_speed[i].weight)
{
last = i;
- if(real_speed[i].speed<real)
- low = i;
- else
+ if(real_speed[i].speed>=real)
high = i;
+ else if(real_speed[i].speed>real_speed[low].speed)
+ low = i;
}
if(!high)
{