CPFWriter.java

  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. package org.orekit.files.ilrs;

  18. import java.io.IOException;
  19. import java.util.List;

  20. import org.orekit.errors.OrekitIllegalArgumentException;
  21. import org.orekit.errors.OrekitMessages;
  22. import org.orekit.files.general.EphemerisFile;
  23. import org.orekit.files.general.EphemerisFile.SatelliteEphemeris;
  24. import org.orekit.files.general.EphemerisFileWriter;
  25. import org.orekit.files.ilrs.StreamingCpfWriter.Segment;
  26. import org.orekit.time.TimeScale;
  27. import org.orekit.utils.TimeStampedPVCoordinates;

  28. /**
  29.  * An CPF Writer class that can take in a general {@link EphemerisFile} object
  30.  * and export it as a valid CPF file.
  31.  * <p>
  32.  * It supports both 1.0 and 2.0 versions
  33.  * <p>
  34.  * <b>Note:</b> By default, only required header keys are wrote (H1 and H2).
  35.  * Furthermore, only position data can be written.
  36.  * Other keys (i.e. in header and other types of ephemeris entries) are simply ignored.
  37.  * Contributions are welcome to support more fields in the format.
  38.  * @author Bryan Cazabonne
  39.  * @since 10.3
  40.  * @see <a href="https://ilrs.gsfc.nasa.gov/docs/2006/cpf_1.01.pdf">1.0 file format</a>
  41.  * @see <a href="https://ilrs.gsfc.nasa.gov/docs/2018/cpf_2.00h-1.pdf">2.0 file format</a>
  42.  */
  43. public class CPFWriter implements EphemerisFileWriter {

  44.     /** Container for header data. */
  45.     private final CPFHeader header;

  46.     /** Time scale for dates. */
  47.     private final TimeScale timescale;

  48.     /** Flag for optional velocity record. */
  49.     private final boolean velocityFlag;

  50.     /**
  51.      * Constructor.
  52.      * <p>
  53.      * Using this constructor, velocity data are not written.
  54.      * </p>
  55.      * @param header container for header data
  56.      * @param timescale time scale for dates
  57.      * @see #CPFWriter(CPFHeader, TimeScale, boolean)
  58.      */
  59.     public CPFWriter(final CPFHeader header, final TimeScale timescale) {
  60.         this(header, timescale, false);
  61.     }

  62.     /**
  63.      * Constructor.
  64.      * @param header container for header data
  65.      * @param timescale time scale for dates
  66.      * @param velocityFlag true if velocity must be written
  67.      * @since 11.2
  68.      */
  69.     public CPFWriter(final CPFHeader header, final TimeScale timescale, final boolean velocityFlag) {
  70.         this.header    = header;
  71.         this.timescale = timescale;
  72.         this.velocityFlag = velocityFlag;
  73.     }

  74.     /** {@inheritDoc} */
  75.     @Override
  76.     public <C extends TimeStampedPVCoordinates, S extends EphemerisFile.EphemerisSegment<C>>
  77.         void write(final Appendable writer, final EphemerisFile<C, S> ephemerisFile)
  78.         throws IOException {

  79.         // Verify if writer is not a null object
  80.         if (writer == null) {
  81.             throw new OrekitIllegalArgumentException(OrekitMessages.NULL_ARGUMENT, "writer");
  82.         }

  83.         // Verify if the populated ephemeris file to serialize into the buffer is not null
  84.         if (ephemerisFile == null) {
  85.             return;
  86.         }

  87.         // Get satellite and ephemeris segments to output.
  88.         final SatelliteEphemeris<C, S> satEphem = ephemerisFile.getSatellites().get(header.getIlrsSatelliteId());
  89.         final List<S> segments = satEphem.getSegments();

  90.         // Writer
  91.         final StreamingCpfWriter cpfWriter =
  92.                         new StreamingCpfWriter(writer, timescale, header, velocityFlag);
  93.         // Write header
  94.         cpfWriter.writeHeader();

  95.         // Loop on ephemeris segments
  96.         for (final S segment : segments) {
  97.             final Segment segmentWriter = cpfWriter.newSegment(header.getRefFrame());
  98.             // Loop on coordinates
  99.             for (final TimeStampedPVCoordinates coordinates : segment.getCoordinates()) {
  100.                 segmentWriter.writeEphemerisLine(coordinates);
  101.             }
  102.         }

  103.         // Write end of file
  104.         cpfWriter.writeEndOfFile();

  105.     }

  106. }