1 //==============================================================================
2 //
3 //  This file is part of GPSTk, the GPS Toolkit.
4 //
5 //  The GPSTk 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 GPSTk 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 GPSTk; 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-2020, 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 "BrcClockCorrection.hpp"
40 #include "TestUtil.hpp"
41 #include "GPSWeekZcount.hpp"
42 
43 using namespace std;
44 using namespace gpstk;
45 
46 #ifdef _MSC_VER
47 #define LDEXP(x,y) ldexp(x,y)
48 #else
49 #define LDEXP(x,y) std::ldexp(x,y)
50 #endif
51 
52 class BrcClockCorrection_T
53 {
54 public:
55       /// set the fields to some non-default values
56    void fill(BrcClockCorrection& orbit);
57    void fill2(BrcClockCorrection& orbit);
58    unsigned initializationTest();
59    unsigned equalityTest();
60    unsigned svClockBiasTest();
61 };
62 
63 
64 void BrcClockCorrection_T ::
fill(BrcClockCorrection & orbit)65 fill(BrcClockCorrection& orbit)
66 {
67    ObsID oi(ObservationType::NavMsg, CarrierBand::L5, TrackingCode::Y);
68    orbit.loadData("GPS", oi, 31, GPSWeekZcount(1886, 398400),
69                   GPSWeekZcount(1887, 0), 5, 7, 9, true,
70                   LDEXP(double( int32_t(0xfffff91d)), -31), // af0
71                   LDEXP(double( int16_t(0xffed)),     -43), // af1
72                   1.0e-15 // af2
73                   );
74 }
75 
76 
77 void BrcClockCorrection_T ::
fill2(BrcClockCorrection & orbit)78 fill2(BrcClockCorrection& orbit)
79 {
80       // By rules of Clock Correction, this must be week of Toc
81    short weeknum   = 1638;
82    short uraoc     = 5;
83    short uraoc1    = 7;
84    short uraoc2    = 7;
85    double toc      = 388800.0;
86    double top      = 302400.0;
87    double af0      = 7.23189674E-04;
88    double af1      = 5.11590770E-12;
89    double af2      = 0.00000000E+00;
90    CommonTime tocCT = GPSWeekSecond(weeknum, toc, TimeSystem::GPS);
91    CommonTime topCT = GPSWeekSecond(weeknum, top, TimeSystem::GPS);
92    ObsID oi(ObservationType::NavMsg, CarrierBand::L5, TrackingCode::Y);
93    orbit.loadData("GPS", oi, 31, tocCT, topCT, uraoc, uraoc1, uraoc2, true,
94                   af0, af1, af2);
95 }
96 
97 
98 unsigned BrcClockCorrection_T ::
initializationTest()99 initializationTest()
100 {
101    BrcClockCorrection empty;
102    CommonTime emptyTime;
103    ObsID emptyObsID;
104    TUDEF("BrcClockCorrection", "Default Constructor");
105    TUASSERTE(bool, false, empty.dataLoaded);
106    TUASSERTE(std::string, "", empty.satSys);
107    TUASSERTE(ObsID, emptyObsID, empty.obsID);
108    TUASSERTE(short, 0, empty.PRNID);
109    TUASSERTE(CommonTime, emptyTime, empty.Toc);
110    TUASSERTE(CommonTime, emptyTime, empty.Top);
111    TUASSERTE(short, -16, empty.URAoc);
112    TUASSERTE(short, 0, empty.URAoc1);
113    TUASSERTE(short, 0, empty.URAoc2);
114    TUASSERTE(bool, false, empty.healthy);
115    TUASSERTE(double, 0, empty.af0);
116    TUASSERTE(double, 0, empty.af1);
117    TUASSERTE(double, 0, empty.af2);
118    TURETURN();
119 }
120 
121 
122 unsigned BrcClockCorrection_T ::
equalityTest()123 equalityTest()
124 {
125    TUDEF("BrcClockCorrection", "operator== / !=");
126    BrcClockCorrection clock;
127    fill(clock);
128    BrcClockCorrection clockCopy(clock);
129       // make sure our copy reports as being the same
130    TUASSERTE(BrcClockCorrection, clock, clockCopy);
131       // Tweak each data member one by one and compare.
132       // Yes the comments are fairly redundant but it helps to
133       // visually separate each batch of statements per data
134       // member.
135    clockCopy.dataLoaded = false;
136    TUASSERT(clockCopy != clock);
137    TUASSERT(!(clockCopy == clock));
138       // satSys
139    TUCATCH(clockCopy = clock);
140    TUASSERTE(BrcClockCorrection, clock, clockCopy);
141    clockCopy.satSys = "twaffle";
142    TUASSERT(clockCopy != clock);
143    TUASSERT(!(clockCopy == clock));
144       // obsID
145    TUCATCH(clockCopy = clock);
146    TUASSERTE(BrcClockCorrection, clock, clockCopy);
147    clockCopy.obsID = ObsID(ObservationType::NavMsg, CarrierBand::L1, TrackingCode::P);
148    TUASSERT(clockCopy != clock);
149    TUASSERT(!(clockCopy == clock));
150       // PRNID
151    TUCATCH(clockCopy = clock);
152    TUASSERTE(BrcClockCorrection, clock, clockCopy);
153    clockCopy.PRNID = 93;
154    TUASSERT(clockCopy != clock);
155    TUASSERT(!(clockCopy == clock));
156       // Toc
157    TUCATCH(clockCopy = clock);
158    TUASSERTE(BrcClockCorrection, clock, clockCopy);
159    clockCopy.Toc = GPSWeekZcount(1234,56789);
160    TUASSERT(clockCopy != clock);
161    TUASSERT(!(clockCopy == clock));
162       // Top
163    TUCATCH(clockCopy = clock);
164    TUASSERTE(BrcClockCorrection, clock, clockCopy);
165    clockCopy.Top = GPSWeekZcount(1234,56789);
166    TUASSERT(clockCopy != clock);
167    TUASSERT(!(clockCopy == clock));
168       // URAoc
169    TUCATCH(clockCopy = clock);
170    TUASSERTE(BrcClockCorrection, clock, clockCopy);
171    clockCopy.URAoc = 943;
172    TUASSERT(clockCopy != clock);
173    TUASSERT(!(clockCopy == clock));
174       // URAoc1
175    TUCATCH(clockCopy = clock);
176    TUASSERTE(BrcClockCorrection, clock, clockCopy);
177    clockCopy.URAoc1 = 943;
178    TUASSERT(clockCopy != clock);
179    TUASSERT(!(clockCopy == clock));
180       // URAoc2
181    TUCATCH(clockCopy = clock);
182    TUASSERTE(BrcClockCorrection, clock, clockCopy);
183    clockCopy.URAoc2 = 943;
184    TUASSERT(clockCopy != clock);
185    TUASSERT(!(clockCopy == clock));
186       // healthy
187    TUCATCH(clockCopy = clock);
188    TUASSERTE(BrcClockCorrection, clock, clockCopy);
189    clockCopy.healthy = false;
190    TUASSERT(clockCopy != clock);
191    TUASSERT(!(clockCopy == clock));
192       // af0
193    TUCATCH(clockCopy = clock);
194    TUASSERTE(BrcClockCorrection, clock, clockCopy);
195    clockCopy.af0 = 1.5e-12;
196    TUASSERT(clockCopy != clock);
197    TUASSERT(!(clockCopy == clock));
198       // af1
199    TUCATCH(clockCopy = clock);
200    TUASSERTE(BrcClockCorrection, clock, clockCopy);
201    clockCopy.af1 = 1.5e-12;
202    TUASSERT(clockCopy != clock);
203    TUASSERT(!(clockCopy == clock));
204       // af2
205    TUCATCH(clockCopy = clock);
206    TUASSERTE(BrcClockCorrection, clock, clockCopy);
207    clockCopy.af2 = 1.5e-12;
208    TUASSERT(clockCopy != clock);
209    TUASSERT(!(clockCopy == clock));
210    TURETURN();
211 }
212 
213 
214 unsigned BrcClockCorrection_T ::
svClockBiasTest()215 svClockBiasTest()
216 {
217    TUDEF("BrcClockCorrection", "svClockBias");
218    BrcClockCorrection co1;
219    CommonTime t = CivilTime(2011, 6, 2, 12, 14, 44.0, TimeSystem::GPS);
220    fill2(co1);
221    cout << setprecision(20)
222         << co1.svClockDrift(t)
223         << endl;
224    TUASSERTFE(7.2319419646240680997e-4, co1.svClockBias(t));
225    TUCSM("svClockBiasM");
226    TUASSERTFE(216808.16576879983768, co1.svClockBiasM(t));
227    TUCSM("svClockDrift");
228    TUASSERTFE(5.1159076999999996399e-12, co1.svClockDrift(t));
229    TURETURN();
230 }
231 
232 
main()233 int main() //Main function to initialize and run all tests above
234 {
235    using namespace std;
236    BrcClockCorrection_T testClass;
237    unsigned errorTotal = 0;
238 
239    errorTotal += testClass.initializationTest();
240    errorTotal += testClass.equalityTest();
241    errorTotal += testClass.svClockBiasTest();
242 
243    cout << "Total Failures for " << __FILE__ << ": " << errorTotal << endl;
244 
245    return errorTotal; // Return the total number of errors
246 }
247