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
18 package org.orekit.files.ccsds.ndm.tdm;
19
20 import java.util.ArrayList;
21 import java.util.List;
22
23 import org.orekit.files.ccsds.section.CommentsContainer;
24 import org.orekit.files.ccsds.section.Data;
25 import org.orekit.time.AbsoluteDate;
26
27 /** The Observations Block class contain metadata and the list of observation data lines.
28 * <p>
29 * Beware that the Orekit getters and setters all rely on SI units. The parsers
30 * and writers take care of converting these SI units into CCSDS mandatory units.
31 * The {@link org.orekit.utils.units.Unit Unit} class provides useful
32 * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
33 * {@link org.orekit.utils.units.Unit#toSI(double) toSI} methods in case the callers
34 * already use CCSDS units instead of the API SI units. The general-purpose
35 * {@link org.orekit.utils.units.Unit Unit} class (without an 's') and the
36 * CCSDS-specific {@link org.orekit.files.ccsds.definitions.Units Units} class
37 * (with an 's') also provide some predefined units. These predefined units and the
38 * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
39 * {@link org.orekit.utils.units.Unit#toSI(double) toSI} conversion methods are indeed
40 * what the parsers and writers use for the conversions.
41 * </p>
42 * <p>
43 * The reason for which the observations have been separated into blocks is that the different
44 * data blocks in a TDM file usually refers to different types of observations.
45 * An observation block is associated with a TDM metadata object and contains a list of observations.
46 * At this level, an observation is not an Orekit object, it is a custom object containing:
47 * </p>
48 * <ul>
49 * <li>a keyword, the type of the observation;</li>
50 * <li>a timetag, the date of the observation;</li>
51 * <li>a measurement, the value of the observation.</li>
52 * </ul>
53 * @author Maxime Journot
54 */
55 public class ObservationsBlock extends CommentsContainer implements Data {
56
57 /** Current observation epoch. */
58 private AbsoluteDate currentObservationEpoch;
59
60 /** List of observations data lines. */
61 private List<Observation> observations;
62
63 /** ObservationsBlock constructor. */
64 public ObservationsBlock() {
65 observations = new ArrayList<>();
66 }
67
68 /** Add the epoch of current observation.
69 * @param epoch current observation epoch
70 * @return alwaus return {@code true}
71 */
72 boolean addObservationEpoch(final AbsoluteDate epoch) {
73 refuseFurtherComments();
74 currentObservationEpoch = epoch;
75 return true;
76 }
77
78 /** Get current observation epoch if set.
79 * @return current observation epoch, or null if not set
80 */
81 AbsoluteDate getCurrentObservationEpoch() {
82 return currentObservationEpoch;
83 }
84
85 /** Add the value of current observation.
86 * @param type type of the observation
87 * @param measurement measurement of the observation
88 */
89 void addObservationValue(final ObservationType type, final double measurement) {
90 addObservation(type, currentObservationEpoch, measurement);
91 currentObservationEpoch = null;
92 }
93
94 /** Get the list of Observations data lines.
95 * @return a reference to the internal list of Observations data lines
96 */
97 public List<Observation> getObservations() {
98 return this.observations;
99 }
100
101 /** Set the list of Observations Data Lines.
102 * @param observations the list of Observations Data Lines to set
103 */
104 public void setObservations(final List<Observation> observations) {
105 refuseFurtherComments();
106 this.observations = new ArrayList<>(observations);
107 }
108
109 /** Adds an observation data line.
110 * @param observation the observation to add to the list
111 */
112 public void addObservation(final Observation observation) {
113 refuseFurtherComments();
114 this.observations.add(observation);
115 }
116
117 /** Adds an observation data line.
118 * @param type type of the observation
119 * @param epoch the timetag
120 * @param measurement the measurement
121 */
122 public void addObservation(final ObservationType type,
123 final AbsoluteDate epoch,
124 final double measurement) {
125 this.addObservation(new Observation(type, epoch, measurement));
126 }
127
128 }