PackedNavBits_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 
43 #include "CivilTime.hpp"
44 #include "CommonTime.hpp"
45 #include "GNSSconstants.hpp"
46 #include "ObsID.hpp"
47 #include "PackedNavBits.hpp"
48 #include "SatID.hpp"
49 #include "TestUtil.hpp"
50 #include "TimeString.hpp"
51 #include "TimeSystem.hpp"
52 
53 using namespace std;
54 using namespace gnsstk;
55 
57 {
58 public:
60 
61  void init();
62 
63  unsigned abstractTest();
64  unsigned realDataTest();
65  unsigned equalityTest();
66  unsigned ancillaryMethods();
67  unsigned addDataVecTest();
68 
69  double eps;
70 };
71 
74 {
75  init();
76 }
77 
80 {
81  TUDEF("PackedNavBits", "initialize");
82  eps = 1E-12; // Set the precision value
83 }
84 
85  // These tests are NOT real data, but are designed to test
86  // edge cases and limits.
87 unsigned PackedNavBits_T ::
89 {
90  // Test Unsigned Integers
91  TUDEF("PackedNavBits", "addUnsigned");
92  unsigned long u_i1 = 32767;
93  int u_n1 = 16;
94  int u_s1 = 1;
95 
96  unsigned long u_i2 = 1;
97  int u_n2 = 8;
98  int u_s2 = 1;
99 
100  unsigned long u_i3 = 255;
101  int u_n3 = 8;
102  int u_s3 = 1;
103 
104  unsigned long u_i4 = 604500;
105  int u_n4 = 11;
106  int u_s4 = 300;
107 
108  // Pack the data
109  PackedNavBits pnb;
110  pnb.addUnsignedLong(u_i1, u_n1, u_s1);
111  pnb.addUnsignedLong(u_i2, u_n2, u_s2);
112  pnb.addUnsignedLong(u_i3, u_n3, u_s3);
113  pnb.addUnsignedLong(u_i4, u_n4, u_s4);
114 
115  // Unpack the data and see that the round-trip worked.
116  int startbit = 0;
117  unsigned long ultest = pnb.asUnsignedLong(startbit, u_n1, u_s1);
118  TUASSERTE(unsigned long, ultest, u_i1);
119  startbit += u_n1;
120  ultest = pnb.asUnsignedLong(startbit, u_n2, u_s2);
121  TUASSERTE(unsigned long, ultest, u_i2);
122  startbit += u_n2;
123  ultest = pnb.asUnsignedLong(startbit, u_n3, u_s3);
124  TUASSERTE(unsigned long, ultest, u_i3);
125  startbit += u_n3;
126  ultest = pnb.asUnsignedLong(startbit, u_n4, u_s4);
127  TUASSERTE(unsigned long, ultest, u_i4);
128  startbit += u_n4;
129 
130  // Test Signed Integers
131  TUCSM("addSigned");
132  long s_i1 = 15;
133  int s_n1 = 5;
134  int s_s1 = 1;
135 
136  long s_i2 = -16;
137  int s_n2 = 5;
138  int s_s2 = 1;
139 
140  long s_i3 = -1;
141  int s_n3 = 5;
142  int s_s3 = 1;
143 
144  long s_i4 = 0;
145  int s_n4 = 6;
146  int s_s4 = 1;
147 
148  long s_i5 = 4194304;
149  int s_n5 = 24;
150  int s_s5 = 1;
151 
152  pnb.addLong(s_i1, s_n1, s_s1);
153  pnb.addLong(s_i2, s_n2, s_s2);
154  pnb.addLong(s_i3, s_n3, s_s3);
155  pnb.addLong(s_i4, s_n4, s_s4);
156  pnb.addLong(s_i5, s_n5, s_s5);
157 
158  long ltest;
159  ltest = pnb.asLong(startbit, s_n1, s_s1);
160  TUASSERTE(long, ltest, s_i1);
161  startbit += s_n1;
162  ltest = pnb.asLong(startbit, s_n2, s_s2);
163  TUASSERTE(long, ltest, s_i2);
164  startbit += s_n2;
165  ltest = pnb.asLong(startbit, s_n3, s_s3);
166  TUASSERTE(long, ltest, s_i3);
167  startbit += s_n3;
168  ltest = pnb.asLong(startbit, s_n4, s_s4);
169  TUASSERTE(long, ltest, s_i4);
170  startbit += s_n4;
171  ltest = pnb.asLong(startbit, s_n5, s_s5);
172  TUASSERTE(long, ltest, s_i5);
173  startbit += s_n5;
174 
175  // Test Signed Doubles
176  TUCSM("addDouble");
177  double d_i1 = 0.490005493;
178  int d_n1 = 16;
179  int d_s1 = -16;
180  double d_e1 = pow(2.0,d_s1); // value of lsb
181 
182  double d_i2 = -0.5;
183  int d_n2 = 16;
184  int d_s2 = -16;
185  double d_e2 = pow(2.0,d_s2); // value of lsb
186 
187  double d_i3 = 0;
188  int d_n3 = 16;
189  int d_s3 = -16;
190  double d_e3 = pow(2.0,d_s3); // value of lsb
191 
192  // Test Unsigned Doubles
193  double d_i4 = 32000.0;
194  int d_n4 = 16;
195  int d_s4 = 0;
196  double d_e4 = pow(2.0,d_s4); // value of lsb
197 
198  pnb.addSignedDouble(d_i1, d_n1, d_s1);
199  pnb.addSignedDouble(d_i2, d_n2, d_s2);
200  pnb.addSignedDouble(d_i3, d_n3, d_s3);
201  pnb.addUnsignedDouble(d_i4, d_n4, d_s4);
202 
203  double dtest;
204  dtest = pnb.asSignedDouble(startbit, d_n1, d_s1);
205  TUASSERTFEPS(dtest, d_i1, d_e1);
206  startbit += d_n1;
207  dtest = pnb.asSignedDouble(startbit, d_n2, d_s2);
208  TUASSERTFEPS(dtest, d_i2, d_e2);
209  startbit += d_n2;
210  dtest = pnb.asSignedDouble(startbit, d_n3, d_s3);
211  TUASSERTFEPS(dtest, d_i3, d_e3);
212  startbit += d_n3;
213  dtest = pnb.asUnsignedDouble(startbit, d_n4, d_s4);
214  TUASSERTFEPS(dtest, d_i4, d_e4);
215  startbit += d_n4;
216 
217  // Test Semi-Circles
218  TUCSM("addSemiCircles");
219  double sd_i1 = PI-2*pow(2.0,-31);
220  int sd_n1 = 32;
221  int sd_s1 = -31;
222  double sd_e1 = pow(2.0,sd_s1) * 3.0; // value of lsb in semi-circles
223 
224  double sd_i2 = -PI;
225  int sd_n2 = 32;
226  int sd_s2 = -31;
227  double sd_e2 = pow(2.0,sd_s1) * 3.0; // value of lsb
228 
229  pnb.addDoubleSemiCircles(sd_i1, sd_n1, sd_s1);
230  pnb.addDoubleSemiCircles(sd_i2, sd_n2, sd_s2);
231 
232  dtest = pnb.asDoubleSemiCircles(startbit, sd_n1, sd_s1);
233  TUASSERTFEPS(dtest, sd_i1, sd_e1);
234  startbit += sd_n1;
235  dtest = pnb.asDoubleSemiCircles(startbit, sd_n2, sd_s2);
236  TUASSERTFEPS(dtest, sd_i2, sd_e2);
237 
238  return testFramework.countFails();
239 }
240 
241  // These test cases are examples from real data.
242 unsigned PackedNavBits_T ::
244 {
245  TUDEF("PackedNavBits", "real data round-trip");
246 
247  //Test Data copied from RINEX file for PRN3, week 1638, day 153 2011
248  SatID satID(3, SatelliteSystem::GPS);
249  ObsID obsID( ObservationType::NavMsg, CarrierBand::L1, TrackingCode::CA );
250  std::string rxID = "rx1";
251  CommonTime ct = CivilTime( 2011, 6, 2, 10, 00, 0.0, TimeSystem::GPS );
252  PackedNavBits pnb(satID,obsID,rxID,ct);
253 
254  double rToe = 388800.0;
255  int n_rToe = 16;
256  int s_rToe = 4;
257 
258  unsigned long riodc = 22;
259  int n_riodc = 8;
260  int s_riodc = 1;
261 
262  unsigned long riode = 22;
263  int n_riode = 8;
264  int s_riode = 1;
265 
266  unsigned long raodo = 10;
267  int n_raodo = 5;
268  int s_raodo = 1;
269 
270  unsigned long rfitInt = 0;
271  int n_rfitInt = 1;
272  int s_rfitInt = 1;
273 
274  double rToc = 388800.0;
275  int n_rToc = 16;
276  int s_rToc = 4;
277 
278  double rCuc = 9.57399606705E-07;
279  int n_rCuc = 16;
280  int s_rCuc = -29;
281 
282  double rCus = 8.35768878460E-06;
283  int n_rCus = 16;
284  int s_rCus = -29;
285 
286  double rCrc = 2.03562500000E+02;
287  int n_rCrc = 16;
288  int s_rCrc = -5;
289 
290  double rCrs = 1.87812500000E+01;
291  int n_rCrs = 16;
292  int s_rCrs = -5;
293 
294  double rCic = -2.30967998505E-07;
295  int n_rCic = 16;
296  int s_rCic = -29;
297 
298  double rCis = 5.02914190292E-08;
299  int n_rCis = 16;
300  int s_rCis = -29;
301 
302  double rM0 = 1.05539162795E+00;
303  int n_rM0 = 32;
304  int s_rM0 = -31;
305 
306  double rdn = 5.39093883996E-09;
307  int n_rdn = 16;
308  int s_rdn = -43;
309 
310  double recc = 1.42575260252E-02;
311  int n_recc = 32;
312  int s_recc = -33;
313 
314  double rAhalf = 5.15365527534E+03;
315  int n_rAhalf = 32;
316  int s_rAhalf = -19;
317 
318  double rOMEGA0 = -2.16947563164E+00;
319  int n_rOMEGA0 = 32;
320  int s_rOMEGA0 = -31;
321 
322  double ri0 = 9.28692497530E-01;
323  int n_ri0 = 32;
324  int s_ri0 = -31;
325 
326  double rw = 1.09154604931E+00;
327  int n_rw = 32;
328  int s_rw = -31;
329 
330  double rOMEGAdot = -8.56285667735E-09;
331  int n_rOMEGAdot = 24;
332  int s_rOMEGAdot = -43;
333 
334  double ridot = 5.52880172536E-10;
335  int n_ridot = 14;
336  int s_ridot = -43;
337 
338  double raf0 = 7.23189674318E-04;
339  int n_raf0 = 22;
340  int s_raf0 = -31;
341 
342  double raf1 = 5.11590769747E-12;
343  int n_raf1 = 16;
344  int s_raf1 = -43;
345 
346  double raf2 = 0.0;
347  int n_raf2 = 8;
348  int s_raf2 = -55;
349 
350  double rTgd = -4.65661287308E-09;
351  int n_rTgd = 8;
352  int s_rTgd = -31;
353 
354  // Pack legacy nav message data in order
355  // (But w/o parity)
356  pnb.addSignedDouble(rTgd, n_rTgd, s_rTgd);
357  pnb.addUnsignedLong(riodc, n_riodc, s_riodc);
358  pnb.addUnsignedDouble(rToc, n_rToc, s_rToc);
359  pnb.addSignedDouble(raf2, n_raf2, s_raf2);
360  pnb.addSignedDouble(raf1, n_raf1, s_raf1);
361  pnb.addSignedDouble(raf0, n_raf0, s_raf0);
362  pnb.addUnsignedLong(riode, n_riode, s_riode);
363  pnb.addSignedDouble(rCrs, n_rCrs, s_rCrs);
364  pnb.addDoubleSemiCircles(rdn, n_rdn, s_rdn);
365  pnb.addDoubleSemiCircles(rM0, n_rM0, s_rM0);
366  pnb.addSignedDouble(rCuc, n_rCuc, s_rCuc);
367  pnb.addUnsignedDouble(recc, n_recc, s_recc);
368  pnb.addSignedDouble(rCus, n_rCus, s_rCus);
369  pnb.addUnsignedDouble(rAhalf, n_rAhalf, s_rAhalf);
370  pnb.addUnsignedDouble(rToe, n_rToe, s_rToe);
371  pnb.addUnsignedLong(rfitInt, n_rfitInt, s_rfitInt);
372  pnb.addUnsignedLong(raodo, n_raodo, s_raodo);
373  pnb.addSignedDouble(rCic, n_rCic, s_rCic);
374  pnb.addDoubleSemiCircles(rOMEGA0, n_rOMEGA0, s_rOMEGA0);
375  pnb.addSignedDouble(rCis, n_rCis, s_rCis);
376  pnb.addDoubleSemiCircles(ri0, n_ri0, s_ri0);
377  pnb.addSignedDouble(rCrc, n_rCrc, s_rCrc);
378  pnb.addDoubleSemiCircles(rw, n_rw, s_rw);
379  pnb.addDoubleSemiCircles(rOMEGAdot, n_rOMEGAdot, s_rOMEGAdot);
380  pnb.addUnsignedLong(riode, n_riode, s_riode);
381  pnb.addDoubleSemiCircles(ridot, n_ridot, s_ridot);
382  pnb.trimsize();
383 
384  int startbit = 0;
385  double dtest;
386  unsigned long ultest;
387  long ltest;
388  double eps; // value of lsb
389 
390  dtest = pnb.asSignedDouble(startbit, n_rTgd, s_rTgd);
391  eps = pow(2.0,s_rTgd);
392  TUASSERTFEPS(dtest,rTgd,eps);
393 
394  startbit += n_rTgd;
395  ultest = pnb.asUnsignedLong(startbit, n_riodc, s_riodc);
396  TUASSERTE(unsigned long, ultest, riodc);
397 
398  startbit += n_riodc;
399  dtest = pnb.asUnsignedDouble(startbit, n_rToc, s_rToc);
400  eps = pow(2.0,s_rToc);
401  TUASSERTFEPS(dtest,rToc,eps);
402 
403  startbit += n_rToc;
404  dtest = pnb.asSignedDouble(startbit, n_raf2, s_raf2);
405  eps = pow(2.0,s_raf2);
406  TUASSERTFEPS(dtest,raf2,eps);
407 
408  startbit += n_raf2;
409  dtest = pnb.asSignedDouble(startbit, n_raf1, s_raf1);
410  eps = pow(2.0,s_raf1);
411  TUASSERTFEPS(dtest,raf1,eps);
412 
413  startbit += n_raf1;
414  dtest = pnb.asSignedDouble(startbit, n_raf0, s_raf0);
415  eps = pow(2.0,s_raf0);
416  TUASSERTFEPS(dtest,raf0,eps);
417 
418  startbit += n_raf0;
419  ultest = pnb.asUnsignedLong(startbit, n_riode, s_riode);
420  TUASSERTE(unsigned long, ultest, riode);
421 
422  startbit += n_riode;
423  dtest = pnb.asSignedDouble(startbit, n_rCrs, s_rCrs);
424  eps = pow(2.0,s_rCrs);
425  TUASSERTFEPS(dtest,rCrs,eps);
426 
427  startbit += n_rCrs;
428  dtest = pnb.asDoubleSemiCircles(startbit, n_rdn, s_rdn);
429  eps = pow(2.0,s_rdn) * 3.0;
430  TUASSERTFEPS(dtest,rdn,eps);
431 
432  startbit += n_rdn;
433  dtest = pnb.asDoubleSemiCircles(startbit, n_rM0, s_rM0);
434  eps = pow(2.0,s_rM0) * 3.0;
435  TUASSERTFEPS(dtest,rM0,eps);
436 
437  startbit += n_rM0;
438  dtest = pnb.asSignedDouble(startbit, n_rCuc, s_rCuc);
439  eps = pow(2.0,s_rCuc);
440  TUASSERTFEPS(dtest,rCuc,eps);
441 
442  startbit += n_rCuc;
443  dtest = pnb.asUnsignedDouble(startbit, n_recc, s_recc);
444  eps = pow(2.0,s_recc);
445  TUASSERTFEPS(dtest,recc,eps);
446 
447  startbit += n_recc;
448  dtest = pnb.asSignedDouble(startbit, n_rCus, s_rCus);
449  eps = pow(2.0,s_rCus);
450  TUASSERTFEPS(dtest,rCus,eps);
451 
452  startbit += n_rCus;
453  dtest = pnb.asUnsignedDouble(startbit, n_rAhalf, s_rAhalf);
454  eps = pow(2.0,s_rAhalf);
455  TUASSERTFEPS(dtest,rAhalf,eps);
456 
457  startbit += n_rAhalf;
458  dtest = pnb.asUnsignedDouble(startbit, n_rToe, s_rToe);
459  eps = pow(2.0,s_rToe);
460  TUASSERTFEPS(dtest,rToe,eps);
461 
462  startbit += n_rToe;
463  ultest = pnb.asUnsignedLong(startbit, n_rfitInt, s_rfitInt);
464  TUASSERTE(unsigned long, ultest, rfitInt);
465 
466  startbit += n_rfitInt;
467  ultest = pnb.asUnsignedLong(startbit, n_raodo, s_raodo);
468  TUASSERTE(unsigned long, ultest, raodo);
469 
470  startbit += n_raodo;
471  dtest = pnb.asSignedDouble(startbit, n_rCic, s_rCic);
472  eps = pow(2.0,s_rCic);
473  TUASSERTFEPS(dtest,rCic,eps);
474 
475  startbit += n_rCic;
476  dtest = pnb.asDoubleSemiCircles(startbit, n_rOMEGA0, s_rOMEGA0);
477  eps = pow(2.0,s_rOMEGA0) * 3.0;
478  TUASSERTFEPS(dtest,rOMEGA0,eps);
479 
480  startbit += n_rOMEGA0;
481  dtest = pnb.asSignedDouble(startbit, n_rCis, s_rCis);
482  eps = pow(2.0,s_rCis);
483  TUASSERTFEPS(dtest,rCis,eps);
484 
485  startbit += n_rCis;
486  dtest = pnb.asDoubleSemiCircles(startbit, n_ri0, s_ri0);
487  eps = pow(2.0,s_ri0) * 3.0;
488  TUASSERTFEPS(dtest,ri0,eps);
489 
490  startbit += n_ri0;
491  dtest = pnb.asSignedDouble(startbit, n_rCrc, s_rCrc);
492  eps = pow(2.0,s_rCrc);
493  TUASSERTFEPS(dtest,rCrc,eps);
494 
495  startbit += n_rCrc;
496  dtest = pnb.asDoubleSemiCircles(startbit, n_rw, s_rw);
497  eps = pow(2.0,s_rw) * 3.0;
498  TUASSERTFEPS(dtest,rw,eps);
499 
500  startbit += n_rw;
501  dtest = pnb.asDoubleSemiCircles(startbit, n_rOMEGAdot, s_rOMEGAdot);
502  eps = pow(2.0,s_rOMEGAdot) * 3.0;
503  TUASSERTFEPS(dtest,rOMEGAdot,eps);
504 
505  startbit += n_rOMEGAdot;
506  dtest = pnb.asUnsignedLong(startbit, n_riode, s_riode);
507  eps = pow(2.0,s_riode);
508  TUASSERTFEPS(dtest,riode,eps);
509 
510  startbit += n_riode;
511  dtest = pnb.asDoubleSemiCircles(startbit, n_ridot, s_ridot);
512  eps = pow(2.0,s_ridot) * 3.0;
513  TUASSERTFEPS(dtest,ridot,eps);
514 
515  return testFramework.countFails();
516 }
517 
518 unsigned PackedNavBits_T ::
520 {
521  // Create a master PackedNavBits, a copy, and
522  // several not-quite-copies.
523  // At this point, the "packed bits" section of
524  // this object is empty. We are focused on testing
525  // the metadata handling.
526  SatID satID(1, SatelliteSystem::GPS);
527  ObsID obsID( ObservationType::NavMsg, CarrierBand::L2, TrackingCode::L2CML );
528  NavID navID(satID,obsID);
529  std::string rxID = "rx1";
530  CommonTime ct = CivilTime( 2011, 6, 2, 12, 14, 44.0, TimeSystem::GPS );
531 
532  SatID satID2(2, SatelliteSystem::GPS);
533  ObsID obsID2(ObservationType::NavMsg, CarrierBand::L5, TrackingCode::L5Q );
534  NavID navID2(satID2,obsID2);
535  std::string rxID2 = "rx2";
536  CommonTime ctPlus = ct + 900.0;
537 
538  PackedNavBits master(satID,obsID,navID,rxID,ct);
539  PackedNavBits masterCopy(master);
540 
541  PackedNavBits diffSat(satID2,obsID,navID,rxID,ct);
542  PackedNavBits diffObs(satID,obsID2,navID,rxID,ct);
543  PackedNavBits diffNav(satID,obsID,navID2,rxID,ct);
544  PackedNavBits diffRx(satID,obsID,navID,rxID2,ct);
545  PackedNavBits diffTime(satID,obsID,navID,rxID,ctPlus);
546  // Typical same SV/OBS/NAV across multiple Rx/Time case.
547  PackedNavBits diffRxTime(satID,obsID,navID,rxID2,ctPlus);
548 
549  TUDEF("PackedNavBits","matchMetaData");
550  TUASSERTE(bool,true,master.matchMetaData(master));
551  TUASSERTE(bool,true,master.matchMetaData(masterCopy));
552  TUASSERTE(bool,false,master.matchMetaData(diffSat));
553  TUASSERTE(bool,false,master.matchMetaData(diffObs));
554  TUASSERTE(bool,false,master.matchMetaData(diffNav));
555  TUASSERTE(bool,false,master.matchMetaData(diffRx));
556  TUASSERTE(bool,false,master.matchMetaData(diffTime));
557 
558  unsigned int ignoreSAT = PackedNavBits::mmOBS | PackedNavBits::mmNAV | PackedNavBits::mmRX | PackedNavBits::mmTIME;
559  unsigned int ignoreOBS = PackedNavBits::mmSAT | PackedNavBits::mmNAV | PackedNavBits::mmRX | PackedNavBits::mmTIME;
560  unsigned int ignoreNAV = PackedNavBits::mmSAT | PackedNavBits::mmOBS | PackedNavBits::mmRX | PackedNavBits::mmTIME;
561  unsigned int ignoreRX = PackedNavBits::mmSAT | PackedNavBits::mmOBS | PackedNavBits::mmNAV | PackedNavBits::mmTIME;
562  unsigned int ignoreTIME = PackedNavBits::mmSAT | PackedNavBits::mmOBS | PackedNavBits::mmNAV | PackedNavBits::mmRX;
563  unsigned int checkRXTIME = PackedNavBits::mmRX | PackedNavBits::mmTIME;
564  unsigned int checkSATOBS = PackedNavBits::mmSAT | PackedNavBits::mmOBS;
565  TUASSERTE(bool,true,master.matchMetaData( diffSat, ignoreSAT));
566  TUASSERTE(bool,true,master.matchMetaData( diffObs, ignoreOBS));
567  TUASSERTE(bool,true,master.matchMetaData( diffNav, ignoreNAV));
568  TUASSERTE(bool,true,master.matchMetaData( diffRx, ignoreRX));
569  TUASSERTE(bool,true,master.matchMetaData(diffTime,ignoreTIME));
570  TUASSERTE(bool,true,master.matchMetaData(diffRxTime,checkSATOBS));
571 
572  TUASSERTE(bool,false,master.matchMetaData( diffSat, PackedNavBits::mmSAT));
573  TUASSERTE(bool,false,master.matchMetaData( diffObs, PackedNavBits::mmOBS));
574  TUASSERTE(bool,false,master.matchMetaData( diffNav, PackedNavBits::mmNAV));
575  TUASSERTE(bool,false,master.matchMetaData( diffRx, PackedNavBits::mmRX));
576  TUASSERTE(bool,false,master.matchMetaData( diffTime, PackedNavBits::mmTIME));
577  TUASSERTE(bool,false,master.matchMetaData(diffRxTime, checkRXTIME));
578 
579  // Now keep the metadata the same across copies, but add some
580  // bits. NOTE: The metadata is all left identical.
581  TUCSM("matchBits");
582  PackedNavBits withBits(satID,obsID,navID,rxID,ct);
583  PackedNavBits withSameBits(satID,obsID,navID,rxID,ct);
584  PackedNavBits withShortBits(satID,obsID,navID,rxID,ct);
585  PackedNavBits withLongBits(satID,obsID,navID,rxID,ct);
586 
587  // Reuse test data from abstractTest( )
588  unsigned long u_i1 = 32767;
589  int u_n1 = 16;
590  int u_s1 = 1;
591 
592  unsigned long u_i2 = 1;
593  int u_n2 = 8;
594  int u_s2 = 1;
595 
596  unsigned long u_i3 = 255;
597  int u_n3 = 8;
598  int u_s3 = 1;
599 
600  unsigned long u_i4 = 604500;
601  int u_n4 = 11;
602  int u_s4 = 300;
603 
604  // Pack the data
605  withBits.addUnsignedLong(u_i1, u_n1, u_s1);
606  withBits.addUnsignedLong(u_i2, u_n2, u_s2);
607  withBits.addUnsignedLong(u_i3, u_n3, u_s3);
608  withBits.trimsize();
609 
610  withSameBits.addUnsignedLong(u_i1, u_n1, u_s1);
611  withSameBits.addUnsignedLong(u_i2, u_n2, u_s2);
612  withSameBits.addUnsignedLong(u_i3, u_n3, u_s3);
613  withSameBits.trimsize();
614 
615  withShortBits.addUnsignedLong(u_i1, u_n1, u_s1);
616  withShortBits.addUnsignedLong(u_i2, u_n2, u_s2);
617  withShortBits.trimsize();
618 
619  withLongBits.addUnsignedLong(u_i1, u_n1, u_s1);
620  withLongBits.addUnsignedLong(u_i2, u_n2, u_s2);
621  withLongBits.addUnsignedLong(u_i3, u_n3, u_s3);
622  withLongBits.addUnsignedLong(u_i4, u_n4, u_s4);
623  withLongBits.trimsize();
624 
625  // Basic "test for complete match"
626  TUASSERTE(bool, true,withBits.matchBits(withSameBits));
627  TUASSERTE(bool,false,withBits.matchBits(withShortBits));
628  TUASSERTE(bool,false,withBits.matchBits(withLongBits));
629 
630  // Test for same bits in area that matches
631  // NOTE: The second argument is the ending BIT NUMBER
632  // NOT the number of bits.
633  TUASSERTE(bool, true,withBits.matchBits( withSameBits,0,23));
634 
635  // It is CORRECT that these two fail. Even though the
636  // bits match, the overall length of the bits sets
637  // does NOT match.
638  TUASSERTE(bool,false,withBits.matchBits(withShortBits,0,23));
639  TUASSERTE(bool,false,withBits.matchBits( withLongBits,0,23));
640 
641  // Same bits as withBits, but in different order.
642  // Therefore, same length, but different contents.
643  // In fact, the first TWO entries are swapped, but
644  // the third entry should be the same bits in the
645  // same location.
646  PackedNavBits diffOrder(satID,obsID,navID,rxID,ct);
647 
648  diffOrder.addUnsignedLong(u_i2, u_n2, u_s2); // 8 bits (0- 7)
649  diffOrder.addUnsignedLong(u_i1, u_n1, u_s1); // 16 bits (8-23)
650  diffOrder.addUnsignedLong(u_i3, u_n3, u_s3);
651  diffOrder.trimsize();
652  TUASSERTE(bool,false,withBits.matchBits(diffOrder));
653  TUASSERTE(bool, true,withBits.matchBits(diffOrder,24,31));
654 
655  // Now build some test cases with both metadata AND bits
656  TUCSM("match");
657  PackedNavBits sameAsWithBits(satID,obsID,navID,rxID,ct);
658  sameAsWithBits.addUnsignedLong(u_i1, u_n1, u_s1);
659  sameAsWithBits.addUnsignedLong(u_i2, u_n2, u_s2);
660  sameAsWithBits.addUnsignedLong(u_i3, u_n3, u_s3);
661  sameAsWithBits.trimsize();
662 
663  PackedNavBits diffMetaWithBits(satID2,obsID2,rxID2,ctPlus);
664  diffMetaWithBits.addUnsignedLong(u_i1, u_n1, u_s1);
665  diffMetaWithBits.addUnsignedLong(u_i2, u_n2, u_s2);
666  diffMetaWithBits.addUnsignedLong(u_i3, u_n3, u_s3);
667  diffMetaWithBits.trimsize();
668 
669  // Same SatID, ObsID, and NavID but different Rx and XmitTime
670  // and with same bits 24-31 but different bits 0-23.
671  PackedNavBits diffMetaWithBits2(satID,obsID,navID,rxID2,ctPlus);
672  diffMetaWithBits2.addUnsignedLong(u_i2, u_n2, u_s2);
673  diffMetaWithBits2.addUnsignedLong(u_i1, u_n1, u_s1);
674  diffMetaWithBits2.addUnsignedLong(u_i3, u_n3, u_s3);
675  diffMetaWithBits2.trimsize();
676 
677  TUASSERTE(bool, true,withBits.match(sameAsWithBits));
678  TUASSERTE(bool, false,withBits.match(diffMetaWithBits));
679  TUASSERTE(bool, false,withBits.match(diffMetaWithBits2));
680  TUASSERTE(bool, false,withBits.match(diffMetaWithBits2,0,-1,checkSATOBS));
681  TUASSERTE(bool, true,withBits.match(diffMetaWithBits2,24,31,checkSATOBS));
682 
683  TUCSM("operator==");
684  TUASSERTE(bool, true,withBits==sameAsWithBits);
685  TUASSERTE(bool, false,withBits==diffMetaWithBits2);
686 
687  TUCSM("operator<");
688  PackedNavBits rightTest(satID,obsID,navID,rxID2,ct);
689  PackedNavBits leftSmall(satID,obsID,navID,rxID2,ct);
690  PackedNavBits leftLarge(satID,obsID,navID,rxID2,ct);
691  PackedNavBits leftEqual(satID,obsID,navID,rxID2,ct);
692  PackedNavBits longer(satID,obsID,navID,rxID2,ct);
693  rightTest.rawBitInput("035 0xFFFFFF0F 0xE0000000");
694  leftEqual.rawBitInput("035 0xFFFFFF0F 0xE0000000");
695  leftSmall.rawBitInput("035 0xFFFFFE0F 0xE0000000");
696  leftLarge.rawBitInput("035 0xFFFFFFFF 0xE0000000");
697 
698  // Ovbserved real-world case that trggered a failure.
699  // Right is greater than left at bit 5, but less than
700  // at bit 6. The greater than was not causing false, so
701  // when the code got to bit 6, it would (incorrectly) return
702  // true.
703  PackedNavBits leftMixed(satID,obsID,navID,rxID2,ct);
704  PackedNavBits rightMixed(satID,obsID,navID,rxID2,ct);
705  leftMixed.rawBitInput( "035 0x03019AA1 0x00000000");
706  rightMixed.rawBitInput("035 0x057E77B8 0x00000000");
707  longer.rawBitInput( "064 0x00000000 0x00000000");
708  TUASSERTE(bool, true, leftSmall<rightTest);
709  TUASSERTE(bool, false, leftEqual<rightTest);
710  TUASSERTE(bool, false, leftLarge<rightTest);
711  TUASSERTE(bool, true, leftSmall<longer);
712  TUASSERTE(bool, false, longer<leftSmall);
713  TUASSERTE(bool, true, leftMixed<rightMixed);
714  TUASSERTE(bool, false, rightMixed<leftMixed);
715 
716  TURETURN();
717 }
718 
719  // These test cases are designed to test the methods
720  // test were added to enable more flexible use of
721  // PackedNavBits in testing:
722  // invert()
723  // copyBits()
724  // insertUnsignedBits()
725  //
726 unsigned PackedNavBits_T::
728 {
729  TUDEF("PackedNavBits", "ancillary methods");
730 
731  // -------------------------------------------------------------
732  // First test the invert() method.
733  // Create a sample PackedNavBits.
734  // At this point, the "packed bits" section of
735  // this object is empty. We are focused on testing
736  // the metadata handling.
737  SatID satID(1, SatelliteSystem::GPS);
738  ObsID obsID( ObservationType::NavMsg, CarrierBand::L2, TrackingCode::L2CML );
739  NavID navID(satID,obsID);
740  std::string rxID = "rx1";
741  CommonTime ct = CivilTime( 2011, 6, 2, 12, 14, 44.0, TimeSystem::GPS );
742  PackedNavBits copyUpright(satID,obsID,navID,rxID,ct);
743 
744  // Next add some bits with a fixed pattern.
745  // Make a copy with a given bit pattern,....
746  unsigned long uword = 0xAAAAAAAA;
747  try
748  {
749  copyUpright.addUnsignedLong(uword,32,1);
750  copyUpright.addUnsignedLong(uword,32,1);
751  }
752  catch (InvalidParameter ip)
753  {
754  cout << "Caught an exception" << endl;
755  cout << ip << endl;
756  }
757  copyUpright.trimsize();
758 
759  // Make copy with the inverse bit pattern
760  PackedNavBits copyInverse(satID,obsID,navID,rxID,ct);
761  unsigned long uwordInverse = (~uword) & 0xFFFFFFFF;
762  try
763  {
764  copyInverse.addUnsignedLong(uwordInverse,32,1);
765  copyInverse.addUnsignedLong(uwordInverse,32,1);
766  }
767  catch (InvalidParameter ip)
768  {
769  cout << "Caught an exception" << endl;
770  cout << ip << endl;
771  }
772  copyInverse.trimsize();
773 
774  // Invert the upright and see that the results
775  // matches expectations
776  copyUpright.invert();
777  TUASSERTE(bool,true,copyUpright.matchBits(copyInverse));
778 
779  // -------------------------------------------------------------
780  // Now test copyBits()
781  // Create a PNB with 64 1's and a PNB with 64 0's
782  PackedNavBits allOnes(satID,obsID,navID,rxID,ct);
783  unsigned long uwordOnes = 0xFFFFFFFF;
784  allOnes.addUnsignedLong(uwordOnes,32,1);
785  allOnes.addUnsignedLong(uwordOnes,32,1);
786  allOnes.trimsize();
787 
788  PackedNavBits allZeros(satID,obsID,navID,rxID,ct);
789  unsigned long uwordZeros = 0x00000000;
790  allZeros.addUnsignedLong(uwordZeros,32,1);
791  allZeros.addUnsignedLong(uwordZeros,32,1);
792  allZeros.trimsize();
793 
794  // Copy first and last 16 bits from allZeros to all ones
795  allOnes.copyBits(allZeros,0,15);
796  allOnes.copyBits(allZeros,48,63);
797 
798  PackedNavBits expected(satID,obsID,navID,rxID,ct);
799  unsigned long uword1 = 0x0000FFFF;
800  unsigned long uword2 = 0xFFFF0000;
801  expected.addUnsignedLong(uword1,32,1);
802  expected.addUnsignedLong(uword2,32,1);
803  expected.trimsize();
804 
805  TUASSERTE(bool,true,expected.matchBits(allOnes));
806 
807  // -------------------------------------------------------------
808  // Now test insertUnsignedLong( )
809  // Create a PNB with 96 0's
810  PackedNavBits insertTest(satID,obsID,navID,rxID,ct);
811  insertTest.addUnsignedLong(uwordZeros,32,1);
812  insertTest.addUnsignedLong(uwordZeros,32,1);
813  insertTest.addUnsignedLong(uwordZeros,32,1);
814  insertTest.trimsize();
815 
816  unsigned long fakeSOW = 604800 - 6;
817  unsigned long tenOnes = 0x000003FF;
818 
819  // Insert an unscaled set of 10 1's into bits 20-29
820  insertTest.insertUnsignedLong(tenOnes,20,10,1);
821 
822  // Insert a 17 bit SOW of 604794 scaled by 6
823  // starting at bit 0
824  insertTest.insertUnsignedLong(fakeSOW,0,17,6);
825 
826  // Build an expected PNB
827  PackedNavBits insertExpected(satID,obsID,navID,rxID,ct);
828  insertExpected.addUnsignedLong(fakeSOW,17,6);
829  insertExpected.addUnsignedLong(uwordZeros,3,1);
830  insertExpected.addUnsignedLong(tenOnes,10,1);
831  insertExpected.addUnsignedLong(uwordZeros,32,1);
832  insertExpected.addUnsignedLong(uwordZeros,32,1);
833  insertExpected.addUnsignedLong(uwordZeros, 2,1);
834  insertExpected.trimsize();
835  TUASSERTE(bool,true,insertExpected.matchBits(insertTest));
836 
837  TURETURN();
838 }
839 
840 
841 unsigned PackedNavBits_T ::
843 {
844  TUDEF("PackedNavBits", "addDataVec");
845  // 33 bits.
846  std::vector<uint8_t> testVec { 0x8b, 0x31, 0x42, 0x59, 0x80 };
847  PackedNavBits uut;
848  uut.addDataVec(testVec, 33);
849  TUASSERTE(size_t, 33, uut.getNumBits());
850  for (unsigned i = 0; i < 33; i+= 8)
851  {
852  if (i+8 >= 33)
853  {
854  // one bit on the end.
855  TUASSERTE(unsigned long, 1, uut.asUnsignedLong(i,1,1));
856  }
857  else
858  {
859  TUASSERTE(unsigned long, testVec[i>>3], uut.asUnsignedLong(i,8,1));
860  }
861  }
862  TURETURN();
863 }
864 
865 
866 int main()
867 {
868  unsigned errorTotal = 0;
869 
870  PackedNavBits_T testClass;
871 
872  errorTotal += testClass.abstractTest();
873  errorTotal += testClass.realDataTest();
874  errorTotal += testClass.equalityTest();
875  errorTotal += testClass.ancillaryMethods();
876  errorTotal += testClass.addDataVecTest();
877 
878  cout << "Total Failures for " << __FILE__ << ": " << errorTotal << endl;
879 
880  return errorTotal; // Return the total number of errors
881 }
882 
883 
TimeSystem.hpp
TUCSM
#define TUCSM(METHOD)
Definition: TestUtil.hpp:59
PackedNavBits_T::PackedNavBits_T
PackedNavBits_T()
Definition: PackedNavBits_T.cpp:73
gnsstk::PackedNavBits::addDataVec
void addDataVec(const std::vector< uint8_t > &data, unsigned numBits)
Definition: PackedNavBits.cpp:740
PackedNavBits_T
Definition: PackedNavBits_T.cpp:56
gnsstk::PackedNavBits::match
bool match(const PackedNavBits &right, const short startBit=0, const short endBit=-1, const unsigned flagBits=mmALL) const
Definition: PackedNavBits.cpp:1079
gnsstk::PackedNavBits::addUnsignedDouble
void addUnsignedDouble(const double value, const int numBits, const int power2)
Definition: PackedNavBits.cpp:648
gnsstk::PackedNavBits::addDoubleSemiCircles
void addDoubleSemiCircles(const double radians, const int numBits, const int power2)
Definition: PackedNavBits.cpp:680
gnsstk::PackedNavBits::asUnsignedDouble
double asUnsignedDouble(const int startBit, const int numBits, const int power2) const
Definition: PackedNavBits.cpp:282
L1
gnsstk::Matrix< double > L1
Definition: Matrix_LUDecomp_T.cpp:46
PackedNavBits_T::eps
double eps
Definition: PackedNavBits_T.cpp:69
gnsstk::PackedNavBits::asUnsignedLong
unsigned long asUnsignedLong(const int startBit, const int numBits, const int scale) const
Definition: PackedNavBits.cpp:265
gnsstk::PackedNavBits::matchMetaData
bool matchMetaData(const PackedNavBits &right, const unsigned flagBits=mmALL) const
Definition: PackedNavBits.cpp:1089
gnsstk::PackedNavBits::invert
void invert()
Definition: PackedNavBits.cpp:841
gnsstk::PackedNavBits::asSignedDouble
double asSignedDouble(const int startBit, const int numBits, const int power2) const
Definition: PackedNavBits.cpp:293
TUASSERTE
#define TUASSERTE(TYPE, EXP, GOT)
Definition: TestUtil.hpp:81
gnsstk::PackedNavBits::asDoubleSemiCircles
double asDoubleSemiCircles(const int startBit, const int numBits, const int power2) const
Definition: PackedNavBits.cpp:304
gnsstk::SatID
Definition: SatID.hpp:89
SatID.hpp
gnsstk::PackedNavBits::rawBitInput
void rawBitInput(const std::string inString)
Definition: PackedNavBits.cpp:1142
gnsstk::PI
const double PI
GPS value of PI; also specified by GAL.
Definition: GNSSconstants.hpp:62
GNSSconstants.hpp
gnsstk::PackedNavBits::addLong
void addLong(const long value, const int numBits, const int scale)
Definition: PackedNavBits.cpp:629
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
PackedNavBits_T::abstractTest
unsigned abstractTest()
Definition: PackedNavBits_T.cpp:88
main
int main()
Definition: PackedNavBits_T.cpp:866
TestUtil.hpp
gnsstk::PackedNavBits::insertUnsignedLong
void insertUnsignedLong(const unsigned long value, const int startBit, const int numBits, const int scale=1)
Definition: PackedNavBits.cpp:889
TURETURN
#define TURETURN()
Definition: TestUtil.hpp:232
gnsstk::PackedNavBits::asLong
long asLong(const int startBit, const int numBits, const int scale) const
Definition: PackedNavBits.cpp:275
gnsstk::PackedNavBits::trimsize
void trimsize()
Definition: PackedNavBits.cpp:938
gnsstk::ObsID
Definition: ObsID.hpp:82
PackedNavBits_T::init
void init()
Definition: PackedNavBits_T.cpp:79
gnsstk::CommonTime
Definition: CommonTime.hpp:84
PackedNavBits_T::equalityTest
unsigned equalityTest()
Definition: PackedNavBits_T.cpp:519
gnsstk::PackedNavBits::matchBits
bool matchBits(const PackedNavBits &right, const short startBit=0, const short endBit=-1) const
Definition: PackedNavBits.cpp:1116
TUASSERTFEPS
#define TUASSERTFEPS(EXP, GOT, EPS)
Definition: TestUtil.hpp:126
CivilTime.hpp
TUDEF
#define TUDEF(CLASS, METHOD)
Definition: TestUtil.hpp:56
gnsstk::PackedNavBits::copyBits
void copyBits(const PackedNavBits &src, const short startBit=0, const short endBit=-1)
Definition: PackedNavBits.cpp:864
PackedNavBits.hpp
gnsstk::CivilTime
Definition: CivilTime.hpp:55
PackedNavBits_T::addDataVecTest
unsigned addDataVecTest()
Definition: PackedNavBits_T.cpp:842
ObsID.hpp
gnsstk::PackedNavBits::addSignedDouble
void addSignedDouble(const double value, const int numBits, const int power2)
Definition: PackedNavBits.cpp:662
CommonTime.hpp
std
Definition: Angle.hpp:142
PackedNavBits_T::realDataTest
unsigned realDataTest()
Definition: PackedNavBits_T.cpp:243
PackedNavBits_T::ancillaryMethods
unsigned ancillaryMethods()
Definition: PackedNavBits_T.cpp:727
gnsstk::PackedNavBits::addUnsignedLong
void addUnsignedLong(const unsigned long value, const int numBits, const int scale)
Definition: PackedNavBits.cpp:613
gnsstk::PackedNavBits
Definition: PackedNavBits.hpp:70
gnsstk::NavID
Definition: NavID.hpp:61
L2
gnsstk::Matrix< double > L2
Definition: Matrix_LUDecomp_T.cpp:46
TimeString.hpp
gnsstk::PackedNavBits::getNumBits
size_t getNumBits() const
Definition: PackedNavBits.cpp:240


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