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.SsrIgm05;
27  import org.orekit.gnss.metric.messages.ssr.igm.SsrIgm05Data;
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 SsrIgm05Test {
33  
34      private double eps = 1.0e-13;
35  
36      @Test
37      public void testPerfectValueBeidou() {
38  
39          final String m = "010000100100" +                     // RTCM Message number: 1060
40                           "001" +                              // IGS SSR version
41                           "01101001" +                         // IGS Message number: 105 (Beidou)
42                           "01111110011000111111" +             // Epoch Time 1s
43                           "0100" +                             // 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: 1
49                           "000001" +                           // Satellite ID
50                           "00010" +                            // No. of Biases Processed
51                           "00001" +                            // GNSS Signal and Tracking Mode Identifier
52                           "00111010111111"+                    // Code Bias 
53                           "00010" +                            // GNSS Signal and Tracking Mode Identifier
54                           "001110101110100";                   // Code Bias
55  
56          final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
57          message.start();
58  
59          ArrayList<Integer> messages = new ArrayList<>();
60          messages.add(105);
61  
62          final SsrIgm05 igm05 = (SsrIgm05) new IgsSsrMessagesParser(messages).parse(message, false);
63  
64          // Verify size
65          Assert.assertEquals(1,                            igm05.getData().size());
66          Assert.assertEquals(SatelliteSystem.BEIDOU,       igm05.getSatelliteSystem());
67  
68          // Verify header
69          Assert.assertEquals(105,                          igm05.getTypeCode());
70          Assert.assertEquals(517695.0,                     igm05.getHeader().getSsrEpoch1s(), eps);
71          Assert.assertEquals(15.0,                         igm05.getHeader().getSsrUpdateInterval(), eps);
72          Assert.assertEquals(0,                            igm05.getHeader().getSsrMultipleMessageIndicator());
73          Assert.assertEquals(7,                            igm05.getHeader().getIodSsr());
74          Assert.assertEquals(3951,                         igm05.getHeader().getSsrProviderId());
75          Assert.assertEquals(1,                            igm05.getHeader().getSsrSolutionId());
76          Assert.assertEquals(1,                            igm05.getHeader().getNumberOfSatellites());
77  
78          // Verify data for satellite C01
79          final SsrIgm05Data c01 = igm05.getSsrIgm05Data().get("C01").get(0);
80          Assert.assertEquals(1,                          c01.getSatelliteID());
81          Assert.assertEquals(2,                          c01.getNumberOfBiasesProcessed());
82          Assert.assertEquals(2,                          c01.getCodeBiases().size());
83          Assert.assertEquals(37.75,                      c01.getCodeBias(1).getCodeBias(), eps);
84          Assert.assertEquals(1,                          c01.getCodeBias(1).getSignalID());
85          Assert.assertEquals(37.70,                      c01.getCodeBias(2).getCodeBias(), eps);
86          Assert.assertEquals(2,                          c01.getCodeBias(2).getSignalID());
87  
88      }
89  
90      @Test
91      public void testPerfectValueGalileo() {
92  
93          final String m = "010000100100" +                     // RTCM Message number: 1060
94                           "001" +                              // IGS SSR version
95                           "01000001" +                         // IGS Message number: 65 (Galileo)
96                           "01111110011000111111" +             // Epoch Time 1s
97                           "1011" +                             // SSR Update Interval
98                           "0" +                                // Multiple Message Indicator
99                           "0111" +                             // IOD SSR
100                          "0000111101101111" +                 // SSR Provider ID
101                          "0001" +                             // SSR Solution ID
102                          "000001" +                           // No. of Satellites: 1
103                          "001100" +                           // Satellite ID
104                          "00010" +                            // No. of Biases Processed
105                          "00001" +                            // GNSS Signal and Tracking Mode Identifier
106                          "00111010111111"+                    // Code Bias 
107                          "00010" +                            // GNSS Signal and Tracking Mode Identifier
108                          "001110101110100";                   // Code Bias
109 
110         final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
111         message.start();
112 
113         ArrayList<Integer> messages = new ArrayList<>();
114         messages.add(65);
115 
116         final SsrIgm05 igm05 = (SsrIgm05) new IgsSsrMessagesParser(messages).parse(message, false);
117 
118         // Verify size
119         Assert.assertEquals(1,                            igm05.getData().size());
120         Assert.assertEquals(SatelliteSystem.GALILEO,      igm05.getSatelliteSystem());
121 
122         // Verify header
123         Assert.assertEquals(65,                           igm05.getTypeCode());
124         Assert.assertEquals(517695.0,                     igm05.getHeader().getSsrEpoch1s(), eps);
125         Assert.assertEquals(900.0,                        igm05.getHeader().getSsrUpdateInterval(), eps);
126         Assert.assertEquals(0,                            igm05.getHeader().getSsrMultipleMessageIndicator());
127         Assert.assertEquals(7,                            igm05.getHeader().getIodSsr());
128         Assert.assertEquals(3951,                         igm05.getHeader().getSsrProviderId());
129         Assert.assertEquals(1,                            igm05.getHeader().getSsrSolutionId());
130         Assert.assertEquals(1,                            igm05.getHeader().getNumberOfSatellites());
131 
132         // Verify data for satellite E12
133         final SsrIgm05Data e12 = igm05.getSsrIgm05Data().get("E12").get(0);
134         Assert.assertEquals(12,                         e12.getSatelliteID());
135         Assert.assertEquals(2,                          e12.getNumberOfBiasesProcessed());
136         Assert.assertEquals(2,                          e12.getCodeBiases().size());
137         Assert.assertEquals(37.75,                      e12.getCodeBias(1).getCodeBias(), eps);
138         Assert.assertEquals(1,                          e12.getCodeBias(1).getSignalID());
139         Assert.assertEquals(37.70,                      e12.getCodeBias(2).getCodeBias(), eps);
140         Assert.assertEquals(2,                          e12.getCodeBias(2).getSignalID());
141 
142     }
143 
144     @Test
145     public void testNullMessage() {
146 
147         final String m = "010000100100" +                     // RTCM Message number: 1060
148                         "001" +                              // IGS SSR version
149                         "01101001" +                         // IGS Message number: 105 (Beidou)
150                         "01111110011000111111" +             // Epoch Time 1s
151                         "0101" +                             // SSR Update Interval
152                         "0" +                                // Multiple Message Indicator
153                         "0111" +                             // IOD SSR
154                         "0000111101101111" +                 // SSR Provider ID
155                         "0001" +                             // SSR Solution ID
156                         "000010" +                           // No. of Satellites: 1
157                         "000001" +                           // Satellite ID
158                         "00010" +                            // No. of Biases Processed
159                         "00001" +                            // GNSS Signal and Tracking Mode Identifier
160                         "00111010111111"+                    // Code Bias 
161                         "00010" +                            // GNSS Signal and Tracking Mode Identifier
162                         "00111010111010";                    // Code Bias
163 
164 
165        final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
166        message.start();
167 
168        ArrayList<Integer> messages = new ArrayList<>();
169        messages.add(9999999);
170 
171        final SsrIgm05 igm05 = (SsrIgm05) new IgsSsrMessagesParser(messages).parse(message, false);
172 
173        Assert.assertNull(igm05);
174     }
175 
176     @Test
177     public void testEmptyMessage() {
178         try {
179             final byte[] array = new byte[0];
180             final EncodedMessage emptyMessage = new ByteArrayEncodedMessages(array);
181             new IgsSsrMessagesParser(new ArrayList<Integer>()).parse(emptyMessage, false);
182             Assert.fail("an exception should have been thrown");
183         } catch (OrekitException oe) {
184             Assert.assertEquals(OrekitMessages.END_OF_ENCODED_MESSAGE, oe.getSpecifier());
185         }
186 
187     }
188 
189     private byte[] byteArrayFromBinary(String radix2Value) {
190         final byte[] array = new byte[radix2Value.length() / 8];
191         for (int i = 0; i < array.length; ++i) {
192             for (int j = 0; j < 8; ++j) {
193                 if (radix2Value.charAt(8 * i + j) != '0') {
194                     array[i] |= 0x1 << (7 - j);
195                 }
196             }
197         }
198         return array;
199     }
200 
201 }