/* TargetLimits_Pkg::v_SBI2 */
void v_SBI2_TargetLimits_Pkg(
  /* TargetLimits_Pkg::v_SBI2::EBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types *EBDcurve,
  /* TargetLimits_Pkg::v_SBI2::V_est */ V_internal_real_Type_SDM_Types_Pkg V_est,
  /* TargetLimits_Pkg::v_SBI2::V_target */ V_internal_real_Type_SDM_Types_Pkg V_target,
  /* TargetLimits_Pkg::v_SBI2::V_bec */ V_internal_real_Type_SDM_Types_Pkg V_bec,
  /* TargetLimits_Pkg::v_SBI2::D_maxsafefront */ L_internal_real_Type_SDM_Types_Pkg D_maxsafefront,
  /* TargetLimits_Pkg::v_SBI2::D_bec */ L_internal_real_Type_SDM_Types_Pkg D_bec,
  /* TargetLimits_Pkg::v_SBI2::T_bs2 */ T_internal_real_Type_SDM_Types_Pkg T_bs2,
  /* TargetLimits_Pkg::v_SBI2::V_SBI1 */ V_internal_real_Type_SDM_Types_Pkg *V_SBI1,
  /* TargetLimits_Pkg::v_SBI2::valid */ kcg_bool *valid)
{
  V_internal_real_Type_SDM_Types_Pkg tmp;
  /* TargetLimits_Pkg::v_SBI2::_L5 */ kcg_real _L5;
  /* TargetLimits_Pkg::v_SBI2::_L11 */ kcg_bool _L11;
  /* TargetLimits_Pkg::v_SBI2::_L19 */ L_internal_real_Type_SDM_Types_Pkg _L19;
  
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(EBDcurve, V_target, &_L11, &_L19);
  _L5 = D_bec + D_maxsafefront + V_est * T_bs2;
  _L11 = _L19 > _L5;
  if (_L11) {
    /* 1 */ getSpeedOnCurve_CalcBrakingCurves_types(EBDcurve, _L5, valid, &tmp);
    *V_SBI1 = tmp - (V_bec - V_est);
  }
  else {
    *valid = kcg_false;
    *V_SBI1 = V_target;
  }
}
/* TargetLimits_Pkg::d_limits */
void d_limits_TargetLimits_Pkg(
  /* TargetLimits_Pkg::d_limits::V_est */ V_internal_real_Type_SDM_Types_Pkg V_est,
  /* TargetLimits_Pkg::d_limits::SBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types *SBDcurve,
  /* TargetLimits_Pkg::d_limits::SBI2valid */ kcg_bool SBI2valid,
  /* TargetLimits_Pkg::d_limits::D_SBI2_V_est */ L_internal_real_Type_SDM_Types_Pkg D_SBI2_V_est,
  /* TargetLimits_Pkg::d_limits::D_estfront */ L_internal_real_Type_SDM_Types_Pkg D_estfront,
  /* TargetLimits_Pkg::d_limits::D_maxsafefront */ L_internal_real_Type_SDM_Types_Pkg D_maxsafefront,
  /* TargetLimits_Pkg::d_limits::T */ T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::d_limits::GUIcurve */ ParabolaCurve_T_CalcBrakingCurves_types *GUIcurve,
  /* TargetLimits_Pkg::d_limits::guiCurveEnabled */ kcg_bool guiCurveEnabled,
  /* TargetLimits_Pkg::d_limits::D_I */ L_internal_real_Type_SDM_Types_Pkg *D_I,
  /* TargetLimits_Pkg::d_limits::D_P */ L_internal_real_Type_SDM_Types_Pkg *D_P,
  /* TargetLimits_Pkg::d_limits::D_W */ L_internal_real_Type_SDM_Types_Pkg *D_W,
  /* TargetLimits_Pkg::d_limits::D_FLOI */ L_internal_real_Type_SDM_Types_Pkg *D_FLOI,
  /* TargetLimits_Pkg::d_limits::FLOIisSBI1 */ kcg_bool *FLOIisSBI1)
{
  /* TargetLimits_Pkg::d_limits */
  static kcg_bool tmp1;
  /* TargetLimits_Pkg::d_limits */
  static L_internal_real_Type_SDM_Types_Pkg tmp;
  /* TargetLimits_Pkg::d_limits::_L31 */
  static kcg_bool _L31;
  /* TargetLimits_Pkg::d_limits::_L37 */
  static kcg_bool _L37;
  
  /* 1 */ d_SBI1_TargetLimits_Pkg(SBDcurve, V_est, T, &tmp1, &tmp);
  *FLOIisSBI1 = /* 2 */
    isLEValid_TargetLimits_Pkg(
      tmp1,
      tmp - D_estfront,
      SBI2valid,
      D_SBI2_V_est - D_maxsafefront);
  /* 1 */ if (*FLOIisSBI1) {
    *D_FLOI = tmp;
  }
  else {
    *D_FLOI = D_SBI2_V_est;
  }
  *D_W = *D_FLOI - T_warning_SDM_Types_Pkg * V_est;
  /* ck_guiCurveEnabled */ if (guiCurveEnabled) {
    /* 1 */
    getLocationOnCurve_CalcBrakingCurves_types(GUIcurve, V_est, &tmp1, &tmp);
  }
  else {
    tmp1 = kcg_false;
    tmp = 0.0;
  }
  /* 1 */
  selectLEValid_TargetLimits_Pkg(
    kcg_true,
    *D_FLOI - V_est * T_driver_SDM_Types_Pkg,
    tmp1,
    tmp,
    &_L31,
    &_L37,
    D_P);
  *D_I = *D_P - V_est * (*T).indication;
}
/* TargetLimits_Pkg::d_SBI1 */
void d_SBI1_TargetLimits_Pkg(
  /* TargetLimits_Pkg::d_SBI1::SBDcurve */ParabolaCurve_T_CalcBrakingCurves_types *SBDcurve,
  /* TargetLimits_Pkg::d_SBI1::V */V_internal_real_Type_SDM_Types_Pkg V,
  /* TargetLimits_Pkg::d_SBI1::T */T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::d_SBI1::valid */kcg_bool *valid,
  /* TargetLimits_Pkg::d_SBI1::D_SBD1 */L_internal_real_Type_SDM_Types_Pkg *D_SBD1)
{
  /* TargetLimits_Pkg::d_SBI1::_L5 */
  static L_internal_real_Type_SDM_Types_Pkg _L5;
  
  /* 1 */ getLocationOnCurve_CalcBrakingCurves_types(SBDcurve, V, valid, &_L5);
  *D_SBD1 = _L5 - V * (*T).bs1;
}
/* TargetLimits_Pkg::d_SBI2 */
void d_SBI2_TargetLimits_Pkg(
  /* TargetLimits_Pkg::d_SBI2::EBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types *EBDcurve,
  /* TargetLimits_Pkg::d_SBI2::bec */ bec_t_TargetLimits_Pkg *bec,
  /* TargetLimits_Pkg::d_SBI2::v_est */ V_internal_real_Type_SDM_Types_Pkg v_est,
  /* TargetLimits_Pkg::d_SBI2::T */ T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::d_SBI2::valid */ kcg_bool *valid,
  /* TargetLimits_Pkg::d_SBI2::D_SBI2 */ L_internal_real_Type_SDM_Types_Pkg *D_SBI2)
{
  /* TargetLimits_Pkg::d_SBI2::_L70 */
  static L_internal_real_Type_SDM_Types_Pkg _L70;
  
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(EBDcurve, (*bec).v, valid, &_L70);
  *D_SBI2 = _L70 - (*bec).d - v_est * (*T).bs2;
}
/* TargetLimits_Pkg::d_SBI2 */
void d_SBI2_TargetLimits_Pkg(
  /* TargetLimits_Pkg::d_SBI2::EBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types *EBDcurve,
  /* TargetLimits_Pkg::d_SBI2::V_bec */ V_internal_real_Type_SDM_Types_Pkg V_bec,
  /* TargetLimits_Pkg::d_SBI2::D_bec */ L_internal_real_Type_SDM_Types_Pkg D_bec,
  /* TargetLimits_Pkg::d_SBI2::v_est */ V_internal_real_Type_SDM_Types_Pkg v_est,
  /* TargetLimits_Pkg::d_SBI2::T_bs2 */ T_internal_real_Type_SDM_Types_Pkg T_bs2,
  /* TargetLimits_Pkg::d_SBI2::valid */ kcg_bool *valid,
  /* TargetLimits_Pkg::d_SBI2::D_SBI2 */ L_internal_real_Type_SDM_Types_Pkg *D_SBI2)
{
  /* TargetLimits_Pkg::d_SBI2::_L70 */ L_internal_real_Type_SDM_Types_Pkg _L70;
  
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(EBDcurve, V_bec, valid, &_L70);
  *D_SBI2 = _L70 - D_bec - v_est * T_bs2;
}
/* CalcBrakingCurves_Pkg::internalOperators::CalculateEBDFootForMRSPorLOA */
L_internal_real_Type_SDM_Types_Pkg CalculateEBDFootForMRSPorLOA_CalcBrakingCurves_Pkg_internalOperators(
  /* CalcBrakingCurves_Pkg::internalOperators::CalculateEBDFootForMRSPorLOA::IsMRSPorLOATarget */ kcg_bool IsMRSPorLOATarget,
  /* CalcBrakingCurves_Pkg::internalOperators::CalculateEBDFootForMRSPorLOA::target */ Target_real_T_TargetManagement_types *target,
  /* CalcBrakingCurves_Pkg::internalOperators::CalculateEBDFootForMRSPorLOA::aSafe */ ASafe_T_CalcBrakingCurves_types *aSafe)
{
  BCAccumulator_type_CalcBrakingCurves_Pkg tmp1;
  kcg_int i;
  ParabolaCurve_T_CalcBrakingCurves_types tmp;
  /* CalcBrakingCurves_Pkg::internalOperators::CalculateEBDFootForMRSPorLOA::_L5 */ BCAccumulator_type_CalcBrakingCurves_Pkg _L5;
  /* CalcBrakingCurves_Pkg::internalOperators::CalculateEBDFootForMRSPorLOA::_L10 */ kcg_bool _L10;
  /* CalcBrakingCurves_Pkg::internalOperators::CalculateEBDFootForMRSPorLOA::Output1 */ L_internal_real_Type_SDM_Types_Pkg Output1;
  
  /* InitilizeAccForEBDFootCalc */
  InitilizeAccForEBDFootCalc_CalcBrakingCurves_Pkg_internalOperators(
    target,
    aSafe,
    &_L5);
  if (IsMRSPorLOATarget) {
    for (i = 0; i < 24; i++) {
      kcg_copy_BCAccumulator_type_CalcBrakingCurves_Pkg(&tmp1, &_L5);
      /* 1 */
      BCFoldOperatorForward_CalcBrakingCurves_Pkg_internalOperators(
        i,
        &tmp1,
        aSafe,
        (*target).speed,
        &_L10,
        &_L5);
      if (!_L10) {
        break;
      }
    }
  }
  /* 1 */
  SortByDistances_CalcBrakingCurves_Pkg_internalOperators(&_L5.BC, &tmp);
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(
    &tmp,
    (*target).speed,
    &_L10,
    &Output1);
  return Output1;
}
/* TargetLimits_Pkg::d_EBI_non_est */
void d_EBI_non_est_TargetLimits_Pkg(
  /* TargetLimits_Pkg::d_EBI_non_est::V */ V_internal_real_Type_SDM_Types_Pkg V,
  /* TargetLimits_Pkg::d_EBI_non_est::EBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types *EBDcurve,
  /* TargetLimits_Pkg::d_EBI_non_est::T */ T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::d_EBI_non_est::D_SBI2 */ L_internal_real_Type_SDM_Types_Pkg *D_SBI2,
  /* TargetLimits_Pkg::d_EBI_non_est::valid */ kcg_bool *valid)
{
  /* TargetLimits_Pkg::d_EBI_non_est */ V_internal_real_Type_SDM_Types_Pkg tmp;
  /* TargetLimits_Pkg::d_EBI_non_est::_L4 */ L_internal_real_Type_SDM_Types_Pkg _L4;
  /* TargetLimits_Pkg::d_EBI_non_est::_L6 */ kcg_real _L6;
  /* TargetLimits_Pkg::d_EBI_non_est::_L19 */ kcg_bool _L19;
  
  _L19 = !(*T).inhComp;
  /* ck__L19 */ if (_L19) {
    tmp = /* 1 */ f_41_TargetLimits_Pkg(V);
  }
  else {
    tmp = 0.0;
  }
  _L6 = tmp + V;
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(EBDcurve, _L6, valid, &_L4);
  *D_SBI2 = _L4 - _L6 * ((*T).Traction + (*T).berem) - V * (*T).bs2;
}
/* TargetLimits_Pkg::v_SBI2 */
void v_SBI2_TargetLimits_Pkg(
  /* TargetLimits_Pkg::v_SBI2::EBDcurve */ParabolaCurve_T_CalcBrakingCurves_types *EBDcurve,
  /* TargetLimits_Pkg::v_SBI2::V_est */V_internal_real_Type_SDM_Types_Pkg V_est,
  /* TargetLimits_Pkg::v_SBI2::V_target */V_internal_real_Type_SDM_Types_Pkg V_target,
  /* TargetLimits_Pkg::v_SBI2::bec */bec_t_TargetLimits_Pkg *bec,
  /* TargetLimits_Pkg::v_SBI2::D_maxsafefront */L_internal_real_Type_SDM_Types_Pkg D_maxsafefront,
  /* TargetLimits_Pkg::v_SBI2::t_driver */T_internal_real_Type_SDM_Types_Pkg t_driver,
  /* TargetLimits_Pkg::v_SBI2::guiCurveEnabled */kcg_bool guiCurveEnabled,
  /* TargetLimits_Pkg::v_SBI2::GUIcurve */ParabolaCurve_T_CalcBrakingCurves_types *GUIcurve,
  /* TargetLimits_Pkg::v_SBI2::T */T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::v_SBI2::valid */kcg_bool *valid,
  /* TargetLimits_Pkg::v_SBI2::V_SBI2 */V_internal_real_Type_SDM_Types_Pkg *V_SBI2)
{
  static kcg_bool tmp3;
  static V_internal_real_Type_SDM_Types_Pkg tmp2;
  static kcg_bool tmp1;
  static V_internal_real_Type_SDM_Types_Pkg tmp;
  /* TargetLimits_Pkg::v_SBI2::_L33 */
  static kcg_bool _L33;
  /* TargetLimits_Pkg::v_SBI2::_L49 */
  static kcg_real _L49;
  /* TargetLimits_Pkg::v_SBI2::_L48 */
  static kcg_bool _L48;
  /* TargetLimits_Pkg::v_SBI2::_L47 */
  static kcg_bool _L47;
  
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(EBDcurve, V_target, &_L33, &tmp);
  _L49 = D_maxsafefront + V_est * ((*T).bs2 + t_driver) + (*bec).d;
  if (guiCurveEnabled) {
    /* 3 */
    getLocationOnCurve_CalcBrakingCurves_types(
      GUIcurve,
      V_target,
      &tmp3,
      &tmp2);
  }
  else {
    tmp3 = kcg_false;
    tmp2 = 0.0;
  }
  _L33 = (tmp3 & (tmp2 > D_maxsafefront)) | (tmp > _L49);
  tmp1 = tmp3 & _L33;
  if (tmp1) {
    /* 2 */
    getSpeedOnCurve_CalcBrakingCurves_types(
      GUIcurve,
      D_maxsafefront,
      &tmp3,
      &tmp2);
  }
  else {
    tmp3 = kcg_false;
    tmp2 = 0.0;
  }
  if (_L33) {
    /* 1 */
    getSpeedOnCurve_CalcBrakingCurves_types(EBDcurve, _L49, &tmp1, &tmp);
  }
  else {
    tmp1 = kcg_false;
    tmp = 0.0;
  }
  /* 1 */
  selectLEValid_TargetLimits_Pkg(
    tmp3,
    tmp2,
    tmp1,
    tmp - ((*bec).v - V_est),
    &_L47,
    &_L48,
    &_L49);
  *valid = !_L33 | _L48;
  if (_L33) {
    *V_SBI2 = _L49;
  }
  else {
    *V_SBI2 = V_target;
  }
}
/* TargetLimits_Pkg::v_ReleaseOnboardIterator */
void v_ReleaseOnboardIterator_TargetLimits_Pkg(
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_release */V_internal_real_Type_SDM_Types_Pkg V_release,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::EBDcurve */ParabolaCurve_T_CalcBrakingCurves_types *EBDcurve,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_ura */V_internal_real_Type_SDM_Types_Pkg V_ura,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_target */V_internal_real_Type_SDM_Types_Pkg V_target,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::D_tripEOA */L_internal_real_Type_SDM_Types_Pkg D_tripEOA,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::T */T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::run_condition */kcg_bool *run_condition,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_release_next */V_internal_real_Type_SDM_Types_Pkg *V_release_next)
{
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L20 */
  static kcg_bool _L20;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L24 */
  static kcg_real _L24;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L25 */
  static kcg_real _L25;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L28 */
  static V_internal_real_Type_SDM_Types_Pkg _L28;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L32 */
  static L_internal_real_Type_SDM_Types_Pkg _L32;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L31 */
  static kcg_bool _L31;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L40 */
  static kcg_real _L40;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L50 */
  static kcg_bool _L50;
  
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(EBDcurve, V_target, &_L31, &_L32);
  _L20 = !(*T).inhComp;
  _L24 = /* 1 */ f_41_TargetLimits_Pkg(V_release);
  if (_L20) {
    if (V_ura >= _L24) {
      _L40 = V_ura;
    }
    else {
      _L40 = _L24;
    }
  }
  else {
    _L40 = 0.0;
  }
  _L24 = D_tripEOA + (V_release + _L40) * ((*T).berem + (*T).Traction);
  /* 1 */ getSpeedOnCurve_CalcBrakingCurves_types(EBDcurve, _L24, &_L20, &_L28);
  _L50 = _L31 & _L20;
  _L25 = _L28 - _L40;
  if ((_L32 <= _L24) | (_L25 <= V_target)) {
    _L28 = V_target;
  }
  else {
    _L28 = _L25;
  }
  if (_L50) {
    *V_release_next = _L28;
  }
  else {
    *V_release_next = - 1.0;
  }
  _L40 = _L28 - V_release;
  if (0. <= _L40) {
    _L24 = _L40;
  }
  else {
    _L24 = - _L40;
  }
  *run_condition = _L50 & !(_L24 <= 1.0 / 3.6);
}
/* TargetLimits_Pkg::v_ReleaseOnboardIterator */
void v_ReleaseOnboardIterator_TargetLimits_Pkg(
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_release */ V_internal_real_Type_SDM_Types_Pkg V_release,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::EBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types *EBDcurve,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_ura */ V_internal_real_Type_SDM_Types_Pkg V_ura,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_target */ V_internal_real_Type_SDM_Types_Pkg V_target,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::D_tripEOA */ L_internal_real_Type_SDM_Types_Pkg D_tripEOA,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::T */ T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::run_condition */ kcg_bool *run_condition,
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::V_release_next */ V_internal_real_Type_SDM_Types_Pkg *V_release_next)
{
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator */
  static kcg_real tmp;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::v_delta0rsob */
  static V_internal_real_Type_SDM_Types_Pkg v_delta0rsob;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L21 */
  static V_internal_real_Type_SDM_Types_Pkg _L21;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L20 */
  static kcg_bool _L20;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L32 */
  static L_internal_real_Type_SDM_Types_Pkg _L32;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L31 */
  static kcg_bool _L31;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L40 */
  static kcg_real _L40;
  /* TargetLimits_Pkg::v_ReleaseOnboardIterator::_L50 */
  static kcg_bool _L50;
  
  _L21 = /* 1 */ f_41_TargetLimits_Pkg(V_release);
  _L20 = !(*T).inhComp;
  /* ck__L10 */ if (_L20) {
    /* 2 */ if (V_ura >= _L21) {
      v_delta0rsob = V_ura;
    }
    else {
      v_delta0rsob = _L21;
    }
  }
  else {
    v_delta0rsob = 0.0;
  }
  tmp = D_tripEOA + (V_release + v_delta0rsob) * ((*T).berem + (*T).Traction);
  /* 1 */ getSpeedOnCurve_CalcBrakingCurves_types(EBDcurve, tmp, &_L20, &_L21);
  _L40 = _L21 - v_delta0rsob;
  /* 1 */
  getLocationOnCurve_CalcBrakingCurves_types(EBDcurve, V_target, &_L31, &_L32);
  /* 1 */ if ((_L32 <= tmp) | (_L40 <= V_target)) {
    _L21 = V_target;
  }
  else {
    _L21 = _L40;
  }
  _L40 = _L21 - V_release;
  _L50 = _L31 & _L20;
  /* 2 */ if (0. <= _L40) {
    tmp = _L40;
  }
  else {
    tmp = - _L40;
  }
  *run_condition = _L50 & !(tmp <= 1.0 / 3.6);
  /* 2 */ if (_L50) {
    *V_release_next = _L21;
  }
  else {
    *V_release_next = - 1.0;
  }
}