/* TargetLimits_Pkg::TargetSelector */
void TargetSelector_TargetLimits_Pkg(
  /* TargetLimits_Pkg::TargetSelector::Targets */ TargetCollection_T_TargetManage *Targets,
  /* TargetLimits_Pkg::TargetSelector::Curves */ CurveCollection_T_CalcBrakingCu *Curves,
  /* TargetLimits_Pkg::TargetSelector::odometry */ odometry_T_Obu_BasicTypes_Pkg *odometry,
  /* TargetLimits_Pkg::TargetSelector::trainData_int */ trainData_internal_t_SDM_Types_ *trainData_int,
  /* TargetLimits_Pkg::TargetSelector::T_b */ t_Brake_t_SDMModelPkg *T_b,
  /* TargetLimits_Pkg::TargetSelector::NationalValues */ P3_NationalValues_T_Packet_Type *NationalValues,
  /* TargetLimits_Pkg::TargetSelector::trainLocations */ TrainLocations_real_T_SDM_Types *trainLocations,
  /* TargetLimits_Pkg::TargetSelector::MostRestrictiveDisplayedTarget */ Target_T_TargetManagement_types *MostRestrictiveDisplayedTarget,
  /* TargetLimits_Pkg::TargetSelector::MostRestrictiveEBDCurve */ ParabolaCurve_T_CalcBrakingCurv *MostRestrictiveEBDCurve,
  /* TargetLimits_Pkg::TargetSelector::SBDcurve */ ParabolaCurve_T_CalcBrakingCurv *SBDcurve,
  /* TargetLimits_Pkg::TargetSelector::GUIcurve */ ParabolaCurve_T_CalcBrakingCurv *GUIcurve,
  /* TargetLimits_Pkg::TargetSelector::GUICurveEnabled */ kcg_bool *GUICurveEnabled,
  /* TargetLimits_Pkg::TargetSelector::V_Target */ V_internal_real_Type_SDM_Types_ *V_Target,
  /* TargetLimits_Pkg::TargetSelector::V_P_MRDT */ V_internal_real_Type_SDM_Types_ *V_P_MRDT,
  /* TargetLimits_Pkg::TargetSelector::D_EOA */ L_internal_real_Type_SDM_Types_ *D_EOA,
  /* TargetLimits_Pkg::TargetSelector::D_SvL */ L_internal_real_Type_SDM_Types_ *D_SvL,
  /* TargetLimits_Pkg::TargetSelector::v_est */ V_internal_real_Type_SDM_Types_ *v_est,
  /* TargetLimits_Pkg::TargetSelector::T */ T_trac_t_TargetLimits_Pkg *T,
  /* TargetLimits_Pkg::TargetSelector::V_ura */ V_internal_real_Type_SDM_Types_ *V_ura,
  /* TargetLimits_Pkg::TargetSelector::bec */ bec_t_TargetLimits_Pkg *bec,
  /* TargetLimits_Pkg::TargetSelector::D_SBI2 */ L_internal_real_Type_SDM_Types_ *D_SBI2,
  /* TargetLimits_Pkg::TargetSelector::valid_D_SBI2 */ kcg_bool *valid_D_SBI2,
  /* TargetLimits_Pkg::TargetSelector::D_estfront */ L_internal_real_Type_SDM_Types_ *D_estfront,
  /* TargetLimits_Pkg::TargetSelector::D_maxsafefront */ L_internal_real_Type_SDM_Types_ *D_maxsafefront)
{
  /* TargetLimits_Pkg::TargetSelector */
  static TargetIteratorAkku_TargetLimits acc;
  static kcg_int i;
  /* TargetLimits_Pkg::TargetSelector */
  static V_internal_real_Type_SDM_Types_ tmp;
  /* TargetLimits_Pkg::TargetSelector::_L29 */
  static TargetIteratorAkku_TargetLimits _L29;
  /* TargetLimits_Pkg::TargetSelector::_L59 */
  static kcg_bool _L59;
  /* TargetLimits_Pkg::TargetSelector::_L60 */
  static TargetIteratorAkku_TargetLimits _L60;
  /* TargetLimits_Pkg::TargetSelector::_L55 */
  static kcg_int _L55;
  /* TargetLimits_Pkg::TargetSelector::_L157 */
  static Target_real_T_TargetManagement_ _L157;
  /* TargetLimits_Pkg::TargetSelector::_L261 */
  static kcg_bool _L261;
  /* TargetLimits_Pkg::TargetSelector::_L262 */
  static kcg_bool _L262;
  /* TargetLimits_Pkg::TargetSelector::_L282 */
  static Target_real_T_TargetManagement_ _L282;
  
  _L29.ttype = invalid_TargetManagement_types;
  _L29.bec.v = 0.0;
  _L29.bec.d = 0.0;
  _L29.V_est = 0.0;
  _L29.V_ura = 0.0;
  _L29.V_P_MRDT_ebd = 0.0;
  _L262 = (*Targets).EOA_target.targetType == EoA_TargetManagement_types;
  kcg_copy_ParabolaCurve_T_CalcBr(SBDcurve, &(*Curves).EOA_SBD_curve);
  _L55 = - 1;
  _L29.index = _L55;
  _L29.V_P_MRDT_index = _L29.index;
  _L29.SBI2 = 0.0;
  _L29.T.Traction = 0.0;
  _L29.T.berem = 0.0;
  _L29.T.bs = 0.0;
  _L29.T.bs1 = 0.0;
  _L29.T.bs2 = 0.0;
  _L29.T.indication = 0.0;
  *D_maxsafefront = (*trainLocations).d_maxSafeFrontEndPos;
  kcg_copy_ParabolaCurve_T_CalcBr(GUIcurve, &(*Curves).GUI_curve);
  *GUICurveEnabled = (*Curves).GUI_curve_enabled;
  switch ((*NationalValues).q_nvinhsmicperm) {
    case Q_NVINHSMICPERM_Yes :
      _L29.T.inhComp = kcg_true;
      break;
    
    default :
      _L29.T.inhComp = kcg_false;
  }
  for (i = 0; i < 110; i++) {
    kcg_copy_TargetIteratorAkku_Tar(&acc, &_L29);
    /* 2 */
    TargetIterator_TargetLimits_Pkg(
      i,
      &acc,
      &(*Targets).MRSP_targetList[i],
      &(*Curves).MRSP_EBD_curves[i],
      trainData_int,
      odometry,
      T_b,
      *D_maxsafefront,
      GUIcurve,
      *GUICurveEnabled,
      &_L59,
      &_L29);
    if (!_L59) {
      break;
    }
  }
  /* 4 */
  TargetIterator_TargetLimits_Pkg(
    _L55,
    &_L29,
    &(*Targets).SvL_LoA_target,
    &(*Curves).SvL_LoA_EBD_curve,
    trainData_int,
    odometry,
    T_b,
    *D_maxsafefront,
    GUIcurve,
    *GUICurveEnabled,
    &_L59,
    &_L60);
  *v_est = _L60.V_est;
  *D_estfront = (*trainLocations).d_est_frontendPos;
  *D_EOA = (*Targets).EOA_target.distance;
  kcg_copy_T_trac_t_TargetLimits_(T, &_L60.T);
  *D_SvL = (*Targets).SvL_LoA_target.distance;
  if ((0 <= _L60.V_P_MRDT_index) & (_L60.V_P_MRDT_index < 110)) {
    kcg_copy_Target_real_T_TargetMa(
      &_L157,
      &(*Targets).MRSP_targetList[_L60.V_P_MRDT_index]);
  }
  else {
    kcg_copy_Target_real_T_TargetMa(&_L157, &(*Targets).SvL_LoA_target);
  }
  if ((0 <= _L60.index) & (_L60.index < 110)) {
    kcg_copy_ParabolaCurve_T_CalcBr(
      MostRestrictiveEBDCurve,
      &(*Curves).MRSP_EBD_curves[_L60.index]);
  }
  else {
    kcg_copy_ParabolaCurve_T_CalcBr(
      MostRestrictiveEBDCurve,
      &(*Curves).SvL_LoA_EBD_curve);
  }
  kcg_copy_bec_t_TargetLimits_Pkg(bec, &_L60.bec);
  *D_SBI2 = _L60.SBI2;
  *V_ura = _L60.V_ura;
  *valid_D_SBI2 = _L60.ttype != invalid_TargetManagement_types;
  /* ck__L275 */ if (_L262) {
    /* 2 */
    v_SBI1_TargetLimits_Pkg(
      SBDcurve,
      *v_est,
      *D_estfront,
      *D_EOA,
      T_driver_SDM_Types_Pkg,
      *GUICurveEnabled,
      GUIcurve,
      T,
      &_L59,
      &tmp);
  }
  else {
    _L59 = kcg_false;
    tmp = 0.0;
  }
  /* 1 */
  selectLEValid_TargetLimits_Pkg(
    (kcg_bool) (_L157.targetType != invalid_TargetManagement_types),
    _L60.V_P_MRDT_ebd,
    _L59,
    tmp,
    &_L261,
    &_L262,
    V_P_MRDT);
  /* 1 */ if (_L261) {
    kcg_copy_Target_real_T_TargetMa(&_L282, &_L157);
  }
  else {
    kcg_copy_Target_real_T_TargetMa(&_L282, &(*Targets).EOA_target);
  }
  (*MostRestrictiveDisplayedTarget).targetType = _L282.targetType;
  (*MostRestrictiveDisplayedTarget).valid = invalid_TargetManagement_types !=
    _L282.targetType;
  *V_Target = _L282.speed;
  (*MostRestrictiveDisplayedTarget).distance = /* 1 */
    TransformL_realToL_int_SDM_Type(_L282.distance);
  (*MostRestrictiveDisplayedTarget).speed = /* 1 */
    TransformV_realToV_int_SDM_Type(*V_Target);
}
/* TargetLimits_Pkg::SDMLimitLocations */
void SDMLimitLocations_TargetLimits_Pkg(
    /* TargetLimits_Pkg::SDMLimitLocations::MRSP_Profile */ MRSP_internal_T_TargetManagement_types *MRSP_Profile,
    /* TargetLimits_Pkg::SDMLimitLocations::odometry */ Odometry_real_T_SDM_Types_Pkg *odometry,
    /* TargetLimits_Pkg::SDMLimitLocations::trainLocations */ TrainLocations_real_T_SDM_Types_Pkg *trainLocations,
    /* TargetLimits_Pkg::SDMLimitLocations::targetCollection */ TargetCollection_T_TargetManagement_types *targetCollection,
    /* TargetLimits_Pkg::SDMLimitLocations::curveCollection */ CurveCollection_T_CalcBrakingCurves_types *curveCollection,
    /* TargetLimits_Pkg::SDMLimitLocations::v_release */ V_internal_real_Type_SDM_Types_Pkg v_release,
    /* TargetLimits_Pkg::SDMLimitLocations::V_ura */ V_internal_real_Type_SDM_Types_Pkg V_ura,
    /* TargetLimits_Pkg::SDMLimitLocations::inhibitUnderReadingCompensation */ Q_NVINHSMICPERM inhibitUnderReadingCompensation,
    /* TargetLimits_Pkg::SDMLimitLocations::isTractionCutOffImplemented */ kcg_bool isTractionCutOffImplemented,
    /* TargetLimits_Pkg::SDMLimitLocations::T_traction_cut_off */ T_internal_real_Type_SDM_Types_Pkg T_traction_cut_off,
    /* TargetLimits_Pkg::SDMLimitLocations::T_be */ T_internal_real_Type_SDM_Types_Pkg T_be,
    /* TargetLimits_Pkg::SDMLimitLocations::T_bs */ T_internal_real_Type_SDM_Types_Pkg T_bs,
    /* TargetLimits_Pkg::SDMLimitLocations::locations */ SDM_Locations_T_SDM_Types_Pkg *locations,
    /* TargetLimits_Pkg::SDMLimitLocations::MostRestrictiveTarget */ Target_real_T_TargetManagement_types *MostRestrictiveTarget,
    /* TargetLimits_Pkg::SDMLimitLocations::FLOIisSBI1 */ kcg_bool *FLOIisSBI1,
    /* TargetLimits_Pkg::SDMLimitLocations::v_target */ V_internal_real_Type_SDM_Types_Pkg *v_target,
    /* TargetLimits_Pkg::SDMLimitLocations::v_MRSP */ V_internal_real_Type_SDM_Types_Pkg *v_MRSP,
    /* TargetLimits_Pkg::SDMLimitLocations::v_P_SBD */ V_internal_real_Type_SDM_Types_Pkg *v_P_SBD,
    /* TargetLimits_Pkg::SDMLimitLocations::v_P_EBD */ V_internal_real_Type_SDM_Types_Pkg *v_P_EBD,
    /* TargetLimits_Pkg::SDMLimitLocations::v_P_EBD_valid */ kcg_bool *v_P_EBD_valid)
{
    V_internal_real_Type_SDM_Types_Pkg tmp;
    /* TargetLimits_Pkg::SDMLimitLocations::D_bec */ L_internal_real_Type_SDM_Types_Pkg D_bec;
    /* TargetLimits_Pkg::SDMLimitLocations::SBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types SBDcurve;
    /* TargetLimits_Pkg::SDMLimitLocations::EBDcurve */ ParabolaCurve_T_CalcBrakingCurves_types EBDcurve;
    /* TargetLimits_Pkg::SDMLimitLocations::T_Traction */ T_internal_real_Type_SDM_Types_Pkg T_Traction;
    /* TargetLimits_Pkg::SDMLimitLocations::T_berem */ T_internal_real_Type_SDM_Types_Pkg T_berem;
    /* TargetLimits_Pkg::SDMLimitLocations::DpiE */ L_internal_real_Type_SDM_Types_Pkg DpiE;
    /* TargetLimits_Pkg::SDMLimitLocations::DpiS */ L_internal_real_Type_SDM_Types_Pkg DpiS;
    /* TargetLimits_Pkg::SDMLimitLocations::V_dt */ TractionDeltaTriple_TargetLimits_Pkg V_dt;
    /* TargetLimits_Pkg::SDMLimitLocations::D_SBI2 */ L_internal_real_Type_SDM_Types_Pkg D_SBI2;
    /* TargetLimits_Pkg::SDMLimitLocations::GUICurveEnabled */ kcg_bool GUICurveEnabled;
    /* TargetLimits_Pkg::SDMLimitLocations::GUIcurve */ ParabolaCurve_T_CalcBrakingCurves_types GUIcurve;
    /* TargetLimits_Pkg::SDMLimitLocations::SBI2val */ kcg_bool SBI2val;
    /* TargetLimits_Pkg::SDMLimitLocations::_L18 */ L_internal_real_Type_SDM_Types_Pkg _L18;
    /* TargetLimits_Pkg::SDMLimitLocations::_L23 */ L_internal_real_Type_SDM_Types_Pkg _L23;
    /* TargetLimits_Pkg::SDMLimitLocations::_L21 */ L_internal_real_Type_SDM_Types_Pkg _L21;
    /* TargetLimits_Pkg::SDMLimitLocations::_L25 */ V_internal_real_Type_SDM_Types_Pkg _L25;
    /* TargetLimits_Pkg::SDMLimitLocations::_L26 */ V_internal_real_Type_SDM_Types_Pkg _L26;
    /* TargetLimits_Pkg::SDMLimitLocations::_L343 */ kcg_bool _L343;
    /* TargetLimits_Pkg::SDMLimitLocations::_L642 */ kcg_bool _L642;

    /* 1 */
    surplusTractionDeltas_TargetLimits_Pkg(
        (*odometry).acceleration,
        inhibitUnderReadingCompensation,
        isTractionCutOffImplemented,
        T_traction_cut_off,
        T_be,
        V_ura,
        T_bs,
        &T_Traction,
        &T_berem,
        &V_dt);
    /* 2 */
    TargetSelector_TargetLimits_Pkg(
        (*odometry).speed.v_safeNominal,
        targetCollection,
        curveCollection,
        T_bs,
        T_Traction,
        T_berem,
        &V_dt,
        MostRestrictiveTarget,
        &EBDcurve,
        &SBDcurve,
        &GUIcurve,
        &GUICurveEnabled,
        v_target,
        &_L23,
        &D_bec,
        &SBI2val,
        &D_SBI2);
    (*locations).d_EBI_of_V_est = D_SBI2 + (*odometry).speed.v_safeNominal * T_bs;
    (*locations).d_eoa = _L23;
    (*locations).d_svl = D_bec;
    *v_P_SBD = /* 1 */
        P_SpeedRelatedToSBD_SDM_Types_Pkg(
            GUICurveEnabled,
            (*trainLocations).d_est_frontendPos,
            (*odometry).speed.v_safeNominal,
            &GUIcurve,
            T_bs,
            &SBDcurve,
            _L23);
    /* 1 */
    v_bec_TargetLimits_Pkg(
        (*odometry).speed.v_safeNominal,
        *v_target,
        T_Traction,
        T_berem,
        &V_dt,
        &_L25,
        &D_bec);
    /* 1 */
    P_SpeedRelatedToEBD_SDM_Types_Pkg(
        (*trainLocations).d_maxSafeFrontEndPos,
        (*trainLocations).d_maxSafeFrontEndPos,
        (*odometry).speed.v_safeNominal,
        &EBDcurve,
        &GUIcurve,
        T_bs,
        *v_target,
        GUICurveEnabled,
        D_bec,
        _L25,
        v_P_EBD,
        v_P_EBD_valid);
    *v_MRSP = /* 1 */
        getMRSFromMRSP_SDM_Types_Pkg(
            MRSP_Profile,
            (*trainLocations).d_maxSafeFrontEndPos);
    /* 2 */
    MRSPPreindicationSelector_TargetLimits_Pkg(
        MRSP_Profile,
        &SBDcurve,
        &GUIcurve,
        GUICurveEnabled,
        0.0,
        0.0,
        T_bs,
        &DpiS,
        &_L343);
    (*locations).SBD_preindication_location = DpiS;
    (*locations).Preindication_SBD_location_valid = _L343;
    /* 1 */
    d_P_target_TargetLimits_Pkg(
        &EBDcurve,
        *v_target,
        T_Traction,
        T_berem,
        T_bs,
        &_L343,
        &(*locations).d_P_of_V_target);
    /* 1 */
    MRSPPreindicationSelector_TargetLimits_Pkg(
        MRSP_Profile,
        &EBDcurve,
        &GUIcurve,
        GUICurveEnabled,
        T_Traction,
        T_berem,
        T_bs,
        &DpiE,
        &_L343);
    (*locations).EBD_preindication_location = DpiE;
    (*locations).Preindication_EBD_location_valid = _L343;
    /* 1 */
    d_RSM_start_TargetLimits_Pkg(
        v_release,
        T_Traction,
        T_berem,
        &EBDcurve,
        &SBDcurve,
        (*trainLocations).d_maxSafeFrontEndPos,
        (*trainLocations).d_est_frontendPos,
        T_bs,
        T_bs,
        &_L18,
        &(*locations).EBD_RSM_start_location,
        &_L21,
        &_L343,
        &_L642);
    (*locations).SBD_RSM_start_location = _L21;
    (*locations).RSM_start_location_EBD_valid = _L343;
    (*locations).RSM_start_location_SBD_valid = _L642;
    /* 1 */
    v_SBI2_TargetLimits_Pkg(
        &EBDcurve,
        (*odometry).speed.v_safeNominal,
        *v_target,
        _L25,
        (*trainLocations).d_maxSafeFrontEndPos,
        D_bec,
        T_bs,
        &_L26,
        &_L343);
    (*locations).SBI2_of_V_est = _L26;
    /* 1 */
    v_SBI1_TargetLimits_Pkg(
        &SBDcurve,
        (*odometry).speed.v_safeNominal,
        (*trainLocations).d_est_frontendPos,
        _L23,
        T_bs,
        &_L25,
        &_L642);
    (*locations).SBI1_of_V_est = _L25;
    /* 1 */
    d_SBI1_TargetLimits_Pkg(
        &SBDcurve,
        (*odometry).speed.v_safeNominal,
        T_bs,
        &_L343,
        &_L18);
    /* 2 */
    d_limits_TargetLimits_Pkg(
        (*odometry).speed.v_safeNominal,
        _L343,
        _L18,
        SBI2val,
        D_SBI2,
        (*trainLocations).d_est_frontendPos,
        (*trainLocations).d_maxSafeFrontEndPos,
        T_bs,
        &GUIcurve,
        GUICurveEnabled,
        &(*locations).d_I_of_V_est,
        &_L23,
        &D_bec,
        &_L21,
        FLOIisSBI1);
    (*locations).d_P_of_V_est = _L23;
    (*locations).d_W_of_V_est = D_bec;
    (*locations).d_FLOI_of_V_est = _L21;
    if (*FLOIisSBI1) {
        (*locations).d_I_of_V_MRSP = DpiS;
        tmp = _L25;
    }
    else {
        (*locations).d_I_of_V_MRSP = DpiE;
        tmp = _L26;
    }
    (*locations).FLOI_of_V_est = tmp;
}