1   /* Copyright 2002-2022 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.ssr;
18  
19  import java.util.ArrayList;
20  
21  import org.junit.Assert;
22  import org.junit.Test;
23  import org.orekit.errors.OrekitException;
24  import org.orekit.errors.OrekitMessages;
25  import org.orekit.gnss.SatelliteSystem;
26  import org.orekit.gnss.metric.messages.ssr.igm.SsrIgm01;
27  import org.orekit.gnss.metric.messages.ssr.igm.SsrIgm01Data;
28  import org.orekit.gnss.metric.parser.ByteArrayEncodedMessages;
29  import org.orekit.gnss.metric.parser.IgsSsrDataField;
30  import org.orekit.gnss.metric.parser.EncodedMessage;
31  import org.orekit.gnss.metric.parser.IgsSsrMessagesParser;
32  
33  
34  public class SsrIgm01Test {
35  
36      private double eps = 1.0e-13;
37  
38      @Test
39      public void testPerfectValueGPS() {
40  
41          final String m = "010000100100" +                 // RTCM Message number: 1060
42                           "001" +                          // IGS SSR version
43                           "00010101" +                     // IGS Message number: 21 (GPS)
44                           "01111110011000111111" +         // Epoch Time 1s
45                           "0010" +                         // SSR Update Interval
46                           "0" +                            // Multiple Message Indicator
47                           "0111" +                         // IOD SSR
48                           "0000111101101111" +             // SSR Provider ID
49                           "0001" +                         // SSR Solution ID
50                           "0" +                            // Global/Regional CRS Indicator
51                           "000001" +                       // No. of Satellites
52                           "001100" +                       // Satellite ID
53                           "10000100" +                     // GNSS IOD
54                           "0000101011111101111111" +       // Delta Radial
55                           "01001010111111011111" +         // Delta Along-Track
56                           "01001010111111011111" +         // Delta Cross-Track
57                           "000010101111110111111" +        // Dot Delta Radial
58                           "0100101011111101111" +          // Dot Delta Along-Track
59                           "010010101111110111100";         // Dot Delta Cross-Track
60  
61          final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
62          message.start();
63  
64          ArrayList<Integer> messages = new ArrayList<>();
65          messages.add(21);
66  
67          final SsrIgm01 igm01 = (SsrIgm01) new IgsSsrMessagesParser(messages).parse(message, false);
68  
69          // Verify size
70          Assert.assertEquals(1,                            igm01.getData().size());
71          Assert.assertEquals(SatelliteSystem.GPS,          igm01.getSatelliteSystem());
72  
73          // Verify header
74          Assert.assertEquals(21,                           igm01.getTypeCode());
75          Assert.assertEquals(517695.0,                     igm01.getHeader().getSsrEpoch1s(), eps);
76          Assert.assertEquals(5.0,                          igm01.getHeader().getSsrUpdateInterval(), eps);
77          Assert.assertEquals(0,                            igm01.getHeader().getSsrMultipleMessageIndicator());
78          Assert.assertEquals(7,                            igm01.getHeader().getIodSsr());
79          Assert.assertEquals(3951,                         igm01.getHeader().getSsrProviderId());
80          Assert.assertEquals(1,                            igm01.getHeader().getSsrSolutionId());
81          Assert.assertEquals(0,                            igm01.getHeader().getCrsIndicator());
82          Assert.assertEquals(1,                            igm01.getHeader().getNumberOfSatellites());
83  
84          // Verify data for satellite G12
85          final SsrIgm01Data g12 = igm01.getSsrIgm01Data().get("G12").get(0);
86          Assert.assertEquals(12,                           g12.getSatelliteID());
87          Assert.assertEquals(132,                          g12.getGnssIod());
88          Assert.assertEquals(18.0095,                      g12.getOrbitCorrection().getDeltaOrbitRadial(),        eps);
89          Assert.assertEquals(122.8668,                     g12.getOrbitCorrection().getDeltaOrbitAlongTrack(),    eps);
90          Assert.assertEquals(122.8668,                     g12.getOrbitCorrection().getDeltaOrbitCrossTrack(),    eps);
91          Assert.assertEquals(0.090047,                     g12.getOrbitCorrection().getDotOrbitDeltaRadial(),     eps);
92          Assert.assertEquals(0.614332,                     g12.getOrbitCorrection().getDotOrbitDeltaAlongTrack(), eps);
93          Assert.assertEquals(0.614332,                     g12.getOrbitCorrection().getDotOrbitDeltaCrossTrack(), eps);
94  
95      }
96  
97      @Test
98      public void testPerfectValueGalileo() {
99  
100         final String m = "010000100100" +                 // RTCM Message number: 1060
101                          "001" +                          // IGS SSR version
102                          "00111101" +                     // IGS Message number: 61 (Galileo)
103                          "01111110011000111111" +         // Epoch Time 1s
104                          "0111" +                         // SSR Update Interval
105                          "0" +                            // Multiple Message Indicator
106                          "0111" +                         // IOD SSR
107                          "0000111101101111" +             // SSR Provider ID
108                          "0001" +                         // SSR Solution ID
109                          "0" +                            // Global/Regional CRS Indicator
110                          "000001" +                       // No. of Satellites
111                          "000001" +                       // Satellite ID
112                          "10000100" +                     // GNSS IOD
113                          "0000101011111101111111" +       // Delta Radial
114                          "01001010111111011111" +         // Delta Along-Track
115                          "01001010111111011111" +         // Delta Cross-Track
116                          "000010101111110111111" +        // Dot Delta Radial
117                          "0100101011111101111" +          // Dot Delta Along-Track
118                          "010010101111110111100";         // Dot Delta Cross-Track
119 
120         final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
121         message.start();
122 
123         ArrayList<Integer> messages = new ArrayList<>();
124         messages.add(0);
125 
126         final SsrIgm01 igm01 = (SsrIgm01) new IgsSsrMessagesParser(messages).parse(message, false);
127 
128         // Verify size
129         Assert.assertEquals(1,                            igm01.getData().size());
130         Assert.assertEquals(SatelliteSystem.GALILEO,      igm01.getSatelliteSystem());
131 
132         // Verify header
133         Assert.assertEquals(61,                           igm01.getTypeCode());
134         Assert.assertEquals(517695.0,                     igm01.getHeader().getSsrEpoch1s(), eps);
135         Assert.assertEquals(120.0,                        igm01.getHeader().getSsrUpdateInterval(), eps);
136         Assert.assertEquals(0,                            igm01.getHeader().getSsrMultipleMessageIndicator());
137         Assert.assertEquals(7,                            igm01.getHeader().getIodSsr());
138         Assert.assertEquals(3951,                         igm01.getHeader().getSsrProviderId());
139         Assert.assertEquals(1,                            igm01.getHeader().getSsrSolutionId());
140         Assert.assertEquals(0,                            igm01.getHeader().getCrsIndicator());
141         Assert.assertEquals(1,                            igm01.getHeader().getNumberOfSatellites());
142 
143         // Verify data for satellite E01
144         final SsrIgm01Data e01 = igm01.getSsrIgm01Data().get("E01").get(0);
145         Assert.assertEquals(1,                            e01.getSatelliteID());
146         Assert.assertEquals(132,                          e01.getGnssIod());
147         Assert.assertEquals(18.0095,                      e01.getOrbitCorrection().getDeltaOrbitRadial(),        eps);
148         Assert.assertEquals(122.8668,                     e01.getOrbitCorrection().getDeltaOrbitAlongTrack(),    eps);
149         Assert.assertEquals(122.8668,                     e01.getOrbitCorrection().getDeltaOrbitCrossTrack(),    eps);
150         Assert.assertEquals(0.090047,                     e01.getOrbitCorrection().getDotOrbitDeltaRadial(),     eps);
151         Assert.assertEquals(0.614332,                     e01.getOrbitCorrection().getDotOrbitDeltaAlongTrack(), eps);
152         Assert.assertEquals(0.614332,                     e01.getOrbitCorrection().getDotOrbitDeltaCrossTrack(), eps);
153 
154     }
155 
156     @Test
157     public void testNullMessage() {
158         final String m = "010000100100" +                 // RTCM Message number: 1060
159                         "001" +                          // IGS SSR version
160                         "11111111" +                     // IGS Message number: 21 (GPS)
161                         "01111110011000111111" +         // Epoch Time 1s
162                         "0101" +                         // SSR Update Interval
163                         "0" +                            // Multiple Message Indicator
164                         "0111" +                         // IOD SSR
165                         "0000111101101111" +             // SSR Provider ID
166                         "0001" +                         // SSR Solution ID
167                         "0" +                            // Global/Regional CRS Indicator
168                         "000001" +                       // No. of Satellites
169                         "001100" +                       // Satellite ID
170                         "10000100" +                     // GNSS IOD
171                         "0000101011111101111111" +       // Delta Radial
172                         "01001010111111011111" +         // Delta Along-Track
173                         "01001010111111011111" +         // Delta Cross-Track
174                         "000010101111110111111" +        // Dot Delta Radial
175                         "0100101011111101111" +          // Dot Delta Along-Track
176                         "010010101111110111100";         // Dot Delta Cross-Track
177 
178        final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
179        message.start();
180 
181        ArrayList<Integer> messages = new ArrayList<>();
182        messages.add(9999999);
183 
184        final SsrIgm01 igm01 = (SsrIgm01) new IgsSsrMessagesParser(messages).parse(message, true);
185 
186        Assert.assertNull(igm01);
187     }
188 
189     @Test
190     public void testEmptyMessage() {
191         try {
192             final byte[] array = new byte[0];
193             final EncodedMessage emptyMessage = new ByteArrayEncodedMessages(array);
194             new IgsSsrMessagesParser(new ArrayList<Integer>()).parse(emptyMessage, false);
195             Assert.fail("an exception should have been thrown");
196         } catch (OrekitException oe) {
197             Assert.assertEquals(OrekitMessages.END_OF_ENCODED_MESSAGE, oe.getSpecifier());
198         }
199 
200     }
201 
202     @Test
203     public void testDefaultSsrUpdateInterval() {
204         final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary("1111111111111111"));
205         Assert.assertEquals(10800, IgsSsrDataField.IDF004.intValue(message));
206     }
207 
208     private byte[] byteArrayFromBinary(String radix2Value) {
209         final byte[] array = new byte[radix2Value.length() / 8];
210         for (int i = 0; i < array.length; ++i) {
211             for (int j = 0; j < 8; ++j) {
212                 if (radix2Value.charAt(8 * i + j) != '0') {
213                     array[i] |= 0x1 << (7 - j);
214                 }
215             }
216         }
217         return array;
218     }
219 
220 }