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