Exemplo n.º 1
0
bool 
OrderedTask::UpdateIdle(const AircraftState &state,
                        const GlidePolar &glide_polar)
{
  bool retval = AbstractTask::UpdateIdle(state, glide_polar);

  if (HasStart()
      && (task_behaviour.optimise_targets_range)
      && (get_ordered_task_behaviour().aat_min_time > fixed_zero)) {

    CalcMinTarget(state, glide_polar,
                    get_ordered_task_behaviour().aat_min_time + fixed(task_behaviour.optimise_targets_margin));

    if (task_behaviour.optimise_targets_bearing) {
      if (task_points[active_task_point]->GetType() == TaskPoint::AAT) {
        AATPoint *ap = (AATPoint *)task_points[active_task_point];
        // very nasty hack
        TaskOptTarget tot(task_points, active_task_point, state,
                          task_behaviour.glide, glide_polar,
                          *ap, task_projection, taskpoint_start);
        tot.search(fixed(0.5));
      }
    }
    retval = true;
  }
  
  return retval;
}
Exemplo n.º 2
0
bool 
AbstractTaskFactory::is_position_finish(const unsigned position) const
{
  if (is_position_start(position))
    return false;

  if (position + 1 < get_ordered_task_behaviour().min_points)
    return false;
  if (position + 1 > get_ordered_task_behaviour().max_points)
    return false;

  if (get_ordered_task_behaviour().is_fixed_size())
    return (position + 1 == get_ordered_task_behaviour().max_points);
  else
    return (position + 1 >= m_task.TaskSize());
}
Exemplo n.º 3
0
bool
AbstractTaskFactory::mutate_closed_finish_per_task_type()
{
  if (m_task.TaskSize() < 2)
    return false;

  if (!is_position_finish(m_task.TaskSize() - 1))
    return false;

  bool changed = false;

  if (get_ordered_task_behaviour().is_closed) {
    if (!is_closed()) {
      OrderedTaskPoint *tp = m_task.get_tp(m_task.TaskSize() - 1);
      assert(tp);
      if (tp->GetType() == TaskPoint::FINISH) {
        FinishPoint *fp = createFinish(m_task.get_tp(0)->GetWaypoint());
        assert(fp);
        remove(m_task.TaskSize() - 1, false);
        append(*fp, false);
        delete fp;
        changed = true;
      }
    }
  }
  return changed;
}
Exemplo n.º 4
0
ASTPoint* 
AbstractTaskFactory::createAST(ObservationZonePoint* oz,
                               const Waypoint& wp) const
{
  return new ASTPoint(oz, wp, m_behaviour,
                      get_ordered_task_behaviour());
}
Exemplo n.º 5
0
bool 
AbstractTaskFactory::is_position_intermediate(const unsigned position) const
{
  if (is_position_start(position))
    return false;
  if (position >= get_ordered_task_behaviour().max_points)
    return false;
  if (position + 1 < get_ordered_task_behaviour().min_points)
    return true;

  if (get_ordered_task_behaviour().is_fixed_size())
    return (position + 1 < get_ordered_task_behaviour().max_points);
  else if (m_task.TaskSize() < get_ordered_task_behaviour().min_points)
    return true;
  else
    return (position <= m_task.TaskSize());
}
Exemplo n.º 6
0
bool
AbstractTaskFactory::remove_excess_tps_per_task_type()
{
  bool changed = false;
  unsigned maxtp = get_ordered_task_behaviour().max_points;
  while (maxtp < m_task.TaskSize()) {
    remove(maxtp, false);
    changed = true;
  }
  return changed;
}
Exemplo n.º 7
0
IntermediateTaskPoint* 
AbstractTaskFactory::createIntermediate(const Waypoint &wp) const
{
  if (get_ordered_task_behaviour().homogeneous_tps && m_task.TaskSize() > 1) {
    LegalPointType_t type = getType(*m_task.get_tp(1));
    if (validIntermediateType(type))
      return createIntermediate(type, wp);
  }

  LegalPointType_t type = m_behaviour.sector_defaults.turnpoint_type;
  if (!validIntermediateType(type))
    type = *m_intermediate_types.begin();

  return createIntermediate(type, wp);
}
Exemplo n.º 8
0
AbstractTaskFactory::LegalPointVector 
AbstractTaskFactory::getValidIntermediateTypes(unsigned position) const
{
  LegalPointVector v;

  if (!is_position_intermediate(position))
    return v;

  if (get_ordered_task_behaviour().homogeneous_tps 
      && (position>1) && (m_task.task_size()>1)) {
    LegalPointType_t type = getType(*m_task.get_tp(1));
    if (validIntermediateType(type)) {
      v.push_back(type);
      return v;
    }
  }
  if (validAbstractType(POINT_AAT, position) ||
      validAbstractType(POINT_AST, position))
    v.insert(v.end(), m_intermediate_types.begin(), m_intermediate_types.end());
  return v;
}
Exemplo n.º 9
0
bool
AbstractTaskFactory::validate()
{
  clearValidationErrors();

  bool valid = true;

  if (!m_task.has_start()) {
    addValidationError(NO_VALID_START);
    valid = false;
  }
  if (!m_task.has_finish()) {
    addValidationError(NO_VALID_FINISH);
    valid = false;
  }

  if (get_ordered_task_behaviour().is_closed && !is_closed()) {
    addValidationError(TASK_NOT_CLOSED);
    valid = false;
  }

  if (get_ordered_task_behaviour().is_fixed_size()) {
    if (m_task.TaskSize() != get_ordered_task_behaviour().max_points) {
      addValidationError(INCORRECT_NUMBER_TURNPOINTS);
      valid = false;
    }
  } else {
    if (m_task.TaskSize() < get_ordered_task_behaviour().min_points) {
      addValidationError(UNDER_MIN_TURNPOINTS);
      valid = false;
    }
    if (m_task.TaskSize() > get_ordered_task_behaviour().max_points) {
      addValidationError(EXCEEDS_MAX_TURNPOINTS);
      valid = false;
    }
  }

  if (get_ordered_task_behaviour().homogeneous_tps && !is_homogeneous()) {
    addValidationError(TASK_NOT_HOMOGENEOUS);
    valid = false;
  }

  return valid;
}