OrbitManeuverHistoryMetadata.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.ccsds.ndm.odm.ocm;

  18. import java.util.Collections;
  19. import java.util.List;

  20. import org.hipparchus.geometry.euclidean.threed.Vector3D;
  21. import org.orekit.errors.OrekitException;
  22. import org.orekit.errors.OrekitMessages;
  23. import org.orekit.files.ccsds.definitions.BodyFacade;
  24. import org.orekit.files.ccsds.definitions.DutyCycleType;
  25. import org.orekit.files.ccsds.definitions.FrameFacade;
  26. import org.orekit.files.ccsds.definitions.OrbitRelativeFrame;
  27. import org.orekit.files.ccsds.definitions.SpacecraftBodyFrame;
  28. import org.orekit.files.ccsds.section.CommentsContainer;
  29. import org.orekit.time.AbsoluteDate;
  30. import org.orekit.utils.units.Unit;

  31. /** Metadata for maneuver history.
  32.  * <p>
  33.  * Beware that the Orekit getters and setters all rely on SI units. The parsers
  34.  * and writers take care of converting these SI units into CCSDS mandatory units.
  35.  * The {@link org.orekit.utils.units.Unit Unit} class provides useful
  36.  * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
  37.  * {@link org.orekit.utils.units.Unit#toSI(double) toSI} methods in case the callers
  38.  * already use CCSDS units instead of the API SI units. The general-purpose
  39.  * {@link org.orekit.utils.units.Unit Unit} class (without an 's') and the
  40.  * CCSDS-specific {@link org.orekit.files.ccsds.definitions.Units Units} class
  41.  * (with an 's') also provide some predefined units. These predefined units and the
  42.  * {@link org.orekit.utils.units.Unit#fromSI(double) fromSi} and
  43.  * {@link org.orekit.utils.units.Unit#toSI(double) toSI} conversion methods are indeed
  44.  * what the parsers and writers use for the conversions.
  45.  * </p>
  46.  * @author Luc Maisonobe
  47.  * @since 11.0
  48.  */
  49. public class OrbitManeuverHistoryMetadata extends CommentsContainer {

  50.     /** Default duty cycle type.
  51.      * @since 12.0
  52.      */
  53.     public static final DutyCycleType DEFAULT_DC_TYPE = DutyCycleType.CONTINUOUS;

  54.     /** Maneuver identification number. */
  55.     private String manID;

  56.     /** Identification number of previous maneuver. */
  57.     private String manPrevID;

  58.     /** Identification number of next maneuver. */
  59.     private String manNextID;

  60.     /** Basis of this maneuver history data. */
  61.     private ManBasis manBasis;

  62.     /** Identification number of the orbit determination or simulation upon which this maneuver is based. */
  63.     private String manBasisID;

  64.     /** Identifier of the device used for this maneuver. */
  65.     private String manDeviceID;

  66.     /** Completion time of previous maneuver. */
  67.     private AbsoluteDate manPrevEpoch;

  68.     /** Start time of next maneuver. */
  69.     private AbsoluteDate manNextEpoch;

  70.     /** Reference frame of the maneuver. */
  71.     private FrameFacade manReferenceFrame;

  72.     /** Epoch of the maneuver reference frame. */
  73.     private AbsoluteDate manFrameEpoch;

  74.     /** Purposes of the maneuver. */
  75.     private List<String> manPurpose;

  76.     /** Prediction source on which this maneuver is based. */
  77.     private String manPredSource;

  78.     /** Origin of maneuver gravitational assist body. */
  79.     private BodyFacade gravitationalAssist;

  80.     /** Type of duty cycle. */
  81.     private DutyCycleType dcType;

  82.     /** Start time of duty cycle-based maneuver window. */
  83.     private AbsoluteDate dcWindowOpen;

  84.     /** End time of duty cycle-based maneuver window. */
  85.     private AbsoluteDate dcWindowClose;

  86.     /** Minimum number of "ON" duty cycles. */
  87.     private int dcMinCycles;

  88.     /** Maximum number of "ON" duty cycles. */
  89.     private int dcMaxCycles;

  90.     /** Start time of initial duty cycle-based maneuver execution. */
  91.     private AbsoluteDate dcExecStart;

  92.     /** End time of final duty cycle-based maneuver execution. */
  93.     private AbsoluteDate dcExecStop;

  94.     /** Duty cycle thrust reference time. */
  95.     private AbsoluteDate dcRefTime;

  96.     /** Duty cycle pulse "ON" duration. */
  97.     private double dcTimePulseDuration;

  98.     /** Duty cycle elapsed time between start of a pulse and start of next pulse. */
  99.     private double dcTimePulsePeriod;

  100.     /** Reference direction for triggering duty cycle. */
  101.     private Vector3D dcRefDir;

  102.     /** Spacecraft body frame in which {@link #dcBodyTrigger} is specified. */
  103.     private SpacecraftBodyFrame dcBodyFrame;

  104.     /** Direction in {@link #dcBodyFrame body frame} for triggering duty cycle. */
  105.     private Vector3D dcBodyTrigger;

  106.     /** Phase angle of pulse start. */
  107.     private double dcPhaseStartAngle;

  108.     /** Phase angle of pulse stop. */
  109.     private double dcPhaseStopAngle;

  110.     /** Maneuver elements of information. */
  111.     private List<ManeuverFieldType> manComposition;

  112.     /** Units of covariance element set. */
  113.     private List<Unit> manUnits;

  114.     /** Simple constructor.
  115.      * @param epochT0 T0 epoch from file metadata
  116.      */
  117.     public OrbitManeuverHistoryMetadata(final AbsoluteDate epochT0) {
  118.         // we don't call the setXxx() methods in order to avoid
  119.         // calling refuseFurtherComments as a side effect
  120.         // In 502.0-B-3 (p. 6-39) MAN_BASIS is optional and has no default
  121.         manBasis            = null;
  122.         manReferenceFrame   = new FrameFacade(null, null,
  123.                                               OrbitRelativeFrame.TNW_INERTIAL, null,
  124.                                               OrbitRelativeFrame.TNW_INERTIAL.name());
  125.         manFrameEpoch       = epochT0;
  126.         manPurpose          = Collections.emptyList();
  127.         dcType              = DEFAULT_DC_TYPE;
  128.         dcMinCycles         = -1;
  129.         dcMaxCycles         = -1;
  130.         dcTimePulseDuration = Double.NaN;
  131.         dcTimePulsePeriod   = Double.NaN;
  132.     }

  133.     /** {@inheritDoc} */
  134.     @Override
  135.     public void validate(final double version) {
  136.         super.validate(version);
  137.         checkNotNull(manID,          OrbitManeuverHistoryMetadataKey.MAN_ID.name());
  138.         checkNotNull(manDeviceID,    OrbitManeuverHistoryMetadataKey.MAN_DEVICE_ID.name());

  139.         if (dcType != DutyCycleType.CONTINUOUS) {
  140.             checkNotNull(dcWindowOpen,       OrbitManeuverHistoryMetadataKey.DC_WIN_OPEN.name());
  141.             checkNotNull(dcWindowClose,      OrbitManeuverHistoryMetadataKey.DC_WIN_CLOSE.name());
  142.             checkNotNull(dcExecStart,        OrbitManeuverHistoryMetadataKey.DC_EXEC_START.name());
  143.             checkNotNull(dcExecStop,         OrbitManeuverHistoryMetadataKey.DC_EXEC_STOP.name());
  144.             checkNotNull(dcRefTime,          OrbitManeuverHistoryMetadataKey.DC_REF_TIME.name());
  145.             checkNotNaN(dcTimePulseDuration, OrbitManeuverHistoryMetadataKey.DC_TIME_PULSE_DURATION.name());
  146.             checkNotNaN(dcTimePulsePeriod,   OrbitManeuverHistoryMetadataKey.DC_TIME_PULSE_PERIOD.name());
  147.         }
  148.         if (dcType == DutyCycleType.TIME_AND_ANGLE) {
  149.             checkNotNull(dcRefDir,           OrbitManeuverHistoryMetadataKey.DC_REF_DIR.name());
  150.             checkNotNull(dcBodyFrame,        OrbitManeuverHistoryMetadataKey.DC_BODY_FRAME.name());
  151.             checkNotNull(dcBodyTrigger,      OrbitManeuverHistoryMetadataKey.DC_BODY_TRIGGER.name());
  152.             checkNotNull(dcPhaseStartAngle,  OrbitManeuverHistoryMetadataKey.DC_PA_START_ANGLE.name());
  153.             checkNotNull(dcPhaseStopAngle,   OrbitManeuverHistoryMetadataKey.DC_PA_STOP_ANGLE.name());
  154.         }

  155.         checkNotNull(manComposition, OrbitManeuverHistoryMetadataKey.MAN_COMPOSITION.name());
  156.         if (!manComposition.get(0).isTime()) {
  157.             throw new OrekitException(OrekitMessages.CCSDS_MANEUVER_MISSING_TIME, manID);
  158.         }
  159.         final int firstNonTime = (manComposition.size() > 1 && manComposition.get(1).isTime()) ? 2 : 1;

  160.         if (manUnits != null) {
  161.             if (manUnits.size() != manComposition.size() - firstNonTime) {
  162.                 throw new OrekitException(OrekitMessages.CCSDS_MANEUVER_UNITS_WRONG_NB_COMPONENTS,
  163.                                           manID);
  164.             }
  165.             for (int i = 0; i < manUnits.size(); ++i) {
  166.                 manComposition.get(firstNonTime + i).checkUnit(manUnits.get(i));
  167.             }
  168.         }
  169.     }

  170.     /** Get maneuver identification number.
  171.      * @return maneuver identification number
  172.      */
  173.     public String getManID() {
  174.         return manID;
  175.     }

  176.     /** Set maneuver identification number.
  177.      * @param manID maneuver identification number
  178.      */
  179.     public void setManID(final String manID) {
  180.         refuseFurtherComments();
  181.         this.manID = manID;
  182.     }

  183.     /** Get identification number of previous maneuver.
  184.      * @return identification number of previous maneuver
  185.      */
  186.     public String getManPrevID() {
  187.         return manPrevID;
  188.     }

  189.     /** Set identification number of previous maneuver.
  190.      * @param manPrevID identification number of previous maneuver
  191.      */
  192.     public void setManPrevID(final String manPrevID) {
  193.         refuseFurtherComments();
  194.         this.manPrevID = manPrevID;
  195.     }

  196.     /** Get identification number of next maneuver.
  197.      * @return identification number of next maneuver
  198.      */
  199.     public String getManNextID() {
  200.         return manNextID;
  201.     }

  202.     /** Set identification number of next maneuver.
  203.      * @param manNextID identification number of next maneuver
  204.      */
  205.     public void setManNextID(final String manNextID) {
  206.         refuseFurtherComments();
  207.         this.manNextID = manNextID;
  208.     }

  209.     /** Get basis of this maneuver history data.
  210.      * @return basis of this maneuver history data
  211.      */
  212.     public ManBasis getManBasis() {
  213.         return manBasis;
  214.     }

  215.     /** Set basis of this maneuver history data.
  216.      * @param manBasis basis of this maneuver history data
  217.      */
  218.     public void setManBasis(final ManBasis manBasis) {
  219.         refuseFurtherComments();
  220.         this.manBasis = manBasis;
  221.     }

  222.     /** Get identification number of the orbit determination or simulation upon which this maneuver is based.
  223.      * @return identification number of the orbit determination or simulation upon which this maneuver is based
  224.      */
  225.     public String getManBasisID() {
  226.         return manBasisID;
  227.     }

  228.     /** Set identification number of the orbit determination or simulation upon which this maneuver is based.
  229.      * @param manBasisID identification number of the orbit determination or simulation upon which this maneuver is based
  230.      */
  231.     public void setManBasisID(final String manBasisID) {
  232.         refuseFurtherComments();
  233.         this.manBasisID = manBasisID;
  234.     }

  235.     /** Get identifier of the device used for this maneuver.
  236.      * @return identifier of the device used for this maneuver
  237.      */
  238.     public String getManDeviceID() {
  239.         return manDeviceID;
  240.     }

  241.     /** Set identifier of the device used for this maneuver.
  242.      * @param manDeviceID identifier of the device used for this maneuver
  243.      */
  244.     public void setManDeviceID(final String manDeviceID) {
  245.         refuseFurtherComments();
  246.         this.manDeviceID = manDeviceID;
  247.     }

  248.     /** Get completion time of previous maneuver.
  249.      * @return completion time of previous maneuver
  250.      */
  251.     public AbsoluteDate getManPrevEpoch() {
  252.         return manPrevEpoch;
  253.     }

  254.     /** Set completion time of previous maneuver.
  255.      * @param manPrevEpoch completion time of previous maneuver
  256.      */
  257.     public void setManPrevEpoch(final AbsoluteDate manPrevEpoch) {
  258.         refuseFurtherComments();
  259.         this.manPrevEpoch = manPrevEpoch;
  260.     }

  261.     /** Get start time of next maneuver.
  262.      * @return start time of next maneuver
  263.      */
  264.     public AbsoluteDate getManNextEpoch() {
  265.         return manNextEpoch;
  266.     }

  267.     /** Set start time of next maneuver.
  268.      * @param manNextEpoch start time of next maneuver
  269.      */
  270.     public void setManNextEpoch(final AbsoluteDate manNextEpoch) {
  271.         refuseFurtherComments();
  272.         this.manNextEpoch = manNextEpoch;
  273.     }

  274.     /** Get the purposes of the maneuver.
  275.      * @return purposes of the maneuver
  276.      */
  277.     public List<String> getManPurpose() {
  278.         return manPurpose;
  279.     }

  280.     /** Set the purposes of the maneuver.
  281.      * @param manPurpose purposes of the maneuver
  282.      */
  283.     public void setManPurpose(final List<String> manPurpose) {
  284.         this.manPurpose = manPurpose;
  285.     }

  286.     /** Get prediction source on which this maneuver is based.
  287.      * @return prediction source on which this maneuver is based
  288.      */
  289.     public String getManPredSource() {
  290.         return manPredSource;
  291.     }

  292.     /** Set prediction source on which this maneuver is based.
  293.      * @param manPredSource prediction source on which this maneuver is based
  294.      */
  295.     public void setManPredSource(final String manPredSource) {
  296.         refuseFurtherComments();
  297.         this.manPredSource = manPredSource;
  298.     }

  299.     /** Get reference frame of the maneuver.
  300.      * @return reference frame of the maneuver
  301.      */
  302.     public FrameFacade getManReferenceFrame() {
  303.         return manReferenceFrame;
  304.     }

  305.     /** Set reference frame of the maneuver.
  306.      * @param manReferenceFrame the reference frame to be set
  307.      */
  308.     public void setManReferenceFrame(final FrameFacade manReferenceFrame) {
  309.         refuseFurtherComments();
  310.         this.manReferenceFrame = manReferenceFrame;
  311.     }

  312.     /** Get epoch of the {@link #getManReferenceFrame() maneuver reference frame}.
  313.      * @return epoch of the {@link #getManReferenceFrame() maneuver reference frame}
  314.      */
  315.     public AbsoluteDate getManFrameEpoch() {
  316.         return manFrameEpoch;
  317.     }

  318.     /** Set epoch of the {@link #getManReferenceFrame() maneuver reference frame}.
  319.      * @param manFrameEpoch epoch of the {@link #getManReferenceFrame() maneuver reference frame}
  320.      */
  321.     public void setManFrameEpoch(final AbsoluteDate manFrameEpoch) {
  322.         refuseFurtherComments();
  323.         this.manFrameEpoch = manFrameEpoch;
  324.     }

  325.     /** Get the origin of gravitational assist.
  326.      * @return the origin of gravitational assist.
  327.      */
  328.     public BodyFacade getGravitationalAssist() {
  329.         return gravitationalAssist;
  330.     }

  331.     /** Set the origin of gravitational assist.
  332.      * @param gravitationalAssist origin of gravitational assist to be set
  333.      */
  334.     public void setGravitationalAssist(final BodyFacade gravitationalAssist) {
  335.         refuseFurtherComments();
  336.         this.gravitationalAssist = gravitationalAssist;
  337.     }

  338.     /** Get type of duty cycle.
  339.      * @return type of duty cycle
  340.      */
  341.     public DutyCycleType getDcType() {
  342.         return dcType;
  343.     }

  344.     /** Set type of duty cycle.
  345.      * @param dcType type of duty cycle
  346.      */
  347.     public void setDcType(final DutyCycleType dcType) {
  348.         this.dcType = dcType;
  349.     }

  350.     /** Get the start time of duty cycle-based maneuver window.
  351.      * @return start time of duty cycle-based maneuver window
  352.      */
  353.     public AbsoluteDate getDcWindowOpen() {
  354.         return dcWindowOpen;
  355.     }

  356.     /** Set the start time of duty cycle-based maneuver window.
  357.      * @param dcWindowOpen start time of duty cycle-based maneuver window
  358.      */
  359.     public void setDcWindowOpen(final AbsoluteDate dcWindowOpen) {
  360.         this.dcWindowOpen = dcWindowOpen;
  361.     }

  362.     /** Get the end time of duty cycle-based maneuver window.
  363.      * @return end time of duty cycle-based maneuver window
  364.      */
  365.     public AbsoluteDate getDcWindowClose() {
  366.         return dcWindowClose;
  367.     }

  368.     /** Set the end time of duty cycle-based maneuver window.
  369.      * @param dcWindowClose end time of duty cycle-based maneuver window
  370.      */
  371.     public void setDcWindowClose(final AbsoluteDate dcWindowClose) {
  372.         this.dcWindowClose = dcWindowClose;
  373.     }

  374.     /** Get the minimum number of "ON" duty cycles.
  375.      * @return minimum number of "ON" duty cycles (-1 if not set)
  376.      */
  377.     public int getDcMinCycles() {
  378.         return dcMinCycles;
  379.     }

  380.     /** Set the minimum number of "ON" duty cycles.
  381.      * @param dcMinCycles minimum number of "ON" duty cycles
  382.      */
  383.     public void setDcMinCycles(final int dcMinCycles) {
  384.         this.dcMinCycles = dcMinCycles;
  385.     }

  386.     /** Get the maximum number of "ON" duty cycles.
  387.      * @return maximum number of "ON" duty cycles (-1 if not set)
  388.      */
  389.     public int getDcMaxCycles() {
  390.         return dcMaxCycles;
  391.     }

  392.     /** Set the maximum number of "ON" duty cycles.
  393.      * @param dcMaxCycles maximum number of "ON" duty cycles
  394.      */
  395.     public void setDcMaxCycles(final int dcMaxCycles) {
  396.         this.dcMaxCycles = dcMaxCycles;
  397.     }

  398.     /** Get the start time of initial duty cycle-based maneuver execution.
  399.      * @return start time of initial duty cycle-based maneuver execution
  400.      */
  401.     public AbsoluteDate getDcExecStart() {
  402.         return dcExecStart;
  403.     }

  404.     /** Set the start time of initial duty cycle-based maneuver execution.
  405.      * @param dcExecStart start time of initial duty cycle-based maneuver execution
  406.      */
  407.     public void setDcExecStart(final AbsoluteDate dcExecStart) {
  408.         this.dcExecStart = dcExecStart;
  409.     }

  410.     /** Get the end time of final duty cycle-based maneuver execution.
  411.      * @return end time of final duty cycle-based maneuver execution
  412.      */
  413.     public AbsoluteDate getDcExecStop() {
  414.         return dcExecStop;
  415.     }

  416.     /** Set the end time of final duty cycle-based maneuver execution.
  417.      * @param dcExecStop end time of final duty cycle-based maneuver execution
  418.      */
  419.     public void setDcExecStop(final AbsoluteDate dcExecStop) {
  420.         this.dcExecStop = dcExecStop;
  421.     }

  422.     /** Get duty cycle thrust reference time.
  423.      * @return duty cycle thrust reference time
  424.      */
  425.     public AbsoluteDate getDcRefTime() {
  426.         return dcRefTime;
  427.     }

  428.     /** Set duty cycle thrust reference time.
  429.      * @param dcRefTime duty cycle thrust reference time
  430.      */
  431.     public void setDcRefTime(final AbsoluteDate dcRefTime) {
  432.         this.dcRefTime = dcRefTime;
  433.     }

  434.     /** Get duty cycle pulse "ON" duration.
  435.      * @return duty cycle pulse "ON" duration
  436.      */
  437.     public double getDcTimePulseDuration() {
  438.         return dcTimePulseDuration;
  439.     }

  440.     /** Set duty cycle pulse "ON" duration.
  441.      * @param dcTimePulseDuration duty cycle pulse "ON" duration
  442.      */
  443.     public void setDcTimePulseDuration(final double dcTimePulseDuration) {
  444.         this.dcTimePulseDuration = dcTimePulseDuration;
  445.     }

  446.     /** Get duty cycle elapsed time between start of a pulse and start of next pulse.
  447.      * @return duty cycle elapsed time between start of a pulse and start of next pulse
  448.      */
  449.     public double getDcTimePulsePeriod() {
  450.         return dcTimePulsePeriod;
  451.     }

  452.     /** Set duty cycle elapsed time between start of a pulse and start of next pulse.
  453.      * @param dcTimePulsePeriod duty cycle elapsed time between start of a pulse and start of next pulse
  454.      */
  455.     public void setDcTimePulsePeriod(final double dcTimePulsePeriod) {
  456.         this.dcTimePulsePeriod = dcTimePulsePeriod;
  457.     }

  458.     /** Get reference direction for triggering duty cycle.
  459.      * @return reference direction for triggering duty cycle
  460.      */
  461.     public Vector3D getDcRefDir() {
  462.         return dcRefDir;
  463.     }

  464.     /** Set reference direction for triggering duty cycle.
  465.      * @param dcRefDir reference direction for triggering duty cycle
  466.      */
  467.     public void setDcRefDir(final Vector3D dcRefDir) {
  468.         this.dcRefDir = dcRefDir;
  469.     }

  470.     /** Get spacecraft body frame in which {@link #getDcBodyTrigger()} is specified.
  471.      * @return spacecraft body frame in which {@link #getDcBodyTrigger()} is specified
  472.      */
  473.     public SpacecraftBodyFrame getDcBodyFrame() {
  474.         return dcBodyFrame;
  475.     }

  476.     /** Set spacecraft body frame in which {@link #getDcBodyTrigger()} is specified.
  477.      * @param dcBodyFrame spacecraft body frame in which {@link #getDcBodyTrigger()} is specified
  478.      */
  479.     public void setDcBodyFrame(final SpacecraftBodyFrame dcBodyFrame) {
  480.         this.dcBodyFrame = dcBodyFrame;
  481.     }

  482.     /** Get direction in {@link #getDcBodyFrame() body frame} for triggering duty cycle.
  483.      * @return direction in {@link #getDcBodyFrame() body frame} for triggering duty cycle
  484.      */
  485.     public Vector3D getDcBodyTrigger() {
  486.         return  dcBodyTrigger;
  487.     }

  488.     /** Set direction in {@link #getDcBodyFrame() body frame} for triggering duty cycle.
  489.      * @param dcBodyTrigger direction in {@link #getDcBodyFrame() body frame} for triggering duty cycle
  490.      */
  491.     public void setDcBodyTrigger(final Vector3D dcBodyTrigger) {
  492.         this.dcBodyTrigger = dcBodyTrigger;
  493.     }

  494.     /** Get phase angle of pulse start.
  495.      * @return phase angle of pulse start
  496.      */
  497.     public double getDcPhaseStartAngle() {
  498.         return dcPhaseStartAngle;
  499.     }

  500.     /** Set phase angle of pulse start.
  501.      * @param dcPhaseStartAngle phase angle of pulse start
  502.      */
  503.     public void setDcPhaseStartAngle(final double dcPhaseStartAngle) {
  504.         this.dcPhaseStartAngle = dcPhaseStartAngle;
  505.     }

  506.     /** Get phase angle of pulse stop.
  507.      * @return phase angle of pulse stop
  508.      */
  509.     public double getDcPhaseStopAngle() {
  510.         return dcPhaseStopAngle;
  511.     }

  512.     /** Set phase angle of pulse stop.
  513.      * @param dcPhaseStopAngle phase angle of pulse stop
  514.      */
  515.     public void setDcPhaseStopAngle(final double dcPhaseStopAngle) {
  516.         this.dcPhaseStopAngle = dcPhaseStopAngle;
  517.     }

  518.     /** Get maneuver elements of information.
  519.      * @return maneuver element of information
  520.      */
  521.     public List<ManeuverFieldType> getManComposition() {
  522.         return manComposition;
  523.     }

  524.     /** Set maneuver element of information.
  525.      * @param manComposition maneuver element of information
  526.      */
  527.     public void setManComposition(final List<ManeuverFieldType> manComposition) {
  528.         refuseFurtherComments();
  529.         this.manComposition = manComposition;
  530.     }

  531.     /** Get maneuver elements of information units.
  532.      * @return maneuver element of information units
  533.      */
  534.     public List<Unit> getManUnits() {
  535.         return manUnits;
  536.     }

  537.     /** Set maneuver element of information units.
  538.      * @param manUnits maneuver element of information units
  539.      */
  540.     public void setManUnits(final List<Unit> manUnits) {
  541.         refuseFurtherComments();
  542.         this.manUnits = manUnits;
  543.     }

  544. }