/* BasicLocationFunctions_Pkg::odoLoc_2_refLocations */
void odoLoc_2_refLocations_BasicLocationFunctions_Pkg(
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::refLoc_2 */ LocWithInAcc_T_Obu_BasicTypes_Pkg *refLoc_2,
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::refLoc_1 */ LocWithInAcc_T_Obu_BasicTypes_Pkg *refLoc_1,
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::refOdo_2 */ OdometryLocations_T_Obu_BasicTypes_Pkg *refOdo_2,
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::refOdo_1 */ OdometryLocations_T_Obu_BasicTypes_Pkg *refOdo_1,
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::odo */ OdometryLocations_T_Obu_BasicTypes_Pkg *odo,
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::location */ LocWithInAcc_T_Obu_BasicTypes_Pkg *location)
{
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations */ LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::_L1 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L1;
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::_L11 */ kcg_bool _L11;
  /* BasicLocationFunctions_Pkg::odoLoc_2_refLocations::_L10 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L10;
  
  /* 1 */
  add_odo_2_Location_BasicLocationFunctions_Pkg(refLoc_1, refOdo_1, odo, &_L1);
  /* 2 */
  add_odo_2_Location_BasicLocationFunctions_Pkg(refLoc_2, refOdo_2, odo, &tmp);
  /* 1 */
  overlapOf_2_Locations_BasicLocationFunctions_Pkg(&tmp, &_L1, &_L10, &_L11);
  /* 1 */ if (_L11) {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(location, &_L10);
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(location, &_L1);
  }
}
/* EVC_MEM_Support_Pkg::maintainTrainProperties */
void maintainTrainProperties_EVC_MEM_Support_Pkg(
  /* EVC_MEM_Support_Pkg::maintainTrainProperties::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* EVC_MEM_Support_Pkg::maintainTrainProperties::trainRunningNumber */ DMI_Train_Running_Number_T_DMI_Messages_Bothways_Pkg *trainRunningNumber,
  /* EVC_MEM_Support_Pkg::maintainTrainProperties::trainData */ trainData_T_TIU_Types_Pkg *trainData,
  /* EVC_MEM_Support_Pkg::maintainTrainProperties::nid_engine */ NID_ENGINE nid_engine,
  /* EVC_MEM_Support_Pkg::maintainTrainProperties::UpdatedtrainProperties */ trainProperties_T_TrainPosition_Types_Pck *UpdatedtrainProperties)
{
  (*UpdatedtrainProperties).nid_engine = nid_engine;
  (*UpdatedtrainProperties).l_train = (*trainData).trainLength / 100;
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*UpdatedtrainProperties).d_baliseAntenna_2_frontend,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cD_Antenna2FE);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*UpdatedtrainProperties).d_frontend_2_rearend,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cD_FE2RE);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*UpdatedtrainProperties).locationAccuracy_DefaultValue,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cLocationAccuracyDefault);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*UpdatedtrainProperties).centerDetectionAcc_DefaultValue,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cCenterDetectionAccuracyDefault);
  /* 1 */ if ((*trainRunningNumber).valid) {
    (*UpdatedtrainProperties).nid_operational =
      (*trainRunningNumber).trainRunningNumber;
  }
  else {
    (*UpdatedtrainProperties).nid_operational =
      (*trainProperties).nid_operational;
  }
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::positionLinkedBGs */
void positionLinkedBGs_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::positionLinkedBGs::passedPositionedBG */ positionedBG_T_TrainPosition_Types_Pck *passedPositionedBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::positionLinkedBGs::linkedBGs */ LinkedBGs_T_BG_Types_Pkg *linkedBGs,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::positionLinkedBGs::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::positionLinkedBGs::linkedPositionedBGs */ linkedBGs_asPositionedBGs_T_TrainPosition_Types_Pck *linkedPositionedBGs)
{
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::positionLinkedBGs */ LocWithInAcc_T_Obu_BasicTypes_Pkg acc;
  kcg_int i;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::positionLinkedBGs::_L6 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L6;
  
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &_L6,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  for (i = 0; i < 33; i++) {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&acc, &_L6);
    /* 1 */
    positionLinkedBGs_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      &acc,
      passedPositionedBG,
      &(*linkedBGs)[i],
      trainProperties,
      &_L6,
      &(*linkedPositionedBGs)[i]);
  }
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation */
void improveUnlinkedBGLocation_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::passedLinkedBG_2 */ positionedBG_T_TrainPosition_Types_Pck *passedLinkedBG_2,
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::passedLinkedBG_1 */ positionedBG_T_TrainPosition_Types_Pck *passedLinkedBG_1,
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::unlinkedBG_in */ positionedBG_T_TrainPosition_Types_Pck *unlinkedBG_in,
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::unlinkedBG_out */ positionedBG_T_TrainPosition_Types_Pck *unlinkedBG_out)
{
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation */
    static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::_L31 */
    static kcg_bool _L31;
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::_L30 */
    static LocWithInAcc_T_Obu_BasicTypes_Pkg _L30;

    /* 1 */
    odoLoc_2_refLocations_BasicLocationFunctions_Pkg(
        &(*passedLinkedBG_2).location,
        &(*passedLinkedBG_1).location,
        &(*passedLinkedBG_2).infoFromPassing.BG_Header.bgPosition.odo,
        &(*passedLinkedBG_1).infoFromPassing.BG_Header.bgPosition.odo,
        &(*unlinkedBG_in).infoFromPassing.BG_Header.bgPosition.odo,
        &tmp);
    /* 1 */
    overlapOf_2_Locations_BasicLocationFunctions_Pkg(
        &tmp,
        &(*unlinkedBG_in).location,
        &_L30,
        &_L31);
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        unlinkedBG_out,
        unlinkedBG_in);
    /* 1 */ if ((*passedLinkedBG_2).valid & ((*passedLinkedBG_2).q_link ==
                Q_LINK_Linked) & (*passedLinkedBG_2).infoFromPassing.valid &
                !kcg_comp_positionedBG_T_TrainPosition_Types_Pck(
                    passedLinkedBG_2,
                    passedLinkedBG_1) & ((*passedLinkedBG_1).valid &
                                         ((*passedLinkedBG_1).q_link == Q_LINK_Linked) &
                                         (*passedLinkedBG_1).infoFromPassing.valid) & ((*unlinkedBG_in).valid &
                                                 ((*unlinkedBG_in).q_link == Q_LINK_Unlinked)) & _L31) {
        kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
            &(*unlinkedBG_out).location,
            &_L30);
    }
    else {
        kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
            &(*unlinkedBG_out).location,
            &(*unlinkedBG_in).location);
    }
}
예제 #5
0
/* MA_Request::op_3_8_2_3_a */
void op_3_8_2_3_a_MA_Request(
  /* MA_Request::op_3_8_2_3_a::t_mar */T_MAR t_mar,
  /* MA_Request::op_3_8_2_3_a::trainPosition */trainPosition_T_TrainPosition_Types_Pck *trainPosition,
  /* MA_Request::op_3_8_2_3_a::preindicationLoc */L_internal_Type_Obu_BasicTypes_Pkg preindicationLoc,
  /* MA_Request::op_3_8_2_3_a::odometry */odometry_T_Obu_BasicTypes_Pkg *odometry,
  outC_op_3_8_2_3_a_MA_Request *outC)
{
  outC->_L2 = t_mar;
  outC->_L17 = (kcg_real) outC->_L2;
  outC->_L3 = preindicationLoc;
  kcg_copy_trainPosition_T_TrainPosition_Types_Pck(&outC->_L1, trainPosition);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &outC->_L5,
    &outC->_L1.trainPosition);
  outC->_L7 = outC->_L5.d_max;
  outC->_L8 = outC->_L3 - outC->_L7;
  outC->_L10 = (kcg_real) outC->_L8;
  outC->_L13 = 100.0;
  /* 1 */ Safe_DIV_real(outC->_L10, outC->_L13, &outC->Context_1);
  outC->_L12 = outC->Context_1.Result;
  kcg_copy_odometry_T_Obu_BasicTypes_Pkg(&outC->_L4, odometry);
  kcg_copy_OdometrySpeeds_T_Obu_BasicTypes_Pkg(&outC->_L9, &outC->_L4.speed);
  outC->_L19 = outC->_L9.v_upper;
  outC->_L11 = (kcg_real) outC->_L19;
  outC->_L14 = 0.28;
  outC->_L15 = outC->_L11 * outC->_L14;
  /* 2 */ Safe_DIV_real(outC->_L12, outC->_L15, &outC->Context_2);
  outC->_L16 = outC->Context_2.Result;
  outC->_L18 = outC->_L17 <= outC->_L16;
  outC->triggerMA = outC->_L18;
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfPassedBG_by_id */
void indexOfPassedBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfPassedBG_by_id::BG */passedBG_T_BG_Types_Pkg *BG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfPassedBG_by_id::BGs */positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfPassedBG_by_id::enable */kcg_bool enable,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfPassedBG_by_id::indexOfBG */kcg_int *indexOfBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfPassedBG_by_id::BG_found */kcg_bool *BG_found,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfPassedBG_by_id::indexValid */kcg_bool *indexValid)
{
  static struct__129113 tmp;
  
  tmp.valid = (*BG).valid & (*BG).BG_Header.valid;
  tmp.nid_c = (*BG).BG_Header.nid_c;
  tmp.nid_bg = (*BG).BG_Header.nid_bg;
  tmp.q_link = (*BG).BG_Header.q_link;
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &tmp.location,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  tmp.seqNoOnTrack = 0;
  kcg_copy_infoFromLinking_T_TrainPosition_Types_Pck(
    &tmp.infoFromLinking,
    (infoFromLinking_T_TrainPosition_Types_Pck *)
      &cNoInfoFromLinking_CalculateTrainPosition_Pkg);
  kcg_copy_passedBG_T_BG_Types_Pkg(&tmp.infoFromPassing, BG);
  tmp.missed = kcg_false;
  /* 1 */
  indexOfBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &tmp,
    BGs,
    enable,
    indexOfBG,
    BG_found,
    indexValid);
}
/* TA_Lib_internal::Get_Position_of_LRBG */
L_internal_Type_Obu_BasicTypes_Pkg Get_Position_of_LRBG_TA_Lib_internal(
  /* TA_Lib_internal::Get_Position_of_LRBG::MessageIn */ ReceivedMessage_T_Common_Types_Pkg *MessageIn,
  /* TA_Lib_internal::Get_Position_of_LRBG::balisegroups */ positionedBGs_T_TrainPosition_Types_Pck *balisegroups)
{
  /* TA_Lib_internal::Get_Position_of_LRBG */ positionedBG_T_TrainPosition_Types_Pck mk_struct;
  /* TA_Lib_internal::Get_Position_of_LRBG */ positionedBG_T_TrainPosition_Types_Pck tmp;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L3 */ kcg_bool _L3;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L2 */ kcg_bool _L2;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L1 */ kcg_int _L1;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L5 */ kcg_int _L5;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L6 */ kcg_int _L6;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L9 */ kcg_bool _L9;
  /* TA_Lib_internal::Get_Position_of_LRBG::Position */ L_internal_Type_Obu_BasicTypes_Pkg Position;
  
  /* 1 */ Eval_LRBG_TA_Lib_internal(MessageIn, &_L9, &_L6, &_L5);
  mk_struct.valid = _L9;
  mk_struct.nid_c = _L6;
  mk_struct.nid_bg = _L5;
  mk_struct.q_link = DEFAULT_q_link_TA_Lib_internal;
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &mk_struct.location,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &DEFAULT_location_TA_Lib_internal);
  mk_struct.seqNoOnTrack = 0;
  kcg_copy_infoFromLinking_T_TrainPosition_Types_Pck(
    &mk_struct.infoFromLinking,
    (infoFromLinking_T_TrainPosition_Types_Pck *)
      &DEFAULT_InfoFromLinking_TA_Lib_internal);
  kcg_copy_passedBG_T_BG_Types_Pkg(
    &mk_struct.infoFromPassing,
    (passedBG_T_BG_Types_Pkg *) &DEFAULT_InfoFromPassing_TA_Lib_internal);
  mk_struct.missed = kcg_false;
  /* 1 */
  indexOfBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &mk_struct,
    balisegroups,
    kcg_true,
    &_L1,
    &_L2,
    &_L3);
  if ((0 <= _L1) & (_L1 < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*balisegroups)[_L1]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &DEFAULT_positioned_BG_TA_Lib_internal);
  }
  Position = tmp.location.nominal;
  return Position;
}
/* ProvidePositionReport_Pkg::AddBGToFIFO */
void AddBGToFIFO_ProvidePositionReport_Pkg(
  /* ProvidePositionReport_Pkg::AddBGToFIFO::reportedBGs */ ReportedBGList_T_ProvidePositionReport_Pkg *reportedBGs,
  /* ProvidePositionReport_Pkg::AddBGToFIFO::reportIsSent */ kcg_bool reportIsSent,
  /* ProvidePositionReport_Pkg::AddBGToFIFO::trainPos */ trainPosition_T_TrainPosition_Types_Pck *trainPos,
  /* ProvidePositionReport_Pkg::AddBGToFIFO::out_reportedBGs */ ReportedBGList_T_ProvidePositionReport_Pkg *out_reportedBGs)
{
  /* 1 */ if (reportIsSent) {
    (*out_reportedBGs)[0].valid = reportIsSent;
    (*out_reportedBGs)[0].nidBG = (*trainPos).LRBG.nid_bg;
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &(*out_reportedBGs)[0].location,
      &(*trainPos).LRBG.location);
    kcg_copy_ReportedBG_T_ProvidePositionReport_Pkg(
      &(*out_reportedBGs)[1],
      &(*reportedBGs)[0]);
    kcg_copy_ReportedBG_T_ProvidePositionReport_Pkg(
      &(*out_reportedBGs)[2],
      &(*reportedBGs)[1]);
    kcg_copy_ReportedBG_T_ProvidePositionReport_Pkg(
      &(*out_reportedBGs)[3],
      &(*reportedBGs)[2]);
    kcg_copy_ReportedBG_T_ProvidePositionReport_Pkg(
      &(*out_reportedBGs)[4],
      &(*reportedBGs)[3]);
    kcg_copy_ReportedBG_T_ProvidePositionReport_Pkg(
      &(*out_reportedBGs)[5],
      &(*reportedBGs)[4]);
    kcg_copy_ReportedBG_T_ProvidePositionReport_Pkg(
      &(*out_reportedBGs)[6],
      &(*reportedBGs)[5]);
    kcg_copy_ReportedBG_T_ProvidePositionReport_Pkg(
      &(*out_reportedBGs)[7],
      &(*reportedBGs)[6]);
  }
  else {
    kcg_copy_ReportedBGList_T_ProvidePositionReport_Pkg(
      out_reportedBGs,
      reportedBGs);
  }
}
/* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed */
void linkedBG_missed_CalculateTrainPosition_Pkg_Linking_Pkg(
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::position */ LocWithInAcc_T_Obu_BasicTypes_Pkg *position,
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::BGs_in */ positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::enable */ kcg_bool enable,
  outC_linkedBG_missed_CalculateTrainPosition_Pkg_Linking_Pkg *outC)
{
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp1;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L1 */
  static kcg_bool _L1;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L52 */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg _L52;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L69 */
  static kcg_bool _L69;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L67 */
  static kcg_int _L67;
  
  /* last_init_ck_position */ if (outC->init) {
    outC->init = kcg_false;
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->BG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
    outC->indexOfBG = cNoValidIndex_CalculateTrainPosition_Pkg;
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &_L52,
      (LocWithInAcc_T_Obu_BasicTypes_Pkg *)
        &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&outC->BG, &outC->_L3);
    outC->indexOfBG = outC->_L2;
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&_L52, &outC->rem_position);
  }
  /* 2 */ sub_2_distances_BasicLocationFunctions_Pkg(position, &_L52, &tmp1);
  _L1 = tmp1.nominal >= 0;
  /* ck_movedAhead */ if (_L1) {
    tmp.nominal = (*position).nominal;
    tmp.d_min = _L52.nominal + _L52.d_min - (*position).nominal;
    tmp.d_max = (*position).d_max;
  }
  else {
    tmp.nominal = (*position).nominal;
    tmp.d_min = (*position).d_min;
    tmp.d_max = _L52.nominal + _L52.d_max - (*position).nominal;
  }
  /* 1 */
  posInRangeOfBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &tmp,
    BGs_in,
    enable,
    &_L1,
    &outC->_L2,
    &outC->_L3);
  /* 1 */ FallingEdge_digital(_L1, &outC->Context_1);
  outC->missed = ((/* 1 */
        positionedBGs_ids_notEqual_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
          &outC->_L3,
          &outC->BG) & _L1) | outC->Context_1.FE_Output) & (outC->BG.q_link ==
      Q_LINK_Linked) & !outC->BG.infoFromPassing.valid;
  outC->BG.missed = outC->missed;
  /* 1 */
  indexOfBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &outC->BG,
    BGs_in,
    outC->missed,
    &_L67,
    &_L1,
    &_L69);
  /* 1 */ if (_L1 & outC->missed) {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(&outC->BGs_out, BGs_in);
    if ((0 <= _L67) & (_L67 < 41)) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &outC->BGs_out[_L67],
        &outC->BG);
    }
  }
  else {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(&outC->BGs_out, BGs_in);
  }
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&outC->rem_position, position);
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr */
void recalculate_BG_locations_ahead_itr_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refBGs_in */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::BG_in */ positionedBG_T_TrainPosition_Types_Pck *BG_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refBGs_out */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_out,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr */ LocWithInAcc_T_Obu_BasicTypes_Pkg tmp1;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr */ positionedBG_T_TrainPosition_Types_Pck tmp;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::BGin_is_refBG */ kcg_bool BGin_is_refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refLocation */ LocWithInAcc_T_Obu_BasicTypes_Pkg refLocation;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refBG */ positionedBG_T_TrainPosition_Types_Pck refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::relocatedBG */ positionedBG_T_TrainPosition_Types_Pck relocatedBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::sumOfBestDistances */ LocWithInAcc_T_Obu_BasicTypes_Pkg sumOfBestDistances;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L96 */ kcg_bool _L96;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L106 */ kcg_bool _L106;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L137 */ kcg_bool _L137;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L302 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L302;
  
  BGin_is_refBG = /* 3 */
    positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      &(*refBGs_in).refBG,
      BG_in);
  (*refBGs_out).recalculate = BGin_is_refBG | ((*refBGs_in).recalculate &
      (*BG_in).valid);
  /* calculateLocalBGInaccuracies */
  calculateLocalBGInaccuracies_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
    BG_in,
    trainProperties,
    &refLocation);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &_L302,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  _L302.nominal = (*BG_in).location.nominal;
  /* 6 */
  add_2_Distances_BasicLocationFunctions_Pkg(&refLocation, &_L302, &tmp1);
  /* 1 */
  overlapOf_2_Locations_BasicLocationFunctions_Pkg(
    &tmp1,
    &(*BG_in).location,
    &_L302,
    &_L106);
  /* 14 */ if (BGin_is_refBG) {
    /* 31 */ if (_L106) {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&refLocation, &_L302);
    }
    else {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
        &refLocation,
        &(*BG_in).location);
    }
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &refLocation,
      &(*BG_in).location);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &relocatedBG,
    &(*refBGs_in).refBG);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &relocatedBG.location,
    &refLocation);
  /* 24 */ if (BGin_is_refBG) {
    /* 25 */ if ((*refBGs_in).refBG.valid &
      (*refBGs_in).refBG.infoFromLinking.valid) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&refBG, &relocatedBG);
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
        &refBG.infoFromLinking.expectedLocation,
        &refLocation);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&refBG, &relocatedBG);
    }
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &refBG,
      &(*refBGs_in).refBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&(*refBGs_out).refBG, &refBG);
  _L106 = Q_LINK_Linked == refBG.q_link;
  _L96 = BGin_is_refBG & !_L106 & refBG.infoFromPassing.valid &
    (*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).prevLinkedBG.infoFromPassing.valid;
  /* 2 */
  sub_2_odoDistances_BasicLocationFunctions_Pkg(
    &refBG.infoFromPassing.BG_Header.bgPosition.odo,
    &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
    &tmp1);
  /* 9 */
  add_2_Distances_BasicLocationFunctions_Pkg(
    &tmp1,
    &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.BG_centerDetectionInaccuraccuracies,
    &_L302);
  /* 27 */ if (BGin_is_refBG & (*BG_in).valid) {
    /* 30 */ if (_L96) {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&tmp1, &_L302);
    }
    else {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
        &tmp1,
        (LocWithInAcc_T_Obu_BasicTypes_Pkg *)
          &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
    }
    /* 4 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cLocWithInAcc_0_Obu_BasicTypes_Pkg,
      &tmp1,
      &sumOfBestDistances);
  }
  else /* 28 */ if ((*BG_in).valid & (*BG_in).infoFromLinking.valid) {
    /* 7 */
    add_2_Distances_BasicLocationFunctions_Pkg(
      &(*BG_in).infoFromLinking.d_link,
      &(*refBGs_in).sumOfBestDistances,
      &sumOfBestDistances);
  }
  else /* 29 */ if ((*BG_in).valid & ((*BG_in).q_link == Q_LINK_Linked) &
    (*BG_in).infoFromPassing.valid & (*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).prevLinkedBG.infoFromPassing.valid) {
    /* 4 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &(*BG_in).infoFromPassing.BG_Header.bgPosition.odo,
      &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
      &refLocation);
    /* 8 */
    add_2_Distances_BasicLocationFunctions_Pkg(
      &refLocation,
      &(*refBGs_in).sumOfBestDistances,
      &sumOfBestDistances);
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &sumOfBestDistances,
      &(*refBGs_in).sumOfBestDistances);
  }
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*refBGs_out).sumOfBestDistances,
    &sumOfBestDistances);
  /* 23 */ if ((*refBGs_in).recalculate) {
    /* 1 */
    recalculate_BG_location_ahead_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
      BG_in,
      &(*refBGs_in).prevLinkedBG,
      &(*refBGs_in).refBG,
      &sumOfBestDistances,
      trainProperties,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&relocatedBG, BG_in);
  }
  _L137 = Q_LINK_Unlinked == refBG.q_link;
  /* 17 */ if (BGin_is_refBG & _L106) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &refBG);
  }
  else /* 18 */ if (_L96) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevLinkedBG);
    /* 2 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &refBG.location,
      &_L302,
      &tmp.location);
  }
  else /* 19 */ if (Q_LINK_Linked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevLinkedBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &(*refBGs_out).prevLinkedBG,
    &tmp);
  /* 20 */ if (BGin_is_refBG & _L137) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &refBG);
  }
  else /* 21 */ if (BGin_is_refBG & !_L137 & refBG.infoFromPassing.valid &
    (*refBGs_in).prevUnlinkedBG.valid &
    (*refBGs_in).prevUnlinkedBG.infoFromPassing.valid) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevUnlinkedBG);
    /* 3 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &refBG.infoFromPassing.BG_Header.bgPosition.odo,
      &(*refBGs_in).prevUnlinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
      &refLocation);
    /* 12 */
    add_2_Distances_BasicLocationFunctions_Pkg(
      &refLocation,
      &(*refBGs_in).prevUnlinkedBG.infoFromPassing.BG_Header.BG_centerDetectionInaccuraccuracies,
      &tmp1);
    /* 3 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &refBG.location,
      &tmp1,
      &tmp.location);
  }
  else /* 22 */ if (Q_LINK_Unlinked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevUnlinkedBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &(*refBGs_out).prevUnlinkedBG,
    &tmp);
  /* 26 */ if (BGin_is_refBG) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &refBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &relocatedBG);
  }
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr */
void recalculate_BG_locations_astern_itr_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::refBGs_in */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::BG_in */ positionedBG_T_TrainPosition_Types_Pck *BG_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::refBGs_out */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_out,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp1;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::BGin_is_refBG */
  static kcg_bool BGin_is_refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::refBG */
  static positionedBG_T_TrainPosition_Types_Pck refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::relocatedBG */
  static positionedBG_T_TrainPosition_Types_Pck relocatedBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::sumOfBestDistances */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg sumOfBestDistances;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::_L106 */
  static kcg_bool _L106;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::_L137 */
  static kcg_bool _L137;
  
  BGin_is_refBG = /* 1 */
    positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      &(*refBGs_in).refBG,
      BG_in);
  (*refBGs_out).recalculate = BGin_is_refBG | ((*refBGs_in).recalculate &
      (*BG_in).valid);
  /* 13 */ if (BGin_is_refBG) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&refBG, BG_in);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &refBG,
      &(*refBGs_in).refBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&(*refBGs_out).refBG, &refBG);
  _L106 = Q_LINK_Linked == refBG.q_link;
  _L137 = (*BG_in).valid & ((*BG_in).q_link == Q_LINK_Linked);
  /* 16 */ if (BGin_is_refBG) {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &sumOfBestDistances,
      (LocWithInAcc_T_Obu_BasicTypes_Pkg *)
        &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  }
  else /* 17 */ if (!(*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).refBG.valid & ((*refBGs_in).refBG.q_link == Q_LINK_Unlinked) &
    (*refBGs_in).refBG.infoFromPassing.valid & (*BG_in).infoFromPassing.valid &
    _L137) {
    /* 2 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).refBG.infoFromPassing.BG_Header.bgPosition.odo,
      &(*BG_in).infoFromPassing.BG_Header.bgPosition.odo,
      &tmp1);
    /* 3 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).sumOfBestDistances,
      &tmp1,
      &sumOfBestDistances);
  }
  else /* 14 */ if (_L137 & (*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).prevLinkedBG.infoFromLinking.valid) {
    /* 1 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).sumOfBestDistances,
      &(*refBGs_in).prevLinkedBG.infoFromLinking.d_link,
      &sumOfBestDistances);
  }
  else /* 15 */ if (_L137 & (*refBGs_in).prevLinkedBG.valid &
    !(*refBGs_in).prevLinkedBG.infoFromLinking.valid &
    (*refBGs_in).prevLinkedBG.infoFromPassing.valid &
    (*BG_in).infoFromPassing.valid) {
    /* 1 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
      &(*BG_in).infoFromPassing.BG_Header.bgPosition.odo,
      &tmp);
    /* 2 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).sumOfBestDistances,
      &tmp,
      &sumOfBestDistances);
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &sumOfBestDistances,
      &(*refBGs_in).sumOfBestDistances);
  }
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*refBGs_out).sumOfBestDistances,
    &sumOfBestDistances);
  /* 9 */ if ((*refBGs_in).recalculate) {
    /* 1 */
    recalculate_BG_location_astern_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
      BG_in,
      &(*refBGs_in).prevLinkedBG,
      &(*refBGs_in).refBG,
      &sumOfBestDistances,
      trainProperties,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&relocatedBG, BG_in);
  }
  _L137 = Q_LINK_Unlinked == refBG.q_link;
  /* 3 */ if (BGin_is_refBG & _L106) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      &refBG);
  }
  else /* 4 */ if (BGin_is_refBG & !_L106) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  else /* 5 */ if (Q_LINK_Linked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      &(*refBGs_in).prevLinkedBG);
  }
  /* 8 */ if (BGin_is_refBG & _L137) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      &refBG);
  }
  else /* 7 */ if (BGin_is_refBG & !_L137) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  else /* 6 */ if (Q_LINK_Unlinked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      &(*refBGs_in).prevUnlinkedBG);
  }
  /* 12 */ if (BGin_is_refBG) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &refBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &relocatedBG);
  }
}
/* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes */
void calculateTrainpositionAttributes_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes::trainPositionInfo */ trainPositionInfo_T_TrainPosition_Types_Pck *trainPositionInfo,
  /* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes::currentOdometry */ odometry_T_Obu_BasicTypes_Pkg *currentOdometry,
  /* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes::trainPosition */ trainPosition_T_TrainPosition_Types_Pck *trainPosition)
{
  /* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes::_L243 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L243;
  /* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes::_L266 */ kcg_bool _L266;
  /* CalculateTrainPosition_Pkg::calculateTrainpositionAttributes::_L366 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L366;
  
  (*trainPosition).valid = (*trainPositionInfo).valid;
  (*trainPosition).timestamp = (*trainPositionInfo).timestamp;
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*trainPosition).trainPosition,
    &(*trainPositionInfo).trainPosition);
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &(*trainPosition).LRBG,
    &(*trainPositionInfo).lastPassedLinkedBG);
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &(*trainPosition).prvLRBG,
    &(*trainPositionInfo).prevPassedLinkedBG);
  (*trainPosition).linkingIsUsedOnboard =
    (*trainPositionInfo).linkingIsUsedOnboard;
  _L266 = !(*trainPositionInfo).lastPassedLinkedBG.valid;
  (*trainPosition).noCoordinateSystemHasBeenAssigned = _L266 |
    (*trainPositionInfo).lastPassedLinkedBG.infoFromPassing.BG_Header.noCoordinateSystemHasBeenAssigned;
  /* 1 */
  add_2_Distances_BasicLocationFunctions_Pkg(
    &(*trainPositionInfo).trainPosition,
    &(*trainProperties).d_baliseAntenna_2_frontend,
    &_L243);
  (*trainPosition).estimatedFrontEndPosition = _L243.nominal;
  (*trainPosition).minSafeFrontEndPosition = _L243.nominal + _L243.d_min;
  (*trainPosition).maxSafeFrontEndPostion = _L243.nominal + _L243.d_max;
  /* 1 */
  sub_2_distances_BasicLocationFunctions_Pkg(
    &_L243,
    &(*trainProperties).d_frontend_2_rearend,
    &_L366);
  (*trainPosition).estimatedRearEndPosition = _L366.nominal;
  (*trainPosition).minSafeRearEndPosition = _L366.nominal + _L366.d_min;
  (*trainPosition).maxSafeRearEndPosition = _L366.nominal + _L366.d_max;
  (*trainPosition).trainPositionIsUnknown = _L266 | (/* nidC_nidBG_2_NIDLRBG */
      nidC_nidBG_2_NIDLRBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        (*trainPositionInfo).lastPassedLinkedBG.valid,
        (*trainPositionInfo).lastPassedLinkedBG.nid_c,
        (*trainPositionInfo).lastPassedLinkedBG.nid_bg) ==
      cNID_LRBG_unknown_BG_Types_Pkg);
  (*trainPosition).nominalOrReverseToLRBG = /* 1 */
    frontendToLRBG_CalculateTrainPosition_Pkg_Pos_Pkg(
      &(*trainPositionInfo).lastPassedLinkedBG,
      trainPositionInfo,
      trainProperties);
  /* 1 */ if (_L266) {
    (*trainPosition).trainOrientationToLRBG = Q_DIRLRBG_Unknown;
  }
  else {
    (*trainPosition).trainOrientationToLRBG =
      (*trainPositionInfo).lastPassedLinkedBG.infoFromPassing.BG_Header.trainOrientationToBG;
  }
  (*trainPosition).trainRunningDirectionToLRBG = /* 1 */
    trainMoveDir_vs_refBG_CalculateTrainPosition_Pkg_Pos_Pkg(
      currentOdometry,
      &(*trainPositionInfo).lastPassedLinkedBG);
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern */
void recalculate_BG_location_astern_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::BG_in */ positionedBG_T_TrainPosition_Types_Pck *BG_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::prevLinkedBG */ positionedBG_T_TrainPosition_Types_Pck *prevLinkedBG,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::refBG */ positionedBG_T_TrainPosition_Types_Pck *refBG,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::sumOfBestDistances */ LocWithInAcc_T_Obu_BasicTypes_Pkg *sumOfBestDistances,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern */ LocWithInAcc_T_Obu_BasicTypes_Pkg tmp1;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern */ LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::_L181 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L181;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::_L195 */ kcg_bool _L195;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_location_astern::_L212 */ kcg_bool _L212;
  
  /* 1 */
  add_2_Distances_BasicLocationFunctions_Pkg(
    &(*refBG).location,
    sumOfBestDistances,
    &tmp1);
  /* 1 */
  calculateLocalBGInaccuracies_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
    BG_in,
    trainProperties,
    &tmp);
  /* 1 */ sub_2_distances_BasicLocationFunctions_Pkg(&tmp1, &tmp, &_L181);
  /* 1 */
  sub_2_odoDistances_BasicLocationFunctions_Pkg(
    &(*prevLinkedBG).infoFromPassing.BG_Header.bgPosition.odo,
    &(*BG_in).infoFromPassing.BG_Header.bgPosition.odo,
    &tmp);
  /* 3 */
  add_2_Distances_BasicLocationFunctions_Pkg(
    &(*BG_in).infoFromPassing.BG_Header.BG_centerDetectionInaccuraccuracies,
    &tmp,
    &tmp1);
  /* 3 */
  sub_2_distances_BasicLocationFunctions_Pkg(
    &(*prevLinkedBG).location,
    &tmp1,
    &tmp);
  /* 1 */
  overlapOf_2_Locations_BasicLocationFunctions_Pkg(&_L181, &tmp, &tmp1, &_L212);
  _L195 = (*BG_in).valid & (*BG_in).infoFromPassing.valid &
    (*prevLinkedBG).valid & (*prevLinkedBG).infoFromPassing.valid;
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, BG_in);
  /* 1 */ if ((*BG_in).valid & (*refBG).valid & ((*BG_in).q_link ==
      Q_LINK_Linked)) {
    /* 3 */ if (_L212 & _L195) {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&(*BG_out).location, &tmp1);
    }
    else {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&(*BG_out).location, &_L181);
    }
  }
  else /* 2 */ if (_L195) {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&(*BG_out).location, &tmp);
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &(*BG_out).location,
      &(*BG_in).location);
  }
}