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