EngAlmanac_T.cpp
Go to the documentation of this file.
1 //==============================================================================
2 //
3 // This file is part of GNSSTk, the ARL:UT GNSS Toolkit.
4 //
5 // The GNSSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GNSSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GNSSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2022, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24 
25 //==============================================================================
26 //
27 // This software was developed by Applied Research Laboratories at the
28 // University of Texas at Austin, under contract to an agency or agencies
29 // within the U.S. Department of Defense. The U.S. Government retains all
30 // rights to use, duplicate, distribute, disclose, or release this software.
31 //
32 // Pursuant to DoD Directive 523024
33 //
34 // DISTRIBUTION STATEMENT A: This software has been approved for public
35 // release, distribution is unlimited.
36 //
37 //==============================================================================
38 
39 #include "EngAlmanac.hpp"
40 #include "TestUtil.hpp"
41 #include <iostream>
42 
43 #include "AlmanacDataGenerator.hpp"
44 #include "BinUtils.hpp"
45 
47 {
48 public:
49  //Reads in AlmanacData object to form comparison data types
51  {
52  eps = 1E-6; //Low precision, data is extracted from binary subframes, some have only 16 bit precision
53  aData = iAData;
54  aSubframes = iASubframes;
55  }
56 
57  ~EngAlmanac_T() {} // Default Desructor
58 
60 
61  int addSubframeTest(void)
62  {
63  gnsstk::TestUtil testFramework("EngAlmanac", "addSubframe", __FILE__, __LINE__);
64 
65 
66  //Subframe and week number mod 1024
67  testMesg = "Adding subframe 5 page 1 failed";
68  testFramework.assert(alm.addSubframe(aSubframes.totalSf[0], 819), testMesg,
69  __LINE__);
70  testMesg = "Adding subframe 5 page 2 failed";
71  testFramework.assert(alm.addSubframe(aSubframes.totalSf[1], 819), testMesg,
72  __LINE__);
73  testMesg = "Adding subframe 5 page 3 failed";
74  testFramework.assert(alm.addSubframe(aSubframes.totalSf[2], 819), testMesg,
75  __LINE__);
76  testMesg = "Adding subframe 5 page 4 failed";
77  testFramework.assert(alm.addSubframe(aSubframes.totalSf[3], 819), testMesg,
78  __LINE__);
79  testMesg = "Adding subframe 5 page 5 failed";
80  testFramework.assert(alm.addSubframe(aSubframes.totalSf[4], 819), testMesg,
81  __LINE__);
82  testMesg = "Adding subframe 5 page 6 failed";
83  testFramework.assert(alm.addSubframe(aSubframes.totalSf[5], 819), testMesg,
84  __LINE__);
85  testMesg = "Adding subframe 5 page 7 failed";
86  testFramework.assert(alm.addSubframe(aSubframes.totalSf[6], 819), testMesg,
87  __LINE__);
88  testMesg = "Adding subframe 5 page 8 failed";
89  testFramework.assert(alm.addSubframe(aSubframes.totalSf[7], 819), testMesg,
90  __LINE__);
91  //skip this test, no valid almanac data for PRN 8
92  // testMesg = "Adding subframe 5 page 9 failed";
93  // testFramework.assert(alm.addSubframe(aSubframes.totalSf[31], 819), testMesg, __LINE__);
94  testMesg = "Adding subframe 5 page 10 failed";
95  testFramework.assert(alm.addSubframe(aSubframes.totalSf[8], 819), testMesg,
96  __LINE__);
97  testMesg = "Adding subframe 5 page 11 failed";
98  testFramework.assert(alm.addSubframe(aSubframes.totalSf[9], 819), testMesg,
99  __LINE__);
100  testMesg = "Adding subframe 5 page 12 failed";
101  testFramework.assert(alm.addSubframe(aSubframes.totalSf[10], 819), testMesg,
102  __LINE__);
103  testMesg = "Adding subframe 5 page 13 failed";
104  testFramework.assert(alm.addSubframe(aSubframes.totalSf[11], 819), testMesg,
105  __LINE__);
106  testMesg = "Adding subframe 5 page 14 failed";
107  testFramework.assert(alm.addSubframe(aSubframes.totalSf[12], 819), testMesg,
108  __LINE__);
109  testMesg = "Adding subframe 5 page 15 failed";
110  testFramework.assert(alm.addSubframe(aSubframes.totalSf[13], 819), testMesg,
111  __LINE__);
112  testMesg = "Adding subframe 5 page 16 failed";
113  testFramework.assert(alm.addSubframe(aSubframes.totalSf[14], 819), testMesg,
114  __LINE__);
115  testMesg = "Adding subframe 5 page 17 failed";
116  testFramework.assert(alm.addSubframe(aSubframes.totalSf[15], 819), testMesg,
117  __LINE__);
118  testMesg = "Adding subframe 5 page 18 failed";
119  testFramework.assert(alm.addSubframe(aSubframes.totalSf[16], 819), testMesg,
120  __LINE__);
121  testMesg = "Adding subframe 5 page 19 failed";
122  testFramework.assert(alm.addSubframe(aSubframes.totalSf[17], 819), testMesg,
123  __LINE__);
124  testMesg = "Adding subframe 5 page 20 failed";
125  testFramework.assert(alm.addSubframe(aSubframes.totalSf[18], 819), testMesg,
126  __LINE__);
127  testMesg = "Adding subframe 5 page 21 failed";
128  testFramework.assert(alm.addSubframe(aSubframes.totalSf[19], 819), testMesg,
129  __LINE__);
130  testMesg = "Adding subframe 5 page 22 failed";
131  testFramework.assert(alm.addSubframe(aSubframes.totalSf[20], 819), testMesg,
132  __LINE__);
133  testMesg = "Adding subframe 5 page 23 failed";
134  testFramework.assert(alm.addSubframe(aSubframes.totalSf[21], 819), testMesg,
135  __LINE__);
136  testMesg = "Adding subframe 5 page 24 failed";
137  testFramework.assert(alm.addSubframe(aSubframes.totalSf[22], 819), testMesg,
138  __LINE__);
139 
140  testMesg = "Adding subframe 4 page 2 failed";
141  testFramework.assert(alm.addSubframe(aSubframes.totalSf[23], 819), testMesg,
142  __LINE__);
143  testMesg = "Adding subframe 4 page 3 failed";
144  testFramework.assert(alm.addSubframe(aSubframes.totalSf[24], 819), testMesg,
145  __LINE__);
146  testMesg = "Adding subframe 4 page 4 failed";
147  testFramework.assert(alm.addSubframe(aSubframes.totalSf[25], 819), testMesg,
148  __LINE__);
149  testMesg = "Adding subframe 4 page 5 failed";
150  testFramework.assert(alm.addSubframe(aSubframes.totalSf[26], 819), testMesg,
151  __LINE__);
152  testMesg = "Adding subframe 4 page 7 failed";
153  testFramework.assert(alm.addSubframe(aSubframes.totalSf[27], 819), testMesg,
154  __LINE__);
155  testMesg = "Adding subframe 4 page 8 failed";
156  testFramework.assert(alm.addSubframe(aSubframes.totalSf[28], 819), testMesg,
157  __LINE__);
158  testMesg = "Adding subframe 4 page 9 failed";
159  testFramework.assert(alm.addSubframe(aSubframes.totalSf[29], 819), testMesg,
160  __LINE__);
161  testMesg = "Adding subframe 4 page 10 failed";
162  testFramework.assert(alm.addSubframe(aSubframes.totalSf[30], 819), testMesg,
163  __LINE__);
164 
165 //subframe 5 page 25
166  /*
167  copy the tlm and how from above for subframe 5
168  dataID = 2 (from the IS-GPS-200)
169  svID = 51 for this page
170  toa = 319488 * 2**-12
171  WNa = 819 % 256 = 51
172  all sv healths are good except 8, set it to 111111 (or leave it blank, don't think it matters)
173 
174  word 3:
175  dID svID (51) 319488*2**-12 = 78 Wn = 51
176  10 110011 01001110 00110011 = 10 1100 1101 0011 1000 1100 1100 0000
177  2CD38CC0
178 
179  word 5:
180  00 0000 0000 00 00 0000 1111 11 00 0000
181 
182  word 10 is reserved, doesn't matter what set to
183 
184  */
185  const long subframe551[10] = {0x22c000e4, 0x00000598, 0x2CD38CC0, 0x00000000, 0x00000FC0,
186  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11111110
187  };
188  testMesg = "Adding subframe 5 page 25 failed";
189  testFramework.assert(alm.addSubframe(subframe551, 819), testMesg, __LINE__);
190 
191 //subframe 4 page 25
192  /*
193  copy the tlm and the how from above for subframe 4
194  dataID = 2 (from the IS-GPS-200)
195  svID = 63 for this page
196 
197  Assume reserved bits are 1, and all satellites have Anti spoofing on and are in block II//IIA/IIR
198  therefore all the sv configs need to be set to 1001
199 
200  word 3
201  dID svID 4 svconfigs
202  10 1111 11 10 0110 0110 0110 01 = 0x2F666640
203 
204  word 4,5,6,7
205  6 sv configs
206  10 0110 0110 0110 0110 0110 01 = 0x26666640
207 
208  word 8
209  4 sv configs 2 reserved 1 sv health
210  10 0110 0110 0110 01 11 0000 00 = 0x26667000
211 
212  word 9
213  5 sv healths, all 0 = 0x00000000
214 
215  word 10
216  3 sv healths 4 reserved 2 parity
217  00 0000 0000 0000 0000 1111 00 = 0x00000F00
218 
219  */
220  const long subframe447[10] = {0x22c000e4, 0x0000042c, 0x2FE66640, 0x26666640, 0x26666640,
221  0x26666640, 0x26666640, 0x26667000, 0x00000000, 0x00000F00
222  };
223  testMesg = "Adding subframe 4 page 25 failed";
224  testFramework.assert(alm.addSubframe(subframe447, 819), testMesg, __LINE__);
225 
226 // subframe4 page 18
227  /*
228  copy tlm and how from other subframe4 pages
229  data id = 2
230  sv id = 56
231 
232  //deadbeefdeadc0de
233  alpha0 = (222 - 256) * 2**-30 = -3.166496753692627e-08 //Twos compliment
234  alpha1 = (173 - 256) * 2**-27 / pi = -1.968422573302286e-07
235  alpha2 = (190 - 256) * 2**-24 / pi**2 = -3.985880685087617e-07
236  alpha3 = (239 - 256) * 2**-24 / pi**3 = -3.26798013069863e-08
237  beta0 = (222 - 256) * 2**11 = -69632 //Twos compliment
238  beta1 = (173 - 256) * 2**14 / pi = -432860.7015445238
239  beta2 = (192 - 256) * 2**16 / pi**2 = -424971.8458357919
240  beta3 = (222 - 256) * 2**16 / pi**3 = -71863.64306088151
241 
242  //cabobobs
243  A0 = (3400577205 - 4294967296) * 2**-30 = -0.8329656822606921
244  //baddab
245  A1 = (12246443 - 16777216) * 2**-50 = -4.0241348031599955e-09
246  dtLS = 13 = 0x0d
247  tot = 110 * 2**12 = 450560 = 0x6e
248  WNt = 90 = 0x5a
249  WNLSF = 254 = 0xFE
250  DN (right justified) = 5 =>0x05
251  dtLSF = (153 - 256) = -103 = 0x99
252 
253 
254  word 3
255  dataID svID alpha0 alpha1 parity
256  10 111000 11011110 10101101 000000 = 0x2e37ab40
257 
258  word 4
259  alpha2 alpha3 beta0 parity
260  10111110 11101111 11011110 000000 = 0x2fbbf780
261 
262  word 5
263  beta1 beta2 beta3 parity
264  10101101 11000000 11011110 000000 = 0x2b703780
265 
266  word 6
267  A0 parity
268  11001010101100001011000010110101 000000 = 0x2eb76ac0
269 
270  word 7
271  A1 (24 msb) parity
272  110010101011000010110000(10110101) 000000 = 0x32ac2c00
273 
274  word 8
275  A0 (8 lsb) tot WNt parity
276  10110101 01101110 01011010 000000 = 0x2d5b9680
277 
278  word 9
279  dtLS WNLSF DN parity
280  00001101 11111110 00000101 000000 = 0x037f8140
281 
282  word 10
283  dtLSF 14b reserved 2b parity
284  10011001 11111111111111 00 000000 = 0x267fff00
285  */
286  const long subframe456[10] = {0x22c000e4, 0x0000042c, 0x2e37ab40, 0x2fbbf780, 0x2b703780,
287  0x2eb76ac0, 0x32ac2c00, 0x2d5b9680, 0x037f8140, 0x267fff00
288  };
289  testMesg = "Adding subframe 4 page 18 failed";
290  testFramework.assert(alm.addSubframe(subframe456, 819), testMesg, __LINE__);
291 
292 
293  return testFramework.countFails();
294  }
295 
296  int getTest(void)
297  {
298  int x, failCount;
299  gnsstk::TestUtil testFramework("EngAlmanac", "getTest", __FILE__, __LINE__);
300 
301  //GNSSTK documentation should really say what units these return as
302  // For loop which tests all the data values for the almanac. Commented out, too many tests
303  /*
304  for(int i=0; i<31; i++)
305  {
306  if ( i >= 7) x = i + 2; //switch to allow for skipped prn 8
307  else x = i + 1;
308  testMesg = "getEcc returned the wrong value";
309  testFramework.assert(std::abs(alm.getEcc(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.ecc[i])*1E2 < eps, testMesg, __LINE__);
310  testMesg = "getIOffset returned the wrong value";
311  testFramework.assert(std::abs(alm.getIOffset(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - (aData.oi[i] - .3*M_PI)) < eps, testMesg, __LINE__);
312  testMesg = "getOmegadot returned the wrong value";
313  testFramework.assert(std::abs(alm.getOmegadot(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.rora[i])*1E8 < eps, testMesg, __LINE__);
314  testMesg = "get6bitHealth returned the wrong value";
315  testFramework.assert(alm.get6bitHealth(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) == 0 , testMesg, __LINE__);
316  testMesg = "getSVHealth returned the wrong value";
317  testFramework.assert(alm.getSVHealth(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) == 0, testMesg, __LINE__);
318  testMesg = "getSVConfig returned the wrong value";
319  testFramework.assert(alm.getSVConfig(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) == 9, testMesg, __LINE__); //9 is 1001
320  testMesg = "getAhalf returned the wrong value";
321  testFramework.assert(std::abs(alm.getAhalf(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.sqrta[i])*1E-4 < eps, testMesg, __LINE__);
322  testMesg = "getA returned the wrong value";
323  testFramework.assert(std::abs(alm.getA(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - pow(aData.sqrta[i],2))*1E-8 < eps, testMesg, __LINE__);
324  testMesg = "getOmega0 returned the wrong value";
325  testFramework.assert(std::abs(alm.getOmega0(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.raaw[i])*1E-1 < eps, testMesg, __LINE__);
326  testMesg = "getW returned the wrong value";
327  testFramework.assert(std::abs(alm.getW(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.aop[i]) < eps, testMesg, __LINE__);
328  testMesg = "getM0 returned the wrong value";
329  testFramework.assert(std::abs(alm.getM0(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.ma[i])*1E-1 < eps, testMesg, __LINE__);
330  testMesg = "getAf0 returned the wrong value";
331  testFramework.assert(std::abs(alm.getAf0(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.af0[i])*1E5 < eps, testMesg, __LINE__);
332  testMesg = "getAf1 returned the wrong value";
333  testFramework.assert(std::abs(alm.getAf1(gnsstk::SatID(x, gnsstk::SatelliteSystem::GPS)) - aData.af1[i]) < eps, testMesg, __LINE__);
334  }
335  */
336 
337  //getEcc test
338  failCount = 0;
339  for (int i=0; i<31; i++)
340  {
341  if ( i >= 7) x = i + 2;
342  else x = i + 1;
343  if (!(std::abs(alm.getEcc(gnsstk::SatID(x,
344  gnsstk::SatelliteSystem::GPS)) - aData.ecc[i])*1E2 < eps))
345  failCount++;
346  }
347  testMesg = "getEcc returned the wrong value";
348  testFramework.assert(failCount == 0, testMesg, __LINE__);
349 
350  //getIOffset test
351  failCount = 0;
352  for (int i=0; i<31; i++)
353  {
354  if ( i >= 7) x = i + 2;
355  else x = i + 1;
356  if (!(std::abs(alm.getIOffset(gnsstk::SatID(x,
357  gnsstk::SatelliteSystem::GPS)) - (aData.oi[i] - .3*M_PI)) < eps))
358  failCount++;
359  }
360  testMesg = "getIOffset returned the wrong value";
361  testFramework.assert(failCount == 0, testMesg, __LINE__);
362 
363  //getOmegadot test
364  failCount = 0;
365  for (int i=0; i<31; i++)
366  {
367  if ( i >= 7) x = i + 2;
368  else x = i + 1;
369  if (!(std::abs(alm.getOmegadot(gnsstk::SatID(x,
371  failCount++;
372  }
373  testMesg = "getOmegadot returned the wrong value";
374  testFramework.assert(failCount == 0, testMesg, __LINE__);
375 
376  //get6bitHealth test
377  failCount = 0;
378  for (int i=0; i<31; i++)
379  {
380  if ( i >= 7) x = i + 2;
381  else x = i + 1;
383  failCount++;
384  }
385  testMesg = "get6bitHealth returned the wrong value";
386  testFramework.assert(failCount == 0, testMesg, __LINE__);
387 
388  //getSVHealth test
389  failCount = 0;
390  for (int i=0; i<31; i++)
391  {
392  if ( i >= 7) x = i + 2;
393  else x = i + 1;
395  failCount++;
396  }
397  testMesg = "getSVHealth returned the wrong value";
398  testFramework.assert(failCount == 0, testMesg, __LINE__);
399 
400  //getSVConfig test
401  failCount = 0;
402  for (int i=0; i<31; i++)
403  {
404  if ( i >= 7) x = i + 2;
405  else x = i + 1;
407  failCount++;
408  }
409  testMesg = "getSVConfig returned the wrong value";
410  testFramework.assert(failCount == 0, testMesg, __LINE__);
411 
412  //getAhalf test
413  failCount = 0;
414  for (int i=0; i<31; i++)
415  {
416  if ( i >= 7) x = i + 2;
417  else x = i + 1;
418  if (!(std::abs(alm.getAhalf(gnsstk::SatID(x,
420  failCount++;
421  }
422  testMesg = "getAhalf returned the wrong value";
423  testFramework.assert(failCount == 0, testMesg, __LINE__);
424 
425  //getA test
426  failCount = 0;
427  for (int i=0; i<31; i++)
428  {
429  if ( i >= 7) x = i + 2;
430  else x = i + 1;
431  if (!(std::abs(alm.getA(gnsstk::SatID(x,
432  gnsstk::SatelliteSystem::GPS)) - pow(aData.sqrta[i],2))*1E-8 < eps))
433  failCount++;
434  }
435  testMesg = "getA returned the wrong value";
436  testFramework.assert(failCount == 0, testMesg, __LINE__);
437 
438  //getOmega0 test
439  failCount = 0;
440  for (int i=0; i<31; i++)
441  {
442  if ( i >= 7) x = i + 2;
443  else x = i + 1;
444  if (!(std::abs(alm.getOmega0(gnsstk::SatID(x,
445  gnsstk::SatelliteSystem::GPS)) - aData.raaw[i])*1E-1 < eps))
446  failCount++;
447  }
448  testMesg = "getOmega0 returned the wrong value";
449  testFramework.assert(failCount == 0, testMesg, __LINE__);
450 
451  //getW test
452  failCount = 0;
453  for (int i=0; i<31; i++)
454  {
455  if ( i >= 7) x = i + 2;
456  else x = i + 1;
457  if (!(std::abs(alm.getW(gnsstk::SatID(x,
459  failCount++;
460  }
461  testMesg = "getW returned the wrong value";
462  testFramework.assert(failCount == 0, testMesg, __LINE__);
463 
464  //getM0 test
465  failCount = 0;
466  for (int i=0; i<31; i++)
467  {
468  if ( i >= 7) x = i + 2;
469  else x = i + 1;
470  if (!(std::abs(alm.getM0(gnsstk::SatID(x,
471  gnsstk::SatelliteSystem::GPS)) - aData.ma[i])*1E-1 < eps))
472  failCount++;
473  }
474  testMesg = "getM0 returned the wrong value";
475  testFramework.assert(failCount == 0, testMesg, __LINE__);
476 
477  //getAf0 test
478  failCount = 0;
479  for (int i=0; i<31; i++)
480  {
481  if ( i >= 7) x = i + 2;
482  else x = i + 1;
483  if (!(std::abs(alm.getAf0(gnsstk::SatID(x,
484  gnsstk::SatelliteSystem::GPS)) - aData.af0[i])*1E5 < eps))
485  failCount++;
486  }
487  testMesg = "getAf0 returned the wrong value";
488  testFramework.assert(failCount == 0, testMesg, __LINE__);
489 
490  //getAf1 test
491  failCount = 0;
492  for (int i=0; i<31; i++)
493  {
494  if ( i >= 7) x = i + 2;
495  else x = i + 1;
496  if (!(std::abs(alm.getAf1(gnsstk::SatID(x,
498  failCount++;
499  }
500  testMesg = "getAf1 returned the wrong value";
501  testFramework.assert(failCount == 0, testMesg, __LINE__);
502 
503  double a[4], b[4];
504  alm.getIon(a, b);
505 
506  testMesg = "getIon returned an incorrect value for Alpha0";
507  testFramework.assert(std::abs(a[0] + 3.166496753692627e-08) < eps, testMesg,
508  __LINE__);
509  testMesg = "getIon returned an incorrect value for Alpha1";
510  testFramework.assert(std::abs(a[1] + 1.968422573302286e-07) < eps, testMesg,
511  __LINE__);
512  testMesg = "getIon returned an incorrect value for Alpha2";
513  testFramework.assert(std::abs(a[2] + 3.985880685087617e-07) < eps, testMesg,
514  __LINE__);
515  testMesg = "getIon returned an incorrect value for Alpha3";
516  testFramework.assert(std::abs(a[3] + 3.26798013069863e-08) < eps, testMesg,
517  __LINE__);
518  testMesg = "getIon returned an incorrect value for Beta0";
519  testFramework.assert(std::abs(b[0] + 69632) < eps, testMesg, __LINE__);
520  testMesg = "getIon returned an incorrect value for Beta1";
521  testFramework.assert(std::abs(b[1] + 432860.7015445238) < eps, testMesg,
522  __LINE__);
523  testMesg = "getIon returned an incorrect value for Beta2";
524  testFramework.assert(std::abs(b[2] + 424971.8458357919) < eps, testMesg,
525  __LINE__);
526  testMesg = "getIon returned an incorrect value for Beta3";
527  testFramework.assert(std::abs(b[3] + 71863.64306088151) < eps, testMesg,
528  __LINE__);
529 
530  double a0, a1, deltaTLS, deltaTLSF;
531  long tot;
532  int WNt, WNLSF, DN;
533  alm.getUTC(a0, a1, deltaTLS, tot, WNt, WNLSF, DN, deltaTLSF);
534 
535  testMesg = "getUTC returned an incorrect value for A0";
536  testFramework.assert(std::abs(a0 + 0.8329656822606921) < eps, testMesg,
537  __LINE__);
538  testMesg = "getUTC returned an incorrect value for A1";
539  testFramework.assert(std::abs(a1 + 4.0241348031599955e-09) < eps, testMesg,
540  __LINE__);
541  testMesg = "getUTC returned an incorrect value for deltaTLS";
542  testFramework.assert(std::abs(deltaTLS - 13) < eps, testMesg, __LINE__);
543  testMesg = "getUTC returned an incorrect value for deltaTLSF";
544  testFramework.assert(std::abs(deltaTLSF + 103) < eps, testMesg, __LINE__);
545  testMesg = "getUTC returned an incorrect value for Tot";
546  testFramework.assert( tot == 450560, testMesg, __LINE__);
547  testMesg = "getUTC returned an incorrect value for WNt";
548  testFramework.assert( WNt == int(851/256)*256 + 90, testMesg, __LINE__);
549 
550  // Below test FAILS! in the 8 bit week conversion. Passing
551  // unsigned value into week conversion can cause diff to be
552  // larger than LIMIT[type], resulting in incorrect value.
553  // See EngNav.cpp convertXbit.
554 
563  testMesg = "getUTC returned an incorrect value for WNLSF";
564  testFramework.assert( WNLSF == 766, testMesg, __LINE__);
565 
566  testMesg = "getUTC returned an incorrect value for DN";
567  testFramework.assert( DN == 5, testMesg, __LINE__);
568 
569  testMesg = "getAlmOrbElem returned an incorrect AlmOrbit object";
570  failCount = 0;
571  for (int i=0; i<30; i++)
572  {
573  x = i+1;
574  if (x > 7) x = i+2;
575  gnsstk::AlmOrbit Compare(aData.id[i], aData.ecc[i], (aData.oi[i] - .3*M_PI),
576  aData.rora[i],
577  aData.sqrta[i], aData.raaw[i], aData.aop[i], aData.ma[i], aData.af0[i],
578  aData.af1[i],
579  aData.toa[i], 0/*?*/, aData.week[i], aData.health[i]);
580  gnsstk::AlmOrbit orbitData;
582 
583 // No == operator for AlmOrbit, using AlmOrbit's get methods to compare
584 // Too many tests, using counter. Uncomment to find specific error
585  /*
586  testMesg = "PRN value in getAlmOrbElem is incorrect";
587  testFramework.assert(orbitData.getPRN() == Compare.getPRN(), testMesg, __LINE__);
588  testMesg = "ecc value in getAlmOrbElem is incorrect";
589  testFramework.assert(std::abs(orbitData.getecc() - Compare.getecc()) < eps, testMesg, __LINE__);
590  testMesg = "i_offset value in getAlmOrbElem is incorrect";
591  testFramework.assert(std::abs(orbitData.geti_offset() - Compare.geti_offset()) < eps, testMesg, __LINE__);
592  testMesg = "OMEGAdot value in getAlmOrbElem is incorrect";
593  testFramework.assert(std::abs(orbitData.getOMEGAdot() - Compare.getOMEGAdot()) < eps, testMesg, __LINE__);
594  testMesg = "Ahalf value in getAlmOrbElem is incorrect";
595  testFramework.assert(std::abs(orbitData.getAhalf() - Compare.getAhalf()) < eps, testMesg, __LINE__);
596  testMesg = "OMEGA0 value in getAlmOrbElem is incorrect";
597  testFramework.assert(std::abs(orbitData.getOMEGA0() - Compare.getOMEGA0()) < eps, testMesg, __LINE__);
598  testMesg = "w value in getAlmOrbElem is incorrect";
599  testFramework.assert(std::abs(orbitData.getw() - Compare.getw()) < eps, testMesg, __LINE__);
600  testMesg = "M0 value in getAlmOrbElem is incorrect";
601  testFramework.assert(std::abs(orbitData.getM0() - Compare.getM0()) < eps, testMesg, __LINE__);
602  testMesg = "AF0 value in getAlmOrbElem is incorrect";
603  testFramework.assert(std::abs(orbitData.getAF0() - Compare.getAF0()) < eps, testMesg, __LINE__);
604  testMesg = "AF1 value in getAlmOrbElem is incorrect";
605  testFramework.assert(std::abs(orbitData.getAF1() - Compare.getAF1()) < eps, testMesg, __LINE__);
606  testMesg = "ToaSOW value in getAlmOrbElem is incorrect";
607  testFramework.assert(orbitData.getToaSOW() == Compare.getToaSOW(), testMesg, __LINE__);
608  testMesg = "xmit_time value in getAlmOrbElem is incorrect";
609  testFramework.assert(orbitData.getxmit_time() == Compare.getxmit_time(), testMesg, __LINE__);
610  testMesg = "ToaWeek value in getAlmOrbElem is incorrect";
611  testFramework.assert(orbitData.getToaWeek() == Compare.getToaWeek(), testMesg, __LINE__);
612  */
613 
614  if (!(orbitData.getPRN() == Compare.getPRN())) failCount++;
615  if (!(std::abs(orbitData.getecc() - Compare.getecc()) < eps)) failCount++;
616  if (!(std::abs(orbitData.geti_offset() - Compare.geti_offset()) < eps))
617  failCount++;
618  if (!(std::abs(orbitData.getOMEGAdot() - Compare.getOMEGAdot()) < eps))
619  failCount++;
620  if (!(std::abs(orbitData.getAhalf() - Compare.getAhalf()) < eps)) failCount++;
621  if (!(std::abs(orbitData.getOMEGA0() - Compare.getOMEGA0()) < eps))
622  failCount++;
623  if (!(std::abs(orbitData.getw() - Compare.getw()) < eps)) failCount++;
624  if (!(std::abs(orbitData.getM0() - Compare.getM0()) < eps)) failCount++;
625  if (!(std::abs(orbitData.getAF0() - Compare.getAF0()) < eps)) failCount++;
626  if (!(std::abs(orbitData.getAF1() - Compare.getAF1()) < eps)) failCount++;
627  if (!(orbitData.getToaSOW() == Compare.getToaSOW())) failCount++;
628  if (!(orbitData.getxmit_time() == Compare.getxmit_time())) failCount++;
629  if (!(orbitData.getToaWeek() == Compare.getToaWeek())) failCount++;
630  }
631  testFramework.assert(failCount == 0, testMesg, __LINE__);
632 
633  return testFramework.countFails();
634 
635  }
636 
637 private:
638  double eps;
639  std::string testMesg;
640  AlmanacData aData; //data where the almanac info is stored
641  AlmanacSubframes aSubframes; //data where subframes are stored
642 
643 };
644 
645 
646 int main() //Main function to initialize and run all tests above
647 {
648  std::string pathData = gnsstk::getPathData();
649  std::string almanacLocation = pathData + "/test_input_gps_almanac.txt";
650  std::ifstream iAlmanac(
651  almanacLocation.c_str()); // Reads in almanac data from file
652  AlmanacData iAData(iAlmanac); // Parses file into data objects
653  AlmanacSubframes iASubframes(
654  iAData); // Takes data objects and generates the subframes needed
655 
656  EngAlmanac_T testClass(iAData, iASubframes);
657  int check, errorCounter = 0;
658 
659  check = testClass.addSubframeTest(); // Tests adding the subframes to a class member of EngAlmanac
660  errorCounter += check;
661 
662  check = testClass.getTest(); // Tests the get methods and if subframes stored the correct data
663  errorCounter += check;
664 
665  std::cout << "Total Failures for " << __FILE__ << ": " << errorCounter <<
666  std::endl;
667 
668  return errorCounter; //Return the total number of errors
669 }
AlmanacData::aop
float aop[31]
Definition: AlmanacDataGenerator.hpp:66
AlmanacData::ecc
float ecc[31]
Definition: AlmanacDataGenerator.hpp:60
main
int main()
Definition: EngAlmanac_T.cpp:646
EngAlmanac_T::addSubframeTest
int addSubframeTest(void)
Definition: EngAlmanac_T.cpp:61
gnsstk::TestUtil::countFails
int countFails(void)
Definition: TestUtil.hpp:771
EngAlmanac_T::alm
gnsstk::EngAlmanac alm
Definition: EngAlmanac_T.cpp:59
gnsstk::TestUtil::assert
void assert(bool testExpression, const std::string &testMsg, const int lineNumber)
Definition: TestUtil.hpp:607
AlmanacData
Definition: AlmanacDataGenerator.hpp:55
gnsstk::AlmOrbit::getAhalf
double getAhalf() const
Definition: AlmOrbit.hpp:131
gnsstk::EngAlmanac::getM0
double getM0(SatID sat) const
Definition: EngAlmanac.cpp:298
gnsstk::AlmOrbit::getecc
double getecc() const
Definition: AlmOrbit.hpp:128
gnsstk::AlmOrbit::getM0
double getM0() const
Definition: AlmOrbit.hpp:134
AlmanacDataGenerator.hpp
EngAlmanac.hpp
EngAlmanac_T::aData
AlmanacData aData
Definition: EngAlmanac_T.cpp:640
gnsstk::SatID
Definition: SatID.hpp:89
AlmanacData::rora
float rora[31]
Definition: AlmanacDataGenerator.hpp:63
AlmanacData::id
int id[31]
Definition: AlmanacDataGenerator.hpp:58
gnsstk::AlmOrbit::getPRN
short getPRN() const
Definition: AlmOrbit.hpp:127
AlmanacData::health
int health[31]
Definition: AlmanacDataGenerator.hpp:59
gnsstk::AlmOrbit::getw
double getw() const
Definition: AlmOrbit.hpp:133
AlmanacSubframes
Definition: AlmanacDataGenerator.hpp:118
EngAlmanac_T::EngAlmanac_T
EngAlmanac_T(AlmanacData iAData, AlmanacSubframes iASubframes)
Definition: EngAlmanac_T.cpp:50
gnsstk::SatelliteSystem::GPS
@ GPS
gnsstk::AlmOrbit::geti_offset
double geti_offset() const
Definition: AlmOrbit.hpp:129
AlmanacData::sqrta
float sqrta[31]
Definition: AlmanacDataGenerator.hpp:64
TestUtil.hpp
gnsstk::EngAlmanac
Definition: EngAlmanac.hpp:71
gnsstk::AlmOrbit::getOMEGA0
double getOMEGA0() const
Definition: AlmOrbit.hpp:132
AlmanacData::ma
float ma[31]
Definition: AlmanacDataGenerator.hpp:67
gnsstk::AlmOrbit::getAF0
double getAF0() const
Definition: AlmOrbit.hpp:135
gnsstk::EngAlmanac::getAlmOrbElem
AlmOrbit getAlmOrbElem(SatID sat) const
Definition: EngAlmanac.cpp:400
EngAlmanac_T::eps
double eps
Definition: EngAlmanac_T.cpp:638
gnsstk::EngAlmanac::getIon
void getIon(double a[4], double b[4]) const
Definition: EngAlmanac.cpp:360
gnsstk::AlmOrbit::getxmit_time
long getxmit_time() const
Definition: AlmOrbit.hpp:138
gnsstk::EngAlmanac::getAf0
double getAf0(SatID sat) const
Definition: EngAlmanac.cpp:307
gnsstk::EngAlmanac::getEcc
double getEcc(SatID sat) const
Definition: EngAlmanac.cpp:198
gnsstk::EngAlmanac::getOmega0
double getOmega0(SatID sat) const
Definition: EngAlmanac.cpp:279
gnsstk::EngAlmanac::get6bitHealth
short get6bitHealth(SatID sat) const
Definition: EngAlmanac.cpp:226
BinUtils.hpp
gnsstk::EngAlmanac::getUTC
void getUTC(double &a0, double &a1, double &deltaTLS, long &tot, int &WNt, int &WNLSF, int &DN, double &deltaTLSF) const
Definition: EngAlmanac.cpp:375
AlmanacSubframes::totalSf
long totalSf[31][10]
Definition: AlmanacDataGenerator.hpp:135
gnsstk::EngAlmanac::getSVHealth
short getSVHealth(SatID sat) const
Definition: EngAlmanac.cpp:239
gnsstk::AlmOrbit::getToaSOW
long getToaSOW() const
Definition: AlmOrbit.hpp:137
gnsstk::EngAlmanac::getOmegadot
double getOmegadot(SatID sat) const
Definition: EngAlmanac.cpp:216
gnsstk::EngAlmanac::getAhalf
double getAhalf(SatID sat) const
Definition: EngAlmanac.cpp:261
EngAlmanac_T::getTest
int getTest(void)
Definition: EngAlmanac_T.cpp:296
gnsstk::EngAlmanac::getAf1
double getAf1(SatID sat) const
Definition: EngAlmanac.cpp:317
AlmanacData::toa
float toa[31]
Definition: AlmanacDataGenerator.hpp:61
EngAlmanac_T::~EngAlmanac_T
~EngAlmanac_T()
Definition: EngAlmanac_T.cpp:57
EngAlmanac_T::testMesg
std::string testMesg
Definition: EngAlmanac_T.cpp:639
gnsstk::EngAlmanac::getA
double getA(SatID sat) const
Definition: EngAlmanac.cpp:270
EngAlmanac_T
Definition: EngAlmanac_T.cpp:46
AlmanacData::af1
float af1[31]
Definition: AlmanacDataGenerator.hpp:69
gnsstk::EngAlmanac::getSVConfig
short getSVConfig(SatID sat) const
Definition: EngAlmanac.cpp:248
AlmanacData::af0
float af0[31]
Definition: AlmanacDataGenerator.hpp:68
AlmanacData::week
float week[31]
Definition: AlmanacDataGenerator.hpp:70
AlmanacData::oi
float oi[31]
Definition: AlmanacDataGenerator.hpp:62
gnsstk::AlmOrbit::getOMEGAdot
double getOMEGAdot() const
Definition: AlmOrbit.hpp:130
gnsstk::TestUtil
Definition: TestUtil.hpp:265
AlmanacData::raaw
float raaw[31]
Definition: AlmanacDataGenerator.hpp:65
gnsstk::EngAlmanac::getW
double getW(SatID sat) const
Definition: EngAlmanac.cpp:289
gnsstk::EngAlmanac::getIOffset
double getIOffset(SatID sat) const
Definition: EngAlmanac.cpp:207
gnsstk::AlmOrbit::getAF1
double getAF1() const
Definition: AlmOrbit.hpp:136
gnsstk::EngAlmanac::addSubframe
bool addSubframe(const long subframe[10], const int gpsWeek)
Definition: EngAlmanac.cpp:84
gnsstk::AlmOrbit::getToaWeek
short getToaWeek() const
Definition: AlmOrbit.hpp:139
gnsstk::AlmOrbit
Definition: AlmOrbit.hpp:59
EngAlmanac_T::aSubframes
AlmanacSubframes aSubframes
Definition: EngAlmanac_T.cpp:641


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:38