SatelliteType.java

  1. /* Copyright 2002-2023 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.gnss.antenna;

  18. import java.util.HashMap;
  19. import java.util.Map;
  20. import java.util.regex.Pattern;

  21. import org.orekit.errors.OrekitIllegalArgumentException;
  22. import org.orekit.errors.OrekitMessages;
  23. import org.orekit.frames.Frame;
  24. import org.orekit.gnss.attitude.BeidouGeo;
  25. import org.orekit.gnss.attitude.BeidouIGSO;
  26. import org.orekit.gnss.attitude.BeidouMeo;
  27. import org.orekit.gnss.attitude.GNSSAttitudeProvider;
  28. import org.orekit.gnss.attitude.GPSBlockIIA;
  29. import org.orekit.gnss.attitude.GPSBlockIIF;
  30. import org.orekit.gnss.attitude.GPSBlockIIR;
  31. import org.orekit.gnss.attitude.Galileo;
  32. import org.orekit.gnss.attitude.GenericGNSS;
  33. import org.orekit.gnss.attitude.Glonass;
  34. import org.orekit.time.AbsoluteDate;
  35. import org.orekit.utils.ExtendedPVCoordinatesProvider;

  36. /**
  37.  * Enumerate for satellite types.
  38.  *
  39.  * @author Luc Maisonobe
  40.  * @since 9.3
  41.  */
  42. public enum SatelliteType {

  43.     /** BeiDou-2 GEO. */
  44.     BEIDOU_2G("BEIDOU-2G") {
  45.         /** {@inheritDoc} */
  46.         @Override
  47.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  48.                                                           final AbsoluteDate validityEnd,
  49.                                                           final ExtendedPVCoordinatesProvider sun,
  50.                                                           final Frame inertialFrame, final int prnNumber) {
  51.             return new BeidouGeo(validityStart, validityEnd, sun, inertialFrame);
  52.         }
  53.     },

  54.     /** BeiDou-2 IGSO. */
  55.     BEIDOU_2I("BEIDOU-2I") {
  56.         /** {@inheritDoc} */
  57.         @Override
  58.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  59.                                                           final AbsoluteDate validityEnd,
  60.                                                           final ExtendedPVCoordinatesProvider sun,
  61.                                                           final Frame inertialFrame, final int prnNumber) {
  62.             return new BeidouIGSO(validityStart, validityEnd, sun, inertialFrame);
  63.         }
  64.     },

  65.     /** BeiDou-2 MEO. */
  66.     BEIDOU_2M("BEIDOU-2M") {
  67.         /** {@inheritDoc} */
  68.         @Override
  69.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  70.                                                           final AbsoluteDate validityEnd,
  71.                                                           final ExtendedPVCoordinatesProvider sun,
  72.                                                           final Frame inertialFrame, final int prnNumber) {
  73.             return new BeidouMeo(validityStart, validityEnd, sun, inertialFrame);
  74.         }
  75.     },

  76.     /** BeiDou-3 IGSO. */
  77.     BEIDOU_3I("BEIDOU-3I") {
  78.         /** {@inheritDoc} */
  79.         @Override
  80.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  81.                                                           final AbsoluteDate validityEnd,
  82.                                                           final ExtendedPVCoordinatesProvider sun,
  83.                                                           final Frame inertialFrame, final int prnNumber) {
  84.             // it seems Beidou III satellites use Galileo mode
  85.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  86.                                validityStart, validityEnd, sun, inertialFrame);
  87.         }
  88.     },

  89.     /** BeiDou-3. */
  90.     BEIDOU_3SI_SECM("BEIDOU-3SI-SECM") {
  91.         /** {@inheritDoc} */
  92.         @Override
  93.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  94.                                                           final AbsoluteDate validityEnd,
  95.                                                           final ExtendedPVCoordinatesProvider sun,
  96.                                                           final Frame inertialFrame, final int prnNumber) {
  97.             // it seems Beidou III satellites use Galileo mode
  98.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  99.                                validityStart, validityEnd, sun, inertialFrame);
  100.         }
  101.     },

  102.     /** BeiDou-3. */
  103.     BEIDOU_3SI_CAST("BEIDOU-3SI-CAST") {
  104.         /** {@inheritDoc} */
  105.         @Override
  106.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  107.                                                           final AbsoluteDate validityEnd,
  108.                                                           final ExtendedPVCoordinatesProvider sun,
  109.                                                           final Frame inertialFrame, final int prnNumber) {
  110.             // it seems Beidou III satellites use Galileo mode
  111.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  112.                                validityStart, validityEnd, sun, inertialFrame);
  113.         }
  114.     },

  115.     /** BeiDou-3. */
  116.     BEIDOU_3M_CAST("BEIDOU-3M-CAST") {
  117.         /** {@inheritDoc} */
  118.         @Override
  119.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  120.                                                           final AbsoluteDate validityEnd,
  121.                                                           final ExtendedPVCoordinatesProvider sun,
  122.                                                           final Frame inertialFrame, final int prnNumber) {
  123.             // it seems Beidou III satellites use Galileo mode
  124.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  125.                                validityStart, validityEnd, sun, inertialFrame);
  126.         }
  127.     },

  128.     /** BeiDou-3. */
  129.     BEIDOU_3SM_CAST("BEIDOU-3SM-CAST") {
  130.         /** {@inheritDoc} */
  131.         @Override
  132.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  133.                                                           final AbsoluteDate validityEnd,
  134.                                                           final ExtendedPVCoordinatesProvider sun,
  135.                                                           final Frame inertialFrame, final int prnNumber) {
  136.             // it seems Beidou III satellites use Galileo mode
  137.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  138.                                validityStart, validityEnd, sun, inertialFrame);
  139.         }
  140.     },

  141.     /** BeiDou-3. */
  142.     BEIDOU_3M_SECM("BEIDOU-3M-SECM") {
  143.         /** {@inheritDoc} */
  144.         @Override
  145.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  146.                                                           final AbsoluteDate validityEnd,
  147.                                                           final ExtendedPVCoordinatesProvider sun,
  148.                                                           final Frame inertialFrame, final int prnNumber) {
  149.             // it seems Beidou III satellites use Galileo mode
  150.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  151.                                validityStart, validityEnd, sun, inertialFrame);
  152.         }
  153.     },

  154.     /** BeiDou-3. */
  155.     BEIDOU_3G_CAST("BEIDOU-3G-CAST") {
  156.         /** {@inheritDoc} */
  157.         @Override
  158.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  159.                                                           final AbsoluteDate validityEnd,
  160.                                                           final ExtendedPVCoordinatesProvider sun,
  161.                                                           final Frame inertialFrame, final int prnNumber) {
  162.             // it seems Beidou III satellites use Galileo mode
  163.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  164.                                validityStart, validityEnd, sun, inertialFrame);
  165.         }
  166.     },

  167.     /** GPS Block I     : SVN 01-11. */
  168.     BLOCK_I("BLOCK I") {
  169.         /** {@inheritDoc} */
  170.         @Override
  171.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  172.                                                           final AbsoluteDate validityEnd,
  173.                                                           final ExtendedPVCoordinatesProvider sun,
  174.                                                           final Frame inertialFrame, final int prnNumber) {
  175.             return new GPSBlockIIA(GPSBlockIIA.getDefaultYawRate(prnNumber),
  176.                                    GPSBlockIIA.DEFAULT_YAW_BIAS,
  177.                                    validityStart, validityEnd, sun, inertialFrame);
  178.         }
  179.     },

  180.     /** GPS Block II    : SVN 13-21. */
  181.     BLOCK_II("BLOCK II") {
  182.         /** {@inheritDoc} */
  183.         @Override
  184.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  185.                                                           final AbsoluteDate validityEnd,
  186.                                                           final ExtendedPVCoordinatesProvider sun,
  187.                                                           final Frame inertialFrame, final int prnNumber) {
  188.             return new GPSBlockIIA(GPSBlockIIA.getDefaultYawRate(prnNumber),
  189.                                    GPSBlockIIA.DEFAULT_YAW_BIAS,
  190.                                    validityStart, validityEnd, sun, inertialFrame);
  191.         }
  192.     },

  193.     /** GPS Block IIA   : SVN 22-40. */
  194.     BLOCK_IIA("BLOCK IIA") {
  195.         /** {@inheritDoc} */
  196.         @Override
  197.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  198.                                                           final AbsoluteDate validityEnd,
  199.                                                           final ExtendedPVCoordinatesProvider sun,
  200.                                                           final Frame inertialFrame, final int prnNumber) {
  201.             return new GPSBlockIIA(GPSBlockIIA.getDefaultYawRate(prnNumber),
  202.                                    GPSBlockIIA.DEFAULT_YAW_BIAS,
  203.                                    validityStart, validityEnd, sun, inertialFrame);
  204.         }
  205.     },

  206.     /** GPS Block IIR   : SVN 41, 43-46, 51, 54, 56. */
  207.     BLOCK_IIR_A("BLOCK IIR-A") {
  208.         /** {@inheritDoc} */
  209.         @Override
  210.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  211.                                                           final AbsoluteDate validityEnd,
  212.                                                           final ExtendedPVCoordinatesProvider sun,
  213.                                                           final Frame inertialFrame, final int prnNumber) {
  214.             return new GPSBlockIIR(GPSBlockIIR.DEFAULT_YAW_RATE,
  215.                                    validityStart, validityEnd, sun, inertialFrame);
  216.         }
  217.     },

  218.     /** GPS Block IIR   : SVN 47, 59-61. */
  219.     BLOCK_IIR_B("BLOCK IIR-B") {
  220.         /** {@inheritDoc} */
  221.         @Override
  222.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  223.                                                           final AbsoluteDate validityEnd,
  224.                                                           final ExtendedPVCoordinatesProvider sun,
  225.                                                           final Frame inertialFrame, final int prnNumber) {
  226.             return new GPSBlockIIR(GPSBlockIIR.DEFAULT_YAW_RATE,
  227.                                    validityStart, validityEnd, sun, inertialFrame);
  228.         }
  229.     },

  230.     /** GPS Block IIR-M : SVN 48-50, 52-53, 55, 57-58. */
  231.     BLOCK_IIR_M("BLOCK IIR-M") {
  232.         /** {@inheritDoc} */
  233.         @Override
  234.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  235.                                                           final AbsoluteDate validityEnd,
  236.                                                           final ExtendedPVCoordinatesProvider sun,
  237.                                                           final Frame inertialFrame, final int prnNumber) {
  238.             return new GPSBlockIIR(GPSBlockIIR.DEFAULT_YAW_RATE,
  239.                                    validityStart, validityEnd, sun, inertialFrame);
  240.         }
  241.     },

  242.     /** GPS Block IIF   : SVN 62-73. */
  243.     BLOCK_IIF("BLOCK IIF") {
  244.         /** {@inheritDoc} */
  245.         @Override
  246.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  247.                                                           final AbsoluteDate validityEnd,
  248.                                                           final ExtendedPVCoordinatesProvider sun,
  249.                                                           final Frame inertialFrame, final int prnNumber) {
  250.             return new GPSBlockIIF(GPSBlockIIF.DEFAULT_YAW_RATE,
  251.                                    GPSBlockIIF.DEFAULT_YAW_BIAS,
  252.                                    validityStart, validityEnd, sun, inertialFrame);
  253.         }
  254.     },

  255.     /** GPS Block IIIA  : SVN 74-81. */
  256.     BLOCK_IIIA("BLOCK IIIA") {
  257.         /** {@inheritDoc} */
  258.         @Override
  259.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  260.                                                           final AbsoluteDate validityEnd,
  261.                                                           final ExtendedPVCoordinatesProvider sun,
  262.                                                           final Frame inertialFrame, final int prnNumber) {
  263.             // we don't have yet a specific mode for block IIIA, we reuse block IIF
  264.             return new GPSBlockIIF(GPSBlockIIF.DEFAULT_YAW_RATE,
  265.                                    GPSBlockIIF.DEFAULT_YAW_BIAS,
  266.                                    validityStart, validityEnd, sun, inertialFrame);
  267.         }
  268.     },

  269.     /** Galileo In-Orbit Validation Element A (GIOVE-A). */
  270.     GALILEO_0A("GALILEO-0A") {
  271.         /** {@inheritDoc} */
  272.         @Override
  273.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  274.                                                           final AbsoluteDate validityEnd,
  275.                                                           final ExtendedPVCoordinatesProvider sun,
  276.                                                           final Frame inertialFrame, final int prnNumber) {
  277.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  278.                                validityStart, validityEnd, sun, inertialFrame);
  279.         }
  280.     },

  281.     /** Galileo In-Orbit Validation Element B (GIOVE-B). */
  282.     GALILEO_0B("GALILEO-0B") {
  283.         /** {@inheritDoc} */
  284.         @Override
  285.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  286.                                                           final AbsoluteDate validityEnd,
  287.                                                           final ExtendedPVCoordinatesProvider sun,
  288.                                                           final Frame inertialFrame, final int prnNumber) {
  289.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  290.                                validityStart, validityEnd, sun, inertialFrame);
  291.         }
  292.     },

  293.     /** Galileo IOV     : GSAT 0101-0104. */
  294.     GALILEO_1("GALILEO-1") {
  295.         /** {@inheritDoc} */
  296.         @Override
  297.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  298.                                                           final AbsoluteDate validityEnd,
  299.                                                           final ExtendedPVCoordinatesProvider sun,
  300.                                                           final Frame inertialFrame, final int prnNumber) {
  301.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  302.                                validityStart, validityEnd, sun, inertialFrame);
  303.         }
  304.     },

  305.     /** Galileo FOC     : GSAT 0201-0222. */
  306.     GALILEO_2("GALILEO-2") {
  307.         /** {@inheritDoc} */
  308.         @Override
  309.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  310.                                                           final AbsoluteDate validityEnd,
  311.                                                           final ExtendedPVCoordinatesProvider sun,
  312.                                                           final Frame inertialFrame, final int prnNumber) {
  313.             return new Galileo(Galileo.DEFAULT_YAW_RATE,
  314.                                validityStart, validityEnd, sun, inertialFrame);
  315.         }
  316.     },

  317.     /** GLONASS         : GLONASS no. 201-249, 750-798. */
  318.     GLONASS("GLONASS") {
  319.         /** {@inheritDoc} */
  320.         @Override
  321.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  322.                                                           final AbsoluteDate validityEnd,
  323.                                                           final ExtendedPVCoordinatesProvider sun,
  324.                                                           final Frame inertialFrame, final int prnNumber) {
  325.             return new Glonass(Glonass.DEFAULT_YAW_RATE,
  326.                                validityStart, validityEnd, sun, inertialFrame);
  327.         }
  328.     },

  329.     /** GLONASS-M       : GLONASS no. 701-749, IGS SVN R850-R861 (GLO no. + 100). */
  330.     GLONASS_M("GLONASS-M") {
  331.         /** {@inheritDoc} */
  332.         @Override
  333.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  334.                                                           final AbsoluteDate validityEnd,
  335.                                                           final ExtendedPVCoordinatesProvider sun,
  336.                                                           final Frame inertialFrame, final int prnNumber) {
  337.             return new Glonass(Glonass.DEFAULT_YAW_RATE,
  338.                                validityStart, validityEnd, sun, inertialFrame);
  339.         }
  340.     },

  341.     /** GLONASS-K1      : IGS SVN R801-R802 (GLO no. + 100). */
  342.     GLONASS_K1("GLONASS-K1") {
  343.         /** {@inheritDoc} */
  344.         @Override
  345.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  346.                                                           final AbsoluteDate validityEnd,
  347.                                                           final ExtendedPVCoordinatesProvider sun,
  348.                                                           final Frame inertialFrame, final int prnNumber) {
  349.             return new Glonass(Glonass.DEFAULT_YAW_RATE,
  350.                                validityStart, validityEnd, sun, inertialFrame);
  351.         }
  352.     },

  353.     /** GLONASS-K2. */
  354.     GLONASS_K2("GLONASS-K2") {
  355.         /** {@inheritDoc} */
  356.         @Override
  357.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  358.                                                           final AbsoluteDate validityEnd,
  359.                                                           final ExtendedPVCoordinatesProvider sun,
  360.                                                           final Frame inertialFrame, final int prnNumber) {
  361.             return new Glonass(Glonass.DEFAULT_YAW_RATE,
  362.                                validityStart, validityEnd, sun, inertialFrame);
  363.         }
  364.     },

  365.     /** IRNSS-1 GEO. */
  366.     IRNSS_1GEO("IRNSS-1GEO") {
  367.         /** {@inheritDoc} */
  368.         @Override
  369.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  370.                                                           final AbsoluteDate validityEnd,
  371.                                                           final ExtendedPVCoordinatesProvider sun,
  372.                                                           final Frame inertialFrame, final int prnNumber) {
  373.             // we don't have yet a specific mode for IRNSS, we use generic GNSS (simple yaw steering)
  374.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  375.         }
  376.     },

  377.     /** IRNSS-1 IGSO. */
  378.     IRNSS_1IGSO("IRNSS-1IGSO") {
  379.         /** {@inheritDoc} */
  380.         @Override
  381.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  382.                                                           final AbsoluteDate validityEnd,
  383.                                                           final ExtendedPVCoordinatesProvider sun,
  384.                                                           final Frame inertialFrame, final int prnNumber) {
  385.             // we don't have yet a specific mode for IRNSS, we use generic GNSS (simple yaw steering)
  386.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  387.         }
  388.     },

  389.     /** QZSS Block I (Michibiki-1). */
  390.     QZSS("QZSS") {
  391.         /** {@inheritDoc} */
  392.         @Override
  393.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  394.                                                           final AbsoluteDate validityEnd,
  395.                                                           final ExtendedPVCoordinatesProvider sun,
  396.                                                           final Frame inertialFrame, final int prnNumber) {
  397.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  398.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  399.         }
  400.     },

  401.     /** QZSS Block II (Michibiki-2). */
  402.     QZSS_2A("QZSS-2A") {
  403.         /** {@inheritDoc} */
  404.         @Override
  405.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  406.                                                           final AbsoluteDate validityEnd,
  407.                                                           final ExtendedPVCoordinatesProvider sun,
  408.                                                           final Frame inertialFrame, final int prnNumber) {
  409.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  410.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  411.         }
  412.     },

  413.     /** QZSS Block II IGSO (Michibiki-2,4). */
  414.     QZSS_2I("QZSS-2I") {
  415.         /** {@inheritDoc} */
  416.         @Override
  417.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  418.                                                           final AbsoluteDate validityEnd,
  419.                                                           final ExtendedPVCoordinatesProvider sun,
  420.                                                           final Frame inertialFrame, final int prnNumber) {
  421.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  422.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  423.         }
  424.     },

  425.     /** QZSS Block II GEO (Michibiki-3). */
  426.     QZSS_2G("QZSS-2G") {
  427.         /** {@inheritDoc} */
  428.         @Override
  429.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  430.                                                           final AbsoluteDate validityEnd,
  431.                                                           final ExtendedPVCoordinatesProvider sun,
  432.                                                           final Frame inertialFrame, final int prnNumber) {
  433.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  434.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  435.         }
  436.     };

  437.     /** Pattern for satellite antenna code. */
  438.     private static final Pattern PATTERN = Pattern.compile("[-_ ]");

  439.     /** Parsing map. */
  440.     private static final Map<String, SatelliteType> NAMES_MAP = new HashMap<>();
  441.     static {
  442.         for (final SatelliteType satelliteAntennaCode : values()) {
  443.             NAMES_MAP.put(satelliteAntennaCode.getName(), satelliteAntennaCode);
  444.             NAMES_MAP.put(PATTERN.matcher(satelliteAntennaCode.getName()).replaceAll(""), satelliteAntennaCode);
  445.         }
  446.     }

  447.     /** IGS name for the antenna code. */
  448.     private final String name;

  449.     /** Simple constructor.
  450.      * @param name IGS name for the antenna code
  451.      */
  452.     SatelliteType(final String name) {
  453.         this.name = name;
  454.     }

  455.     /** Get the IGS name for the antenna code.
  456.      * @return IGS name for the antenna code
  457.      */
  458.     public String getName() {
  459.         return name;
  460.     }

  461.     /** Build an attitude provider suitable for this satellite type.
  462.      * <p>
  463.      * Apart from the caller-provided validity interval, Sun provider,
  464.      * frame and PRN number, all construction parameters required for
  465.      * the {@link GNSSAttitudeProvider} (for example yaw rates and biases)
  466.      * will be the default ones. If non-default values are needed, the
  467.      * constructor of the appropriate {@link GNSSAttitudeProvider} must be
  468.      * called explicitly instead of relying on this general purpose factory
  469.      * method.
  470.      * </p>
  471.      * @param validityStart start of validity for this provider
  472.      * @param validityEnd end of validity for this provider
  473.      * @param sun provider for Sun position
  474.      * @param inertialFrame inertial frame where velocity are computed
  475.      * @param prnNumber number within the satellite system
  476.      * @return an attitude provider suitable for this satellite type
  477.      */
  478.     public abstract GNSSAttitudeProvider buildAttitudeProvider(AbsoluteDate validityStart,
  479.                                                                AbsoluteDate validityEnd,
  480.                                                                ExtendedPVCoordinatesProvider sun,
  481.                                                                Frame inertialFrame, int prnNumber);

  482.     /** Parse a string to get the satellite type.
  483.      * <p>
  484.      * The name must be either a strict IGS name (like "BLOCK IIR-B") or
  485.      * an IGS name canonicalized by removing all spaces, hypen and underscore
  486.      * characters (like BLOCKIIRB").
  487.      * </p>
  488.      * @param s string to parse (must be a strict IGS name)
  489.      * @return the satellite type
  490.      * @exception OrekitIllegalArgumentException if the string does not correspond to a satellite antenna code
  491.      */
  492.     public static SatelliteType parseSatelliteType(final String s)
  493.         throws OrekitIllegalArgumentException {
  494.         final SatelliteType satelliteAntennaCode = NAMES_MAP.get(s);
  495.         if (satelliteAntennaCode == null) {
  496.             throw new OrekitIllegalArgumentException(OrekitMessages.UNKNOWN_SATELLITE_ANTENNA_CODE, s);
  497.         }
  498.         return satelliteAntennaCode;
  499.     }

  500. }