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.SsrIgm06;
27  import org.orekit.gnss.metric.messages.ssr.igm.SsrIgm06Data;
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  import org.orekit.propagation.analytical.gnss.data.GNSSConstants;
32  
33  public class SsrIgm06Test {
34  
35      private double eps = 1.0e-13;
36  
37      @Test
38      public void testPerfectValueSBAS() {
39  
40          final String m = "010000100100" +                     // RTCM Message number: 1060
41                           "001" +                              // IGS SSR version
42                           "01111110" +                         // IGS Message number: 126 (SBAS)
43                           "01111110011000111111" +             // Epoch Time 1s
44                           "0101" +                             // SSR Update Interval
45                           "0" +                                // Multiple Message Indicator
46                           "0111" +                             // IOD SSR
47                           "0000111101101111" +                 // SSR Provider ID
48                           "0001" +                             // SSR Solution ID
49                           "0" +                                // Dispersive Bias Consistency Indicator
50                           "0" +                                // MW Consistency Indicator
51                           "000001" +                           // No. of Satellites: 1
52                           "000001" +                           // Satellite ID
53                           "00001" +                            // No. of Biases Processed
54                           "001100010" +                        // Yaw Angle
55                           "01001010"+                          // Yaw Rate 
56                           "00001" +                            // GNSS Signal and Tracking Mode Identifier
57                           "1" +                                // Signal Integer Indicator
58                           "10" +                               // Signals Wide-Lane Integer Indicator
59                           "0000" +                             // Signal Discontinuity Counter
60                           "001110101110100110100000";          // Phase Bias
61  
62          final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
63          message.start();
64  
65          ArrayList<Integer> messages = new ArrayList<>();
66          messages.add(126);
67  
68          final SsrIgm06 igm06 = (SsrIgm06) new IgsSsrMessagesParser(messages).parse(message, false);
69  
70          // Verify size
71          Assert.assertEquals(1,                            igm06.getData().size());
72          Assert.assertEquals(SatelliteSystem.SBAS,         igm06.getSatelliteSystem());
73  
74          // Verify header
75          Assert.assertEquals(126,                          igm06.getTypeCode());
76          Assert.assertEquals(517695.0,                     igm06.getHeader().getSsrEpoch1s(), eps);
77          Assert.assertEquals(30.0,                         igm06.getHeader().getSsrUpdateInterval(), eps);
78          Assert.assertEquals(0,                            igm06.getHeader().getSsrMultipleMessageIndicator());
79          Assert.assertEquals(7,                            igm06.getHeader().getIodSsr());
80          Assert.assertEquals(3951,                         igm06.getHeader().getSsrProviderId());
81          Assert.assertEquals(1,                            igm06.getHeader().getSsrSolutionId());
82          Assert.assertEquals(1,                            igm06.getHeader().getNumberOfSatellites());
83          Assert.assertFalse(igm06.getHeader().isMelbourneWubbenaConsistencyMaintained());
84          Assert.assertFalse(igm06.getHeader().isConsistencyMaintained());
85  
86          // Verify data for satellite S120
87          final SsrIgm06Data s120 = igm06.getSsrIgm06Data().get("S120").get(0);
88          Assert.assertEquals(120,                        s120.getSatelliteID());
89          Assert.assertEquals(1,                          s120.getNumberOfBiasesProcessed());
90          Assert.assertEquals(1,                          s120.getPhaseBiases().size());
91          Assert.assertEquals(98.0,                       s120.getYawAngle() * 256.0 / GNSSConstants.GNSS_PI, eps);
92          Assert.assertEquals(74.0,                       s120.getYawRate() * 8192.0 / GNSSConstants.GNSS_PI, eps);
93          Assert.assertEquals(1,                          s120.getPhaseBias(1).getSignalID(), eps);
94          Assert.assertEquals(2,                          s120.getPhaseBias(1).getSignalWideLaneIntegerIndicator());
95          Assert.assertEquals(0,                          s120.getPhaseBias(1).getDiscontinuityCounter());
96          Assert.assertEquals(24.1306,                    s120.getPhaseBias(1).getPhaseBias(), eps);
97          Assert.assertTrue(s120.getPhaseBias(1).isSignalInteger());
98  
99      }
100 
101     @Test
102     public void testPerfectValueGalileo() {
103 
104         final String m = "010000100100" +                     // RTCM Message number: 1060
105                          "001" +                              // IGS SSR version
106                          "01000010" +                         // IGS Message number: 66 (Galileo)
107                          "01111110011000111111" +             // Epoch Time 1s
108                          "1100" +                             // SSR Update Interval
109                          "0" +                                // Multiple Message Indicator
110                          "0111" +                             // IOD SSR
111                          "0000111101101111" +                 // SSR Provider ID
112                          "0001" +                             // SSR Solution ID
113                          "1" +                                // Dispersive Bias Consistency Indicator
114                          "1" +                                // MW Consistency Indicator
115                          "000001" +                           // No. of Satellites: 1
116                          "000001" +                           // Satellite ID
117                          "00001" +                            // No. of Biases Processed
118                          "001100010" +                        // Yaw Angle
119                          "01001010"+                          // Yaw Rate 
120                          "00001" +                            // GNSS Signal and Tracking Mode Identifier
121                          "0" +                                // Signal Integer Indicator
122                          "10" +                               // Signals Wide-Lane Integer Indicator
123                          "0000" +                             // Signal Discontinuity Counter
124                          "001110101110100110100000";          // Phase Bias
125 
126         final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
127         message.start();
128 
129         ArrayList<Integer> messages = new ArrayList<>();
130         messages.add(66);
131 
132         final SsrIgm06 igm06 = (SsrIgm06) new IgsSsrMessagesParser(messages).parse(message, false);
133 
134         // Verify size
135         Assert.assertEquals(1,                            igm06.getData().size());
136         Assert.assertEquals(SatelliteSystem.GALILEO,      igm06.getSatelliteSystem());
137 
138         // Verify header
139         Assert.assertEquals(66,                           igm06.getTypeCode());
140         Assert.assertEquals(517695.0,                     igm06.getHeader().getSsrEpoch1s(), eps);
141         Assert.assertEquals(1800.0,                       igm06.getHeader().getSsrUpdateInterval(), eps);
142         Assert.assertEquals(0,                            igm06.getHeader().getSsrMultipleMessageIndicator());
143         Assert.assertEquals(7,                            igm06.getHeader().getIodSsr());
144         Assert.assertEquals(3951,                         igm06.getHeader().getSsrProviderId());
145         Assert.assertEquals(1,                            igm06.getHeader().getSsrSolutionId());
146         Assert.assertEquals(1,                            igm06.getHeader().getNumberOfSatellites());
147         Assert.assertTrue(igm06.getHeader().isMelbourneWubbenaConsistencyMaintained());
148         Assert.assertTrue(igm06.getHeader().isConsistencyMaintained());
149 
150         // Verify data for satellite E01
151         final SsrIgm06Data e01 = igm06.getSsrIgm06Data().get("E01").get(0);
152         Assert.assertEquals(1,                          e01.getSatelliteID());
153         Assert.assertEquals(1,                          e01.getNumberOfBiasesProcessed());
154         Assert.assertEquals(1,                          e01.getPhaseBiases().size());
155         Assert.assertEquals(98.0,                       e01.getYawAngle() * 256.0 / GNSSConstants.GNSS_PI, eps);
156         Assert.assertEquals(74.0,                       e01.getYawRate() * 8192.0 / GNSSConstants.GNSS_PI, eps);
157         Assert.assertEquals(1,                          e01.getPhaseBias(1).getSignalID(), eps);
158         Assert.assertEquals(2,                          e01.getPhaseBias(1).getSignalWideLaneIntegerIndicator());
159         Assert.assertEquals(0,                          e01.getPhaseBias(1).getDiscontinuityCounter());
160         Assert.assertEquals(24.1306,                    e01.getPhaseBias(1).getPhaseBias(), eps);
161         Assert.assertFalse(e01.getPhaseBias(1).isSignalInteger());
162 
163     }
164 
165     @Test
166     public void testNullMessage() {
167 
168         final String m = "010000100100" +                     // RTCM Message number: 1060
169                         "001" +                              // IGS SSR version
170                         "01101001" +                         // IGS Message number: 126 (SBAS)
171                         "01111110011000111111" +             // Epoch Time 1s
172                         "0101" +                             // SSR Update Interval
173                         "0" +                                // Multiple Message Indicator
174                         "0111" +                             // IOD SSR
175                         "0000111101101111" +                 // SSR Provider ID
176                         "0001" +                             // SSR Solution ID
177                         "0" +                                // Dispersive Bias Consistency Indicator
178                         "0" +                                // MW Consistency Indicator
179                         "000001" +                           // No. of Satellites: 1
180                         "000001" +                           // Satellite ID
181                         "00001" +                            // No. of Biases Processed
182                         "001100010" +                        // Yaw Angle
183                         "01001010"+                          // Yaw Rate 
184                         "00001" +                            // GNSS Signal and Tracking Mode Identifier
185                         "1" +                                // Signal Integer Indicator
186                         "10" +                               // Signals Wide-Lane Integer Indicator
187                         "0000" +                             // Signal Discontinuity Counter
188                         "001110101110100110100000";          // Phase Bias
189 
190 
191        final EncodedMessage message = new ByteArrayEncodedMessages(byteArrayFromBinary(m));
192        message.start();
193 
194        ArrayList<Integer> messages = new ArrayList<>();
195        messages.add(9999999);
196 
197        final SsrIgm06 igm06 = (SsrIgm06) new IgsSsrMessagesParser(messages).parse(message, false);
198 
199        Assert.assertNull(igm06);
200     }
201 
202     @Test
203     public void testEmptyMessage() {
204         try {
205             final byte[] array = new byte[0];
206             final EncodedMessage emptyMessage = new ByteArrayEncodedMessages(array);
207             new IgsSsrMessagesParser(new ArrayList<Integer>()).parse(emptyMessage, false);
208             Assert.fail("an exception should have been thrown");
209         } catch (OrekitException oe) {
210             Assert.assertEquals(OrekitMessages.END_OF_ENCODED_MESSAGE, oe.getSpecifier());
211         }
212 
213     }
214 
215     private byte[] byteArrayFromBinary(String radix2Value) {
216         final byte[] array = new byte[radix2Value.length() / 8];
217         for (int i = 0; i < array.length; ++i) {
218             for (int j = 0; j < 8; ++j) {
219                 if (radix2Value.charAt(8 * i + j) != '0') {
220                     array[i] |= 0x1 << (7 - j);
221                 }
222             }
223         }
224         return array;
225     }
226 
227 }