FieldBeidouCivilianNavigationMessage.java

  1. /* Copyright 2022-2025 Luc Maisonobe
  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.propagation.analytical.gnss.data;

  18. import org.hipparchus.CalculusFieldElement;
  19. import org.hipparchus.Field;
  20. import org.orekit.gnss.RadioWave;

  21. import java.util.function.Function;

  22. /**
  23.  * Container for data contained in a Beidou civilian navigation message.
  24.  * @param <T> type of the field elements
  25.  * @author Luc Maisonobe
  26.  * @since 13.0
  27.  */
  28. public class FieldBeidouCivilianNavigationMessage<T extends CalculusFieldElement<T>>
  29.     extends FieldAbstractNavigationMessage<T, BeidouCivilianNavigationMessage> {

  30.     /** Radio wave on which navigation signal is sent. */
  31.     private final RadioWave radioWave;

  32.     /** Change rate in semi-major axis (m/s). */
  33.     private T aDot;

  34.     /** Change rate in Δn₀. */
  35.     private T deltaN0Dot;

  36.     /** Issue of Data, Ephemeris. */
  37.     private int iode;

  38.     /** Issue of Data, Clock. */
  39.     private int iodc;

  40.     /** Inter Signal Delay for B1 CD. */
  41.     private T iscB1CD;

  42.     /** Inter Signal Delay for B1 CP. */
  43.     private T iscB1CP;

  44.     /** Inter Signal Delay for B2 AD. */
  45.     private T iscB2AD;

  46.     /** Signal In Space Accuracy Index (along track and across track). */
  47.     private int sisaiOe;

  48.     /** Signal In Space Accuracy Index (radial and clock). */
  49.     private int sisaiOcb;

  50.     /** Signal In Space Accuracy Index (clock drift accuracy). */
  51.     private int sisaiOc1;

  52.     /** Signal In Space Accuracy Index (clock drift rate accuracy). */
  53.     private int sisaiOc2;

  54.     /** Signal In Space Monitoring Accuracy Index. */
  55.     private int sismai;

  56.     /** Health. */
  57.     private int health;

  58.     /** Integrity flags. */
  59.     private int integrityFlags;

  60.     /** B1/B3 Group Delay Differential (s). */
  61.     private T tgdB1Cp;

  62.     /** B2 AP Group Delay Differential (s). */
  63.     private T tgdB2ap;

  64.     /** B2B_i / B3I Group Delay Differential (s). */
  65.     private T tgdB2bI;

  66.     /** Satellite type. */
  67.     private BeidouSatelliteType satelliteType;

  68.     /** Constructor from non-field instance.
  69.      * @param field    field to which elements belong
  70.      * @param original regular non-field instance
  71.      */
  72.     public FieldBeidouCivilianNavigationMessage(final Field<T> field, final BeidouCivilianNavigationMessage original) {
  73.         super(field, original);
  74.         this.radioWave = original.getRadioWave();
  75.         setADot(field.getZero().newInstance(original.getADot()));
  76.         setDeltaN0Dot(field.getZero().newInstance(original.getDeltaN0Dot()));
  77.         setIODE(original.getIODE());
  78.         setIODC(original.getIODC());
  79.         setIscB1CD(field.getZero().newInstance(original.getIscB1CD()));
  80.         setIscB1CP(field.getZero().newInstance(original.getIscB1CP()));
  81.         setIscB2AD(field.getZero().newInstance(original.getIscB2AD()));
  82.         setSisaiOe(original.getSisaiOe());
  83.         setSisaiOcb(original.getSisaiOcb());
  84.         setSisaiOc1(original.getSisaiOc1());
  85.         setSisaiOc2(original.getSisaiOc2());
  86.         setSismai(original.getSismai());
  87.         setHealth(original.getHealth());
  88.         setIntegrityFlags(original.getIntegrityFlags());
  89.         setTgdB1Cp(field.getZero().newInstance(original.getTgdB1Cp()));
  90.         setTgdB2ap(field.getZero().newInstance(original.getTgdB2ap()));
  91.         setTgdB2bI(field.getZero().newInstance(original.getTgdB2bI()));
  92.         setSatelliteType(original.getSatelliteType());
  93.     }

  94.     /** Constructor from different field instance.
  95.      * @param <V> type of the old field elements
  96.      * @param original regular non-field instance
  97.      * @param converter for field elements
  98.      */
  99.     public <V extends CalculusFieldElement<V>> FieldBeidouCivilianNavigationMessage(final Function<V, T> converter,
  100.                                                                                     final FieldBeidouCivilianNavigationMessage<V> original) {
  101.         super(converter, original);
  102.         this.radioWave = original.getRadioWave();
  103.         setADot(converter.apply(original.getADot()));
  104.         setDeltaN0Dot(converter.apply(original.getDeltaN0Dot()));
  105.         setIODE(original.getIODE());
  106.         setIODC(original.getIODC());
  107.         setIscB1CD(converter.apply(original.getIscB1CD()));
  108.         setIscB1CP(converter.apply(original.getIscB1CP()));
  109.         setIscB2AD(converter.apply(original.getIscB2AD()));
  110.         setSisaiOe(original.getSisaiOe());
  111.         setSisaiOcb(original.getSisaiOcb());
  112.         setSisaiOc1(original.getSisaiOc1());
  113.         setSisaiOc2(original.getSisaiOc2());
  114.         setSismai(original.getSismai());
  115.         setHealth(original.getHealth());
  116.         setIntegrityFlags(original.getIntegrityFlags());
  117.         setTgdB1Cp(converter.apply(original.getTgdB1Cp()));
  118.         setTgdB2ap(converter.apply(original.getTgdB2ap()));
  119.         setTgdB2bI(converter.apply(original.getTgdB2bI()));
  120.         setSatelliteType(original.getSatelliteType());
  121.     }

  122.     /** {@inheritDoc} */
  123.     @Override
  124.     public BeidouCivilianNavigationMessage toNonField() {
  125.         return new BeidouCivilianNavigationMessage(this);
  126.     }

  127.     /** {@inheritDoc} */
  128.     @SuppressWarnings("unchecked")
  129.     @Override
  130.     public <U extends CalculusFieldElement<U>, G extends FieldGnssOrbitalElements<U, BeidouCivilianNavigationMessage>>
  131.         G changeField(final Function<T, U> converter) {
  132.         return (G) new FieldBeidouCivilianNavigationMessage<>(converter, this);
  133.     }

  134.     /**
  135.      * Getter for radio wave.
  136.      * @return radio wave on which navigation signal is sent
  137.      */
  138.     public RadioWave getRadioWave() {
  139.         return radioWave;
  140.     }

  141.     /**
  142.      * Getter for the change rate in semi-major axis.
  143.      * @return the change rate in semi-major axis
  144.      */
  145.     public T getADot() {
  146.         return aDot;
  147.     }

  148.     /**
  149.      * Setter for the change rate in semi-major axis.
  150.      * @param value the change rate in semi-major axis
  151.      */
  152.     public void setADot(final T value) {
  153.         this.aDot = value;
  154.     }

  155.     /**
  156.      * Getter for change rate in Δn₀.
  157.      * @return change rate in Δn₀
  158.      */
  159.     public T getDeltaN0Dot() {
  160.         return deltaN0Dot;
  161.     }

  162.     /**
  163.      * Setter for change rate in Δn₀.
  164.      * @param deltaN0Dot change rate in Δn₀
  165.      */
  166.     public void setDeltaN0Dot(final T deltaN0Dot) {
  167.         this.deltaN0Dot = deltaN0Dot;
  168.     }

  169.     /**
  170.      * Getter for the Issue Of Data Ephemeris (IODE).
  171.      * @return the Issue Of Data Ephemeris (IODE)
  172.      */
  173.     public int getIODE() {
  174.         return iode;
  175.     }

  176.     /**
  177.      * Setter for the Issue of Data Ephemeris.
  178.      * @param value the IODE to set
  179.      */
  180.     public void setIODE(final int value) {
  181.         this.iode = value;
  182.     }

  183.     /**
  184.      * Getter for the Issue Of Data Clock (IODC).
  185.      * @return the Issue Of Data Clock (IODC)
  186.      */
  187.     public int getIODC() {
  188.         return iodc;
  189.     }

  190.     /**
  191.      * Setter for the Issue of Data Clock.
  192.      * @param value the IODC to set
  193.      */
  194.     public void setIODC(final int value) {
  195.         this.iodc = value;
  196.     }

  197.     /**
  198.      * Getter for inter Signal Delay for B1 CD.
  199.      * @return inter signal delay
  200.      */
  201.     public T getIscB1CD() {
  202.         return iscB1CD;
  203.     }

  204.     /**
  205.      * Setter for inter Signal Delay for B1 CD.
  206.      * @param delay delay to set
  207.      */
  208.     public void setIscB1CD(final T delay) {
  209.         this.iscB1CD = delay;
  210.     }

  211.     /**
  212.      * Getter for inter Signal Delay for B2 AD.
  213.      * @return inter signal delay
  214.      */
  215.     public T getIscB2AD() {
  216.         return iscB2AD;
  217.     }

  218.     /**
  219.      * Setter for inter Signal Delay for B2 AD.
  220.      * @param delay delay to set
  221.      */
  222.     public void setIscB2AD(final T delay) {
  223.         this.iscB2AD = delay;
  224.     }

  225.     /**
  226.      * Getter for inter Signal Delay for B1 CP.
  227.      * @return inter signal delay
  228.      */
  229.     public T getIscB1CP() {
  230.         return iscB1CP;
  231.     }

  232.     /**
  233.      * Setter for inter Signal Delay for B1 CP.
  234.      * @param delay delay to set
  235.      */
  236.     public void setIscB1CP(final T delay) {
  237.         this.iscB1CP = delay;
  238.     }

  239.     /**
  240.      * Getter for Signal In Space Accuracy Index (along track and across track).
  241.      * @return Signal In Space Accuracy Index (along track and across track)
  242.      */
  243.     public int getSisaiOe() {
  244.         return sisaiOe;
  245.     }

  246.     /**
  247.      * Setter for Signal In Space Accuracy Index (along track and across track).
  248.      * @param sisaiOe Signal In Space Accuracy Index (along track and across track)
  249.      */
  250.     public void setSisaiOe(final int sisaiOe) {
  251.         this.sisaiOe = sisaiOe;
  252.     }

  253.     /**
  254.      * Getter for Signal In Space Accuracy Index (radial and clock).
  255.      * @return Signal In Space Accuracy Index (radial and clock)
  256.      */
  257.     public int getSisaiOcb() {
  258.         return sisaiOcb;
  259.     }

  260.     /**
  261.      * Setter for Signal In Space Accuracy Index (radial and clock).
  262.      * @param sisaiOcb Signal In Space Accuracy Index (radial and clock)
  263.      */
  264.     public void setSisaiOcb(final int sisaiOcb) {
  265.         this.sisaiOcb = sisaiOcb;
  266.     }

  267.     /**
  268.      * Getter for Signal In Space Accuracy Index (clock drift accuracy).
  269.      * @return Signal In Space Accuracy Index (clock drift accuracy)
  270.      */
  271.     public int getSisaiOc1() {
  272.         return sisaiOc1;
  273.     }

  274.     /**
  275.      * Setter for Signal In Space Accuracy Index (clock drift accuracy).
  276.      * @param sisaiOc1 Signal In Space Accuracy Index (clock drift accuracy)
  277.      */
  278.     public void setSisaiOc1(final int sisaiOc1) {
  279.         this.sisaiOc1 = sisaiOc1;
  280.     }

  281.     /**
  282.      * Getter for Signal In Space Accuracy Index (clock drift rate accuracy).
  283.      * @return Signal In Space Accuracy Index (clock drift rate accuracy)
  284.      */
  285.     public int getSisaiOc2() {
  286.         return sisaiOc2;
  287.     }

  288.     /**
  289.      * Setter for Signal In Space Accuracy Index (clock drift rate accuracy).
  290.      * @param sisaiOc2 Signal In Space Accuracy Index (clock drift rate accuracy)
  291.      */
  292.     public void setSisaiOc2(final int sisaiOc2) {
  293.         this.sisaiOc2 = sisaiOc2;
  294.     }

  295.     /**
  296.      * Getter for Signal In Space Monitoring Accuracy Index.
  297.      * @return Signal In Space Monitoring Accuracy Index
  298.      */
  299.     public int getSismai() {
  300.         return sismai;
  301.     }

  302.     /**
  303.      * Setter for Signal In Space Monitoring Accuracy Index.
  304.      * @param sismai Signal In Space Monitoring Accuracy Index
  305.      */
  306.     public void setSismai(final int sismai) {
  307.         this.sismai = sismai;
  308.     }

  309.     /**
  310.      * Getter for health.
  311.      * @return health
  312.      */
  313.     public int getHealth() {
  314.         return health;
  315.     }

  316.     /**
  317.      * Setter for health.
  318.      * @param health health
  319.      */
  320.     public void setHealth(final int health) {
  321.         this.health = health;
  322.     }

  323.     /**
  324.      * Getter for B1C integrity flags.
  325.      * @return B1C integrity flags
  326.      */
  327.     public int getIntegrityFlags() {
  328.         return integrityFlags;
  329.     }

  330.     /**
  331.      * Setter for B1C integrity flags.
  332.      * @param integrityFlags integrity flags
  333.      */
  334.     public void setIntegrityFlags(final int integrityFlags) {
  335.         this.integrityFlags = integrityFlags;
  336.     }

  337.     /**
  338.      * Getter for B1/B3 Group Delay Differential (s).
  339.      * @return B1/B3 Group Delay Differential (s)
  340.      */
  341.     public T getTgdB1Cp() {
  342.         return tgdB1Cp;
  343.     }

  344.     /**
  345.      * Setter for B1/B3 Group Delay Differential (s).
  346.      * @param tgdB1Cp B1/B3 Group Delay Differential (s)
  347.      */
  348.     public void setTgdB1Cp(final T tgdB1Cp) {
  349.         this.tgdB1Cp = tgdB1Cp;
  350.     }

  351.     /**
  352.      * Getter for B2 AP Group Delay Differential (s).
  353.      * @return B2 AP Group Delay Differential (s)
  354.      */
  355.     public T getTgdB2ap() {
  356.         return tgdB2ap;
  357.     }

  358.     /**
  359.      * Setter for B2 AP Group Delay Differential (s).
  360.      * @param tgdB2ap B2 AP Group Delay Differential (s)
  361.      */
  362.     public void setTgdB2ap(final T tgdB2ap) {
  363.         this.tgdB2ap = tgdB2ap;
  364.     }

  365.     /**
  366.      * Getter for B2B_i / B3I Group Delay Differential (s).
  367.      * @return B2B_i / B3I Group Delay Differential (s)
  368.      */
  369.     public T getTgdB2bI() {
  370.         return tgdB2bI;
  371.     }

  372.     /**
  373.      * Setter for B2B_i / B3I Group Delay Differential (s).
  374.      * @param tgdB2bI B2B_i / B3I Group Delay Differential (s)
  375.      */
  376.     public void setTgdB2bI(final T tgdB2bI) {
  377.         this.tgdB2bI = tgdB2bI;
  378.     }

  379.     /**
  380.      * Getter for satellite type.
  381.      * @return satellite type
  382.      */
  383.     public BeidouSatelliteType getSatelliteType() {
  384.         return satelliteType;
  385.     }

  386.     /**
  387.      * Setter for satellite type.
  388.      * @param satelliteType satellite type
  389.      */
  390.     public void setSatelliteType(final BeidouSatelliteType satelliteType) {
  391.         this.satelliteType = satelliteType;
  392.     }

  393. }