1 /* Copyright 2002-2025 CS GROUP 2 * Licensed to CS GROUP (CS) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * CS licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.orekit.files.ccsds.utils; 18 19 import java.util.function.BooleanSupplier; 20 import java.util.function.DoubleSupplier; 21 import java.util.function.Supplier; 22 23 import org.orekit.data.DataContext; 24 import org.orekit.files.ccsds.definitions.TimeSystem; 25 import org.orekit.files.ccsds.ndm.ParsedUnitsBehavior; 26 import org.orekit.time.AbsoluteDate; 27 import org.orekit.utils.IERSConventions; 28 29 /** Context for parsing/writing Navigation Data Message. 30 * <p> 31 * This class is a facade providing late binding access to data. 32 * Late binding is mainly useful at parse time as it allows some data to be set up 33 * during parsing itself. This is used for example to access {@link #getTimeSystem() 34 * time system} that is generally parsed from metadata block, and used later on 35 * within the same metadata block. 36 * </p> 37 * @author Luc Maisonobe 38 * @since 11.0 39 */ 40 public class ContextBinding { 41 42 /** Behavior adopted for units that have been parsed from a CCSDS message. */ 43 private final Supplier<ParsedUnitsBehavior> behaviorSupplier; 44 45 /** Supplier for IERS conventions to use. */ 46 private final Supplier<IERSConventions> conventionsSupplier; 47 48 /** Supplier for simple or accurate EOP interpolation indicator. */ 49 private final BooleanSupplier simpleEOPSupplier; 50 51 /** Supplier for data context. */ 52 private final Supplier<DataContext> dataContextSupplier; 53 54 /** Supplier for reference date for mission elapsed time (MET), mission relative time (MRT), 55 * or spacecraft clock (SCLK) time systems. */ 56 private final Supplier<AbsoluteDate> referenceDateSupplier; 57 58 /** Supplier for reference system for interpreting dates. */ 59 private final Supplier<TimeSystem> timeSystemSupplier; 60 61 /** Supplier for clock count at reference date in spacecraft clock (SCLK) time system. */ 62 private final DoubleSupplier clockCountSupplier; 63 64 /** Supplier for clock rate in spacecraft clock (SCLK) time system. */ 65 private final DoubleSupplier clockRateSupplier; 66 67 /** Create a new context. 68 * @param conventionsSupplier supplier for IERS conventions to use 69 * @param simpleEOPSupplier supplier for simple or accurate EOP interpolation indicator 70 * @param dataContextSupplier supplier for data context to use 71 * @param behaviorSupplier supplier for behavior to adopt on unit 72 * @param referenceDateSupplier supplier for reference date for mission elapsed time (MET), 73 * mission relative time (MRT), or spacecraft clock (SCLK) time systems 74 * @param timeSystemSupplier supplier for reference system for interpreting dates 75 * @param clockCountSupplier supplier for clock count at reference date in spacecraft clock (SCLK) time system 76 * @param clockRateSupplier supplier for clock rate in spacecraft clock (SCLK) time system 77 */ 78 public ContextBinding(final Supplier<IERSConventions> conventionsSupplier, 79 final BooleanSupplier simpleEOPSupplier, 80 final Supplier<DataContext> dataContextSupplier, 81 final Supplier<ParsedUnitsBehavior> behaviorSupplier, 82 final Supplier<AbsoluteDate> referenceDateSupplier, 83 final Supplier<TimeSystem> timeSystemSupplier, 84 final DoubleSupplier clockCountSupplier, 85 final DoubleSupplier clockRateSupplier) { 86 this.behaviorSupplier = behaviorSupplier; 87 this.conventionsSupplier = conventionsSupplier; 88 this.simpleEOPSupplier = simpleEOPSupplier; 89 this.dataContextSupplier = dataContextSupplier; 90 this.referenceDateSupplier = referenceDateSupplier; 91 this.timeSystemSupplier = timeSystemSupplier; 92 this.clockCountSupplier = clockCountSupplier; 93 this.clockRateSupplier = clockRateSupplier; 94 } 95 96 /** Get the behavior to adopt for handling parsed units. 97 * @return behavior to adopt for handling parsed units 98 */ 99 public ParsedUnitsBehavior getParsedUnitsBehavior() { 100 return behaviorSupplier.get(); 101 } 102 103 /** Get IERS conventions. 104 * @return IERS conventions to use while parsing 105 */ 106 public IERSConventions getConventions() { 107 return conventionsSupplier.get(); 108 } 109 110 /** Get EOP interpolation method. 111 * @return true if tidal effects are ignored when interpolating EOP 112 */ 113 public boolean isSimpleEOP() { 114 return simpleEOPSupplier.getAsBoolean(); 115 } 116 117 /** Get the data context used for getting frames, time scales, and celestial bodies. 118 * @return the data context. 119 */ 120 public DataContext getDataContext() { 121 return dataContextSupplier.get(); 122 } 123 124 /** Get initial date. 125 * @return reference date to use while parsing 126 */ 127 public AbsoluteDate getReferenceDate() { 128 return referenceDateSupplier.get(); 129 } 130 131 /** Get the time system. 132 * @return time system 133 */ 134 public TimeSystem getTimeSystem() { 135 return timeSystemSupplier.get(); 136 } 137 138 /** Get clock count. 139 * @return clock count at reference date 140 */ 141 public double getClockCount() { 142 return clockCountSupplier.getAsDouble(); 143 } 144 145 /** Get clock rate. 146 * @return clock rate (in clock ticks per SI second) 147 */ 148 public double getClockRate() { 149 return clockRateSupplier.getAsDouble(); 150 } 151 152 }