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.Rotation;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.orekit.errors.OrekitException;
23 import org.orekit.errors.OrekitMessages;
24 import org.orekit.files.ccsds.definitions.FrameFacade;
25 import org.orekit.files.ccsds.section.CommentsContainer;
26
27 /** Maneuver entry.
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 * @author Luc Maisonobe
43 * @since 12.0
44 */
45 public class AttitudeManeuver extends CommentsContainer {
46
47 /** Maneuver identification number. */
48 private String id;
49
50 /** Identification number of previous maneuver. */
51 private String prevID;
52
53 /** Purpose of the maneuver. */
54 private String manPurpose;
55
56 /** Start time of actual maneuver, relative to t₀. */
57 private double beginTime;
58
59 /** End time of actual maneuver, relative to t₀. */
60 private double endTime;
61
62 /** Duration. */
63 private double duration;
64
65 /** Actuator used. */
66 private String actuatorUsed;
67
68 /** Target momentum (if purpose is momentum desaturation). */
69 private Vector3D targetMomentum;
70
71 /** Reference frame for {@link #targetMomentum}. */
72 private FrameFacade targetMomFrame;
73
74 /** Target attitude (if purpose is attitude adjustment). */
75 private Rotation targetAttitude;
76
77 /** Target spin rate (if purpose is spin rate adjustment). */
78 private double targetSpinRate;
79
80 /** Build an uninitialized maneuver.
81 */
82 public AttitudeManeuver() {
83 beginTime = Double.NaN;
84 endTime = Double.NaN;
85 duration = Double.NaN;
86 targetSpinRate = Double.NaN;
87 }
88
89 /** {@inheritDoc} */
90 @Override
91 public void validate(final double version) {
92 checkNotNull(manPurpose, AttitudeManeuverKey.MAN_PURPOSE.name());
93 checkNotNaN(beginTime, AttitudeManeuverKey.MAN_BEGIN_TIME.name());
94 if (!Double.isNaN(endTime + duration)) {
95 throw new OrekitException(OrekitMessages.CCSDS_INCOMPATIBLE_KEYS_BOTH_USED,
96 AttitudeManeuverKey.MAN_END_TIME,
97 AttitudeManeuverKey.MAN_DURATION);
98 }
99 if (targetMomFrame != null) {
100 checkNotNull(targetMomentum, AttitudeManeuverKey.TARGET_MOMENTUM.name());
101 }
102 }
103
104 /** Get maneuver identification number.
105 * @return maneuver identification number
106 */
107 public String getID() {
108 return id;
109 }
110
111 /** Set maneuver identification number.
112 * @param manId maneuver identification number
113 */
114 public void setID(final String manId) {
115 refuseFurtherComments();
116 this.id = manId;
117 }
118
119 /** Get identification number of previous maneuver.
120 * @return identification number of previous maneuver
121 */
122 public String getPrevID() {
123 return prevID;
124 }
125
126 /** Set identification number of previous maneuver.
127 * @param prevID identification number of previous maneuver
128 */
129 public void setPrevID(final String prevID) {
130 refuseFurtherComments();
131 this.prevID = prevID;
132 }
133
134 /** Get purpose of maneuver.
135 * @return purpose of maneuver
136 */
137 public String getManPurpose() {
138 return manPurpose;
139 }
140
141 /** Set purpose of maneuver.
142 * @param manPurpose purpose of maneuver
143 */
144 public void setManPurpose(final String manPurpose) {
145 refuseFurtherComments();
146 this.manPurpose = manPurpose;
147 }
148
149 /** Get start time of actual maneuver, relative to t₀.
150 * @return start time of actual maneuver, relative to t₀
151 */
152 public double getBeginTime() {
153 return beginTime;
154 }
155
156 /** Set start time of actual maneuver, relative to t₀.
157 * @param beginTime start time of actual maneuver, relative to t₀
158 */
159 public void setBeginTime(final double beginTime) {
160 this.beginTime = beginTime;
161 }
162
163 /** Get end time of actual maneuver, relative to t₀.
164 * @return end time of actual maneuver, relative to t₀
165 */
166 public double getEndTime() {
167 return endTime;
168 }
169
170 /** Set end time of actual maneuver, relative to t₀.
171 * @param endTime end time of actual maneuver, relative to t₀
172 */
173 public void setEndTime(final double endTime) {
174 this.endTime = endTime;
175 }
176
177 /** Get duration.
178 * @return duration
179 */
180 public double getDuration() {
181 return duration;
182 }
183
184 /** Set duration.
185 * @param duration duration
186 */
187 public void setDuration(final double duration) {
188 this.duration = duration;
189 }
190
191 /** Get the actuator used.
192 * @return actuator used
193 */
194 public String getActuatorUsed() {
195 return actuatorUsed;
196 }
197
198 /** Set actuator used.
199 * @param actuatorUsed actuator used
200 */
201 public void setActuatorUsed(final String actuatorUsed) {
202 this.actuatorUsed = actuatorUsed;
203 }
204
205 /** Get target momentum (if purpose is momentum desaturation).
206 * @return target momentum
207 */
208 public Vector3D getTargetMomentum() {
209 return targetMomentum;
210 }
211
212 /** Set target momentum (if purpose is momentum desaturation).
213 * @param targetMomentum target momentum
214 */
215 public void setTargetMomentum(final Vector3D targetMomentum) {
216 this.targetMomentum = targetMomentum;
217 }
218
219 /** Get reference frame for {@link #getTargetMomentum()}.
220 * @return reference frame for {@link #getTargetMomentum()}
221 */
222 public FrameFacade getTargetMomFrame() {
223 return targetMomFrame;
224 }
225
226 /** Set reference frame for {@link #getTargetMomentum()}.
227 * @param targetMomFrame reference frame for {@link #getTargetMomentum()}
228 */
229 public void setTargetMomFrame(final FrameFacade targetMomFrame) {
230 this.targetMomFrame = targetMomFrame;
231 }
232
233 /** Get target attitude (if purpose is attitude adjustment).
234 * @return target attitude
235 */
236 public Rotation getTargetAttitude() {
237 return targetAttitude;
238 }
239
240 /** Set target attitude (if purpose is attitude adjustment).
241 * @param targetAttitude target attitude
242 */
243 public void setTargetAttitude(final Rotation targetAttitude) {
244 this.targetAttitude = targetAttitude;
245 }
246
247 /** Get target spin rate (if purpose is spin rate adjustment).
248 * @return target spin rate
249 */
250 public double getTargetSpinRate() {
251 return targetSpinRate;
252 }
253
254 /** Set target spin rate (if purpose is spin rate adjustment).
255 * @param targetSpinRate target spin rate
256 */
257 public void setTargetSpinRate(final double targetSpinRate) {
258 this.targetSpinRate = targetSpinRate;
259 }
260
261 }