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