1   /* Copyright 2002-2024 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.metric.messages.rtcm;
18  
19  import org.hipparchus.util.FastMath;
20  import org.junit.jupiter.api.Assertions;
21  import org.junit.jupiter.api.BeforeEach;
22  import org.junit.jupiter.api.Test;
23  import org.orekit.Utils;
24  import org.orekit.gnss.SatelliteSystem;
25  import org.orekit.gnss.metric.messages.rtcm.ephemeris.Rtcm1045;
26  import org.orekit.gnss.metric.messages.rtcm.ephemeris.Rtcm1045Data;
27  import org.orekit.gnss.metric.parser.ByteArrayEncodedMessage;
28  import org.orekit.gnss.metric.parser.EncodedMessage;
29  import org.orekit.gnss.metric.parser.RtcmMessagesParser;
30  import org.orekit.propagation.analytical.gnss.GNSSPropagator;
31  import org.orekit.propagation.analytical.gnss.GNSSPropagatorBuilder;
32  import org.orekit.propagation.analytical.gnss.data.GalileoNavigationMessage;
33  import org.orekit.time.GNSSDate;
34  
35  import java.util.ArrayList;
36  
37  public class Rtcm1045Test {
38  
39      private double eps = 8.2e-10;
40  
41      @BeforeEach
42      public void setUp() {
43          Utils.setDataRoot("gnss");
44      }
45  
46      @Test
47      public void testParseMessage() {
48  
49          final String m = "010000010101" +                    // Message Number: 1045
50                          "001100" +                           // Satellite ID
51                          "111111101111" +                     // Week Number
52                          "1000010000" +                       // IODNav
53                          "01011110" +                         // SISA
54                          "01011101111101" +                   // IDOT
55                          "00001111011011" +                   // toc
56                          "011111" +                           // af2
57                          "000010101111110111011" +            // af1
58                          "0100101011111101111111101010011" +  // af0
59                          "0000000000000000" +                 // Crs
60                          "0111111011001111" +                 // DELTA n
61                          "00000110110011111011100110011011" + // M0
62                          "0000000000000000" +                 // Cuc
63                          "00010011111101111000111000011001" + // ecc
64                          "0000000000000000" +                 // Cus
65                          "10100001000011000111111111111111" + // A^(1/2)
66                          "10001000111011" +                   // toe
67                          "0000000000000000" +                 // Cic
68                          "00011100011100000111111000111111" + // OMEGA0
69                          "0000000000000000" +                 // Cis
70                          "00101000001111100011110011110000" + // i0
71                          "0000000000000000" +                 // Crc
72                          "00001100001111100011110011110000" + // Argument of perigee
73                          "111111111011111111110100" +         // OMEGADOT
74                          "0001101101" +                       // BGD
75                          "00" +                               // E5a SIGNAL Health Status
76                          "0" +                                // E5a Data Validity Status
77                          "0000000";                           // Reserved
78  
79  
80          final EncodedMessage message = new ByteArrayEncodedMessage(byteArrayFromBinary(m));
81          message.start();
82  
83          ArrayList<Integer> messages = new ArrayList<>();
84          messages.add(1045);
85  
86          final Rtcm1045                 rtcm1045      = (Rtcm1045) new RtcmMessagesParser(messages).parse(message, false);
87          final Rtcm1045Data             ephemerisData = rtcm1045.getEphemerisData();
88          final GalileoNavigationMessage galileoMessage   = ephemerisData.getGalileoNavigationMessage();
89  
90          // Verify propagator initialization
91          final GNSSPropagator propagator = new GNSSPropagatorBuilder(galileoMessage).build();
92          Assertions.assertNotNull(propagator);
93          Assertions.assertEquals(0.0, galileoMessage.getDate().
94                              durationFrom(new GNSSDate(galileoMessage.getWeek(), galileoMessage.getTime(), SatelliteSystem.GALILEO).getDate()), eps);
95  
96          // Verify message number
97          Assertions.assertEquals(1045,                   rtcm1045.getTypeCode());
98          Assertions.assertEquals(1,                      rtcm1045.getData().size());
99  
100         // Verify navigation message
101         Assertions.assertEquals(12,                     galileoMessage.getPRN());
102         Assertions.assertEquals(4079,                   galileoMessage.getWeek());
103         Assertions.assertEquals(2.1475894557210572E-9,  galileoMessage.getIDot(),               eps);
104         Assertions.assertEquals(528,                    galileoMessage.getIODNav(),             eps);
105         Assertions.assertEquals(3.3776428E-17,          galileoMessage.getAf2(),                eps);
106         Assertions.assertEquals(1.279588E-9,            galileoMessage.getAf1(),                eps);
107         Assertions.assertEquals(0.036617268982809,      galileoMessage.getAf0(),                eps);
108         Assertions.assertEquals(0.0,                    galileoMessage.getCrs(),                eps);
109         Assertions.assertEquals(1.4587496546628753E-4,  galileoMessage.getMeanMotion(),         eps);
110         Assertions.assertEquals(0.1671775426328288,     galileoMessage.getM0(),                 eps);
111         Assertions.assertEquals(0.0,                    galileoMessage.getCuc(),                eps);
112         Assertions.assertEquals(0.0389980711042881,     galileoMessage.getE(),                  eps);
113         Assertions.assertEquals(0.0,                    galileoMessage.getCus(),                eps);
114         Assertions.assertEquals(5153.562498092651,      FastMath.sqrt(galileoMessage.getSma()), eps);
115         Assertions.assertEquals(525780.0,               galileoMessage.getTime(),               eps);
116         Assertions.assertEquals(0.0,                    galileoMessage.getCic(),                eps);
117         Assertions.assertEquals(0.0,                    galileoMessage.getCis(),                eps);
118         Assertions.assertEquals(0.987714701321906,      galileoMessage.getI0(),                 eps);
119         Assertions.assertEquals(0.0,                    galileoMessage.getCrc(),                eps);
120         Assertions.assertEquals(0.30049130834913723,    galileoMessage.getPa(),                 eps);
121         Assertions.assertEquals(-5.855958209879004E-9,  galileoMessage.getOmegaDot(),           eps);
122         Assertions.assertEquals(0.6980085385373721,     galileoMessage.getOmega0(),             eps);
123         Assertions.assertEquals(2.537854E-8,            galileoMessage.getBGDE1E5a(),           eps);
124 
125         // Verify other data
126         Assertions.assertEquals(12,                     ephemerisData.getSatelliteID());
127         Assertions.assertEquals(59220.0,                ephemerisData.getGalileoToc(), eps);
128         Assertions.assertEquals(0,                      ephemerisData.getGalileoDataValidityStatus());
129         Assertions.assertEquals(ephemerisData.getAccuracyProvider().getAccuracy(), galileoMessage.getSisa(), eps);
130 
131     }
132 
133     @Test
134     public void testNullMessage() {
135 
136         final String m = "010000010101" +                    // Message Number: 1045
137                         "001100" +                           // Satellite ID
138                         "111111101111" +                     // Week Number
139                         "1000010000" +                       // IODNav
140                         "01011110" +                         // SISA
141                         "01011101111101" +                   // IDOT
142                         "00001111011011" +                   // toc
143                         "011111" +                           // af2
144                         "000010101111110111011" +            // af1
145                         "0100101011111101111111101010011" +  // af0
146                         "0000000000000000" +                 // Crs
147                         "0111111011001111" +                 // DELTA n
148                         "00000110110011111011100110011011" + // M0
149                         "0000000000000000" +                 // Cuc
150                         "00010011111101111000111000011001" + // ecc
151                         "0000000000000000" +                 // Cus
152                         "10100001000011000111111111111111" + // A^(1/2)
153                         "10001000111011" +                   // toe
154                         "0000000000000000" +                 // Cic
155                         "00011100011100000111111000111111" + // OMEGA0
156                         "0000000000000000" +                 // Cis
157                         "00101000001111100011110011110000" + // i0
158                         "0000000000000000" +                 // Crc
159                         "00001100001111100011110011110000" + // Argument of perigee
160                         "111111111011111111110100" +         // OMEGADOT
161                         "0001101101" +                       // BGD
162                         "00" +                               // E5a SIGNAL Health Status
163                         "0" +                                // E5a Data Validity Status
164                         "0000000";                           // Reserved
165 
166        final EncodedMessage message = new ByteArrayEncodedMessage(byteArrayFromBinary(m));
167        message.start();
168 
169        ArrayList<Integer> messages = new ArrayList<>();
170        messages.add(9999999);
171 
172        final Rtcm1045 rtcm1045 = (Rtcm1045) new RtcmMessagesParser(messages).parse(message, false);
173 
174        Assertions.assertNull(rtcm1045);
175     }
176 
177 
178     private byte[] byteArrayFromBinary(String radix2Value) {
179         final byte[] array = new byte[radix2Value.length() / 8];
180         for (int i = 0; i < array.length; ++i) {
181             for (int j = 0; j < 8; ++j) {
182                 if (radix2Value.charAt(8 * i + j) != '0') {
183                     array[i] |= 0x1 << (7 - j);
184                 }
185             }
186         }
187         return array;
188     }
189 
190 }