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