OrbitPhysicalPropertiesKey.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 org.orekit.files.ccsds.definitions.Units;
  19. import org.orekit.files.ccsds.utils.ContextBinding;
  20. import org.orekit.files.ccsds.utils.lexical.ParseToken;
  21. import org.orekit.files.ccsds.utils.lexical.TokenType;
  22. import org.orekit.utils.units.Unit;


  23. /** Keys for {@link OrbitPhysicalProperties physical properties data} entries.
  24.  * @author Luc Maisonobe
  25.  * @since 11.0
  26.  */
  27. public enum OrbitPhysicalPropertiesKey {

  28.     /** Comment entry. */
  29.     COMMENT((token, context, container) ->
  30.             token.getType() == TokenType.ENTRY ? container.addComment(token.getContentAsNormalizedString()) : true),

  31.     /** Satellite manufacturer name. */
  32.     MANUFACTURER((token, context, container) -> token.processAsFreeTextString(container::setManufacturer)),

  33.     /** Bus model name. */
  34.     BUS_MODEL((token, context, container) -> token.processAsFreeTextString(container::setBusModel)),

  35.     /** Other space objects this object is docked to. */
  36.     DOCKED_WITH((token, context, container) -> token.processAsFreeTextList(container::setDockedWith)),

  37.     /** Attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB. */
  38.     DRAG_CONST_AREA((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  39.                                                                          container::setDragConstantArea)),

  40.     /** Nominal drag coefficient. */
  41.     DRAG_COEFF_NOM((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
  42.                                                                         container::setDragCoefficient)),

  43.     /** Drag coefficient 1σ uncertainty. */
  44.     DRAG_UNCERTAINTY((token, context, container) -> token.processAsDouble(Unit.PERCENT, context.getParsedUnitsBehavior(),
  45.                                                                           container::setDragUncertainty)),

  46.     /** Total mass at beginning of life. */
  47.     INITIAL_WET_MASS((token, context, container) -> token.processAsDouble(Unit.KILOGRAM, context.getParsedUnitsBehavior(),
  48.                                                                           container::setInitialWetMass)),

  49.     /** Total mass at T₀. */
  50.     WET_MASS((token, context, container) -> token.processAsDouble(Unit.KILOGRAM, context.getParsedUnitsBehavior(),
  51.                                                                   container::setWetMass)),

  52.     /** Mass without propellant. */
  53.     DRY_MASS((token, context, container) -> token.processAsDouble(Unit.KILOGRAM, context.getParsedUnitsBehavior(),
  54.                                                                   container::setDryMass)),

  55.     /** Optimally Enclosing Box parent reference frame. */
  56.     OEB_PARENT_FRAME((token, context, container) -> token.processAsFrame(container::setOebParentFrame, context, true, true, false)),

  57.     /** Optimally Enclosing Box parent reference frame epoch. */
  58.     OEB_PARENT_FRAME_EPOCH((token, context, container) -> token.processAsDate(container::setOebParentFrameEpoch, context)),

  59.     /** Quaternion defining Optimally Enclosing Box (first vectorial component). */
  60.     OEB_Q1((token, context, container) -> token.processAsIndexedDouble(1, Unit.ONE, context.getParsedUnitsBehavior(),
  61.                                                                        container::setOebQ)),

  62.     /** Quaternion defining Optimally Enclosing Box (second vectorial component). */
  63.     OEB_Q2((token, context, container) -> token.processAsIndexedDouble(2, Unit.ONE, context.getParsedUnitsBehavior(),
  64.                                                                        container::setOebQ)),

  65.     /** Quaternion defining Optimally Enclosing Box (third vectorial component). */
  66.     OEB_Q3((token, context, container) -> token.processAsIndexedDouble(3, Unit.ONE, context.getParsedUnitsBehavior(),
  67.                                                                        container::setOebQ)),

  68.     /** Quaternion defining Optimally Enclosing Box (scalar component). */
  69.     OEB_QC((token, context, container) -> token.processAsIndexedDouble(0, Unit.ONE, context.getParsedUnitsBehavior(),
  70.                                                                        container::setOebQ)),

  71.     /** Dimensions of Optimally Enclosing Box along X-OEB (i.e max). */
  72.     OEB_MAX((token, context, container) -> token.processAsDouble(Unit.METRE, context.getParsedUnitsBehavior(),
  73.                                                                  container::setOebMax)),

  74.     /** Dimensions of Optimally Enclosing Box along Y-OEB (i.e intermediate). */
  75.     OEB_INT((token, context, container) -> token.processAsDouble(Unit.METRE, context.getParsedUnitsBehavior(),
  76.                                                                  container::setOebIntermediate)),

  77.     /** Dimensions of Optimally Enclosing Box along Z-OEB (i.e min). */
  78.     OEB_MIN((token, context, container) -> token.processAsDouble(Unit.METRE, context.getParsedUnitsBehavior(),
  79.                                                                  container::setOebMin)),

  80.     /** Cross-sectional area of Optimally Enclosing Box along X-OEB. */
  81.     AREA_ALONG_OEB_MAX((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  82.                                                                             container::setOebAreaAlongMax)),

  83.     /** Cross-sectional area of Optimally Enclosing Box along Y-OEB. */
  84.     AREA_ALONG_OEB_INT((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  85.                                                                             container::setOebAreaAlongIntermediate)),

  86.     /** Cross-sectional area of Optimally Enclosing Box along Z-OEB. */
  87.     AREA_ALONG_OEB_MIN((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  88.                                                                             container::setOebAreaAlongMin)),

  89.     /** Minimum cross-sectional area for collision probability estimation purposes. */
  90.     AREA_MIN_FOR_PC((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  91.                                                                          container::setMinAreaForCollisionProbability)),

  92.     /** Maximum cross-sectional area for collision probability estimation purposes. */
  93.     AREA_MAX_FOR_PC((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  94.                                                                          container::setMaxAreaForCollisionProbability)),

  95.     /** Typical (50th percentile) cross-sectional area for collision probability estimation purposes. */
  96.     AREA_TYP_FOR_PC((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  97.                                                                          container::setTypAreaForCollisionProbability)),

  98.     /** Typical (50th percentile) radar cross-section. */
  99.     RCS((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  100.                                                              container::setRcs)),

  101.     /** Minimum radar cross-section. */
  102.     RCS_MIN((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  103.                                                                  container::setMinRcs)),

  104.     /** Maximum radar cross-section. */
  105.     RCS_MAX((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  106.                                                                  container::setMaxRcs)),

  107.     /** Attitude-independent SRP area, not already into attitude-dependent area along OEB. */
  108.     SRP_CONST_AREA((token, context, container) -> token.processAsDouble(Units.M2, context.getParsedUnitsBehavior(),
  109.                                                                         container::setSrpConstantArea)),

  110.     /** Nominal SRP coefficient. */
  111.     SOLAR_RAD_COEFF((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
  112.                                                                          container::setSrpCoefficient)),

  113.     /** SRP coefficient 1σ uncertainty. */
  114.     SOLAR_RAD_UNCERTAINTY((token, context, container) -> token.processAsDouble(Unit.PERCENT, context.getParsedUnitsBehavior(),
  115.                                                                                container::setSrpUncertainty)),

  116.     /** Typical (50th percentile) visual magnitude. */
  117.     VM_ABSOLUTE((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
  118.                                                                      container::setVmAbsolute)),

  119.     /** Minimum apparent visual magnitude. */
  120.     VM_APPARENT_MIN((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
  121.                                                                          container::setVmApparentMin)),

  122.     /** Typical (50th percentile) apparent visual magnitude. */
  123.     VM_APPARENT((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
  124.                                                                      container::setVmApparent)),

  125.     /** Maximum apparent visual magnitude. */
  126.     VM_APPARENT_MAX((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
  127.                                                                          container::setVmApparentMax)),

  128.     /** Typical (50th percentile) coefficient of reflectance. */
  129.     REFLECTANCE((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
  130.                                                                      container::setReflectance)),

  131.     /** Attitude control mode. */
  132.     ATT_CONTROL_MODE((token, context, container) -> token.processAsFreeTextString(container::setAttitudeControlMode)),

  133.     /** Type of actuator for attitude control. */
  134.     ATT_ACTUATOR_TYPE((token, context, container) -> token.processAsFreeTextString(container::setAttitudeActuatorType)),

  135.     /** Accuracy of attitude knowledge. */
  136.     ATT_KNOWLEDGE((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(), container::setAttitudeKnowledgeAccuracy)),

  137.     /** Accuracy of attitude control. */
  138.     ATT_CONTROL((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(), container::setAttitudeControlAccuracy)),

  139.     /** Overall accuracy of spacecraft to maintain attitude. */
  140.     ATT_POINTING((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(), container::setAttitudePointingAccuracy)),

  141.     /** Average number of orbit or attitude maneuvers per year. */
  142.     AVG_MANEUVER_FREQ((token, context, container) -> token.processAsDouble(Units.NB_PER_Y, context.getParsedUnitsBehavior(),
  143.                                                                            container::setManeuversFrequency)),

  144.     /** Maximum composite thrust the spacecraft can accomplish. */
  145.     MAX_THRUST((token, context, container) -> token.processAsDouble(Unit.NEWTON, context.getParsedUnitsBehavior(),
  146.                                                                     container::setMaxThrust)),

  147.     /** Total ΔV capability at beginning of life. */
  148.     DV_BOL((token, context, container) -> token.processAsDouble(Units.KM_PER_S, context.getParsedUnitsBehavior(),
  149.                                                                 container::setBolDv)),

  150.     /** Total ΔV remaining for spacecraft. */
  151.     DV_REMAINING((token, context, container) -> token.processAsDouble(Units.KM_PER_S, context.getParsedUnitsBehavior(),
  152.                                                                       container::setRemainingDv)),

  153.     /** Moment of inertia about X-axis. */
  154.     IXX((token, context, container) -> token.processAsDoublyIndexedDouble(0, 0, Units.KG_M2, context.getParsedUnitsBehavior(),
  155.                                                                           container::setInertiaMatrixEntry)),

  156.     /** Moment of inertia about Y-axis. */
  157.     IYY((token, context, container) -> token.processAsDoublyIndexedDouble(1, 1, Units.KG_M2, context.getParsedUnitsBehavior(),
  158.                                                                           container::setInertiaMatrixEntry)),

  159.     /** Moment of inertia about Z-axis. */
  160.     IZZ((token, context, container) -> token.processAsDoublyIndexedDouble(2, 2, Units.KG_M2, context.getParsedUnitsBehavior(),
  161.                                                                           container::setInertiaMatrixEntry)),

  162.     /** Inertia cross product of the X and Y axes. */
  163.     IXY((token, context, container) -> token.processAsDoublyIndexedDouble(0, 1, Units.KG_M2, context.getParsedUnitsBehavior(),
  164.                                                                           container::setInertiaMatrixEntry)),

  165.     /** Inertia cross product of the X and Z axes. */
  166.     IXZ((token, context, container) -> token.processAsDoublyIndexedDouble(0, 2, Units.KG_M2, context.getParsedUnitsBehavior(),
  167.                                                                           container::setInertiaMatrixEntry)),

  168.     /** Inertia cross product of the Y and Z axes. */
  169.     IYZ((token, context, container) -> token.processAsDoublyIndexedDouble(1, 2, Units.KG_M2, context.getParsedUnitsBehavior(),
  170.                                                                           container::setInertiaMatrixEntry));

  171.     /** Processing method. */
  172.     private final transient TokenProcessor processor;

  173.     /** Simple constructor.
  174.      * @param processor processing method
  175.      */
  176.     OrbitPhysicalPropertiesKey(final TokenProcessor processor) {
  177.         this.processor = processor;
  178.     }

  179.     /** Process an token.
  180.      * @param token token to process
  181.      * @param context context binding
  182.      * @param data data to fill
  183.      * @return true of token was accepted
  184.      */
  185.     public boolean process(final ParseToken token, final ContextBinding context, final OrbitPhysicalProperties data) {
  186.         return processor.process(token, context, data);
  187.     }

  188.     /** Interface for processing one token. */
  189.     interface TokenProcessor {
  190.         /** Process one token.
  191.          * @param token token to process
  192.          * @param context context binding
  193.          * @param data data to fill
  194.          * @return true of token was accepted
  195.          */
  196.         boolean process(ParseToken token, ContextBinding context, OrbitPhysicalProperties data);
  197.     }

  198. }