/* InfraLib::TrackDiscontinuity_CalcTrainPos */
void TrackDiscontinuity_CalcTr_InfraLib(
  /* InfraLib::TrackDiscontinuity_CalcTrainPos::DeltaIn */kcg_int DeltaIn,
  /* InfraLib::TrackDiscontinuity_CalcTrainPos::StartSection */kcg_int StartSection,
  /* InfraLib::TrackDiscontinuity_CalcTrainPos::SectionDataIn */TrackSectionData_T_InfraLib *SectionDataIn,
  outC_TrackDiscontinuity_CalcTr_InfraLib *outC)
{
  kcg_copy_TrackSectionData_T_InfraLib(&outC->_L27, SectionDataIn);
  kcg_copy_TrainPosRaw_T_InfraLib(&outC->_L29, &outC->_L27.TrainPosRaw);
  outC->_L31 = outC->_L29.TrainPos_in;
  outC->_L30 = outC->_L29.OffsetTotal;
  outC->_L26 = (kcg_real) outC->_L30;
  outC->_L23 = outC->_L31 - outC->_L26;
  outC->_L15 = DeltaIn;
  outC->_L19 = 0;
  outC->_L18 = outC->_L15 >= outC->_L19;
  outC->_L22 = 1;
  outC->_L20 = - 1;
  if (outC->_L18) {
    outC->_L21 = outC->_L22;
  }
  else {
    outC->_L21 = outC->_L20;
  }
  outC->_L24 = (kcg_real) outC->_L21;
  outC->_L25 = outC->_L23 * outC->_L24;
  outC->_L28 = StartSection;
  outC->_L33 = (kcg_real) outC->_L28;
  outC->_L32 = outC->_L25 + outC->_L33;
  outC->TrainPosCalibrated = outC->_L32;
}
/* InfraLib::TrackDiscontinuity */
void TrackDiscontinuity_InfraLib(
  /* InfraLib::TrackDiscontinuity::SectionData_in */TrackSectionData_T_InfraLib *SectionData_in,
  /* InfraLib::TrackDiscontinuity::StartSection */kcg_int StartSection,
  /* InfraLib::TrackDiscontinuity::EndSection */kcg_int EndSection,
  /* InfraLib::TrackDiscontinuity::SectionData_out */TrackSectionData_T_InfraLib *SectionData_out)
{
  static kcg_int tmp;
  /* InfraLib::TrackDiscontinuity::NewOffset */
  static kcg_int NewOffset;
  /* InfraLib::TrackDiscontinuity::_L49 */
  static kcg_int _L49;
  /* InfraLib::TrackDiscontinuity::_L63 */
  static kcg_bool _L63;
  
  _L49 = EndSection - StartSection;
  if (0 <= _L49) {
    tmp = _L49;
  }
  else {
    tmp = - _L49;
  }
  NewOffset = (*SectionData_in).TrainPosRaw.OffsetTotal + tmp;
  _L63 = ((*SectionData_in).TrainPosRaw.TrainPos_in >= (kcg_real)
        (*SectionData_in).TrainPosRaw.OffsetTotal) &
    ((*SectionData_in).TrainPosRaw.TrainPos_in < (kcg_real) NewOffset);
  kcg_copy_TrackSectionData_T_InfraLib(SectionData_out, SectionData_in);
  kcg_copy_TrainPosRaw_T_InfraLib(
    &(*SectionData_out).TrainPosRaw,
    &(*SectionData_in).TrainPosRaw);
  (*SectionData_out).TrainPosRaw.OffsetTotal = NewOffset;
  if (_L63) {
    (*SectionData_out).TrainPosRaw.TrainPosCalibrated = /* 2 */
      TrackDiscontinuity_CalcTrainPos_InfraLib(
        _L49,
        StartSection,
        SectionData_in);
  }
  else {
    (*SectionData_out).TrainPosRaw.TrainPosCalibrated = 0.0;
  }
}
/* InfraLib::TrackDiscontinuity */
void TrackDiscontinuity_InfraLib(
  /* InfraLib::TrackDiscontinuity::SectionData_in */TrackSectionData_T_InfraLib *SectionData_in,
  /* InfraLib::TrackDiscontinuity::StartSection */kcg_int StartSection,
  /* InfraLib::TrackDiscontinuity::EndSection */kcg_int EndSection,
  outC_TrackDiscontinuity_InfraLib *outC)
{
  static kcg_real tmp;
  
  kcg_copy_TrackSectionData_T_InfraLib(&outC->_L16, SectionData_in);
  kcg_copy_TrainPosRaw_T_InfraLib(&outC->_L81, &outC->_L16.TrainPosRaw);
  outC->_L83 = outC->_L81.OffsetTotal;
  outC->_L8_3 = 0;
  outC->_L3 = EndSection;
  outC->_L2 = StartSection;
  outC->_L49 = outC->_L3 - outC->_L2;
  outC->A_Input_3 = outC->_L49;
  outC->_L5_3 = outC->A_Input_3;
  outC->_L1_3 = outC->_L8_3 <= outC->_L5_3;
  outC->_L3_3 = - outC->_L5_3;
  if (outC->_L1_3) {
    outC->_L2_3 = outC->_L5_3;
  }
  else {
    outC->_L2_3 = outC->_L3_3;
  }
  outC->A_Output_3 = outC->_L2_3;
  outC->_L50 = outC->A_Output_3;
  outC->_L57 = outC->_L83 + outC->_L50;
  outC->NewOffset = outC->_L57;
  outC->_L91 = outC->NewOffset;
  kcg_copy_TrainPosRaw_T_InfraLib(&outC->_L90, &outC->_L81);
  if (kcg_true) {
    outC->_L90.OffsetTotal = outC->_L91;
  }
  outC->_L82 = outC->_L81.TrainPos_in;
  outC->_L60 = (kcg_real) outC->_L83;
  outC->_L61 = outC->_L82 >= outC->_L60;
  outC->_L59 = (kcg_real) outC->_L57;
  outC->_L62 = outC->_L82 < outC->_L59;
  outC->_L63 = outC->_L61 & outC->_L62;
  outC->tmp = outC->_L63;
  kcg_copy_TrackSectionData_T_InfraLib(&outC->_L80, SectionData_in);
  if (outC->tmp) {
    /* 2 */
    TrackDiscontinuity_CalcTr_InfraLib(
      outC->_L49,
      outC->_L2,
      &outC->_L80,
      &outC->Context_2);
    tmp = outC->Context_2.TrainPosCalibrated;
    outC->_L79 = tmp;
  }
  else {
    outC->_L79 = 0.0;
  }
  kcg_copy_TrainPosRaw_T_InfraLib(&outC->_L89, &outC->_L90);
  if (kcg_true) {
    outC->_L89.TrainPosCalibrated = outC->_L79;
  }
  kcg_copy_TrackSectionData_T_InfraLib(&outC->_L88, &outC->_L16);
  if (kcg_true) {
    kcg_copy_TrainPosRaw_T_InfraLib(&outC->_L88.TrainPosRaw, &outC->_L89);
  }
  kcg_copy_TrackSectionData_T_InfraLib(&outC->SectionData_out, &outC->_L88);
}