blob: 50cb4edb19aadcff6e20d0774a6751621ba599b2 [file] [log] [blame]
Katz Yamada592b3f52017-03-14 11:13:23 -07001/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation, nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29#define LOG_TAG "LocSvc_SystemStatus"
30
Baili Feng4c9c7832017-07-03 21:00:31 +080031#include <inttypes.h>
Katz Yamada592b3f52017-03-14 11:13:23 -070032#include <string>
33#include <stdlib.h>
34#include <string.h>
35#include <sys/time.h>
36#include <pthread.h>
37#include <platform_lib_log_util.h>
Kevin Tang8b98a562017-03-24 17:39:20 -070038#include <loc_nmea.h>
Katz Yamada592b3f52017-03-14 11:13:23 -070039#include <SystemStatus.h>
40
41namespace loc_core
42{
43
44/******************************************************************************
45 SystemStatusNmeaBase - base class for all NMEA parsers
46******************************************************************************/
47class SystemStatusNmeaBase
48{
49protected:
50 std::vector<std::string> mField;
Katz Yamada592b3f52017-03-14 11:13:23 -070051
Katz Yamada592b3f52017-03-14 11:13:23 -070052 SystemStatusNmeaBase(const char *str_in, uint32_t len_in)
53 {
54 // check size and talker
Kevin Tang8b98a562017-03-24 17:39:20 -070055 if (!loc_nmea_is_debug(str_in, len_in)) {
Katz Yamada592b3f52017-03-14 11:13:23 -070056 return;
57 }
58
59 std::string parser(str_in);
60 std::string::size_type index = 0;
61
62 // verify checksum field
63 index = parser.find("*");
64 if (index == std::string::npos) {
65 return;
66 }
67 parser[index] = ',';
68
69 // tokenize parser
70 while (1) {
71 std::string str;
72 index = parser.find(",");
73 if (index == std::string::npos) {
74 break;
75 }
76 str = parser.substr(0, index);
77 parser = parser.substr(index + 1);
78 mField.push_back(str);
79 }
80 }
81
82 virtual ~SystemStatusNmeaBase() { }
Kevin Tang8b98a562017-03-24 17:39:20 -070083
84public:
85 static const uint32_t NMEA_MINSIZE = DEBUG_NMEA_MINSIZE;
86 static const uint32_t NMEA_MAXSIZE = DEBUG_NMEA_MAXSIZE;
Katz Yamada592b3f52017-03-14 11:13:23 -070087};
88
Katz Yamada592b3f52017-03-14 11:13:23 -070089/******************************************************************************
90 SystemStatusPQWM1
91******************************************************************************/
92class SystemStatusPQWM1
93{
94public:
Katz Yamada592b3f52017-03-14 11:13:23 -070095 uint16_t mGpsWeek; // x1
96 uint32_t mGpsTowMs; // x2
97 uint8_t mTimeValid; // x3
98 uint8_t mTimeSource; // x4
99 int32_t mTimeUnc; // x5
100 int32_t mClockFreqBias; // x6
101 int32_t mClockFreqBiasUnc; // x7
102 uint8_t mXoState; // x8
103 int32_t mPgaGain; // x9
104 uint32_t mGpsBpAmpI; // xA
105 uint32_t mGpsBpAmpQ; // xB
106 uint32_t mAdcI; // xC
107 uint32_t mAdcQ; // xD
108 uint32_t mJammerGps; // xE
109 uint32_t mJammerGlo; // xF
110 uint32_t mJammerBds; // x10
111 uint32_t mJammerGal; // x11
112 uint32_t mRecErrorRecovery; // x12
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700113 double mAgcGps; // x13
114 double mAgcGlo; // x14
115 double mAgcBds; // x15
116 double mAgcGal; // x16
Katz Yamada3eef3d72017-04-27 13:46:09 -0700117 int32_t mLeapSeconds;// x17
118 int32_t mLeapSecUnc; // x18
Katz Yamada592b3f52017-03-14 11:13:23 -0700119};
120
121// parser
122class SystemStatusPQWM1parser : public SystemStatusNmeaBase
123{
124private:
125 enum
126 {
127 eTalker = 0,
128 eGpsWeek = 1,
129 eGpsTowMs = 2,
130 eTimeValid = 3,
131 eTimeSource = 4,
132 eTimeUnc = 5,
133 eClockFreqBias = 6,
134 eClockFreqBiasUnc = 7,
135 eXoState = 8,
136 ePgaGain = 9,
137 eGpsBpAmpI = 10,
138 eGpsBpAmpQ = 11,
139 eAdcI = 12,
140 eAdcQ = 13,
141 eJammerGps = 14,
142 eJammerGlo = 15,
143 eJammerBds = 16,
144 eJammerGal = 17,
145 eRecErrorRecovery = 18,
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700146 eAgcGps = 19,
147 eAgcGlo = 20,
148 eAgcBds = 21,
149 eAgcGal = 22,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700150 eLeapSeconds = 23,
151 eLeapSecUnc = 24,
152 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700153 };
154 SystemStatusPQWM1 mM1;
155
156public:
157 inline uint16_t getGpsWeek() { return mM1.mGpsWeek; }
158 inline uint32_t getGpsTowMs() { return mM1.mGpsTowMs; }
159 inline uint8_t getTimeValid() { return mM1.mTimeValid; }
160 inline uint8_t getTimeSource() { return mM1.mTimeSource; }
161 inline int32_t getTimeUnc() { return mM1.mTimeUnc; }
162 inline int32_t getClockFreqBias() { return mM1.mClockFreqBias; }
163 inline int32_t getClockFreqBiasUnc() { return mM1.mClockFreqBiasUnc; }
164 inline uint8_t getXoState() { return mM1.mXoState;}
165 inline int32_t getPgaGain() { return mM1.mPgaGain; }
166 inline uint32_t getGpsBpAmpI() { return mM1.mGpsBpAmpI; }
167 inline uint32_t getGpsBpAmpQ() { return mM1.mGpsBpAmpQ; }
168 inline uint32_t getAdcI() { return mM1.mAdcI; }
169 inline uint32_t getAdcQ() { return mM1.mAdcQ; }
170 inline uint32_t getJammerGps() { return mM1.mJammerGps; }
171 inline uint32_t getJammerGlo() { return mM1.mJammerGlo; }
172 inline uint32_t getJammerBds() { return mM1.mJammerBds; }
173 inline uint32_t getJammerGal() { return mM1.mJammerGal; }
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700174 inline uint32_t getAgcGps() { return mM1.mAgcGps; }
175 inline uint32_t getAgcGlo() { return mM1.mAgcGlo; }
176 inline uint32_t getAgcBds() { return mM1.mAgcBds; }
177 inline uint32_t getAgcGal() { return mM1.mAgcGal; }
Katz Yamada592b3f52017-03-14 11:13:23 -0700178 inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; }
Katz Yamada3eef3d72017-04-27 13:46:09 -0700179 inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; }
180 inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; }
Katz Yamada592b3f52017-03-14 11:13:23 -0700181
182 SystemStatusPQWM1parser(const char *str_in, uint32_t len_in)
183 : SystemStatusNmeaBase(str_in, len_in)
184 {
Katz Yamadae3d70312017-05-18 11:00:17 -0700185 memset(&mM1, 0, sizeof(mM1));
Katz Yamada592b3f52017-03-14 11:13:23 -0700186 if (mField.size() < eMax) {
Baili Feng4c9c7832017-07-03 21:00:31 +0800187 LOC_LOGE("PQWM1parser - invalid size=%zu", mField.size());
Katz Yamadae3d70312017-05-18 11:00:17 -0700188 mM1.mTimeValid = 0;
Katz Yamada592b3f52017-03-14 11:13:23 -0700189 return;
190 }
Katz Yamada592b3f52017-03-14 11:13:23 -0700191 mM1.mGpsWeek = atoi(mField[eGpsWeek].c_str());
192 mM1.mGpsTowMs = atoi(mField[eGpsTowMs].c_str());
193 mM1.mTimeValid = atoi(mField[eTimeValid].c_str());
194 mM1.mTimeSource = atoi(mField[eTimeSource].c_str());
195 mM1.mTimeUnc = atoi(mField[eTimeUnc].c_str());
196 mM1.mClockFreqBias = atoi(mField[eClockFreqBias].c_str());
197 mM1.mClockFreqBiasUnc = atoi(mField[eClockFreqBiasUnc].c_str());
198 mM1.mXoState = atoi(mField[eXoState].c_str());
199 mM1.mPgaGain = atoi(mField[ePgaGain].c_str());
200 mM1.mGpsBpAmpI = atoi(mField[eGpsBpAmpI].c_str());
201 mM1.mGpsBpAmpQ = atoi(mField[eGpsBpAmpQ].c_str());
202 mM1.mAdcI = atoi(mField[eAdcI].c_str());
203 mM1.mAdcQ = atoi(mField[eAdcQ].c_str());
204 mM1.mJammerGps = atoi(mField[eJammerGps].c_str());
205 mM1.mJammerGlo = atoi(mField[eJammerGlo].c_str());
206 mM1.mJammerBds = atoi(mField[eJammerBds].c_str());
207 mM1.mJammerGal = atoi(mField[eJammerGal].c_str());
208 mM1.mRecErrorRecovery = atoi(mField[eRecErrorRecovery].c_str());
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700209 mM1.mAgcGps = atof(mField[eAgcGps].c_str());
210 mM1.mAgcGlo = atof(mField[eAgcGlo].c_str());
211 mM1.mAgcBds = atof(mField[eAgcBds].c_str());
212 mM1.mAgcGal = atof(mField[eAgcGal].c_str());
Katz Yamada3eef3d72017-04-27 13:46:09 -0700213 mM1.mLeapSeconds = atoi(mField[eLeapSeconds].c_str());
214 mM1.mLeapSecUnc = atoi(mField[eLeapSecUnc].c_str());
Katz Yamada592b3f52017-03-14 11:13:23 -0700215 }
216
217 inline SystemStatusPQWM1& get() { return mM1;} //getparser
218};
219
220/******************************************************************************
221 SystemStatusPQWP1
222******************************************************************************/
223class SystemStatusPQWP1
224{
225public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700226 uint8_t mEpiValidity; // x4
227 float mEpiLat; // x5
228 float mEpiLon; // x6
229 float mEpiAlt; // x7
230 float mEpiHepe; // x8
231 float mEpiAltUnc; // x9
232 uint8_t mEpiSrc; // x10
233};
234
235class SystemStatusPQWP1parser : public SystemStatusNmeaBase
236{
237private:
238 enum
239 {
240 eTalker = 0,
241 eUtcTime = 1,
242 eEpiValidity = 2,
243 eEpiLat = 3,
244 eEpiLon = 4,
245 eEpiAlt = 5,
246 eEpiHepe = 6,
247 eEpiAltUnc = 7,
248 eEpiSrc = 8,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700249 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700250 };
251 SystemStatusPQWP1 mP1;
252
253public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700254 inline uint8_t getEpiValidity() { return mP1.mEpiValidity; }
255 inline float getEpiLat() { return mP1.mEpiLat; }
256 inline float getEpiLon() { return mP1.mEpiLon; }
257 inline float getEpiAlt() { return mP1.mEpiAlt; }
258 inline float getEpiHepe() { return mP1.mEpiHepe; }
259 inline float getEpiAltUnc() { return mP1.mEpiAltUnc; }
260 inline uint8_t getEpiSrc() { return mP1.mEpiSrc; }
261
262 SystemStatusPQWP1parser(const char *str_in, uint32_t len_in)
263 : SystemStatusNmeaBase(str_in, len_in)
264 {
265 if (mField.size() < eMax) {
266 return;
267 }
268 memset(&mP1, 0, sizeof(mP1));
Katz Yamada592b3f52017-03-14 11:13:23 -0700269 mP1.mEpiValidity = strtol(mField[eEpiValidity].c_str(), NULL, 16);
270 mP1.mEpiLat = atof(mField[eEpiLat].c_str());
271 mP1.mEpiLon = atof(mField[eEpiLon].c_str());
272 mP1.mEpiAlt = atof(mField[eEpiAlt].c_str());
273 mP1.mEpiHepe = atoi(mField[eEpiHepe].c_str());
274 mP1.mEpiAltUnc = atof(mField[eEpiAltUnc].c_str());
275 mP1.mEpiSrc = atoi(mField[eEpiSrc].c_str());
276 }
277
278 inline SystemStatusPQWP1& get() { return mP1;}
279};
280
281/******************************************************************************
282 SystemStatusPQWP2
283******************************************************************************/
284class SystemStatusPQWP2
285{
286public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700287 float mBestLat; // x4
288 float mBestLon; // x5
289 float mBestAlt; // x6
290 float mBestHepe; // x7
291 float mBestAltUnc; // x8
292};
293
294class SystemStatusPQWP2parser : public SystemStatusNmeaBase
295{
296private:
297 enum
298 {
299 eTalker = 0,
300 eUtcTime = 1,
301 eBestLat = 2,
302 eBestLon = 3,
303 eBestAlt = 4,
304 eBestHepe = 5,
305 eBestAltUnc = 6,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700306 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700307 };
308 SystemStatusPQWP2 mP2;
309
310public:
311 inline float getBestLat() { return mP2.mBestLat; }
312 inline float getBestLon() { return mP2.mBestLon; }
313 inline float getBestAlt() { return mP2.mBestAlt; }
314 inline float getBestHepe() { return mP2.mBestHepe; }
315 inline float getBestAltUnc() { return mP2.mBestAltUnc; }
316
317 SystemStatusPQWP2parser(const char *str_in, uint32_t len_in)
318 : SystemStatusNmeaBase(str_in, len_in)
319 {
320 if (mField.size() < eMax) {
321 return;
322 }
323 memset(&mP2, 0, sizeof(mP2));
Katz Yamada592b3f52017-03-14 11:13:23 -0700324 mP2.mBestLat = atof(mField[eBestLat].c_str());
325 mP2.mBestLon = atof(mField[eBestLon].c_str());
326 mP2.mBestAlt = atof(mField[eBestAlt].c_str());
327 mP2.mBestHepe = atof(mField[eBestHepe].c_str());
328 mP2.mBestAltUnc = atof(mField[eBestAltUnc].c_str());
329 }
330
331 inline SystemStatusPQWP2& get() { return mP2;}
332};
333
334/******************************************************************************
335 SystemStatusPQWP3
336******************************************************************************/
337class SystemStatusPQWP3
338{
339public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700340 uint8_t mXtraValidMask;
341 uint32_t mGpsXtraAge;
342 uint32_t mGloXtraAge;
343 uint32_t mBdsXtraAge;
344 uint32_t mGalXtraAge;
345 uint32_t mQzssXtraAge;
346 uint32_t mGpsXtraValid;
347 uint32_t mGloXtraValid;
348 uint64_t mBdsXtraValid;
349 uint64_t mGalXtraValid;
350 uint8_t mQzssXtraValid;
351};
352
353class SystemStatusPQWP3parser : public SystemStatusNmeaBase
354{
355private:
356 enum
357 {
358 eTalker = 0,
359 eUtcTime = 1,
360 eXtraValidMask = 2,
361 eGpsXtraAge = 3,
362 eGloXtraAge = 4,
363 eBdsXtraAge = 5,
364 eGalXtraAge = 6,
365 eQzssXtraAge = 7,
366 eGpsXtraValid = 8,
367 eGloXtraValid = 9,
368 eBdsXtraValid = 10,
369 eGalXtraValid = 11,
370 eQzssXtraValid = 12,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700371 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700372 };
373 SystemStatusPQWP3 mP3;
374
375public:
376 inline uint8_t getXtraValid() { return mP3.mXtraValidMask; }
377 inline uint32_t getGpsXtraAge() { return mP3.mGpsXtraAge; }
378 inline uint32_t getGloXtraAge() { return mP3.mGloXtraAge; }
379 inline uint32_t getBdsXtraAge() { return mP3.mBdsXtraAge; }
380 inline uint32_t getGalXtraAge() { return mP3.mGalXtraAge; }
381 inline uint32_t getQzssXtraAge() { return mP3.mQzssXtraAge; }
382 inline uint32_t getGpsXtraValid() { return mP3.mGpsXtraValid; }
383 inline uint32_t getGloXtraValid() { return mP3.mGloXtraValid; }
384 inline uint64_t getBdsXtraValid() { return mP3.mBdsXtraValid; }
385 inline uint64_t getGalXtraValid() { return mP3.mGalXtraValid; }
386 inline uint8_t getQzssXtraValid() { return mP3.mQzssXtraValid; }
387
388 SystemStatusPQWP3parser(const char *str_in, uint32_t len_in)
389 : SystemStatusNmeaBase(str_in, len_in)
390 {
391 if (mField.size() < eMax) {
392 return;
393 }
394 memset(&mP3, 0, sizeof(mP3));
Katz Yamada592b3f52017-03-14 11:13:23 -0700395 mP3.mXtraValidMask = strtol(mField[eXtraValidMask].c_str(), NULL, 16);
396 mP3.mGpsXtraAge = atoi(mField[eGpsXtraAge].c_str());
397 mP3.mGloXtraAge = atoi(mField[eGloXtraAge].c_str());
398 mP3.mBdsXtraAge = atoi(mField[eBdsXtraAge].c_str());
399 mP3.mGalXtraAge = atoi(mField[eGalXtraAge].c_str());
400 mP3.mQzssXtraAge = atoi(mField[eQzssXtraAge].c_str());
401 mP3.mGpsXtraValid = strtol(mField[eGpsXtraValid].c_str(), NULL, 16);
402 mP3.mGloXtraValid = strtol(mField[eGloXtraValid].c_str(), NULL, 16);
403 mP3.mBdsXtraValid = strtol(mField[eBdsXtraValid].c_str(), NULL, 16);
404 mP3.mGalXtraValid = strtol(mField[eGalXtraValid].c_str(), NULL, 16);
405 mP3.mQzssXtraValid = strtol(mField[eQzssXtraValid].c_str(), NULL, 16);
406 }
407
408 inline SystemStatusPQWP3& get() { return mP3;}
409};
410
411/******************************************************************************
412 SystemStatusPQWP4
413******************************************************************************/
414class SystemStatusPQWP4
415{
416public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700417 uint32_t mGpsEpheValid;
418 uint32_t mGloEpheValid;
419 uint64_t mBdsEpheValid;
420 uint64_t mGalEpheValid;
421 uint8_t mQzssEpheValid;
422};
423
424class SystemStatusPQWP4parser : public SystemStatusNmeaBase
425{
426private:
427 enum
428 {
429 eTalker = 0,
430 eUtcTime = 1,
431 eGpsEpheValid = 2,
432 eGloEpheValid = 3,
433 eBdsEpheValid = 4,
434 eGalEpheValid = 5,
435 eQzssEpheValid = 6,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700436 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700437 };
438 SystemStatusPQWP4 mP4;
439
440public:
441 inline uint32_t getGpsEpheValid() { return mP4.mGpsEpheValid; }
442 inline uint32_t getGloEpheValid() { return mP4.mGloEpheValid; }
443 inline uint64_t getBdsEpheValid() { return mP4.mBdsEpheValid; }
444 inline uint64_t getGalEpheValid() { return mP4.mGalEpheValid; }
445 inline uint8_t getQzssEpheValid() { return mP4.mQzssEpheValid; }
446
447 SystemStatusPQWP4parser(const char *str_in, uint32_t len_in)
448 : SystemStatusNmeaBase(str_in, len_in)
449 {
450 if (mField.size() < eMax) {
451 return;
452 }
453 memset(&mP4, 0, sizeof(mP4));
Katz Yamada592b3f52017-03-14 11:13:23 -0700454 mP4.mGpsEpheValid = strtol(mField[eGpsEpheValid].c_str(), NULL, 16);
455 mP4.mGloEpheValid = strtol(mField[eGloEpheValid].c_str(), NULL, 16);
456 mP4.mBdsEpheValid = strtol(mField[eBdsEpheValid].c_str(), NULL, 16);
457 mP4.mGalEpheValid = strtol(mField[eGalEpheValid].c_str(), NULL, 16);
458 mP4.mQzssEpheValid = strtol(mField[eQzssEpheValid].c_str(), NULL, 16);
459 }
460
461 inline SystemStatusPQWP4& get() { return mP4;}
462};
463
464/******************************************************************************
465 SystemStatusPQWP5
466******************************************************************************/
467class SystemStatusPQWP5
468{
469public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700470 uint32_t mGpsUnknownMask;
471 uint32_t mGloUnknownMask;
472 uint64_t mBdsUnknownMask;
473 uint64_t mGalUnknownMask;
474 uint8_t mQzssUnknownMask;
475 uint32_t mGpsGoodMask;
476 uint32_t mGloGoodMask;
477 uint64_t mBdsGoodMask;
478 uint64_t mGalGoodMask;
479 uint8_t mQzssGoodMask;
480 uint32_t mGpsBadMask;
481 uint32_t mGloBadMask;
482 uint64_t mBdsBadMask;
483 uint64_t mGalBadMask;
484 uint8_t mQzssBadMask;
485};
486
487class SystemStatusPQWP5parser : public SystemStatusNmeaBase
488{
489private:
490 enum
491 {
492 eTalker = 0,
493 eUtcTime = 1,
494 eGpsUnknownMask = 2,
495 eGloUnknownMask = 3,
496 eBdsUnknownMask = 4,
497 eGalUnknownMask = 5,
498 eQzssUnknownMask = 6,
499 eGpsGoodMask = 7,
500 eGloGoodMask = 8,
501 eBdsGoodMask = 9,
502 eGalGoodMask = 10,
503 eQzssGoodMask = 11,
504 eGpsBadMask = 12,
505 eGloBadMask = 13,
506 eBdsBadMask = 14,
507 eGalBadMask = 15,
508 eQzssBadMask = 16,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700509 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700510 };
511 SystemStatusPQWP5 mP5;
512
513public:
514 inline uint32_t getGpsUnknownMask() { return mP5.mGpsUnknownMask; }
515 inline uint32_t getGloUnknownMask() { return mP5.mGloUnknownMask; }
516 inline uint64_t getBdsUnknownMask() { return mP5.mBdsUnknownMask; }
517 inline uint64_t getGalUnknownMask() { return mP5.mGalUnknownMask; }
518 inline uint8_t getQzssUnknownMask() { return mP5.mQzssUnknownMask; }
519 inline uint32_t getGpsGoodMask() { return mP5.mGpsGoodMask; }
520 inline uint32_t getGloGoodMask() { return mP5.mGloGoodMask; }
521 inline uint64_t getBdsGoodMask() { return mP5.mBdsGoodMask; }
522 inline uint64_t getGalGoodMask() { return mP5.mGalGoodMask; }
523 inline uint8_t getQzssGoodMask() { return mP5.mQzssGoodMask; }
524 inline uint32_t getGpsBadMask() { return mP5.mGpsBadMask; }
525 inline uint32_t getGloBadMask() { return mP5.mGloBadMask; }
526 inline uint64_t getBdsBadMask() { return mP5.mBdsBadMask; }
527 inline uint64_t getGalBadMask() { return mP5.mGalBadMask; }
528 inline uint8_t getQzssBadMask() { return mP5.mQzssBadMask; }
529
530 SystemStatusPQWP5parser(const char *str_in, uint32_t len_in)
531 : SystemStatusNmeaBase(str_in, len_in)
532 {
533 if (mField.size() < eMax) {
534 return;
535 }
536 memset(&mP5, 0, sizeof(mP5));
Katz Yamada592b3f52017-03-14 11:13:23 -0700537 mP5.mGpsUnknownMask = strtol(mField[eGpsUnknownMask].c_str(), NULL, 16);
538 mP5.mGloUnknownMask = strtol(mField[eGloUnknownMask].c_str(), NULL, 16);
539 mP5.mBdsUnknownMask = strtol(mField[eBdsUnknownMask].c_str(), NULL, 16);
540 mP5.mGalUnknownMask = strtol(mField[eGalUnknownMask].c_str(), NULL, 16);
541 mP5.mQzssUnknownMask = strtol(mField[eQzssUnknownMask].c_str(), NULL, 16);
542 mP5.mGpsGoodMask = strtol(mField[eGpsGoodMask].c_str(), NULL, 16);
543 mP5.mGloGoodMask = strtol(mField[eGloGoodMask].c_str(), NULL, 16);
544 mP5.mBdsGoodMask = strtol(mField[eBdsGoodMask].c_str(), NULL, 16);
545 mP5.mGalGoodMask = strtol(mField[eGalGoodMask].c_str(), NULL, 16);
546 mP5.mQzssGoodMask = strtol(mField[eQzssGoodMask].c_str(), NULL, 16);
547 mP5.mGpsBadMask = strtol(mField[eGpsBadMask].c_str(), NULL, 16);
548 mP5.mGloBadMask = strtol(mField[eGloBadMask].c_str(), NULL, 16);
549 mP5.mBdsBadMask = strtol(mField[eBdsBadMask].c_str(), NULL, 16);
550 mP5.mGalBadMask = strtol(mField[eGalBadMask].c_str(), NULL, 16);
551 mP5.mQzssBadMask = strtol(mField[eQzssBadMask].c_str(), NULL, 16);
552 }
553
554 inline SystemStatusPQWP5& get() { return mP5;}
555};
556
557/******************************************************************************
558 SystemStatusPQWP6parser
559******************************************************************************/
560class SystemStatusPQWP6
561{
562public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700563 uint32_t mFixInfoMask;
564};
565
566class SystemStatusPQWP6parser : public SystemStatusNmeaBase
567{
568private:
569 enum
570 {
571 eTalker = 0,
572 eUtcTime = 1,
573 eFixInfoMask = 2,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700574 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700575 };
576 SystemStatusPQWP6 mP6;
577
578public:
579 inline uint32_t getFixInfoMask() { return mP6.mFixInfoMask; }
580
581 SystemStatusPQWP6parser(const char *str_in, uint32_t len_in)
582 : SystemStatusNmeaBase(str_in, len_in)
583 {
584 if (mField.size() < eMax) {
585 return;
586 }
587 memset(&mP6, 0, sizeof(mP6));
Katz Yamada592b3f52017-03-14 11:13:23 -0700588 mP6.mFixInfoMask = strtol(mField[eFixInfoMask].c_str(), NULL, 16);
589 }
590
591 inline SystemStatusPQWP6& get() { return mP6;}
592};
593
594/******************************************************************************
Katz Yamada3eef3d72017-04-27 13:46:09 -0700595 SystemStatusPQWP7parser
596******************************************************************************/
597class SystemStatusPQWP7
598{
599public:
600 SystemStatusNav mNav[SV_ALL_NUM];
601};
602
603class SystemStatusPQWP7parser : public SystemStatusNmeaBase
604{
605private:
606 enum
607 {
608 eTalker = 0,
609 eUtcTime = 1,
610 eMax = 2 + SV_ALL_NUM*3
611 };
612 SystemStatusPQWP7 mP7;
613
614public:
615 SystemStatusPQWP7parser(const char *str_in, uint32_t len_in)
616 : SystemStatusNmeaBase(str_in, len_in)
617 {
618 if (mField.size() < eMax) {
Baili Feng4c9c7832017-07-03 21:00:31 +0800619 LOC_LOGE("PQWP7parser - invalid size=%zu", mField.size());
Katz Yamada3eef3d72017-04-27 13:46:09 -0700620 return;
621 }
622 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
623 mP7.mNav[i].mType = GnssEphemerisType(atoi(mField[i*3+2].c_str()));
624 mP7.mNav[i].mSource = GnssEphemerisSource(atoi(mField[i*3+3].c_str()));
625 mP7.mNav[i].mAgeSec = atoi(mField[i*3+4].c_str());
626 }
627 }
628
629 inline SystemStatusPQWP7& get() { return mP7;}
630};
631
632/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -0700633 SystemStatusPQWS1parser
634******************************************************************************/
635class SystemStatusPQWS1
636{
637public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700638 uint32_t mFixInfoMask;
639 uint32_t mHepeLimit;
640};
641
642class SystemStatusPQWS1parser : public SystemStatusNmeaBase
643{
644private:
645 enum
646 {
647 eTalker = 0,
648 eUtcTime = 1,
649 eFixInfoMask = 2,
650 eHepeLimit = 3,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700651 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700652 };
653 SystemStatusPQWS1 mS1;
654
655public:
656 inline uint16_t getFixInfoMask() { return mS1.mFixInfoMask; }
657 inline uint32_t getHepeLimit() { return mS1.mHepeLimit; }
658
659 SystemStatusPQWS1parser(const char *str_in, uint32_t len_in)
660 : SystemStatusNmeaBase(str_in, len_in)
661 {
662 if (mField.size() < eMax) {
663 return;
664 }
665 memset(&mS1, 0, sizeof(mS1));
Katz Yamada592b3f52017-03-14 11:13:23 -0700666 mS1.mFixInfoMask = atoi(mField[eFixInfoMask].c_str());
667 mS1.mHepeLimit = atoi(mField[eHepeLimit].c_str());
668 }
669
670 inline SystemStatusPQWS1& get() { return mS1;}
671};
672
673/******************************************************************************
674 SystemStatusTimeAndClock
675******************************************************************************/
676SystemStatusTimeAndClock::SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700677 mGpsWeek(nmea.mGpsWeek),
678 mGpsTowMs(nmea.mGpsTowMs),
679 mTimeValid(nmea.mTimeValid),
680 mTimeSource(nmea.mTimeSource),
681 mTimeUnc(nmea.mTimeUnc),
682 mClockFreqBias(nmea.mClockFreqBias),
Katz Yamada3eef3d72017-04-27 13:46:09 -0700683 mClockFreqBiasUnc(nmea.mClockFreqBiasUnc),
684 mLeapSeconds(nmea.mLeapSeconds),
685 mLeapSecUnc(nmea.mLeapSecUnc)
Katz Yamada592b3f52017-03-14 11:13:23 -0700686{
687}
688
689bool SystemStatusTimeAndClock::equals(SystemStatusTimeAndClock& peer)
690{
691 if ((mGpsWeek != peer.mGpsWeek) ||
692 (mGpsTowMs != peer.mGpsTowMs) ||
693 (mTimeValid != peer.mTimeValid) ||
694 (mTimeSource != peer.mTimeSource) ||
695 (mTimeUnc != peer.mTimeUnc) ||
696 (mClockFreqBias != peer.mClockFreqBias) ||
Katz Yamada3eef3d72017-04-27 13:46:09 -0700697 (mClockFreqBiasUnc != peer.mClockFreqBiasUnc) ||
698 (mLeapSeconds != peer.mLeapSeconds) ||
699 (mLeapSecUnc != peer.mLeapSecUnc)) {
Katz Yamada592b3f52017-03-14 11:13:23 -0700700 return false;
701 }
702 return true;
703}
704
705void SystemStatusTimeAndClock::dump()
706{
Katz Yamada3eef3d72017-04-27 13:46:09 -0700707 LOC_LOGV("TimeAndClock: u=%ld:%ld g=%d:%d v=%d ts=%d tu=%d b=%d bu=%d ls=%d lu=%d",
Katz Yamada592b3f52017-03-14 11:13:23 -0700708 mUtcTime.tv_sec, mUtcTime.tv_nsec,
709 mGpsWeek,
710 mGpsTowMs,
711 mTimeValid,
712 mTimeSource,
713 mTimeUnc,
714 mClockFreqBias,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700715 mClockFreqBiasUnc,
716 mLeapSeconds,
717 mLeapSecUnc);
Katz Yamada592b3f52017-03-14 11:13:23 -0700718 return;
719}
720
721/******************************************************************************
722 SystemStatusXoState
723******************************************************************************/
724SystemStatusXoState::SystemStatusXoState(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700725 mXoState(nmea.mXoState)
726{
727}
728
729bool SystemStatusXoState::equals(SystemStatusXoState& peer)
730{
731 if (mXoState != peer.mXoState) {
732 return false;
733 }
734 return true;
735}
736
737void SystemStatusXoState::dump()
738{
739 LOC_LOGV("XoState: u=%ld:%ld x=%d",
740 mUtcTime.tv_sec, mUtcTime.tv_nsec,
741 mXoState);
742 return;
743}
744
745/******************************************************************************
746 SystemStatusRfAndParams
747******************************************************************************/
748SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700749 mPgaGain(nmea.mPgaGain),
750 mGpsBpAmpI(nmea.mGpsBpAmpI),
751 mGpsBpAmpQ(nmea.mGpsBpAmpQ),
752 mAdcI(nmea.mAdcI),
753 mAdcQ(nmea.mAdcQ),
754 mJammerGps(nmea.mJammerGps),
755 mJammerGlo(nmea.mJammerGlo),
756 mJammerBds(nmea.mJammerBds),
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700757 mJammerGal(nmea.mJammerGal),
758 mAgcGps(nmea.mAgcGps),
759 mAgcGlo(nmea.mAgcGlo),
760 mAgcBds(nmea.mAgcBds),
761 mAgcGal(nmea.mAgcGal)
Katz Yamada592b3f52017-03-14 11:13:23 -0700762{
763}
764
765bool SystemStatusRfAndParams::equals(SystemStatusRfAndParams& peer)
766{
767 if ((mPgaGain != peer.mPgaGain) ||
768 (mGpsBpAmpI != peer.mGpsBpAmpI) ||
769 (mGpsBpAmpQ != peer.mGpsBpAmpQ) ||
770 (mAdcI != peer.mAdcI) ||
771 (mAdcQ != peer.mAdcQ) ||
772 (mJammerGps != peer.mJammerGps) ||
773 (mJammerGlo != peer.mJammerGlo) ||
774 (mJammerBds != peer.mJammerBds) ||
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700775 (mJammerGal != peer.mJammerGal) ||
776 (mAgcGps != peer.mAgcGps) ||
777 (mAgcGlo != peer.mAgcGlo) ||
778 (mAgcBds != peer.mAgcBds) ||
779 (mAgcGal != peer.mAgcGal)) {
Katz Yamada592b3f52017-03-14 11:13:23 -0700780 return false;
781 }
782 return true;
783}
784
785void SystemStatusRfAndParams::dump()
786{
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700787 LOC_LOGV("RfAndParams: u=%ld:%ld p=%d bi=%d bq=%d ai=%d aq=%d "
788 "jgp=%d jgl=%d jbd=%d jga=%d "
789 "agp=%lf agl=%lf abd=%lf aga=%lf",
Katz Yamada592b3f52017-03-14 11:13:23 -0700790 mUtcTime.tv_sec, mUtcTime.tv_nsec,
791 mPgaGain,
792 mGpsBpAmpI,
793 mGpsBpAmpQ,
794 mAdcI,
795 mAdcQ,
796 mJammerGps,
797 mJammerGlo,
798 mJammerBds,
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700799 mJammerGal,
800 mAgcGps,
801 mAgcGlo,
802 mAgcBds,
803 mAgcGal);
Katz Yamada592b3f52017-03-14 11:13:23 -0700804 return;
805}
806
807/******************************************************************************
808 SystemStatusErrRecovery
809******************************************************************************/
810SystemStatusErrRecovery::SystemStatusErrRecovery(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700811 mRecErrorRecovery(nmea.mRecErrorRecovery)
812{
813}
814
815bool SystemStatusErrRecovery::equals(SystemStatusErrRecovery& peer)
816{
817 if (mRecErrorRecovery != peer.mRecErrorRecovery) {
818 return false;
819 }
820 return true;
821}
822
823void SystemStatusErrRecovery::dump()
824{
825 LOC_LOGV("ErrRecovery: u=%ld:%ld e=%d",
826 mUtcTime.tv_sec, mUtcTime.tv_nsec,
827 mRecErrorRecovery);
828 return;
829}
830
831/******************************************************************************
832 SystemStatusInjectedPosition
833******************************************************************************/
834SystemStatusInjectedPosition::SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700835 mEpiValidity(nmea.mEpiValidity),
836 mEpiLat(nmea.mEpiLat),
837 mEpiLon(nmea.mEpiLon),
838 mEpiAlt(nmea.mEpiAlt),
839 mEpiHepe(nmea.mEpiHepe),
840 mEpiAltUnc(nmea.mEpiAltUnc),
841 mEpiSrc(nmea.mEpiSrc)
842{
843}
844
845bool SystemStatusInjectedPosition::equals(SystemStatusInjectedPosition& peer)
846{
847 if ((mEpiValidity != peer.mEpiValidity) ||
848 (mEpiLat != peer.mEpiLat) ||
849 (mEpiLon != peer.mEpiLon) ||
850 (mEpiAlt != peer.mEpiAlt) ||
851 (mEpiHepe != peer.mEpiHepe) ||
852 (mEpiAltUnc != peer.mEpiAltUnc) ||
853 (mEpiSrc != peer.mEpiSrc)) {
854 return false;
855 }
856 return true;
857}
858
859void SystemStatusInjectedPosition::dump()
860{
861 LOC_LOGV("InjectedPosition: u=%ld:%ld v=%x la=%f lo=%f al=%f he=%f au=%f es=%d",
862 mUtcTime.tv_sec, mUtcTime.tv_nsec,
863 mEpiValidity,
864 mEpiLat,
865 mEpiLon,
866 mEpiAlt,
867 mEpiHepe,
868 mEpiAltUnc,
869 mEpiSrc);
870 return;
871}
872
873/******************************************************************************
874 SystemStatusBestPosition
875******************************************************************************/
876SystemStatusBestPosition::SystemStatusBestPosition(const SystemStatusPQWP2& nmea) :
Katz Yamada58d74dc2017-06-06 10:04:43 -0700877 mValid(true),
Katz Yamada592b3f52017-03-14 11:13:23 -0700878 mBestLat(nmea.mBestLat),
879 mBestLon(nmea.mBestLon),
880 mBestAlt(nmea.mBestAlt),
881 mBestHepe(nmea.mBestHepe),
882 mBestAltUnc(nmea.mBestAltUnc)
883{
884}
885
886bool SystemStatusBestPosition::equals(SystemStatusBestPosition& peer)
887{
888 if ((mBestLat != peer.mBestLat) ||
889 (mBestLon != peer.mBestLon) ||
890 (mBestAlt != peer.mBestAlt) ||
891 (mBestHepe != peer.mBestHepe) ||
892 (mBestAltUnc != peer.mBestAltUnc)) {
893 return false;
894 }
895 return true;
896}
897
898void SystemStatusBestPosition::dump()
899{
900 LOC_LOGV("BestPosition: u=%ld:%ld la=%f lo=%f al=%f he=%f au=%f",
901 mUtcTime.tv_sec, mUtcTime.tv_nsec,
902 mBestLat,
903 mBestLon,
904 mBestAlt,
905 mBestHepe,
906 mBestAltUnc);
907 return;
908}
909
910/******************************************************************************
911 SystemStatusXtra
912******************************************************************************/
913SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700914 mXtraValidMask(nmea.mXtraValidMask),
915 mGpsXtraAge(nmea.mGpsXtraAge),
916 mGloXtraAge(nmea.mGloXtraAge),
917 mBdsXtraAge(nmea.mBdsXtraAge),
918 mGalXtraAge(nmea.mGalXtraAge),
919 mQzssXtraAge(nmea.mQzssXtraAge),
920 mGpsXtraValid(nmea.mGpsXtraValid),
921 mGloXtraValid(nmea.mGloXtraValid),
922 mBdsXtraValid(nmea.mBdsXtraValid),
923 mGalXtraValid(nmea.mGalXtraValid),
924 mQzssXtraValid(nmea.mQzssXtraValid)
925{
926}
927
928bool SystemStatusXtra::equals(SystemStatusXtra& peer)
929{
930 if ((mXtraValidMask != peer.mXtraValidMask) ||
931 (mGpsXtraAge != peer.mGpsXtraAge) ||
932 (mGloXtraAge != peer.mGloXtraAge) ||
933 (mBdsXtraAge != peer.mBdsXtraAge) ||
934 (mGalXtraAge != peer.mGalXtraAge) ||
935 (mQzssXtraAge != peer.mQzssXtraAge) ||
936 (mGpsXtraValid != peer.mGpsXtraValid) ||
937 (mGloXtraValid != peer.mGloXtraValid) ||
938 (mBdsXtraValid != peer.mBdsXtraValid) ||
939 (mGalXtraValid != peer.mGalXtraValid) ||
940 (mQzssXtraValid != peer.mQzssXtraValid)) {
941 return false;
942 }
943 return true;
944}
945
946void SystemStatusXtra::dump()
947{
Baili Feng4c9c7832017-07-03 21:00:31 +0800948 LOC_LOGV("SystemStatusXtra: u=%ld:%ld m=%x a=%d:%d:%d:%d:%d v=%x:%x:%" PRIx64 ":%" PRIx64":%x",
Katz Yamada592b3f52017-03-14 11:13:23 -0700949 mUtcTime.tv_sec, mUtcTime.tv_nsec,
950 mXtraValidMask,
951 mGpsXtraAge,
952 mGloXtraAge,
953 mBdsXtraAge,
954 mGalXtraAge,
955 mQzssXtraAge,
956 mGpsXtraValid,
957 mGloXtraValid,
958 mBdsXtraValid,
959 mGalXtraValid,
960 mQzssXtraValid);
961 return;
962}
963
964/******************************************************************************
965 SystemStatusEphemeris
966******************************************************************************/
967SystemStatusEphemeris::SystemStatusEphemeris(const SystemStatusPQWP4& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700968 mGpsEpheValid(nmea.mGpsEpheValid),
969 mGloEpheValid(nmea.mGloEpheValid),
970 mBdsEpheValid(nmea.mBdsEpheValid),
971 mGalEpheValid(nmea.mGalEpheValid),
972 mQzssEpheValid(nmea.mQzssEpheValid)
973{
974}
975
976bool SystemStatusEphemeris::equals(SystemStatusEphemeris& peer)
977{
978 if ((mGpsEpheValid != peer.mGpsEpheValid) ||
979 (mGloEpheValid != peer.mGloEpheValid) ||
980 (mBdsEpheValid != peer.mBdsEpheValid) ||
981 (mGalEpheValid != peer.mGalEpheValid) ||
982 (mQzssEpheValid != peer.mQzssEpheValid)) {
983 return false;
984 }
985 return true;
986}
987
988void SystemStatusEphemeris::dump()
989{
Baili Feng4c9c7832017-07-03 21:00:31 +0800990 LOC_LOGV("Ephemeris: u=%ld:%ld ev=%x:%x:%" PRIx64 ":%" PRIx64 ":%x",
Katz Yamada592b3f52017-03-14 11:13:23 -0700991 mUtcTime.tv_sec, mUtcTime.tv_nsec,
992 mGpsEpheValid,
993 mGloEpheValid,
994 mBdsEpheValid,
995 mGalEpheValid,
996 mQzssEpheValid);
997 return;
998}
999
1000/******************************************************************************
1001 SystemStatusSvHealth
1002******************************************************************************/
1003SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -07001004 mGpsUnknownMask(nmea.mGpsUnknownMask),
1005 mGloUnknownMask(nmea.mGloUnknownMask),
1006 mBdsUnknownMask(nmea.mBdsUnknownMask),
1007 mGalUnknownMask(nmea.mGalUnknownMask),
1008 mQzssUnknownMask(nmea.mQzssUnknownMask),
1009 mGpsGoodMask(nmea.mGpsGoodMask),
1010 mGloGoodMask(nmea.mGloGoodMask),
1011 mBdsGoodMask(nmea.mBdsGoodMask),
1012 mGalGoodMask(nmea.mGalGoodMask),
1013 mQzssGoodMask(nmea.mQzssGoodMask),
1014 mGpsBadMask(nmea.mGpsBadMask),
1015 mGloBadMask(nmea.mGloBadMask),
1016 mBdsBadMask(nmea.mBdsBadMask),
1017 mGalBadMask(nmea.mGalBadMask),
1018 mQzssBadMask(nmea.mQzssBadMask)
1019{
1020}
1021
1022bool SystemStatusSvHealth::equals(SystemStatusSvHealth& peer)
1023{
1024 if ((mGpsUnknownMask != peer.mGpsUnknownMask) ||
1025 (mGloUnknownMask != peer.mGloUnknownMask) ||
1026 (mBdsUnknownMask != peer.mBdsUnknownMask) ||
1027 (mGalUnknownMask != peer.mGalUnknownMask) ||
1028 (mQzssUnknownMask != peer.mQzssUnknownMask) ||
1029 (mGpsGoodMask != peer.mGpsGoodMask) ||
1030 (mGloGoodMask != peer.mGloGoodMask) ||
1031 (mBdsGoodMask != peer.mBdsGoodMask) ||
1032 (mGalGoodMask != peer.mGalGoodMask) ||
1033 (mQzssGoodMask != peer.mQzssGoodMask) ||
1034 (mGpsBadMask != peer.mGpsBadMask) ||
1035 (mGloBadMask != peer.mGloBadMask) ||
1036 (mBdsBadMask != peer.mBdsBadMask) ||
1037 (mGalBadMask != peer.mGalBadMask) ||
1038 (mQzssBadMask != peer.mQzssBadMask)) {
1039 return false;
1040 }
1041 return true;
1042}
1043
1044void SystemStatusSvHealth::dump()
1045{
Baili Feng4c9c7832017-07-03 21:00:31 +08001046 LOC_LOGV("SvHealth: u=%ld:%ld \
1047 u=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \
1048 g=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \
1049 b=%x:%x:%" PRIx64 ":%" PRIx64 ":%x",
Katz Yamada592b3f52017-03-14 11:13:23 -07001050 mUtcTime.tv_sec, mUtcTime.tv_nsec,
1051 mGpsUnknownMask,
1052 mGloUnknownMask,
1053 mBdsUnknownMask,
1054 mGalUnknownMask,
1055 mQzssUnknownMask,
1056 mGpsGoodMask,
1057 mGloGoodMask,
1058 mBdsGoodMask,
1059 mGalGoodMask,
1060 mQzssGoodMask,
1061 mGpsBadMask,
1062 mGloBadMask,
1063 mBdsBadMask,
1064 mGalBadMask,
1065 mQzssBadMask);
1066 return;
1067}
1068
1069/******************************************************************************
1070 SystemStatusPdr
1071******************************************************************************/
1072SystemStatusPdr::SystemStatusPdr(const SystemStatusPQWP6& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -07001073 mFixInfoMask(nmea.mFixInfoMask)
1074{
1075}
1076
1077bool SystemStatusPdr::equals(SystemStatusPdr& peer)
1078{
1079 if (mFixInfoMask != peer.mFixInfoMask) {
1080 return false;
1081 }
1082 return true;
1083}
1084
1085void SystemStatusPdr::dump()
1086{
1087 LOC_LOGV("Pdr: u=%ld:%ld m=%x",
1088 mUtcTime.tv_sec, mUtcTime.tv_nsec,
1089 mFixInfoMask);
1090 return;
1091}
1092
1093/******************************************************************************
Katz Yamada3eef3d72017-04-27 13:46:09 -07001094 SystemStatusNavData
1095******************************************************************************/
1096SystemStatusNavData::SystemStatusNavData(const SystemStatusPQWP7& nmea)
1097{
1098 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
1099 mNav[i] = nmea.mNav[i];
1100 }
1101}
1102
1103bool SystemStatusNavData::equals(SystemStatusNavData& peer)
1104{
1105 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
1106 if ((mNav[i].mType != peer.mNav[i].mType) ||
1107 (mNav[i].mSource != peer.mNav[i].mSource) ||
1108 (mNav[i].mAgeSec != peer.mNav[i].mAgeSec)) {
1109 return false;
1110 }
1111 }
1112 return true;
1113}
1114
1115void SystemStatusNavData::dump()
1116{
1117 LOC_LOGV("NavData: u=%ld:%ld",
1118 mUtcTime.tv_sec, mUtcTime.tv_nsec);
1119 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
1120 LOC_LOGV("i=%d type=%d src=%d age=%d",
1121 i, mNav[i].mType, mNav[i].mSource, mNav[i].mAgeSec);
1122 }
1123 return;
1124}
1125
1126/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -07001127 SystemStatusPositionFailure
1128******************************************************************************/
1129SystemStatusPositionFailure::SystemStatusPositionFailure(const SystemStatusPQWS1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -07001130 mFixInfoMask(nmea.mFixInfoMask),
1131 mHepeLimit(nmea.mHepeLimit)
1132{
1133}
1134
1135bool SystemStatusPositionFailure::equals(SystemStatusPositionFailure& peer)
1136{
1137 if ((mFixInfoMask != peer.mFixInfoMask) ||
1138 (mHepeLimit != peer.mHepeLimit)) {
1139 return false;
1140 }
1141 return true;
1142}
1143
1144void SystemStatusPositionFailure::dump()
1145{
1146 LOC_LOGV("PositionFailure: u=%ld:%ld m=%d h=%d",
1147 mUtcTime.tv_sec, mUtcTime.tv_nsec,
1148 mFixInfoMask,
1149 mHepeLimit);
1150 return;
1151}
1152
1153/******************************************************************************
Katz Yamada4ff6da42017-03-21 17:16:49 -07001154 SystemStatusLocation
1155******************************************************************************/
1156bool SystemStatusLocation::equals(SystemStatusLocation& peer)
1157{
1158 if ((mLocation.gpsLocation.latitude != peer.mLocation.gpsLocation.latitude) ||
1159 (mLocation.gpsLocation.longitude != peer.mLocation.gpsLocation.longitude) ||
1160 (mLocation.gpsLocation.altitude != peer.mLocation.gpsLocation.altitude)) {
1161 return false;
1162 }
1163 return true;
1164}
1165
1166void SystemStatusLocation::dump()
1167{
1168 LOC_LOGV("Location: lat=%f lon=%f alt=%f spd=%f",
1169 mLocation.gpsLocation.latitude,
1170 mLocation.gpsLocation.longitude,
1171 mLocation.gpsLocation.altitude,
1172 mLocation.gpsLocation.speed);
1173 return;
1174}
1175
1176/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -07001177 SystemStatus
1178******************************************************************************/
1179pthread_mutex_t SystemStatus::mMutexSystemStatus = PTHREAD_MUTEX_INITIALIZER;
1180
1181SystemStatus::SystemStatus()
1182{
Katz Yamada4ff6da42017-03-21 17:16:49 -07001183 mCache.mLocation.clear();
1184
Katz Yamada592b3f52017-03-14 11:13:23 -07001185 mCache.mTimeAndClock.clear();
1186 mCache.mXoState.clear();
1187 mCache.mRfAndParams.clear();
1188 mCache.mErrRecovery.clear();
1189
1190 mCache.mInjectedPosition.clear();
1191 mCache.mBestPosition.clear();
1192 mCache.mXtra.clear();
1193 mCache.mEphemeris.clear();
1194 mCache.mSvHealth.clear();
1195 mCache.mPdr.clear();
Katz Yamada3eef3d72017-04-27 13:46:09 -07001196 mCache.mNavData.clear();
1197
Katz Yamada592b3f52017-03-14 11:13:23 -07001198 mCache.mPositionFailure.clear();
1199}
1200
1201/******************************************************************************
1202 SystemStatus - M1 functions
1203******************************************************************************/
1204bool SystemStatus::setTimeAndCLock(const SystemStatusPQWM1& nmea)
1205{
1206 SystemStatusTimeAndClock s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001207 if (!mCache.mTimeAndClock.empty() && mCache.mTimeAndClock.back().equals(s)) {
1208 mCache.mTimeAndClock.back().mUtcReported = s.mUtcReported;
1209 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001210 mCache.mTimeAndClock.push_back(s);
1211 if (mCache.mTimeAndClock.size() > maxTimeAndClock) {
1212 mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin());
1213 }
1214 }
1215 return true;
1216}
1217
1218bool SystemStatus::setXoState(const SystemStatusPQWM1& nmea)
1219{
1220 SystemStatusXoState s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001221 if (!mCache.mXoState.empty() && mCache.mXoState.back().equals(s)) {
1222 mCache.mXoState.back().mUtcReported = s.mUtcReported;
1223 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001224 mCache.mXoState.push_back(s);
1225 if (mCache.mXoState.size() > maxXoState) {
1226 mCache.mXoState.erase(mCache.mXoState.begin());
1227 }
1228 }
1229 return true;
1230}
1231
1232bool SystemStatus::setRfAndParams(const SystemStatusPQWM1& nmea)
1233{
1234 SystemStatusRfAndParams s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001235 if (!mCache.mRfAndParams.empty() && mCache.mRfAndParams.back().equals(s)) {
1236 mCache.mRfAndParams.back().mUtcReported = s.mUtcReported;
1237 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001238 mCache.mRfAndParams.push_back(s);
1239 if (mCache.mRfAndParams.size() > maxRfAndParams) {
1240 mCache.mRfAndParams.erase(mCache.mRfAndParams.begin());
1241 }
1242 }
1243 return true;
1244}
1245
1246bool SystemStatus::setErrRecovery(const SystemStatusPQWM1& nmea)
1247{
1248 SystemStatusErrRecovery s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001249 if (!mCache.mErrRecovery.empty() && mCache.mErrRecovery.back().equals(s)) {
1250 mCache.mErrRecovery.back().mUtcReported = s.mUtcReported;
1251 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001252 mCache.mErrRecovery.push_back(s);
1253 if (mCache.mErrRecovery.size() > maxErrRecovery) {
1254 mCache.mErrRecovery.erase(mCache.mErrRecovery.begin());
1255 }
1256 }
1257 return true;
1258}
1259
1260/******************************************************************************
1261 SystemStatus - Px functions
1262******************************************************************************/
1263bool SystemStatus::setInjectedPosition(const SystemStatusPQWP1& nmea)
1264{
1265 SystemStatusInjectedPosition s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001266 if (!mCache.mInjectedPosition.empty() && mCache.mInjectedPosition.back().equals(s)) {
1267 mCache.mInjectedPosition.back().mUtcReported = s.mUtcReported;
1268 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001269 mCache.mInjectedPosition.push_back(s);
1270 if (mCache.mInjectedPosition.size() > maxInjectedPosition) {
1271 mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin());
1272 }
1273 }
1274 return true;
1275}
1276
1277bool SystemStatus::setBestPosition(const SystemStatusPQWP2& nmea)
1278{
1279 SystemStatusBestPosition s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001280 if (!mCache.mBestPosition.empty() && mCache.mBestPosition.back().equals(s)) {
1281 mCache.mBestPosition.back().mUtcReported = s.mUtcReported;
1282 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001283 mCache.mBestPosition.push_back(s);
1284 if (mCache.mBestPosition.size() > maxBestPosition) {
1285 mCache.mBestPosition.erase(mCache.mBestPosition.begin());
1286 }
1287 }
1288 return true;
1289}
1290
1291bool SystemStatus::setXtra(const SystemStatusPQWP3& nmea)
1292{
1293 SystemStatusXtra s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001294 if (!mCache.mXtra.empty() && mCache.mXtra.back().equals(s)) {
1295 mCache.mXtra.back().mUtcReported = s.mUtcReported;
1296 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001297 mCache.mXtra.push_back(s);
1298 if (mCache.mXtra.size() > maxXtra) {
1299 mCache.mXtra.erase(mCache.mXtra.begin());
1300 }
1301 }
1302 return true;
1303}
1304
1305bool SystemStatus::setEphemeris(const SystemStatusPQWP4& nmea)
1306{
1307 SystemStatusEphemeris s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001308 if (!mCache.mEphemeris.empty() && mCache.mEphemeris.back().equals(s)) {
1309 mCache.mEphemeris.back().mUtcReported = s.mUtcReported;
1310 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001311 mCache.mEphemeris.push_back(s);
1312 if (mCache.mEphemeris.size() > maxEphemeris) {
1313 mCache.mEphemeris.erase(mCache.mEphemeris.begin());
1314 }
1315 }
1316 return true;
1317}
1318
1319bool SystemStatus::setSvHealth(const SystemStatusPQWP5& nmea)
1320{
1321 SystemStatusSvHealth s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001322 if (!mCache.mSvHealth.empty() && mCache.mSvHealth.back().equals(s)) {
1323 mCache.mSvHealth.back().mUtcReported = s.mUtcReported;
1324 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001325 mCache.mSvHealth.push_back(s);
1326 if (mCache.mSvHealth.size() > maxSvHealth) {
1327 mCache.mSvHealth.erase(mCache.mSvHealth.begin());
1328 }
1329 }
1330 return true;
1331}
1332
1333bool SystemStatus::setPdr(const SystemStatusPQWP6& nmea)
1334{
1335 SystemStatusPdr s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001336 if (!mCache.mPdr.empty() && mCache.mPdr.back().equals(s)) {
1337 mCache.mPdr.back().mUtcReported = s.mUtcReported;
1338 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001339 mCache.mPdr.push_back(s);
1340 if (mCache.mPdr.size() > maxPdr) {
1341 mCache.mPdr.erase(mCache.mPdr.begin());
1342 }
1343 }
1344 return true;
1345}
1346
Katz Yamada3eef3d72017-04-27 13:46:09 -07001347bool SystemStatus::setNavData(const SystemStatusPQWP7& nmea)
1348{
1349 SystemStatusNavData s(nmea);
1350 if (!mCache.mNavData.empty() && mCache.mNavData.back().equals(s)) {
1351 mCache.mNavData.back().mUtcReported = s.mUtcReported;
1352 } else {
1353 mCache.mNavData.push_back(s);
1354 if (mCache.mNavData.size() > maxNavData) {
1355 mCache.mNavData.erase(mCache.mNavData.begin());
1356 }
1357 }
1358 return true;
1359}
1360
Katz Yamada592b3f52017-03-14 11:13:23 -07001361/******************************************************************************
1362 SystemStatus - Sx functions
1363******************************************************************************/
1364bool SystemStatus::setPositionFailure(const SystemStatusPQWS1& nmea)
1365{
1366 SystemStatusPositionFailure s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001367 if (!mCache.mPositionFailure.empty() && mCache.mPositionFailure.back().equals(s)) {
1368 mCache.mPositionFailure.back().mUtcReported = s.mUtcReported;
1369 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001370 mCache.mPositionFailure.push_back(s);
1371 if (mCache.mPositionFailure.size() > maxPositionFailure) {
1372 mCache.mPositionFailure.erase(mCache.mPositionFailure.begin());
1373 }
1374 }
1375 return true;
1376}
1377
1378/******************************************************************************
1379@brief API to set report data into internal buffer
1380
1381@param[In] data pointer to the NMEA string
1382@param[In] len length of the NMEA string
1383
1384@return true when successfully done
1385******************************************************************************/
1386static uint32_t cnt = 0;
1387static uint32_t cnt_m1 = 0;
1388static uint32_t cnt_p1 = 0;
1389static uint32_t cnt_p2 = 0;
1390static uint32_t cnt_p3 = 0;
1391static uint32_t cnt_p4 = 0;
1392static uint32_t cnt_p5 = 0;
1393static uint32_t cnt_p6 = 0;
Katz Yamada3eef3d72017-04-27 13:46:09 -07001394static uint32_t cnt_p7 = 0;
Katz Yamada592b3f52017-03-14 11:13:23 -07001395static uint32_t cnt_s1 = 0;
1396
1397bool SystemStatus::setNmeaString(const char *data, uint32_t len)
1398{
1399 bool ret = false;
Kevin Tang8b98a562017-03-24 17:39:20 -07001400 if (!loc_nmea_is_debug(data, len)) {
Katz Yamada592b3f52017-03-14 11:13:23 -07001401 return false;
1402 }
1403
1404 char buf[SystemStatusNmeaBase::NMEA_MAXSIZE + 1] = { 0 };
Katz Yamada604d8742017-05-04 14:43:52 -07001405 strlcpy(buf, data, sizeof(buf));
Katz Yamada592b3f52017-03-14 11:13:23 -07001406
1407 pthread_mutex_lock(&mMutexSystemStatus);
1408
1409 // parse the received nmea strings here
1410 if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1411 SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get();
1412 ret = setTimeAndCLock(s);
1413 ret |= setXoState(s);
1414 ret |= setRfAndParams(s);
1415 ret |= setErrRecovery(s);
1416 cnt_m1++;
1417 }
1418 else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1419 ret = setInjectedPosition(SystemStatusPQWP1parser(buf, len).get());
1420 cnt_p1++;
1421 }
1422 else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1423 ret = setBestPosition(SystemStatusPQWP2parser(buf, len).get());
1424 cnt_p2++;
1425 }
1426 else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1427 ret = setXtra(SystemStatusPQWP3parser(buf, len).get());
1428 cnt_p3++;
1429 }
1430 else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1431 ret = setEphemeris(SystemStatusPQWP4parser(buf, len).get());
1432 cnt_p4++;
1433 }
1434 else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1435 ret = setSvHealth(SystemStatusPQWP5parser(buf, len).get());
1436 cnt_p5++;
1437 }
1438 else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1439 ret = setPdr(SystemStatusPQWP6parser(buf, len).get());
1440 cnt_p6++;
1441 }
Katz Yamada3eef3d72017-04-27 13:46:09 -07001442 else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1443 ret = setNavData(SystemStatusPQWP7parser(buf, len).get());
1444 cnt_p7++;
1445 }
Katz Yamada592b3f52017-03-14 11:13:23 -07001446 else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1447 ret = setPositionFailure(SystemStatusPQWS1parser(buf, len).get());
1448 cnt_s1++;
1449 }
1450 else {
1451 // do nothing
1452 }
1453 cnt++;
Katz Yamada3eef3d72017-04-27 13:46:09 -07001454 LOC_LOGV("setNmeaString: cnt=%d M:%d 1:%d 2:%d 3:%d 4:%d 5:%d 6:%d 7:%d S:%d",
Katz Yamada592b3f52017-03-14 11:13:23 -07001455 cnt,
1456 cnt_m1,
1457 cnt_p1,
1458 cnt_p2,
1459 cnt_p3,
1460 cnt_p4,
1461 cnt_p5,
1462 cnt_p6,
Katz Yamada3eef3d72017-04-27 13:46:09 -07001463 cnt_p7,
Katz Yamada592b3f52017-03-14 11:13:23 -07001464 cnt_s1);
1465
1466 pthread_mutex_unlock(&mMutexSystemStatus);
1467 return ret;
1468}
1469
1470/******************************************************************************
Katz Yamada4ff6da42017-03-21 17:16:49 -07001471@brief API to set report position data into internal buffer
1472
1473@param[In] UlpLocation
1474
1475@return true when successfully done
1476******************************************************************************/
1477bool SystemStatus::eventPosition(const UlpLocation& location,
1478 const GpsLocationExtended& locationEx)
1479{
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001480 SystemStatusLocation s(location, locationEx);
Katz Yamada3eef3d72017-04-27 13:46:09 -07001481 if (!mCache.mLocation.empty() && mCache.mLocation.back().equals(s)) {
1482 mCache.mLocation.back().mUtcReported = s.mUtcReported;
1483 }
1484 else {
Katz Yamada4ff6da42017-03-21 17:16:49 -07001485 mCache.mLocation.push_back(s);
1486 if (mCache.mLocation.size() > maxLocation) {
1487 mCache.mLocation.erase(mCache.mLocation.begin());
1488 }
Katz Yamada4ff6da42017-03-21 17:16:49 -07001489 }
Katz Yamada3eef3d72017-04-27 13:46:09 -07001490 LOC_LOGV("eventPosition - lat=%f lon=%f alt=%f speed=%f",
1491 s.mLocation.gpsLocation.latitude,
1492 s.mLocation.gpsLocation.longitude,
1493 s.mLocation.gpsLocation.altitude,
1494 s.mLocation.gpsLocation.speed);
Katz Yamada4ff6da42017-03-21 17:16:49 -07001495 return true;
1496}
1497
1498/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -07001499@brief API to get report data into a given buffer
1500
1501@param[In] reference to report buffer
1502@param[In] bool flag to identify latest only or entire buffer
1503
1504@return true when successfully done
1505******************************************************************************/
1506bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) const
1507{
1508 pthread_mutex_lock(&mMutexSystemStatus);
1509
1510 if (isLatestOnly) {
1511 // push back only the latest report and return it
Katz Yamada4ff6da42017-03-21 17:16:49 -07001512 report.mLocation.clear();
1513 if (mCache.mLocation.size() >= 1) {
1514 report.mLocation.push_back(mCache.mLocation.back());
1515 report.mLocation.back().dump();
1516 }
1517
Katz Yamada592b3f52017-03-14 11:13:23 -07001518 report.mTimeAndClock.clear();
1519 if (mCache.mTimeAndClock.size() >= 1) {
1520 report.mTimeAndClock.push_back(mCache.mTimeAndClock.back());
1521 report.mTimeAndClock.back().dump();
1522 }
1523 report.mXoState.clear();
1524 if (mCache.mXoState.size() >= 1) {
1525 report.mXoState.push_back(mCache.mXoState.back());
1526 report.mXoState.back().dump();
1527 }
1528 report.mRfAndParams.clear();
1529 if (mCache.mRfAndParams.size() >= 1) {
1530 report.mRfAndParams.push_back(mCache.mRfAndParams.back());
1531 report.mRfAndParams.back().dump();
1532 }
1533 report.mErrRecovery.clear();
1534 if (mCache.mErrRecovery.size() >= 1) {
1535 report.mErrRecovery.push_back(mCache.mErrRecovery.back());
1536 report.mErrRecovery.back().dump();
1537 }
1538
1539 report.mInjectedPosition.clear();
1540 if (mCache.mInjectedPosition.size() >= 1) {
1541 report.mInjectedPosition.push_back(mCache.mInjectedPosition.back());
1542 report.mInjectedPosition.back().dump();
1543 }
1544 report.mBestPosition.clear();
1545 if (mCache.mBestPosition.size() >= 1) {
1546 report.mBestPosition.push_back(mCache.mBestPosition.back());
1547 report.mBestPosition.back().dump();
1548 }
1549 report.mXtra.clear();
1550 if (mCache.mXtra.size() >= 1) {
1551 report.mXtra.push_back(mCache.mXtra.back());
1552 report.mXtra.back().dump();
1553 }
1554 report.mEphemeris.clear();
1555 if (mCache.mEphemeris.size() >= 1) {
1556 report.mEphemeris.push_back(mCache.mEphemeris.back());
1557 report.mEphemeris.back().dump();
1558 }
1559 report.mSvHealth.clear();
1560 if (mCache.mSvHealth.size() >= 1) {
1561 report.mSvHealth.push_back(mCache.mSvHealth.back());
1562 report.mSvHealth.back().dump();
1563 }
1564 report.mPdr.clear();
1565 if (mCache.mPdr.size() >= 1) {
1566 report.mPdr.push_back(mCache.mPdr.back());
1567 report.mPdr.back().dump();
1568 }
Katz Yamada3eef3d72017-04-27 13:46:09 -07001569 report.mNavData.clear();
1570 if (mCache.mNavData.size() >= 1) {
1571 report.mNavData.push_back(mCache.mNavData.back());
1572 report.mNavData.back().dump();
1573 }
1574
Katz Yamada592b3f52017-03-14 11:13:23 -07001575 report.mPositionFailure.clear();
1576 if (mCache.mPositionFailure.size() >= 1) {
1577 report.mPositionFailure.push_back(mCache.mPositionFailure.back());
1578 report.mPositionFailure.back().dump();
1579 }
1580 }
1581 else {
1582 // copy entire reports and return them
Katz Yamada4ff6da42017-03-21 17:16:49 -07001583 report.mLocation.clear();
1584
Katz Yamada592b3f52017-03-14 11:13:23 -07001585 report.mTimeAndClock.clear();
1586 report.mXoState.clear();
1587 report.mRfAndParams.clear();
1588 report.mErrRecovery.clear();
1589
1590 report.mInjectedPosition.clear();
1591 report.mBestPosition.clear();
1592 report.mXtra.clear();
1593 report.mEphemeris.clear();
1594 report.mSvHealth.clear();
1595 report.mPdr.clear();
Katz Yamada3eef3d72017-04-27 13:46:09 -07001596 report.mNavData.clear();
1597
Katz Yamada592b3f52017-03-14 11:13:23 -07001598 report.mPositionFailure.clear();
1599 report = mCache;
1600 }
1601
1602 pthread_mutex_unlock(&mMutexSystemStatus);
1603 return true;
1604}
1605
Katz Yamada58d74dc2017-06-06 10:04:43 -07001606/******************************************************************************
1607@brief API to set default report data
1608
1609@param[In] none
1610
1611@return true when successfully done
1612******************************************************************************/
1613bool SystemStatus::setDefaultReport(void)
1614{
1615 pthread_mutex_lock(&mMutexSystemStatus);
1616
1617 mCache.mLocation.push_back(SystemStatusLocation());
1618 if (mCache.mLocation.size() > maxLocation) {
1619 mCache.mLocation.erase(mCache.mLocation.begin());
1620 }
1621
1622 mCache.mTimeAndClock.push_back(SystemStatusTimeAndClock());
1623 if (mCache.mTimeAndClock.size() > maxTimeAndClock) {
1624 mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin());
1625 }
1626 mCache.mXoState.push_back(SystemStatusXoState());
1627 if (mCache.mXoState.size() > maxXoState) {
1628 mCache.mXoState.erase(mCache.mXoState.begin());
1629 }
1630 mCache.mRfAndParams.push_back(SystemStatusRfAndParams());
1631 if (mCache.mRfAndParams.size() > maxRfAndParams) {
1632 mCache.mRfAndParams.erase(mCache.mRfAndParams.begin());
1633 }
1634 mCache.mErrRecovery.push_back(SystemStatusErrRecovery());
1635 if (mCache.mErrRecovery.size() > maxErrRecovery) {
1636 mCache.mErrRecovery.erase(mCache.mErrRecovery.begin());
1637 }
1638
1639 mCache.mInjectedPosition.push_back(SystemStatusInjectedPosition());
1640 if (mCache.mInjectedPosition.size() > maxInjectedPosition) {
1641 mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin());
1642 }
1643 mCache.mBestPosition.push_back(SystemStatusBestPosition());
1644 if (mCache.mBestPosition.size() > maxBestPosition) {
1645 mCache.mBestPosition.erase(mCache.mBestPosition.begin());
1646 }
1647 mCache.mXtra.push_back(SystemStatusXtra());
1648 if (mCache.mXtra.size() > maxXtra) {
1649 mCache.mXtra.erase(mCache.mXtra.begin());
1650 }
1651 mCache.mEphemeris.push_back(SystemStatusEphemeris());
1652 if (mCache.mEphemeris.size() > maxEphemeris) {
1653 mCache.mEphemeris.erase(mCache.mEphemeris.begin());
1654 }
1655 mCache.mSvHealth.push_back(SystemStatusSvHealth());
1656 if (mCache.mSvHealth.size() > maxSvHealth) {
1657 mCache.mSvHealth.erase(mCache.mSvHealth.begin());
1658 }
1659 mCache.mPdr.push_back(SystemStatusPdr());
1660 if (mCache.mPdr.size() > maxPdr) {
1661 mCache.mPdr.erase(mCache.mPdr.begin());
1662 }
1663 mCache.mNavData.push_back(SystemStatusNavData());
1664 if (mCache.mNavData.size() > maxNavData) {
1665 mCache.mNavData.erase(mCache.mNavData.begin());
1666 }
1667
1668 mCache.mPositionFailure.push_back(SystemStatusPositionFailure());
1669 if (mCache.mPositionFailure.size() > maxPositionFailure) {
1670 mCache.mPositionFailure.erase(mCache.mPositionFailure.begin());
1671 }
1672
1673 pthread_mutex_unlock(&mMutexSystemStatus);
1674 return true;
1675}
1676
Katz Yamada592b3f52017-03-14 11:13:23 -07001677} // namespace loc_core
1678