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 java.util.List; 21 22 import org.orekit.data.DataContext; 23 import org.orekit.files.ccsds.ndm.adm.AdmMetadata; 24 import org.orekit.files.ccsds.ndm.adm.AdmMetadataKey; 25 import org.orekit.files.ccsds.section.MetadataKey; 26 import org.orekit.time.AbsoluteDate; 27 28 /** Meta-data for {@link AcmMetadata Attitude Comprehensive Message}. 29 * @since 12.0 30 */ 31 public class AcmMetadata extends AdmMetadata { 32 33 /** Specification of satellite catalog source. */ 34 private String catalogName; 35 36 /** Unique satellite identification designator for the object. */ 37 private String objectDesignator; 38 39 /** Programmatic Point Of Contact at originator. */ 40 private String originatorPOC; 41 42 /** Position of Programmatic Point Of Contact at originator. */ 43 private String originatorPosition; 44 45 /** Phone number of Programmatic Point Of Contact at originator. */ 46 private String originatorPhone; 47 48 /** Email address of Programmatic Point Of Contact at originator. */ 49 private String originatorEmail; 50 51 /** Address of Programmatic Point Of Contact at originator. */ 52 private String originatorAddress; 53 54 /** Unique identifier of Orbit Data Message linked to this Orbit Data Message. */ 55 private String odmMessageLink; 56 57 /** Epoch to which <em>all</em> relative times are referenced in data blocks; 58 * unless overridden by block-specific {@code EPOCH_TZERO} values. */ 59 private AbsoluteDate epochT0; 60 61 /** List of elements of information data blocks included in this message. */ 62 private List<AcmElements> acmDataElements; 63 64 /** Time of the earliest data contained in the OCM. */ 65 private AbsoluteDate startTime; 66 67 /** Time of the latest data contained in the OCM. */ 68 private AbsoluteDate stopTime; 69 70 /** Difference (TAI – UTC) in seconds at epoch {@link #epochT0}. */ 71 private double taimutcT0; 72 73 /** Epoch of next leap second. */ 74 private AbsoluteDate nextLeapEpoch; 75 76 /** Difference (TAI – UTC) in seconds incorporated at {@link #nextLeapEpoch}. */ 77 private double nextLeapTaimutc; 78 79 /** Create a new meta-data. 80 * @param dataContext data context 81 */ 82 public AcmMetadata(final DataContext dataContext) { 83 84 // set up the few fields that have default values as per CCSDS standard 85 taimutcT0 = Double.NaN; 86 nextLeapTaimutc = Double.NaN; 87 88 } 89 90 /** {@inheritDoc} */ 91 @Override 92 public void validate(final double version) { 93 // we don't call super.checkMandatoryEntries() because 94 // all of the parameters considered mandatory at ADM level 95 // for APM and AEM are in fact optional in ACM 96 // only OBJECT_NAME, TIME_SYSTEM and EPOCH_TZERO are mandatory 97 checkNotNull(getObjectName(), AdmMetadataKey.OBJECT_NAME.name()); 98 checkNotNull(getTimeSystem(), MetadataKey.TIME_SYSTEM.name()); 99 checkNotNull(epochT0, AcmMetadataKey.EPOCH_TZERO.name()); 100 if (nextLeapEpoch != null) { 101 checkNotNaN(nextLeapTaimutc, AcmMetadataKey.NEXT_LEAP_TAIMUTC.name()); 102 } 103 } 104 105 /** Get the international designator for the object. 106 * @return international designator for the object 107 */ 108 public String getInternationalDesignator() { 109 return getObjectID(); 110 } 111 112 /** Set the international designator for the object. 113 * @param internationalDesignator international designator for the object 114 */ 115 public void setInternationalDesignator(final String internationalDesignator) { 116 setObjectID(internationalDesignator); 117 } 118 119 /** Get the specification of satellite catalog source. 120 * @return specification of satellite catalog source 121 */ 122 public String getCatalogName() { 123 return catalogName; 124 } 125 126 /** Set the specification of satellite catalog source. 127 * @param catalogName specification of satellite catalog source 128 */ 129 public void setCatalogName(final String catalogName) { 130 refuseFurtherComments(); 131 this.catalogName = catalogName; 132 } 133 134 /** Get the unique satellite identification designator for the object. 135 * @return unique satellite identification designator for the object. 136 */ 137 public String getObjectDesignator() { 138 return objectDesignator; 139 } 140 141 /** Set the unique satellite identification designator for the object. 142 * @param objectDesignator unique satellite identification designator for the object 143 */ 144 public void setObjectDesignator(final String objectDesignator) { 145 refuseFurtherComments(); 146 this.objectDesignator = objectDesignator; 147 } 148 149 /** Get the programmatic Point Of Contact at originator. 150 * @return programmatic Point Of Contact at originator 151 */ 152 public String getOriginatorPOC() { 153 return originatorPOC; 154 } 155 156 /** Set the programmatic Point Of Contact at originator. 157 * @param originatorPOC programmatic Point Of Contact at originator 158 */ 159 public void setOriginatorPOC(final String originatorPOC) { 160 refuseFurtherComments(); 161 this.originatorPOC = originatorPOC; 162 } 163 164 /** Get the position of Programmatic Point Of Contact at originator. 165 * @return position of Programmatic Point Of Contact at originator 166 */ 167 public String getOriginatorPosition() { 168 return originatorPosition; 169 } 170 171 /** Set the position of Programmatic Point Of Contact at originator. 172 * @param originatorPosition position of Programmatic Point Of Contact at originator 173 */ 174 public void setOriginatorPosition(final String originatorPosition) { 175 refuseFurtherComments(); 176 this.originatorPosition = originatorPosition; 177 } 178 179 /** Get the phone number of Programmatic Point Of Contact at originator. 180 * @return phone number of Programmatic Point Of Contact at originator 181 */ 182 public String getOriginatorPhone() { 183 return originatorPhone; 184 } 185 186 /** Set the phone number of Programmatic Point Of Contact at originator. 187 * @param originatorPhone phone number of Programmatic Point Of Contact at originator 188 */ 189 public void setOriginatorPhone(final String originatorPhone) { 190 refuseFurtherComments(); 191 this.originatorPhone = originatorPhone; 192 } 193 194 /** Get the email address of Programmatic Point Of Contact at originator. 195 * @return email address of Programmatic Point Of Contact at originator 196 */ 197 public String getOriginatorEmail() { 198 return originatorEmail; 199 } 200 201 /** Set the email address of Programmatic Point Of Contact at originator. 202 * @param originatorEmail email address of Programmatic Point Of Contact at originator 203 */ 204 public void setOriginatorEmail(final String originatorEmail) { 205 refuseFurtherComments(); 206 this.originatorEmail = originatorEmail; 207 } 208 209 /** Get the address of Programmatic Point Of Contact at originator. 210 * @return address of Programmatic Point Of Contact at originator 211 */ 212 public String getOriginatorAddress() { 213 return originatorAddress; 214 } 215 216 /** Set the address of Programmatic Point Of Contact at originator. 217 * @param originatorAddress address of Programmatic Point Of Contact at originator 218 */ 219 public void setOriginatorAddress(final String originatorAddress) { 220 refuseFurtherComments(); 221 this.originatorAddress = originatorAddress; 222 } 223 224 /** Get the Unique identifier of Orbit Data Message linked to this Attitude Data Message. 225 * @return Unique identifier of Orbit Data Message linked to this Attitude Data Message 226 */ 227 public String getOdmMessageLink() { 228 return odmMessageLink; 229 } 230 231 /** Set the Unique identifier of Orbit Data Message linked to this Attitude Data Message. 232 * @param odmMessageLink Unique identifier of Orbit Data Message linked to this Attitude Data Message 233 */ 234 public void setOdmMessageLink(final String odmMessageLink) { 235 refuseFurtherComments(); 236 this.odmMessageLink = odmMessageLink; 237 } 238 239 /** Get the epoch to which <em>all</em> relative times are referenced in data blocks. 240 * @return epoch to which <em>all</em> relative times are referenced in data blocks 241 */ 242 public AbsoluteDate getEpochT0() { 243 return epochT0; 244 } 245 246 /** Set the epoch to which <em>all</em> relative times are referenced in data blocks. 247 * @param epochT0 epoch to which <em>all</em> relative times are referenced in data blocks 248 */ 249 public void setEpochT0(final AbsoluteDate epochT0) { 250 refuseFurtherComments(); 251 this.epochT0 = epochT0; 252 } 253 254 /** Get the list of elements of information data blocks included in this message. 255 * @return list of elements of information data blocks included in this message 256 */ 257 public List<AcmElements> getAcmDataElements() { 258 return acmDataElements; 259 } 260 261 /** Set the list of elements of information data blocks included in this message. 262 * @param acmDataElements list of elements of information data blocks included in this message 263 */ 264 public void setAcmDataElements(final List<AcmElements> acmDataElements) { 265 refuseFurtherComments(); 266 this.acmDataElements = acmDataElements; 267 } 268 269 /** Get the time of the earliest data contained in the OCM. 270 * @return time of the earliest data contained in the OCM 271 */ 272 public AbsoluteDate getStartTime() { 273 return startTime; 274 } 275 276 /** Set the time of the earliest data contained in the OCM. 277 * @param startTime time of the earliest data contained in the OCM 278 */ 279 public void setStartTime(final AbsoluteDate startTime) { 280 refuseFurtherComments(); 281 this.startTime = startTime; 282 } 283 284 /** Get the time of the latest data contained in the OCM. 285 * @return time of the latest data contained in the OCM 286 */ 287 public AbsoluteDate getStopTime() { 288 return stopTime; 289 } 290 291 /** Set the time of the latest data contained in the OCM. 292 * @param stopTime time of the latest data contained in the OCM 293 */ 294 public void setStopTime(final AbsoluteDate stopTime) { 295 refuseFurtherComments(); 296 this.stopTime = stopTime; 297 } 298 299 /** Get the difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()}. 300 * @return difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()} 301 */ 302 public double getTaimutcT0() { 303 return taimutcT0; 304 } 305 306 /** Set the difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()}. 307 * @param taimutcT0 difference (TAI – UTC) in seconds at epoch {@link #getEpochT0()} 308 */ 309 public void setTaimutcT0(final double taimutcT0) { 310 refuseFurtherComments(); 311 this.taimutcT0 = taimutcT0; 312 } 313 314 /** Get the epoch of next leap second. 315 * @return epoch of next leap second 316 */ 317 public AbsoluteDate getNextLeapEpoch() { 318 return nextLeapEpoch; 319 } 320 321 /** Set the epoch of next leap second. 322 * @param nextLeapEpoch epoch of next leap second 323 */ 324 public void setNextLeapEpoch(final AbsoluteDate nextLeapEpoch) { 325 refuseFurtherComments(); 326 this.nextLeapEpoch = nextLeapEpoch; 327 } 328 329 /** Get the difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()}. 330 * @return difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()} 331 */ 332 public double getNextLeapTaimutc() { 333 return nextLeapTaimutc; 334 } 335 336 /** Set the difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()}. 337 * @param nextLeapTaimutc difference (TAI – UTC) in seconds incorporated at epoch {@link #getNextLeapEpoch()} 338 */ 339 public void setNextLeapTaimutc(final double nextLeapTaimutc) { 340 refuseFurtherComments(); 341 this.nextLeapTaimutc = nextLeapTaimutc; 342 } 343 344 }