IIRVMessage.java
/* Copyright 2024-2025 The Johns Hopkins University Applied Physics Laboratory
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.files.iirv;
import org.orekit.errors.OrekitIllegalStateException;
import org.orekit.errors.OrekitInternalError;
import org.orekit.errors.OrekitMessages;
import org.orekit.files.iirv.terms.CheckSumTerm;
import org.orekit.files.iirv.terms.CoordinateSystemTerm;
import org.orekit.files.iirv.terms.CrossSectionalAreaTerm;
import org.orekit.files.iirv.terms.DataSourceTerm;
import org.orekit.files.iirv.terms.DayOfYearTerm;
import org.orekit.files.iirv.terms.DragCoefficientTerm;
import org.orekit.files.iirv.terms.MassTerm;
import org.orekit.files.iirv.terms.MessageClassTerm;
import org.orekit.files.iirv.terms.MessageEndConstantTerm;
import org.orekit.files.iirv.terms.MessageIDTerm;
import org.orekit.files.iirv.terms.MessageSourceTerm;
import org.orekit.files.iirv.terms.MessageStartConstantTerm;
import org.orekit.files.iirv.terms.MessageTypeTerm;
import org.orekit.files.iirv.terms.OriginIdentificationTerm;
import org.orekit.files.iirv.terms.OriginatorRoutingIndicatorTerm;
import org.orekit.files.iirv.terms.PositionVectorComponentTerm;
import org.orekit.files.iirv.terms.RoutingIndicatorTerm;
import org.orekit.files.iirv.terms.SequenceNumberTerm;
import org.orekit.files.iirv.terms.SolarReflectivityCoefficientTerm;
import org.orekit.files.iirv.terms.SpareConstantTerm;
import org.orekit.files.iirv.terms.SupportIdCodeTerm;
import org.orekit.files.iirv.terms.VectorEpochTerm;
import org.orekit.files.iirv.terms.VectorTypeTerm;
import org.orekit.files.iirv.terms.VehicleIdCodeTerm;
import org.orekit.files.iirv.terms.VelocityVectorComponentTerm;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* Container for Improved Interrange Vector (IIRV) messages, implemented as a list of sequential {@link IIRVVector}
* instances.
* <p>
* The IIRV message consists of a series of sequential {@link IIRVVector}s that each contains ephemeris state data
* at a particular epoch. The message body is defined as:<p>
* {@code ttuuuuuuuqjjGIIRVarrrr<<≡≡}<br>
* {@code vs1ciiiibbnnndoyhhmmsssssccc<<≡≡}<br>
* {@code sxxxxxxxxxxxxsyyyyyyyyyyyyszzzzzzzzzzzzccc<<==}<br>
* {@code sxxxxxxxxxxxxsyyyyyyyyyyyyszzzzzzzzzzzzccc<<==}<br>
* {@code mmmmmmmmaaaaakkkksrrrrrrrccc<<==}<br>
* {@code ITERM oooo<<==}
* <table border="1">
* <caption>Line No. / Characters / Value / Type / Description / Class</caption>
* <tbody>
* <tr>
* <th rowspan="9">1</th>
* <td>{@code tt}</td>
* <td>2 characters</td>
* <td>Constant</td>
* <td>Message Type (Operations Data Message)</td>
* <td>{@link MessageTypeTerm}</td>
* <tr>
* <td>{@code uuuuuuu}</td>
* <td>0000000 to 9999999</td>
* <td>Integer</td>
* <td>Message ID</td>
* <td>{@link MessageIDTerm}</td>
* <tr>
* <td>{@code q}</td>
* <td>1 character</td>
* <td>String</td>
* <td>Message Source</td>
* <td>{@link MessageSourceTerm}</td>
* <tr>
* <td>{@code jj}</td>
* <td>
* <ul>
* <li> 10 = Nominal
* <li> 15 = In-flight Update
* </ul></td>
* <td>String</td>
* <td>Message class (10=nominal)</td>
* <td>{@link MessageClassTerm}</td>
* <tr>
* <td>{@code GIIRV}</td>
* <td>"GIIRV"</td>
* <td>Constant</td>
* <td>Message ID</td>
* <td>{@link MessageStartConstantTerm}</td>
* <tr>
* <td>{@code a}</td>
* <td>
* <ul>
* <li> ASCII space = GSFC
* <li> Z = WLP
* <li> E = ETR
* <li> L = JPL
* <li> W = WTR
* <li> J = JSC
* <li> P = PMR
* <li> A = CSTC
* <li> K = KMR
* <li> C = CNES
* </ul></td>
* <td>String</td>
* <td>Origin identification</td>
* <td>{@link OriginIdentificationTerm}</td>
* <tr>
* <td>{@code rrrr}</td>
* <td>
* <ul>
* <li>GSFC = NASA Goddard Space Flight Center
* <li>WLP = Wallops Island tracking radars
* <li>ETR = NASA/USFC Eastern Test Range
* <li>JPL = NASA Jet Propulsion Laboratory
* <li>WTR = NASA/USFC Western Test Range
* <li>JSC = NASA Johnson Space Center
* <li>PMR = Navy Pacific Missile Range
* <li>CSTC = Air Force Satellite Control Facility
* <li>KMR = Army Kwajalein Missile Range
* <li>CNES = French Space Agency National <br>Centre for Space Studies (CNES)
* <li>MANY = Message originated from more <br>than one of the above stations
* </ul></td>
* <td>String</td>
* <td>Destination routing indicator</td>
* <td>{@link RoutingIndicatorTerm}</td>
* <tr>
* <td>{@code <<}</td>
* <td>"\r\r"</td>
* <td>Constant</td>
* <td>Carriage returns</td>
* <td>n/a</td>
* <tr>
* <td>==</td>
* <td>"\n\n"</td>
* <td>Constant</td>
* <td>Line feeds</td>
* <td>n/a</td>
* <tr>
* <th rowspan="12">2</th>
* <td>{@code v}</td>
* <td>
* <ul>
* <li> 1 = Free flight (routine on-orbit)
* <li> 2 = Forced (special orbit update)
* <li> 3 = Spare
* <li> 4 = Maneuver ignition
* <li> 5 = Maneuver cutoff
* <li> 6 = Reentry
* <li> 7 = Powered flight
* <li> 8 = Stationary
* <li> 9 = Spare
* </ul></td>
* <td>Integer</td>
* <td>Vector type</td>
* <td>{@link VectorTypeTerm}</td>
* <tr>
* <td>{@code s}</td>
* <td>
* <ul>
* <li> 1 = Nominal/planning
* <li> 2 = Real-time
* <li> 3 = Off-line
* <li> 4 = Off-line/mean
* </ul></td>
* <td>Integer</td>
* <td>Source of data</td>
* <td>{@link DataSourceTerm}</td>
* <tr>
* <td>{@code 1}</td>
* <td>"1" = interrange message</td>
* <td>Constant</td>
* <td>Transfer type</td>
* <td>{@link org.orekit.files.iirv.terms.TransferTypeConstantTerm}</td>
* <tr>
* <td>{@code c}</td>
* <td>
* <ul>
* <li> 1 = Geocentric True-of-Date Rotating
* <li> 2 = Geocentric mean of 1950.0 (B1950.0)
* <li> 3 = Heliocentric B1950.0
* <li> 4 = Reserved for JPL use (non-GSFC)
* <li> 5 = Reserved for JPL use (non-GSFC)
* <li> 6 = Geocentric mean of 2000.0 (J2000.0)
* <li> 7 = Heliocentric J2000.0
* </ul></td>
* <td>Integer</td>
* <td>Coordinate system</td>
* <td>{@link CoordinateSystemTerm}</td>
* <tr>
* <td>{@code iiii}</td>
* <td>0000-9999</td>
* <td>Integer</td>
* <td>Support Identification Code (SIC)</td>
* <td>{@link SupportIdCodeTerm}</td>
* <tr>
* <td>{@code bb}</td>
* <td>00-99</td>
* <td>Integer</td>
* <td>Vehicle Identification Code (VIC)</td>
* <td>{@link VehicleIdCodeTerm}</td>
* <tr>
* <td>{@code nnn}</td>
* <td>000-999</td>
* <td>Integer</td>
* <td>Sequence number</td>
* <td>{@link SequenceNumberTerm}</td>
* <tr>
* <td>{@code doy}</td>
* <td>001-366</td>
* <td>Integer</td>
* <td>Day of year</td>
* <td>{@link DayOfYearTerm}</td>
* <tr>
* <td>{@code hhmmsssss}</td>
* <td>000000000 - 235959999</td>
* <td>Integer</td>
* <td>Vector epoch (in UTC)<br>HH:mm:ss.SSS</td>
* <td>{@link VectorEpochTerm}</td>
* <tr>
* <td>{@code ccc}</td>
* <td>000-999</td>
* <td>Integer</td>
* <td>Checksum for line 2</td>
* <td>{@link CheckSumTerm}</td>
* <tr>
* <td>{@code <<}</td>
* <td>"\r\r"</td>
* <td>Constant</td>
* <td>Carriage returns</td>
* <td>n/a</td>
* <tr>
* <td>==</td>
* <td>"\n\n"</td>
* <td>Constant</td>
* <td>Line feeds</td>
* <td>n/a</td>
* <tr>
* <th rowspan="7">3</th>
* <td>{@code s}</td>
* <td>
* <ul>
* <li> " " (ASCII Space) = positive
* <li> "-" = Negative
* </ul></td>
* <td>Integer</td>
* <td>Positive/negative sign</td>
* <td>n/a</td>
* <tr>
* <td>{@code xxxxxxxxxxxx}</td>
* <td>0 - 9999999999999</td>
* <td>Integer</td>
* <td>X component of position (m)</td>
* <td>{@link PositionVectorComponentTerm}</td>
* <tr>
* <td>{@code yyyyyyyyyyyy}</td>
* <td>0 - 9999999999999</td>
* <td>Integer</td>
* <td>Y component of position (m)</td>
* <td>{@link PositionVectorComponentTerm}</td>
* <tr>
* <td>{@code zzzzzzzzzzzz}</td>
* <td>0 - 9999999999999</td>
* <td>Integer</td>
* <td>Z component of position (m)</td>
* <td>{@link PositionVectorComponentTerm}</td>
* <tr>
* <td>{@code ccc}</td>
* <td>000-999</td>
* <td>Integer</td>
* <td>Checksum for line 3</td>
* <td>{@link CheckSumTerm}</td>
* <tr>
* <td>{@code <<}</td>
* <td>"\r\r"</td>
* <td>Constant</td>
* <td>Carriage returns</td>
* <td>n/a</td>
* <tr>
* <td>==</td>
* <td>"\n\n"</td>
* <td>Constant</td>
* <td>Line feeds</td>
* <td>n/a</td>
* <tr>
* <th rowspan="7">4</th>
* <td>{@code s}</td>
* <td>
* <ul>
* <li> " " (ASCII Space) = positive
* <li> "-" = Negative
* </ul></td>
* <td>Integer</td>
* <td>Positive/negative sign</td>
* <td>n/a</td>
* <tr>
* <td>{@code xxxxxxxxxxxx}</td>
* <td>0 - 9999999999.999</td>
* <td>Double</td>
* <td>X component of velocity (m/s)</td>
* <td>{@link VelocityVectorComponentTerm}</td>
* <tr>
* <td>{@code yyyyyyyyyyyy}</td>
* <td>0 - 9999999999.999</td>
* <td>Double</td>
* <td>Y component of velocity (m/s)</td>
* <td>{@link VelocityVectorComponentTerm}</td>
* <tr>
* <td>{@code zzzzzzzzzzzz}</td>
* <td>0 - 9999999999.999</td>
* <td>Double</td>
* <td>Z component of velocity (m/s)</td>
* <td>{@link VelocityVectorComponentTerm}</td>
* <tr>
* <td>{@code ccc}</td>
* <td>000-999</td>
* <td>Integer</td>
* <td>Checksum for line 4</td>
* <td>{@link CheckSumTerm}</td>
* <tr>
* <td>{@code <<}</td>
* <td>"\r\r"</td>
* <td>Constant</td>
* <td>Carriage returns</td>
* <td>n/a</td>
* <tr>
* <td>==</td>
* <td>"\n\n"</td>
* <td>Constant</td>
* <td>Line feeds</td>
* <td>n/a</td>
* <tr>
* <th rowspan="7">5</th>
* <td>{@code mmmmmmmm}</td>
* <td>0 - 99999999.9</td>
* <td>Double</td>
* <td>Spacecraft mass (kg)</td>
* <td>{@link MassTerm}</td>
* <tr>
* <td>{@code aaaaa}</td>
* <td>0 - 999.99</td>
* <td>Double</td>
* <td>Average cross-sectional area (m^2)</td>
* <td>{@link CrossSectionalAreaTerm}</td>
* <tr>
* <td>{@code kkkk}</td>
* <td>0 - 99.99</td>
* <td>Double</td>
* <td>Drag coefficient (dimensionless)</td>
* <td>{@link DragCoefficientTerm}</td>
* <tr>
* <td>{@code srrrrrrr}</td>
* <td>-99.99999 to 99.99999</td>
* <td>Double</td>
* <td>Solar reflectivity coefficient (dimensionless)</td>
* <td>{@link SolarReflectivityCoefficientTerm}</td>
* <tr>
* <td>{@code ccc}</td>
* <td>000-999</td>
* <td>Integer</td>
* <td>Checksum for line 5</td>
* <td>{@link CheckSumTerm}</td>
* <tr>
* <td>{@code <<}</td>
* <td>"\r\r"</td>
* <td>Constant</td>
* <td>Carriage returns</td>
* <td>n/a</td>
* <tr>
* <td>==</td>
* <td>"\n\n"</td>
* <td>Constant</td>
* <td>Line feeds</td>
* <td>n/a</td>
* <tr>
* <th rowspan="5">6</th>
* <td>{@code ITERM}</td>
* <td>"ITERM"</td>
* <td>Constant</td>
* <td>End of message</td>
* <td>{@link MessageEndConstantTerm}</td>
* <tr>
* <td>{@code ITERM}</td>
* <td>ASCII Space</td>
* <td>Constant</td>
* <td>Spare (blank) character</td>
* <td>{@link SpareConstantTerm}</td>
* <tr>
* <td>{@code oooo}</td>
* <td>"GCQU" or "GAQD"</td>
* <td>String</td>
* <td>Originator routing indicator</td>
* <td>{@link OriginatorRoutingIndicatorTerm}</td>
* <tr>
* <td>{@code <<}</td>
* <td>"\r\r"</td>
* <td>Constant</td>
* <td>Carriage returns</td>
* <td>n/a</td>
* <tr>
* <td>==</td>
* <td>"\n\n"</td>
* <td>Constant</td>
* <td>Line feeds</td>
* <td>n/a</td>
* <tr>
* <th>7-12</th>
* <td colspan="5">Second {@link IIRVVector} in message</td>
* <tr>
* <th>13-18</th>
* <td colspan="5">Third {@link IIRVVector} in message</td>
* <tr>
* <th>...</th>
* <td colspan="5">nth {@link IIRVVector} in message</td>
* </tbody>
* </table>
*
* @author Nick LaFarge
* @since 13.0
*/
public class IIRVMessage {
/** List of vectors that comprise the IIRV message. */
private final List<IIRVVector> vectors;
/** Constructor that initializes to an empty list of vectors. */
public IIRVMessage() {
this.vectors = new ArrayList<>();
}
/**
* Constructor from a list of IIRV {@link IIRVVector}s that monotonically increase in both
* {@link org.orekit.files.iirv.terms.SequenceNumberTerm} and time ({@link org.orekit.files.iirv.terms.DayOfYearTerm}
* and {@link org.orekit.files.iirv.terms.VectorEpochTerm}).
*
* @param vectors list of sequential {@link IIRVVector}s.
*/
public IIRVMessage(final List<IIRVVector> vectors) {
// Perform validation checks
validateSequenceNumberIncreasing(vectors);
validateStaticValues(vectors);
this.vectors = vectors;
}
/**
* Constructor from a list of IIRV {@link IIRVVector}s that monotonically increase in both
* {@link org.orekit.files.iirv.terms.SequenceNumberTerm} and time ({@link org.orekit.files.iirv.terms.DayOfYearTerm}
* and {@link org.orekit.files.iirv.terms.VectorEpochTerm}).
*
* @param vectors list of sequential IIRV vectors.
*/
public IIRVMessage(final IIRVVector... vectors) {
this(Arrays.asList(vectors));
}
/**
* Copy constructor.
*
* @param other other {@link IIRVMessage} instance.
*/
public IIRVMessage(final IIRVMessage other) {
final List<IIRVVector> copied_vectors = new ArrayList<>();
for (IIRVVector v : other.getVectors()) {
copied_vectors.add(new IIRVVector(v));
}
validateSequenceNumberIncreasing(copied_vectors);
validateStaticValues(copied_vectors);
this.vectors = copied_vectors;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final IIRVMessage that = (IIRVMessage) o;
return Objects.equals(toMessageString(IncludeMessageMetadata.ALL_VECTORS), that.toMessageString(IncludeMessageMetadata.ALL_VECTORS));
}
@Override
public int hashCode() {
return Objects.hashCode(vectors);
}
/**
* Adds an {@link IIRVVector} to the message (see {@link ArrayList#add(Object)}).
*
* @param v IIRV vector to add to the message
*/
public void add(final IIRVVector v) {
if (vectors.isEmpty()) {
vectors.add(v);
return;
}
// Check that the time and sequence number are increasing
final int prevLineNumber = vectors.size() - 1;
final IIRVVector prev = vectors.get(prevLineNumber);
// Verify sequence number is increasing by one
if (prev.getSequenceNumber().value() + 1 != v.getSequenceNumber().value()) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_SEQUENCE_NUMBER_MUST_BE_INCREASING_BY_ONE, prevLineNumber, prev.getSequenceNumber().value(), prevLineNumber, v.getSequenceNumber().value());
}
// Ensure the static values are consistent across all the vectors
validateStaticValues(vectors);
this.vectors.add(v);
}
/**
* Gets the {@link IIRVVector} located at a given index in the message.
*
* @param i index of the element to return
* @return element at the given index
* @see ArrayList#get(int)
*/
public IIRVVector get(final int i) {
return vectors.get(i);
}
/**
* Returns the number of IIRV vectors contained in the message.
*
* @return number of IIRV vectors contained in the message
* @see ArrayList#size()
*/
public int size() {
return vectors.size();
}
/**
* Returns true if no vectors exist in the message.
*
* @return true if no vectors exist in the message
* @see ArrayList#isEmpty()
*/
public boolean isEmpty() {
return vectors.isEmpty();
}
/**
* Converts the {@link IIRVVector}s contained in the message file into a list of their String representations.
*
* @param includeMessageMetadataSetting Setting for when message metadata terms appear in the created IIRV message
* @return list of {@link IIRVVector} strings for each vector the message
* @see IIRVVector#toIIRVString
*/
public ArrayList<String> getVectorStrings(final IncludeMessageMetadata includeMessageMetadataSetting) {
final ArrayList<String> messageStrings = new ArrayList<>();
for (int i = 0; i < vectors.size(); i++) {
final boolean includeMessageMetadata;
switch (includeMessageMetadataSetting) {
case ALL_VECTORS: {
includeMessageMetadata = true;
break;
}
case FIRST_VECTOR_ONLY: {
includeMessageMetadata = i == 0;
break;
}
default:
throw new OrekitInternalError(null);
}
messageStrings.add(vectors.get(i).toIIRVString(includeMessageMetadata));
}
return messageStrings;
}
/**
* Converts the {@link IIRVVector}s contained in the message file into a single String, where no deliminator
* included between each vector (the vectors already have trailing line carriage and line returns).
*
* @param includeMessageMetadataSetting Setting for when message metadata terms appear in the created IIRV message
* @return String containing all {@link IIRVVector}s for the IIRV message
* @see IIRVVector#toIIRVString
*/
public String toMessageString(final IncludeMessageMetadata includeMessageMetadataSetting) {
return String.join("", getVectorStrings(includeMessageMetadataSetting));
}
/**
* Gets the list of sequential {@link IIRVVector} instances contained within the overall IIRV message.
*
* @return list of sequential {@link IIRVVector} instances contained within the overall IIRV message.
*/
public List<IIRVVector> getVectors() {
return vectors;
}
/**
* Validates that values that are expected to remain constant do not change across a series of inputted
* IIRV vectors.
*
* @param iirvVectors List of {@link IIRVVector} instances to validate.
*/
private void validateStaticValues(final List<IIRVVector> iirvVectors) {
// Check thatM select values are consistent across entire vector
final IIRVVector firstIIRV = iirvVectors.get(0);
for (int i = 1; i < iirvVectors.size(); i++) {
final IIRVVector iirv = iirvVectors.get(i);
// Check that terms you expect to remain constant, do remain constant
if (!firstIIRV.getMessageID().equals(iirv.getMessageID())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Message ID");
} else if (!firstIIRV.getMessageClass().equals(iirv.getMessageClass())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Message class");
} else if (!firstIIRV.getOriginIdentification().equals(iirv.getOriginIdentification())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Origin ID");
} else if (!firstIIRV.getRoutingIndicator().equals(iirv.getRoutingIndicator())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Routing indicator");
} else if (!firstIIRV.getVectorType().equals(iirv.getVectorType())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Vector type");
} else if (!firstIIRV.getDataSource().equals(iirv.getDataSource())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Data source");
} else if (!firstIIRV.getCoordinateSystem().equals(iirv.getCoordinateSystem())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Coordinate system");
} else if (!firstIIRV.getSupportIdCode().equals(iirv.getSupportIdCode())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Support ID code (SIC)");
} else if (!firstIIRV.getVehicleIdCode().equals(iirv.getVehicleIdCode())) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_TERM_CHANGES_WITHIN_FILE, "Vehicle ID code (VID)");
}
}
}
/**
* Returns the satellite ID (set to the value of the {@link org.orekit.files.iirv.terms.VehicleIdCodeTerm}).
*
* @return the satellite ID
* @see org.orekit.files.iirv.terms.VehicleIdCodeTerm
*/
public String getSatelliteID() {
return vectors.get(0).getVehicleIdCode().toEncodedString();
}
/**
* Validates that the sequence number increases by one for each element in a series of {@link IIRVVector}s.
*
* @param iirvVectors List of {@link IIRVVector} instances to validate.
*/
private void validateSequenceNumberIncreasing(final List<IIRVVector> iirvVectors) {
if (iirvVectors.size() < 2) {
return;
}
// Check that sequence number increases by 1 each time
for (int i = 1; i < iirvVectors.size(); i++) {
final IIRVVector current = iirvVectors.get(i);
final IIRVVector prev = iirvVectors.get(i - 1);
if (current.getSequenceNumber().value() - prev.getSequenceNumber().value() != 1) {
throw new OrekitIllegalStateException(OrekitMessages.IIRV_SEQUENCE_NUMBER_MUST_BE_INCREASING_BY_ONE, i - 1, prev.getSequenceNumber().value(), current.getSequenceNumber().value());
}
}
}
/**
* Options for how message metadata appears in the IIRV message file.
* <p>
* Message metadata fields refer to the first four terms defined for an IIRV vector:
* <ul>
* <li>{@link MessageTypeTerm}</li>
* <li>{@link org.orekit.files.iirv.terms.MessageIDTerm}</li>
* <li>{@link MessageSourceTerm}</li>
* <li>{@link org.orekit.files.iirv.terms.MessageClassTerm}</li>
* </ul>
*
* @author Nick LaFarge
* @since 13.0
*/
public enum IncludeMessageMetadata {
/**
* Include message metadata fields in the first line of the first vector
* (when {@link org.orekit.files.iirv.terms.SequenceNumberTerm} is 0), and omit for all other vectors
* in a given IIRV message file.
*/
FIRST_VECTOR_ONLY,
/** Include message metadata fields from all vectors in a given IIRV message file. */
ALL_VECTORS
}
}