/* Contributed in the public domain. * Licensed to CS Systèmes d'Information (CS) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * CS licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.orekit.files.ccsds; import org.orekit.errors.OrekitException; import org.orekit.errors.OrekitMessages; import org.orekit.time.AbsoluteDate; import org.orekit.time.DateTimeComponents; import org.orekit.time.TimeScale; import org.orekit.time.TimeScalesFactory; import org.orekit.utils.Constants; import org.orekit.utils.IERSConventions; /** * The set of time scales defined in Annex A of the ODM CCSDS standard 502.0-B-2. * * @author Evan Ward */ public enum CcsdsTimeScale { /** Greenwich Mean Sidereal Time. */ GMST { @Override public TimeScale getTimeScale(final IERSConventions conventions) throws OrekitException { return TimeScalesFactory.getGMST(conventions, false); } }, /** Global Positioning System. */ GPS { @Override public TimeScale getTimeScale(final IERSConventions conventions) { return TimeScalesFactory.getGPS(); } }, /** Mission Elapsed Time. */ MET { @Override public AbsoluteDate parseDate(final String date, final IERSConventions conventions, final AbsoluteDate missionReferenceDate) { final DateTimeComponents clock = DateTimeComponents.parseDateTime(date); final double offset = clock.getDate().getYear() * Constants.JULIAN_YEAR + clock.getDate().getDayOfYear() * Constants.JULIAN_DAY + clock.getTime().getSecondsInUTCDay(); return missionReferenceDate.shiftedBy(offset); } @Override public TimeScale getTimeScale(final IERSConventions conventions) throws OrekitException { throw new OrekitException( OrekitMessages.CCSDS_NO_CORRESPONDING_TIME_SCALE, "MET"); } }, /** Mission Relative Time. */ MRT { @Override public AbsoluteDate parseDate(final String date, final IERSConventions conventions, final AbsoluteDate missionReferenceDate) { final DateTimeComponents clock = DateTimeComponents.parseDateTime(date); final double offset = clock.getDate().getYear() * Constants.JULIAN_YEAR + clock.getDate().getDayOfYear() * Constants.JULIAN_DAY + clock.getTime().getSecondsInUTCDay(); return missionReferenceDate.shiftedBy(offset); } @Override public TimeScale getTimeScale(final IERSConventions conventions) throws OrekitException { throw new OrekitException( OrekitMessages.CCSDS_NO_CORRESPONDING_TIME_SCALE, "MRT"); } }, /** Spacecraft Clock. Not currently Implemented. */ SCLK { @Override public AbsoluteDate parseDate(final String date, final IERSConventions conventions, final AbsoluteDate missionReferenceDate) throws OrekitException { throw new OrekitException( OrekitMessages.CCSDS_TIME_SYSTEM_NOT_IMPLEMENTED, this.name()); } @Override public TimeScale getTimeScale(final IERSConventions conventions) throws OrekitException { throw new OrekitException( OrekitMessages.CCSDS_NO_CORRESPONDING_TIME_SCALE, this.name()); } }, /** International Atomic Time. */ TAI { @Override public TimeScale getTimeScale(final IERSConventions conventions) { return TimeScalesFactory.getTAI(); } }, /** Barycentric Coordinate Time. */ TCB { @Override public TimeScale getTimeScale(final IERSConventions conventions) { return TimeScalesFactory.getTCB(); } }, /** Barycentric Dynamical Time. */ TDB { @Override public TimeScale getTimeScale(final IERSConventions conventions) throws OrekitException { return TimeScalesFactory.getTDB(); } }, /** Geocentric Coordinate Time. */ TCG { @Override public TimeScale getTimeScale(final IERSConventions conventions) { return TimeScalesFactory.getTCG(); } }, /** Terrestrial Time. */ TT { @Override public TimeScale getTimeScale(final IERSConventions conventions) { return TimeScalesFactory.getTT(); } }, /** Universal Time. */ UT1 { @Override public TimeScale getTimeScale(final IERSConventions conventions) throws OrekitException { return TimeScalesFactory.getUT1(conventions, false); } }, /** Universal Coordinated Time. */ UTC { @Override public TimeScale getTimeScale(final IERSConventions conventions) throws OrekitException { return TimeScalesFactory.getUTC(); } }; /** * Parse a date in this time scale. * * @param date a CCSDS date string. * @param conventions IERS conventions for {@link #UT1} and {@link #GMST}. * @param missionReferenceDate epoch for {@link #MET} and {@link #MRT}. * @return parsed {@code date}. * @throws OrekitException if an {@link AbsoluteDate} cannot be created from {@code * date} in this time scale. */ public AbsoluteDate parseDate(final String date, final IERSConventions conventions, final AbsoluteDate missionReferenceDate) throws OrekitException { return new AbsoluteDate(date, this.getTimeScale(conventions)); } /** * Get the corresponding {@link TimeScale}. * * @param conventions IERS Conventions for the {@link #GMST} and {@link #UT1} scales. * @return the time scale. * @throws OrekitException if the time scale cannot be constructed. */ public abstract TimeScale getTimeScale(IERSConventions conventions) throws OrekitException; /** * Check if {@code timeScale} is one of the values supported by this enum. * * @param timeScale specifier. * @return {@code true} if {@link #valueOf(String)} will not throw an exception with * the same string. */ public static boolean contains(final String timeScale) { for (final CcsdsTimeScale scale : values()) { if (scale.name().equals(timeScale)) { return true; } } return false; } }