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 }