1 /* Copyright 2022-2025 Luc Maisonobe
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.adm.acm;
19
20 import org.hipparchus.geometry.euclidean.threed.RotationOrder;
21 import org.orekit.errors.OrekitException;
22 import org.orekit.errors.OrekitMessages;
23 import org.orekit.files.ccsds.ndm.adm.AttitudeEndpoints;
24 import org.orekit.files.ccsds.section.CommentsContainer;
25
26 /** Metadata for attitude state history.
27 * <p>
28 * Beware that the Orekit getters and setters all rely on SI units. The parsers
29 * and writers take care of converting these SI units into CCSDS mandatory units.
30 * The {@link org.orekit.utils.units.Unit Unit} class provides useful
31 * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
32 * {@link org.orekit.utils.units.Unit#toSI(double) toSI} methods in case the callers
33 * already use CCSDS units instead of the API SI units. The general-purpose
34 * {@link org.orekit.utils.units.Unit Unit} class (without an 's') and the
35 * CCSDS-specific {@link org.orekit.files.ccsds.definitions.Units Units} class
36 * (with an 's') also provide some predefined units. These predefined units and the
37 * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
38 * {@link org.orekit.utils.units.Unit#toSI(double) toSI} conversion methods are indeed
39 * what the parsers and writers use for the conversions.
40 * </p>
41 * @author Luc Maisonobe
42 * @since 12.0
43 */
44 public class AttitudeStateHistoryMetadata extends CommentsContainer {
45
46 /** Endpoints (i.e. frames A, B and their relationship). */
47 private final AttitudeEndpoints endpoints;
48
49 /** Attitude identification number. */
50 private String attID;
51
52 /** Identification number of previous attitude. */
53 private String attPrevID;
54
55 /** Basis of this attitude state time history data. */
56 private String attBasis;
57
58 /** Identification number of the attitude determination or simulation upon which this attitude is based. */
59 private String attBasisID;
60
61 /** Rotation order for Euler angles. */
62 private RotationOrder eulerRotSeq;
63
64 /** Number of data states included (attitude components plus rates components). */
65 private int nbStates;
66
67 /** Attitude element set type. */
68 private AttitudeElementsType attitudeType;
69
70 /** Attitude rate element set type. */
71 private RateElementsType rateType;
72
73 /** Simple constructor.
74 */
75 public AttitudeStateHistoryMetadata() {
76 endpoints = new AttitudeEndpoints();
77 }
78
79 /** {@inheritDoc} */
80 @Override
81 public void validate(final double version) {
82 super.validate(version);
83 endpoints.checkExternalFrame(AttitudeStateHistoryMetadataKey.REF_FRAME_A,
84 AttitudeStateHistoryMetadataKey.REF_FRAME_B);
85 checkNotNull(attitudeType, AttitudeStateHistoryMetadataKey.ATT_TYPE.name());
86 final int rateSize = rateType == null ? 0 : rateType.getUnits().size();
87 if (nbStates != attitudeType.getUnits().size() + rateSize) {
88 throw new OrekitException(OrekitMessages.CCSDS_INCONSISTENT_NUMBER_OF_ATTITUDE_STATES,
89 attitudeType.toString(), rateType.toString(),
90 attitudeType.getUnits().size() + rateSize, nbStates);
91 }
92 if (attitudeType == AttitudeElementsType.EULER_ANGLES) {
93 checkNotNull(eulerRotSeq, AttitudeStateHistoryMetadataKey.EULER_ROT_SEQ.name());
94 }
95 }
96
97 /** Get the endpoints (i.e. frames A, B and their relationship).
98 * @return endpoints
99 */
100 public AttitudeEndpoints getEndpoints() {
101 return endpoints;
102 }
103
104 /** Get attitude identification number.
105 * @return attitude identification number
106 */
107 public String getAttID() {
108 return attID;
109 }
110
111 /** Set attitude identification number.
112 * @param attID attitude identification number
113 */
114 public void setAttID(final String attID) {
115 refuseFurtherComments();
116 this.attID = attID;
117 }
118
119 /** Get identification number of previous attitude.
120 * @return identification number of previous attitude
121 */
122 public String getAttPrevID() {
123 return attPrevID;
124 }
125
126 /** Set identification number of previous attitude.
127 * @param attPrevID identification number of previous attitude
128 */
129 public void setAttPrevID(final String attPrevID) {
130 refuseFurtherComments();
131 this.attPrevID = attPrevID;
132 }
133
134 /** Get basis of this attitude state time history data.
135 * @return basis of this attitude state time history data
136 */
137 public String getAttBasis() {
138 return attBasis;
139 }
140
141 /** Set basis of this attitude state time history data.
142 * @param attBasis basis of this attitude state time history data
143 */
144 public void setAttBasis(final String attBasis) {
145 refuseFurtherComments();
146 this.attBasis = attBasis;
147 }
148
149 /** Get identification number of the orbit determination or simulation upon which this attitude is based.
150 * @return identification number of the orbit determination or simulation upon which this attitude is based
151 */
152 public String getAttBasisID() {
153 return attBasisID;
154 }
155
156 /** Set identification number of the orbit determination or simulation upon which this attitude is based.
157 * @param attBasisID identification number of the orbit determination or simulation upon which this attitude is based
158 */
159 public void setAttBasisID(final String attBasisID) {
160 refuseFurtherComments();
161 this.attBasisID = attBasisID;
162 }
163
164 /** Get the rotation order for Euler angles.
165 * @return rotation order for Euler angles
166 */
167 public RotationOrder getEulerRotSeq() {
168 return eulerRotSeq;
169 }
170
171 /** Set the rotation order for Euler angles.
172 * @param eulerRotSeq rotation order for Euler angles
173 */
174 public void setEulerRotSeq(final RotationOrder eulerRotSeq) {
175 this.eulerRotSeq = eulerRotSeq;
176 }
177
178 /** Get the number of data states included (attitude components plus rates components).
179 * @return number of data states included (attitude components plus rates components)
180 */
181 public int getNbStates() {
182 return nbStates;
183 }
184
185 /** Set the number of data states included (attitude components plus rates components).
186 * @param nbStates number of data states included (attitude components plus rates components)
187 */
188 public void setNbStates(final int nbStates) {
189 this.nbStates = nbStates;
190 }
191
192 /** Get attitude element set type.
193 * @return attitude element set type
194 */
195 public AttitudeElementsType getAttitudeType() {
196 return attitudeType;
197 }
198
199 /** Set attitude element set type.
200 * @param attitudeType attitude element set type
201 */
202 public void setAttitudeType(final AttitudeElementsType attitudeType) {
203 refuseFurtherComments();
204 this.attitudeType = attitudeType;
205 }
206
207 /** Get attitude rate element set type.
208 * @return attitude rate element set type
209 */
210 public RateElementsType getRateType() {
211 return rateType;
212 }
213
214 /** Set attitude rate element set type.
215 * @param rateType attitude rate element set type
216 */
217 public void setRateType(final RateElementsType rateType) {
218 refuseFurtherComments();
219 this.rateType = rateType;
220 }
221
222 }