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 }