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.SsrIgm02;
27  import org.orekit.gnss.metric.messages.ssr.igm.SsrIgm02Data;
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 SsrIgm02Test {
33  
34      private double eps = 1.0e-13;
35  
36      @Test
37      public void testPerfectValueGlonass() {
38  
39          final String m = "010000100100" +                     // RTCM Message number: 1060
40                           "001" +                              // IGS SSR version
41                           "00101010" +                         // IGS Message number: 42 (Glonass)
42                           "01111110011000111111" +             // Epoch Time 1s
43                           "0000" +                             // SSR Update Interval
44                           "0" +                                // Multiple Message Indicator
45                           "0111" +                             // IOD SSR
46                           "0000111101101111" +                 // SSR Provider ID
47                           "0001" +                             // SSR Solution ID
48                           "000001" +                           // No. of Satellites
49                           "001100" +                           // Satellite ID
50                           "0011101011111101111111" +           // Delta Clock C0
51                           "001110101111110111111" +            // Delta Clock C1
52                           "001110101111110111111100011000000"; // Delta Clock C2
53  
54          final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
55          message.start();
56  
57          ArrayList<Integer> messages = new ArrayList<>();
58          messages.add(42);
59  
60          final SsrIgm02 igm02 = (SsrIgm02) new IgsSsrMessagesParser(messages).parse(message, false);
61  
62          // Verify size
63          Assert.assertEquals(1,                            igm02.getData().size());
64          Assert.assertEquals(SatelliteSystem.GLONASS,      igm02.getSatelliteSystem());
65  
66          // Verify header
67          Assert.assertEquals(42,                           igm02.getTypeCode());
68          Assert.assertEquals(517695.0,                     igm02.getHeader().getSsrEpoch1s(), eps);
69          Assert.assertEquals(1.0,                          igm02.getHeader().getSsrUpdateInterval(), eps);
70          Assert.assertEquals(0,                            igm02.getHeader().getSsrMultipleMessageIndicator());
71          Assert.assertEquals(7,                            igm02.getHeader().getIodSsr());
72          Assert.assertEquals(3951,                         igm02.getHeader().getSsrProviderId());
73          Assert.assertEquals(1,                            igm02.getHeader().getSsrSolutionId());
74          Assert.assertEquals(1,                            igm02.getHeader().getNumberOfSatellites());
75  
76          // Verify data for satellite G12
77          final SsrIgm02Data r12 = igm02.getSsrIgm02Data().get("R12").get(0);
78          Assert.assertEquals(12,                           r12.getSatelliteID());
79          Assert.assertEquals(96.6527,                      r12.getClockCorrection().getDeltaClockC0(), eps);
80          Assert.assertEquals(0.483263,                     r12.getClockCorrection().getDeltaClockC1(), eps);
81          Assert.assertEquals(0.61857734,                   r12.getClockCorrection().getDeltaClockC2(), eps);
82  
83      }
84  
85      @Test
86      public void testPerfectValueGalileo() {
87  
88          final String m = "010000100100" +                     // RTCM Message number: 1060
89                           "001" +                              // IGS SSR version
90                           "00111110" +                         // IGS Message number: 62 (Galileo)
91                           "01111110011000111111" +             // Epoch Time 1s
92                           "1000" +                             // SSR Update Interval
93                           "0" +                                // Multiple Message Indicator
94                           "0111" +                             // IOD SSR
95                           "0000111101101111" +                 // SSR Provider ID
96                           "0001" +                             // SSR Solution ID
97                           "000001" +                           // No. of Satellites
98                           "000001" +                           // Satellite ID
99                           "0011101011111101111111" +           // Delta Clock C0
100                          "001110101111110111111" +            // Delta Clock C1
101                          "001110101111110111111100011000000"; // Delta Clock C2
102 
103         final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
104         message.start();
105 
106         ArrayList<Integer> messages = new ArrayList<>();
107         messages.add(62);
108 
109         final SsrIgm02 igm02 = (SsrIgm02) new IgsSsrMessagesParser(messages).parse(message, false);
110 
111         // Verify size
112         Assert.assertEquals(1,                            igm02.getData().size());
113         Assert.assertEquals(SatelliteSystem.GALILEO,      igm02.getSatelliteSystem());
114 
115         // Verify header
116         Assert.assertEquals(62,                           igm02.getTypeCode());
117         Assert.assertEquals(517695.0,                     igm02.getHeader().getSsrEpoch1s(), eps);
118         Assert.assertEquals(240.0,                        igm02.getHeader().getSsrUpdateInterval(), eps);
119         Assert.assertEquals(0,                            igm02.getHeader().getSsrMultipleMessageIndicator());
120         Assert.assertEquals(7,                            igm02.getHeader().getIodSsr());
121         Assert.assertEquals(3951,                         igm02.getHeader().getSsrProviderId());
122         Assert.assertEquals(1,                            igm02.getHeader().getSsrSolutionId());
123         Assert.assertEquals(1,                            igm02.getHeader().getNumberOfSatellites());
124 
125         // Verify data for satellite E01
126         final SsrIgm02Data e01 = igm02.getSsrIgm02Data().get("E01").get(0);
127         Assert.assertEquals(1,                            e01.getSatelliteID());
128         Assert.assertEquals(96.6527,                      e01.getClockCorrection().getDeltaClockC0(), eps);
129         Assert.assertEquals(0.483263,                     e01.getClockCorrection().getDeltaClockC1(), eps);
130         Assert.assertEquals(0.61857734,                   e01.getClockCorrection().getDeltaClockC2(), eps);
131 
132     }
133 
134     @Test
135     public void testNullMessage() {
136 
137        final String m = "010000100100" +                     // RTCM Message number: 1060
138                         "001" +                              // IGS SSR version
139                         "00101010" +                         // IGS Message number: 42 (Glonass)
140                         "01111110011000111111" +             // Epoch Time 1s
141                         "0101" +                             // SSR Update Interval
142                         "0" +                                // Multiple Message Indicator
143                         "0111" +                             // IOD SSR
144                         "0000111101101111" +                 // SSR Provider ID
145                         "0001" +                             // SSR Solution ID
146                         "000001" +                           // No. of Satellites
147                         "001100" +                           // Satellite ID
148                         "0011101011111101111111" +           // Delta Clock C0
149                         "001110101111110111111" +            // Delta Clock C1
150                         "001110101111110111111100011000000"; // Delta Clock C2
151 
152        final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
153        message.start();
154 
155        ArrayList<Integer> messages = new ArrayList<>();
156        messages.add(9999999);
157 
158        final SsrIgm02 igm02 = (SsrIgm02) new IgsSsrMessagesParser(messages).parse(message, false);
159 
160        Assert.assertNull(igm02);
161     }
162 
163     @Test
164     public void testEmptyMessage() {
165         try {
166             final byte[] array = new byte[0];
167             final EncodedMessage emptyMessage = new ByteArrayEncodedMessages(array);
168             new IgsSsrMessagesParser(new ArrayList<Integer>()).parse(emptyMessage, false);
169             Assert.fail("an exception should have been thrown");
170         } catch (OrekitException oe) {
171             Assert.assertEquals(OrekitMessages.END_OF_ENCODED_MESSAGE, oe.getSpecifier());
172         }
173 
174     }
175 
176     private byte[] byteArrayFromBinary(String radix2Value) {
177         final byte[] array = new byte[radix2Value.length() / 8];
178         for (int i = 0; i < array.length; ++i) {
179             for (int j = 0; j < 8; ++j) {
180                 if (radix2Value.charAt(8 * i + j) != '0') {
181                     array[i] |= 0x1 << (7 - j);
182                 }
183             }
184         }
185         return array;
186     }
187 
188 }