Beispiel #1
0
GlideResult
TaskMacCready::glide_solution(const AircraftState &aircraft)
{
  const fixed aircraft_min_height = get_min_height(aircraft);
  GlideResult acc_gr;
  AircraftState aircraft_predict = get_aircraft_start(aircraft);

  for (unsigned i = 0, size = points.size(); i < size; ++i) {
    const fixed tp_min_height = std::max(aircraft_min_height,
                                         points[i]->GetElevation());

    // perform estimate, ensuring that alt is above previous taskpoint
    const GlideResult gr = SolvePoint(*points[i], aircraft_predict,
                                      tp_min_height);
    leg_solutions[i] = gr;

    // update state
    if (i == 0)
      acc_gr = gr;
    else
      acc_gr.Add(gr);

    /* make sure the next leg doesn't start below the safety altitude
       of the current turn point, because we assume that the pilot
       will never progress to the next leg if he's too low */
    aircraft_predict.altitude = tp_min_height;
    if (positive(gr.altitude_difference))
      /* .. but start higher if the last calculation allows it */
      aircraft_predict.altitude += gr.altitude_difference;
  }

  leg_solutions[active_index].CalcDeferred();
  acc_gr.CalcDeferred();
  return acc_gr;
}
Beispiel #2
0
GlideResult 
TaskMacCready::glide_solution(const AircraftState &aircraft) 
{
  GlideResult acc_gr, gr;
  AircraftState aircraft_predict = aircraft;
  AircraftState aircraft_start = get_aircraft_start(aircraft);

  clearance_heights(aircraft);

  fixed excess_height = aircraft_start.altitude - m_minHs[m_end];

  for (int i = m_end; i >= m_start; --i) {
    if (i > m_start)
      aircraft_predict.altitude =
          m_minHs[i - 1] + max(excess_height, fixed_zero);
    else
      aircraft_predict.altitude =
          min(aircraft_start.altitude,
              m_minHs[i] + max(excess_height, fixed_zero));

    // perform estimate, ensuring that alt is above previous taskpoint  
    gr = tp_solution(i, aircraft_predict, m_minHs[i]);
    m_gs[i] = gr;
    excess_height -= gr.height_glide;

    // update state
    if (i == m_end)
      acc_gr = gr;
    else
      acc_gr.Add(gr);
  }

  if (!acc_gr.IsOk())
    /* no values - cannot do the additional calculations below, bail
       out */
    return acc_gr;

  aircraft_predict.altitude = aircraft_start.altitude;
  fixed alt_difference = aircraft_start.altitude - m_minHs[m_start];

  for (int i = m_start; i <= m_end; ++i) {
    aircraft_predict.altitude -= m_gs[i].height_glide;
    alt_difference =
        min(alt_difference, aircraft_predict.altitude - m_minHs[i]);
  }

  alt_difference -= acc_gr.height_climb;
  acc_gr.altitude_difference = alt_difference;
  acc_gr.CalcDeferred(aircraft);

  return acc_gr;
}