SatelliteType.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.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.ExtendedPositionProvider;

  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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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 ExtendedPositionProvider 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.      * @since 13.0
  367.      */
  368.     NAVIC_1GEO("IRNSS-1GEO") {
  369.         /** {@inheritDoc} */
  370.         @Override
  371.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  372.                                                           final AbsoluteDate validityEnd,
  373.                                                           final ExtendedPositionProvider sun,
  374.                                                           final Frame inertialFrame, final int prnNumber) {
  375.             // we don't have yet a specific mode for NavIC, we use generic GNSS (simple yaw steering)
  376.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  377.         }
  378.     },

  379.     /** IRNSS-2 GEO.
  380.      * @since 13.0
  381.      */
  382.     NAVIC_2GEO("IRNSS-2GEO") {
  383.         /** {@inheritDoc} */
  384.         @Override
  385.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  386.                                                           final AbsoluteDate validityEnd,
  387.                                                           final ExtendedPositionProvider sun,
  388.                                                           final Frame inertialFrame, final int prnNumber) {
  389.             // we don't have yet a specific mode for NavIC, we use generic GNSS (simple yaw steering)
  390.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  391.         }
  392.     },

  393.     /** IRNSS-1 IGSO.
  394.      * @since 13.0
  395.      */
  396.     NAVIC_1IGSO("IRNSS-1IGSO") {
  397.         /** {@inheritDoc} */
  398.         @Override
  399.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  400.                                                           final AbsoluteDate validityEnd,
  401.                                                           final ExtendedPositionProvider sun,
  402.                                                           final Frame inertialFrame, final int prnNumber) {
  403.             // we don't have yet a specific mode for NavIC, we use generic GNSS (simple yaw steering)
  404.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  405.         }
  406.     },

  407.     /** QZSS Block I (Michibiki-1). */
  408.     QZSS("QZSS") {
  409.         /** {@inheritDoc} */
  410.         @Override
  411.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  412.                                                           final AbsoluteDate validityEnd,
  413.                                                           final ExtendedPositionProvider sun,
  414.                                                           final Frame inertialFrame, final int prnNumber) {
  415.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  416.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  417.         }
  418.     },

  419.     /** QZSS Block II (Michibiki-2). */
  420.     QZSS_2A("QZSS-2A") {
  421.         /** {@inheritDoc} */
  422.         @Override
  423.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  424.                                                           final AbsoluteDate validityEnd,
  425.                                                           final ExtendedPositionProvider sun,
  426.                                                           final Frame inertialFrame, final int prnNumber) {
  427.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  428.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  429.         }
  430.     },

  431.     /** QZSS Block II IGSO (Michibiki-2,4). */
  432.     QZSS_2I("QZSS-2I") {
  433.         /** {@inheritDoc} */
  434.         @Override
  435.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  436.                                                           final AbsoluteDate validityEnd,
  437.                                                           final ExtendedPositionProvider sun,
  438.                                                           final Frame inertialFrame, final int prnNumber) {
  439.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  440.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  441.         }
  442.     },

  443.     /** QZSS Block II GEO (Michibiki-3). */
  444.     QZSS_2G("QZSS-2G") {
  445.         /** {@inheritDoc} */
  446.         @Override
  447.         public GNSSAttitudeProvider buildAttitudeProvider(final AbsoluteDate validityStart,
  448.                                                           final AbsoluteDate validityEnd,
  449.                                                           final ExtendedPositionProvider sun,
  450.                                                           final Frame inertialFrame, final int prnNumber) {
  451.             // we don't have yet a specific mode for QZSS, we use generic GNSS (simple yaw steering)
  452.             return new GenericGNSS(validityStart, validityEnd, sun, inertialFrame);
  453.         }
  454.     };

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

  457.     /** Parsing map. */
  458.     private static final Map<String, SatelliteType> NAMES_MAP = new HashMap<>();
  459.     static {
  460.         for (final SatelliteType satelliteAntennaCode : values()) {
  461.             NAMES_MAP.put(satelliteAntennaCode.getName(), satelliteAntennaCode);
  462.             NAMES_MAP.put(PATTERN.matcher(satelliteAntennaCode.getName()).replaceAll(""), satelliteAntennaCode);
  463.         }
  464.     }

  465.     /** IGS name for the antenna code. */
  466.     private final String name;

  467.     /** Simple constructor.
  468.      * @param name IGS name for the antenna code
  469.      */
  470.     SatelliteType(final String name) {
  471.         this.name = name;
  472.     }

  473.     /** Get the IGS name for the antenna code.
  474.      * @return IGS name for the antenna code
  475.      */
  476.     public String getName() {
  477.         return name;
  478.     }

  479.     /** Build an attitude provider suitable for this satellite type.
  480.      * <p>
  481.      * Apart from the caller-provided validity interval, Sun provider,
  482.      * frame and PRN number, all construction parameters required for
  483.      * the {@link GNSSAttitudeProvider} (for example yaw rates and biases)
  484.      * will be the default ones. If non-default values are needed, the
  485.      * constructor of the appropriate {@link GNSSAttitudeProvider} must be
  486.      * called explicitly instead of relying on this general purpose factory
  487.      * method.
  488.      * </p>
  489.      * @param validityStart start of validity for this provider
  490.      * @param validityEnd end of validity for this provider
  491.      * @param sun provider for Sun position
  492.      * @param inertialFrame inertial frame where velocity are computed
  493.      * @param prnNumber number within the satellite system
  494.      * @return an attitude provider suitable for this satellite type
  495.      */
  496.     public abstract GNSSAttitudeProvider buildAttitudeProvider(AbsoluteDate validityStart,
  497.                                                                AbsoluteDate validityEnd,
  498.                                                                ExtendedPositionProvider sun,
  499.                                                                Frame inertialFrame, int prnNumber);

  500.     /** Parse a string to get the satellite type.
  501.      * <p>
  502.      * The name must be either a strict IGS name (like "BLOCK IIR-B") or
  503.      * an IGS name canonicalized by removing all spaces, hyphen and underscore
  504.      * characters (like BLOCKIIRB").
  505.      * </p>
  506.      * @param s string to parse (must be a strict IGS name)
  507.      * @return the satellite type
  508.      * @exception OrekitIllegalArgumentException if the string does not correspond to a satellite antenna code
  509.      */
  510.     public static SatelliteType parseSatelliteType(final String s)
  511.         throws OrekitIllegalArgumentException {
  512.         final SatelliteType satelliteAntennaCode = NAMES_MAP.get(s);
  513.         if (satelliteAntennaCode == null) {
  514.             throw new OrekitIllegalArgumentException(OrekitMessages.UNKNOWN_SATELLITE_ANTENNA_CODE, s);
  515.         }
  516.         return satelliteAntennaCode;
  517.     }

  518. }