blob: 275c9debbe7aed82b4805d28db1c21c7daf9292f [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>
Harikrishnan Hariharanee2d6652017-08-11 15:13:38 +053038#include <MsgTask.h>
Kevin Tang8b98a562017-03-24 17:39:20 -070039#include <loc_nmea.h>
Harikrishnan Hariharanff8b3172017-08-11 17:36:10 +053040#include <DataItemsFactoryProxy.h>
Katz Yamada592b3f52017-03-14 11:13:23 -070041#include <SystemStatus.h>
Harikrishnan Hariharanee2d6652017-08-11 15:13:38 +053042#include <SystemStatusOsObserver.h>
Harikrishnan Hariharan40284222017-09-05 17:52:32 +053043#include <DataItemConcreteTypesBase.h>
Katz Yamada592b3f52017-03-14 11:13:23 -070044
45namespace loc_core
46{
47
48/******************************************************************************
49 SystemStatusNmeaBase - base class for all NMEA parsers
50******************************************************************************/
51class SystemStatusNmeaBase
52{
53protected:
54 std::vector<std::string> mField;
Katz Yamada592b3f52017-03-14 11:13:23 -070055
Katz Yamada592b3f52017-03-14 11:13:23 -070056 SystemStatusNmeaBase(const char *str_in, uint32_t len_in)
57 {
58 // check size and talker
Kevin Tang8b98a562017-03-24 17:39:20 -070059 if (!loc_nmea_is_debug(str_in, len_in)) {
Katz Yamada592b3f52017-03-14 11:13:23 -070060 return;
61 }
62
63 std::string parser(str_in);
64 std::string::size_type index = 0;
65
66 // verify checksum field
67 index = parser.find("*");
68 if (index == std::string::npos) {
69 return;
70 }
71 parser[index] = ',';
72
73 // tokenize parser
74 while (1) {
75 std::string str;
76 index = parser.find(",");
77 if (index == std::string::npos) {
78 break;
79 }
80 str = parser.substr(0, index);
81 parser = parser.substr(index + 1);
82 mField.push_back(str);
83 }
84 }
85
86 virtual ~SystemStatusNmeaBase() { }
Kevin Tang8b98a562017-03-24 17:39:20 -070087
88public:
89 static const uint32_t NMEA_MINSIZE = DEBUG_NMEA_MINSIZE;
90 static const uint32_t NMEA_MAXSIZE = DEBUG_NMEA_MAXSIZE;
Katz Yamada592b3f52017-03-14 11:13:23 -070091};
92
Katz Yamada592b3f52017-03-14 11:13:23 -070093/******************************************************************************
94 SystemStatusPQWM1
95******************************************************************************/
96class SystemStatusPQWM1
97{
98public:
Katz Yamada592b3f52017-03-14 11:13:23 -070099 uint16_t mGpsWeek; // x1
100 uint32_t mGpsTowMs; // x2
101 uint8_t mTimeValid; // x3
102 uint8_t mTimeSource; // x4
103 int32_t mTimeUnc; // x5
104 int32_t mClockFreqBias; // x6
105 int32_t mClockFreqBiasUnc; // x7
106 uint8_t mXoState; // x8
107 int32_t mPgaGain; // x9
108 uint32_t mGpsBpAmpI; // xA
109 uint32_t mGpsBpAmpQ; // xB
110 uint32_t mAdcI; // xC
111 uint32_t mAdcQ; // xD
112 uint32_t mJammerGps; // xE
113 uint32_t mJammerGlo; // xF
114 uint32_t mJammerBds; // x10
115 uint32_t mJammerGal; // x11
116 uint32_t mRecErrorRecovery; // x12
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700117 double mAgcGps; // x13
118 double mAgcGlo; // x14
119 double mAgcBds; // x15
120 double mAgcGal; // x16
Katz Yamada3eef3d72017-04-27 13:46:09 -0700121 int32_t mLeapSeconds;// x17
122 int32_t mLeapSecUnc; // x18
Katz Yamadafe173632017-09-14 15:04:24 -0700123 uint32_t mGloBpAmpI; // x19
124 uint32_t mGloBpAmpQ; // x1A
125 uint32_t mBdsBpAmpI; // x1B
126 uint32_t mBdsBpAmpQ; // x1C
127 uint32_t mGalBpAmpI; // x1D
128 uint32_t mGalBpAmpQ; // x1E
Katz Yamada592b3f52017-03-14 11:13:23 -0700129};
130
131// parser
132class SystemStatusPQWM1parser : public SystemStatusNmeaBase
133{
134private:
135 enum
136 {
137 eTalker = 0,
138 eGpsWeek = 1,
139 eGpsTowMs = 2,
140 eTimeValid = 3,
141 eTimeSource = 4,
142 eTimeUnc = 5,
143 eClockFreqBias = 6,
144 eClockFreqBiasUnc = 7,
145 eXoState = 8,
146 ePgaGain = 9,
147 eGpsBpAmpI = 10,
148 eGpsBpAmpQ = 11,
149 eAdcI = 12,
150 eAdcQ = 13,
151 eJammerGps = 14,
152 eJammerGlo = 15,
153 eJammerBds = 16,
154 eJammerGal = 17,
155 eRecErrorRecovery = 18,
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700156 eAgcGps = 19,
157 eAgcGlo = 20,
158 eAgcBds = 21,
159 eAgcGal = 22,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700160 eLeapSeconds = 23,
161 eLeapSecUnc = 24,
Katz Yamadafe173632017-09-14 15:04:24 -0700162 eGloBpAmpI = 25,
163 eGloBpAmpQ = 26,
164 eBdsBpAmpI = 27,
165 eBdsBpAmpQ = 28,
166 eGalBpAmpI = 29,
167 eGalBpAmpQ = 30,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700168 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700169 };
170 SystemStatusPQWM1 mM1;
171
172public:
173 inline uint16_t getGpsWeek() { return mM1.mGpsWeek; }
174 inline uint32_t getGpsTowMs() { return mM1.mGpsTowMs; }
175 inline uint8_t getTimeValid() { return mM1.mTimeValid; }
176 inline uint8_t getTimeSource() { return mM1.mTimeSource; }
177 inline int32_t getTimeUnc() { return mM1.mTimeUnc; }
178 inline int32_t getClockFreqBias() { return mM1.mClockFreqBias; }
179 inline int32_t getClockFreqBiasUnc() { return mM1.mClockFreqBiasUnc; }
180 inline uint8_t getXoState() { return mM1.mXoState;}
181 inline int32_t getPgaGain() { return mM1.mPgaGain; }
182 inline uint32_t getGpsBpAmpI() { return mM1.mGpsBpAmpI; }
183 inline uint32_t getGpsBpAmpQ() { return mM1.mGpsBpAmpQ; }
184 inline uint32_t getAdcI() { return mM1.mAdcI; }
185 inline uint32_t getAdcQ() { return mM1.mAdcQ; }
186 inline uint32_t getJammerGps() { return mM1.mJammerGps; }
187 inline uint32_t getJammerGlo() { return mM1.mJammerGlo; }
188 inline uint32_t getJammerBds() { return mM1.mJammerBds; }
189 inline uint32_t getJammerGal() { return mM1.mJammerGal; }
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700190 inline uint32_t getAgcGps() { return mM1.mAgcGps; }
191 inline uint32_t getAgcGlo() { return mM1.mAgcGlo; }
192 inline uint32_t getAgcBds() { return mM1.mAgcBds; }
193 inline uint32_t getAgcGal() { return mM1.mAgcGal; }
Katz Yamada592b3f52017-03-14 11:13:23 -0700194 inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; }
Katz Yamada3eef3d72017-04-27 13:46:09 -0700195 inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; }
196 inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; }
Katz Yamadafe173632017-09-14 15:04:24 -0700197 inline uint32_t getGloBpAmpI() { return mM1.mGloBpAmpI; }
198 inline uint32_t getGloBpAmpQ() { return mM1.mGloBpAmpQ; }
199 inline uint32_t getBdsBpAmpI() { return mM1.mBdsBpAmpI; }
200 inline uint32_t getBdsBpAmpQ() { return mM1.mBdsBpAmpQ; }
201 inline uint32_t getGalBpAmpI() { return mM1.mGalBpAmpI; }
202 inline uint32_t getGalBpAmpQ() { return mM1.mGalBpAmpQ; }
Katz Yamada592b3f52017-03-14 11:13:23 -0700203
204 SystemStatusPQWM1parser(const char *str_in, uint32_t len_in)
205 : SystemStatusNmeaBase(str_in, len_in)
206 {
Katz Yamadae3d70312017-05-18 11:00:17 -0700207 memset(&mM1, 0, sizeof(mM1));
Katz Yamada592b3f52017-03-14 11:13:23 -0700208 if (mField.size() < eMax) {
Baili Feng4c9c7832017-07-03 21:00:31 +0800209 LOC_LOGE("PQWM1parser - invalid size=%zu", mField.size());
Katz Yamadae3d70312017-05-18 11:00:17 -0700210 mM1.mTimeValid = 0;
Katz Yamada592b3f52017-03-14 11:13:23 -0700211 return;
212 }
Katz Yamada592b3f52017-03-14 11:13:23 -0700213 mM1.mGpsWeek = atoi(mField[eGpsWeek].c_str());
214 mM1.mGpsTowMs = atoi(mField[eGpsTowMs].c_str());
215 mM1.mTimeValid = atoi(mField[eTimeValid].c_str());
216 mM1.mTimeSource = atoi(mField[eTimeSource].c_str());
217 mM1.mTimeUnc = atoi(mField[eTimeUnc].c_str());
218 mM1.mClockFreqBias = atoi(mField[eClockFreqBias].c_str());
219 mM1.mClockFreqBiasUnc = atoi(mField[eClockFreqBiasUnc].c_str());
220 mM1.mXoState = atoi(mField[eXoState].c_str());
221 mM1.mPgaGain = atoi(mField[ePgaGain].c_str());
222 mM1.mGpsBpAmpI = atoi(mField[eGpsBpAmpI].c_str());
223 mM1.mGpsBpAmpQ = atoi(mField[eGpsBpAmpQ].c_str());
224 mM1.mAdcI = atoi(mField[eAdcI].c_str());
225 mM1.mAdcQ = atoi(mField[eAdcQ].c_str());
226 mM1.mJammerGps = atoi(mField[eJammerGps].c_str());
227 mM1.mJammerGlo = atoi(mField[eJammerGlo].c_str());
228 mM1.mJammerBds = atoi(mField[eJammerBds].c_str());
229 mM1.mJammerGal = atoi(mField[eJammerGal].c_str());
230 mM1.mRecErrorRecovery = atoi(mField[eRecErrorRecovery].c_str());
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700231 mM1.mAgcGps = atof(mField[eAgcGps].c_str());
232 mM1.mAgcGlo = atof(mField[eAgcGlo].c_str());
233 mM1.mAgcBds = atof(mField[eAgcBds].c_str());
234 mM1.mAgcGal = atof(mField[eAgcGal].c_str());
Katz Yamada3eef3d72017-04-27 13:46:09 -0700235 mM1.mLeapSeconds = atoi(mField[eLeapSeconds].c_str());
236 mM1.mLeapSecUnc = atoi(mField[eLeapSecUnc].c_str());
Katz Yamadafe173632017-09-14 15:04:24 -0700237 mM1.mGloBpAmpI = atoi(mField[eGloBpAmpI].c_str());
238 mM1.mGloBpAmpQ = atoi(mField[eGloBpAmpQ].c_str());
239 mM1.mBdsBpAmpI = atoi(mField[eBdsBpAmpI].c_str());
240 mM1.mBdsBpAmpQ = atoi(mField[eBdsBpAmpQ].c_str());
241 mM1.mGalBpAmpI = atoi(mField[eGalBpAmpI].c_str());
242 mM1.mGalBpAmpQ = atoi(mField[eGalBpAmpQ].c_str());
Katz Yamada592b3f52017-03-14 11:13:23 -0700243 }
244
245 inline SystemStatusPQWM1& get() { return mM1;} //getparser
246};
247
248/******************************************************************************
249 SystemStatusPQWP1
250******************************************************************************/
251class SystemStatusPQWP1
252{
253public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700254 uint8_t mEpiValidity; // x4
255 float mEpiLat; // x5
256 float mEpiLon; // x6
257 float mEpiAlt; // x7
258 float mEpiHepe; // x8
259 float mEpiAltUnc; // x9
260 uint8_t mEpiSrc; // x10
261};
262
263class SystemStatusPQWP1parser : public SystemStatusNmeaBase
264{
265private:
266 enum
267 {
268 eTalker = 0,
269 eUtcTime = 1,
270 eEpiValidity = 2,
271 eEpiLat = 3,
272 eEpiLon = 4,
273 eEpiAlt = 5,
274 eEpiHepe = 6,
275 eEpiAltUnc = 7,
276 eEpiSrc = 8,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700277 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700278 };
279 SystemStatusPQWP1 mP1;
280
281public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700282 inline uint8_t getEpiValidity() { return mP1.mEpiValidity; }
283 inline float getEpiLat() { return mP1.mEpiLat; }
284 inline float getEpiLon() { return mP1.mEpiLon; }
285 inline float getEpiAlt() { return mP1.mEpiAlt; }
286 inline float getEpiHepe() { return mP1.mEpiHepe; }
287 inline float getEpiAltUnc() { return mP1.mEpiAltUnc; }
288 inline uint8_t getEpiSrc() { return mP1.mEpiSrc; }
289
290 SystemStatusPQWP1parser(const char *str_in, uint32_t len_in)
291 : SystemStatusNmeaBase(str_in, len_in)
292 {
293 if (mField.size() < eMax) {
294 return;
295 }
296 memset(&mP1, 0, sizeof(mP1));
Katz Yamada592b3f52017-03-14 11:13:23 -0700297 mP1.mEpiValidity = strtol(mField[eEpiValidity].c_str(), NULL, 16);
298 mP1.mEpiLat = atof(mField[eEpiLat].c_str());
299 mP1.mEpiLon = atof(mField[eEpiLon].c_str());
300 mP1.mEpiAlt = atof(mField[eEpiAlt].c_str());
301 mP1.mEpiHepe = atoi(mField[eEpiHepe].c_str());
302 mP1.mEpiAltUnc = atof(mField[eEpiAltUnc].c_str());
303 mP1.mEpiSrc = atoi(mField[eEpiSrc].c_str());
304 }
305
306 inline SystemStatusPQWP1& get() { return mP1;}
307};
308
309/******************************************************************************
310 SystemStatusPQWP2
311******************************************************************************/
312class SystemStatusPQWP2
313{
314public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700315 float mBestLat; // x4
316 float mBestLon; // x5
317 float mBestAlt; // x6
318 float mBestHepe; // x7
319 float mBestAltUnc; // x8
320};
321
322class SystemStatusPQWP2parser : public SystemStatusNmeaBase
323{
324private:
325 enum
326 {
327 eTalker = 0,
328 eUtcTime = 1,
329 eBestLat = 2,
330 eBestLon = 3,
331 eBestAlt = 4,
332 eBestHepe = 5,
333 eBestAltUnc = 6,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700334 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700335 };
336 SystemStatusPQWP2 mP2;
337
338public:
339 inline float getBestLat() { return mP2.mBestLat; }
340 inline float getBestLon() { return mP2.mBestLon; }
341 inline float getBestAlt() { return mP2.mBestAlt; }
342 inline float getBestHepe() { return mP2.mBestHepe; }
343 inline float getBestAltUnc() { return mP2.mBestAltUnc; }
344
345 SystemStatusPQWP2parser(const char *str_in, uint32_t len_in)
346 : SystemStatusNmeaBase(str_in, len_in)
347 {
348 if (mField.size() < eMax) {
349 return;
350 }
351 memset(&mP2, 0, sizeof(mP2));
Katz Yamada592b3f52017-03-14 11:13:23 -0700352 mP2.mBestLat = atof(mField[eBestLat].c_str());
353 mP2.mBestLon = atof(mField[eBestLon].c_str());
354 mP2.mBestAlt = atof(mField[eBestAlt].c_str());
355 mP2.mBestHepe = atof(mField[eBestHepe].c_str());
356 mP2.mBestAltUnc = atof(mField[eBestAltUnc].c_str());
357 }
358
359 inline SystemStatusPQWP2& get() { return mP2;}
360};
361
362/******************************************************************************
363 SystemStatusPQWP3
364******************************************************************************/
365class SystemStatusPQWP3
366{
367public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700368 uint8_t mXtraValidMask;
369 uint32_t mGpsXtraAge;
370 uint32_t mGloXtraAge;
371 uint32_t mBdsXtraAge;
372 uint32_t mGalXtraAge;
373 uint32_t mQzssXtraAge;
374 uint32_t mGpsXtraValid;
375 uint32_t mGloXtraValid;
376 uint64_t mBdsXtraValid;
377 uint64_t mGalXtraValid;
378 uint8_t mQzssXtraValid;
379};
380
381class SystemStatusPQWP3parser : public SystemStatusNmeaBase
382{
383private:
384 enum
385 {
386 eTalker = 0,
387 eUtcTime = 1,
388 eXtraValidMask = 2,
389 eGpsXtraAge = 3,
390 eGloXtraAge = 4,
391 eBdsXtraAge = 5,
392 eGalXtraAge = 6,
393 eQzssXtraAge = 7,
394 eGpsXtraValid = 8,
395 eGloXtraValid = 9,
396 eBdsXtraValid = 10,
397 eGalXtraValid = 11,
398 eQzssXtraValid = 12,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700399 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700400 };
401 SystemStatusPQWP3 mP3;
402
403public:
404 inline uint8_t getXtraValid() { return mP3.mXtraValidMask; }
405 inline uint32_t getGpsXtraAge() { return mP3.mGpsXtraAge; }
406 inline uint32_t getGloXtraAge() { return mP3.mGloXtraAge; }
407 inline uint32_t getBdsXtraAge() { return mP3.mBdsXtraAge; }
408 inline uint32_t getGalXtraAge() { return mP3.mGalXtraAge; }
409 inline uint32_t getQzssXtraAge() { return mP3.mQzssXtraAge; }
410 inline uint32_t getGpsXtraValid() { return mP3.mGpsXtraValid; }
411 inline uint32_t getGloXtraValid() { return mP3.mGloXtraValid; }
412 inline uint64_t getBdsXtraValid() { return mP3.mBdsXtraValid; }
413 inline uint64_t getGalXtraValid() { return mP3.mGalXtraValid; }
414 inline uint8_t getQzssXtraValid() { return mP3.mQzssXtraValid; }
415
416 SystemStatusPQWP3parser(const char *str_in, uint32_t len_in)
417 : SystemStatusNmeaBase(str_in, len_in)
418 {
419 if (mField.size() < eMax) {
420 return;
421 }
422 memset(&mP3, 0, sizeof(mP3));
Katz Yamada592b3f52017-03-14 11:13:23 -0700423 mP3.mXtraValidMask = strtol(mField[eXtraValidMask].c_str(), NULL, 16);
424 mP3.mGpsXtraAge = atoi(mField[eGpsXtraAge].c_str());
425 mP3.mGloXtraAge = atoi(mField[eGloXtraAge].c_str());
426 mP3.mBdsXtraAge = atoi(mField[eBdsXtraAge].c_str());
427 mP3.mGalXtraAge = atoi(mField[eGalXtraAge].c_str());
428 mP3.mQzssXtraAge = atoi(mField[eQzssXtraAge].c_str());
429 mP3.mGpsXtraValid = strtol(mField[eGpsXtraValid].c_str(), NULL, 16);
430 mP3.mGloXtraValid = strtol(mField[eGloXtraValid].c_str(), NULL, 16);
431 mP3.mBdsXtraValid = strtol(mField[eBdsXtraValid].c_str(), NULL, 16);
432 mP3.mGalXtraValid = strtol(mField[eGalXtraValid].c_str(), NULL, 16);
433 mP3.mQzssXtraValid = strtol(mField[eQzssXtraValid].c_str(), NULL, 16);
434 }
435
436 inline SystemStatusPQWP3& get() { return mP3;}
437};
438
439/******************************************************************************
440 SystemStatusPQWP4
441******************************************************************************/
442class SystemStatusPQWP4
443{
444public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700445 uint32_t mGpsEpheValid;
446 uint32_t mGloEpheValid;
447 uint64_t mBdsEpheValid;
448 uint64_t mGalEpheValid;
449 uint8_t mQzssEpheValid;
450};
451
452class SystemStatusPQWP4parser : public SystemStatusNmeaBase
453{
454private:
455 enum
456 {
457 eTalker = 0,
458 eUtcTime = 1,
459 eGpsEpheValid = 2,
460 eGloEpheValid = 3,
461 eBdsEpheValid = 4,
462 eGalEpheValid = 5,
463 eQzssEpheValid = 6,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700464 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700465 };
466 SystemStatusPQWP4 mP4;
467
468public:
469 inline uint32_t getGpsEpheValid() { return mP4.mGpsEpheValid; }
470 inline uint32_t getGloEpheValid() { return mP4.mGloEpheValid; }
471 inline uint64_t getBdsEpheValid() { return mP4.mBdsEpheValid; }
472 inline uint64_t getGalEpheValid() { return mP4.mGalEpheValid; }
473 inline uint8_t getQzssEpheValid() { return mP4.mQzssEpheValid; }
474
475 SystemStatusPQWP4parser(const char *str_in, uint32_t len_in)
476 : SystemStatusNmeaBase(str_in, len_in)
477 {
478 if (mField.size() < eMax) {
479 return;
480 }
481 memset(&mP4, 0, sizeof(mP4));
Katz Yamada592b3f52017-03-14 11:13:23 -0700482 mP4.mGpsEpheValid = strtol(mField[eGpsEpheValid].c_str(), NULL, 16);
483 mP4.mGloEpheValid = strtol(mField[eGloEpheValid].c_str(), NULL, 16);
484 mP4.mBdsEpheValid = strtol(mField[eBdsEpheValid].c_str(), NULL, 16);
485 mP4.mGalEpheValid = strtol(mField[eGalEpheValid].c_str(), NULL, 16);
486 mP4.mQzssEpheValid = strtol(mField[eQzssEpheValid].c_str(), NULL, 16);
487 }
488
489 inline SystemStatusPQWP4& get() { return mP4;}
490};
491
492/******************************************************************************
493 SystemStatusPQWP5
494******************************************************************************/
495class SystemStatusPQWP5
496{
497public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700498 uint32_t mGpsUnknownMask;
499 uint32_t mGloUnknownMask;
500 uint64_t mBdsUnknownMask;
501 uint64_t mGalUnknownMask;
502 uint8_t mQzssUnknownMask;
503 uint32_t mGpsGoodMask;
504 uint32_t mGloGoodMask;
505 uint64_t mBdsGoodMask;
506 uint64_t mGalGoodMask;
507 uint8_t mQzssGoodMask;
508 uint32_t mGpsBadMask;
509 uint32_t mGloBadMask;
510 uint64_t mBdsBadMask;
511 uint64_t mGalBadMask;
512 uint8_t mQzssBadMask;
513};
514
515class SystemStatusPQWP5parser : public SystemStatusNmeaBase
516{
517private:
518 enum
519 {
520 eTalker = 0,
521 eUtcTime = 1,
522 eGpsUnknownMask = 2,
523 eGloUnknownMask = 3,
524 eBdsUnknownMask = 4,
525 eGalUnknownMask = 5,
526 eQzssUnknownMask = 6,
527 eGpsGoodMask = 7,
528 eGloGoodMask = 8,
529 eBdsGoodMask = 9,
530 eGalGoodMask = 10,
531 eQzssGoodMask = 11,
532 eGpsBadMask = 12,
533 eGloBadMask = 13,
534 eBdsBadMask = 14,
535 eGalBadMask = 15,
536 eQzssBadMask = 16,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700537 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700538 };
539 SystemStatusPQWP5 mP5;
540
541public:
542 inline uint32_t getGpsUnknownMask() { return mP5.mGpsUnknownMask; }
543 inline uint32_t getGloUnknownMask() { return mP5.mGloUnknownMask; }
544 inline uint64_t getBdsUnknownMask() { return mP5.mBdsUnknownMask; }
545 inline uint64_t getGalUnknownMask() { return mP5.mGalUnknownMask; }
546 inline uint8_t getQzssUnknownMask() { return mP5.mQzssUnknownMask; }
547 inline uint32_t getGpsGoodMask() { return mP5.mGpsGoodMask; }
548 inline uint32_t getGloGoodMask() { return mP5.mGloGoodMask; }
549 inline uint64_t getBdsGoodMask() { return mP5.mBdsGoodMask; }
550 inline uint64_t getGalGoodMask() { return mP5.mGalGoodMask; }
551 inline uint8_t getQzssGoodMask() { return mP5.mQzssGoodMask; }
552 inline uint32_t getGpsBadMask() { return mP5.mGpsBadMask; }
553 inline uint32_t getGloBadMask() { return mP5.mGloBadMask; }
554 inline uint64_t getBdsBadMask() { return mP5.mBdsBadMask; }
555 inline uint64_t getGalBadMask() { return mP5.mGalBadMask; }
556 inline uint8_t getQzssBadMask() { return mP5.mQzssBadMask; }
557
558 SystemStatusPQWP5parser(const char *str_in, uint32_t len_in)
559 : SystemStatusNmeaBase(str_in, len_in)
560 {
561 if (mField.size() < eMax) {
562 return;
563 }
564 memset(&mP5, 0, sizeof(mP5));
Katz Yamada592b3f52017-03-14 11:13:23 -0700565 mP5.mGpsUnknownMask = strtol(mField[eGpsUnknownMask].c_str(), NULL, 16);
566 mP5.mGloUnknownMask = strtol(mField[eGloUnknownMask].c_str(), NULL, 16);
567 mP5.mBdsUnknownMask = strtol(mField[eBdsUnknownMask].c_str(), NULL, 16);
568 mP5.mGalUnknownMask = strtol(mField[eGalUnknownMask].c_str(), NULL, 16);
569 mP5.mQzssUnknownMask = strtol(mField[eQzssUnknownMask].c_str(), NULL, 16);
570 mP5.mGpsGoodMask = strtol(mField[eGpsGoodMask].c_str(), NULL, 16);
571 mP5.mGloGoodMask = strtol(mField[eGloGoodMask].c_str(), NULL, 16);
572 mP5.mBdsGoodMask = strtol(mField[eBdsGoodMask].c_str(), NULL, 16);
573 mP5.mGalGoodMask = strtol(mField[eGalGoodMask].c_str(), NULL, 16);
574 mP5.mQzssGoodMask = strtol(mField[eQzssGoodMask].c_str(), NULL, 16);
575 mP5.mGpsBadMask = strtol(mField[eGpsBadMask].c_str(), NULL, 16);
576 mP5.mGloBadMask = strtol(mField[eGloBadMask].c_str(), NULL, 16);
577 mP5.mBdsBadMask = strtol(mField[eBdsBadMask].c_str(), NULL, 16);
578 mP5.mGalBadMask = strtol(mField[eGalBadMask].c_str(), NULL, 16);
579 mP5.mQzssBadMask = strtol(mField[eQzssBadMask].c_str(), NULL, 16);
580 }
581
582 inline SystemStatusPQWP5& get() { return mP5;}
583};
584
585/******************************************************************************
586 SystemStatusPQWP6parser
587******************************************************************************/
588class SystemStatusPQWP6
589{
590public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700591 uint32_t mFixInfoMask;
592};
593
594class SystemStatusPQWP6parser : public SystemStatusNmeaBase
595{
596private:
597 enum
598 {
599 eTalker = 0,
600 eUtcTime = 1,
601 eFixInfoMask = 2,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700602 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700603 };
604 SystemStatusPQWP6 mP6;
605
606public:
607 inline uint32_t getFixInfoMask() { return mP6.mFixInfoMask; }
608
609 SystemStatusPQWP6parser(const char *str_in, uint32_t len_in)
610 : SystemStatusNmeaBase(str_in, len_in)
611 {
612 if (mField.size() < eMax) {
613 return;
614 }
615 memset(&mP6, 0, sizeof(mP6));
Katz Yamada592b3f52017-03-14 11:13:23 -0700616 mP6.mFixInfoMask = strtol(mField[eFixInfoMask].c_str(), NULL, 16);
617 }
618
619 inline SystemStatusPQWP6& get() { return mP6;}
620};
621
622/******************************************************************************
Katz Yamada3eef3d72017-04-27 13:46:09 -0700623 SystemStatusPQWP7parser
624******************************************************************************/
625class SystemStatusPQWP7
626{
627public:
628 SystemStatusNav mNav[SV_ALL_NUM];
629};
630
631class SystemStatusPQWP7parser : public SystemStatusNmeaBase
632{
633private:
634 enum
635 {
636 eTalker = 0,
637 eUtcTime = 1,
638 eMax = 2 + SV_ALL_NUM*3
639 };
640 SystemStatusPQWP7 mP7;
641
642public:
643 SystemStatusPQWP7parser(const char *str_in, uint32_t len_in)
644 : SystemStatusNmeaBase(str_in, len_in)
645 {
646 if (mField.size() < eMax) {
Baili Feng4c9c7832017-07-03 21:00:31 +0800647 LOC_LOGE("PQWP7parser - invalid size=%zu", mField.size());
Katz Yamada3eef3d72017-04-27 13:46:09 -0700648 return;
649 }
650 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
651 mP7.mNav[i].mType = GnssEphemerisType(atoi(mField[i*3+2].c_str()));
652 mP7.mNav[i].mSource = GnssEphemerisSource(atoi(mField[i*3+3].c_str()));
653 mP7.mNav[i].mAgeSec = atoi(mField[i*3+4].c_str());
654 }
655 }
656
657 inline SystemStatusPQWP7& get() { return mP7;}
658};
659
660/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -0700661 SystemStatusPQWS1parser
662******************************************************************************/
663class SystemStatusPQWS1
664{
665public:
Katz Yamada592b3f52017-03-14 11:13:23 -0700666 uint32_t mFixInfoMask;
667 uint32_t mHepeLimit;
668};
669
670class SystemStatusPQWS1parser : public SystemStatusNmeaBase
671{
672private:
673 enum
674 {
675 eTalker = 0,
676 eUtcTime = 1,
677 eFixInfoMask = 2,
678 eHepeLimit = 3,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700679 eMax
Katz Yamada592b3f52017-03-14 11:13:23 -0700680 };
681 SystemStatusPQWS1 mS1;
682
683public:
684 inline uint16_t getFixInfoMask() { return mS1.mFixInfoMask; }
685 inline uint32_t getHepeLimit() { return mS1.mHepeLimit; }
686
687 SystemStatusPQWS1parser(const char *str_in, uint32_t len_in)
688 : SystemStatusNmeaBase(str_in, len_in)
689 {
690 if (mField.size() < eMax) {
691 return;
692 }
693 memset(&mS1, 0, sizeof(mS1));
Katz Yamada592b3f52017-03-14 11:13:23 -0700694 mS1.mFixInfoMask = atoi(mField[eFixInfoMask].c_str());
695 mS1.mHepeLimit = atoi(mField[eHepeLimit].c_str());
696 }
697
698 inline SystemStatusPQWS1& get() { return mS1;}
699};
700
701/******************************************************************************
702 SystemStatusTimeAndClock
703******************************************************************************/
704SystemStatusTimeAndClock::SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700705 mGpsWeek(nmea.mGpsWeek),
706 mGpsTowMs(nmea.mGpsTowMs),
707 mTimeValid(nmea.mTimeValid),
708 mTimeSource(nmea.mTimeSource),
709 mTimeUnc(nmea.mTimeUnc),
710 mClockFreqBias(nmea.mClockFreqBias),
Katz Yamada3eef3d72017-04-27 13:46:09 -0700711 mClockFreqBiasUnc(nmea.mClockFreqBiasUnc),
712 mLeapSeconds(nmea.mLeapSeconds),
713 mLeapSecUnc(nmea.mLeapSecUnc)
Katz Yamada592b3f52017-03-14 11:13:23 -0700714{
715}
716
717bool SystemStatusTimeAndClock::equals(SystemStatusTimeAndClock& peer)
718{
719 if ((mGpsWeek != peer.mGpsWeek) ||
720 (mGpsTowMs != peer.mGpsTowMs) ||
721 (mTimeValid != peer.mTimeValid) ||
722 (mTimeSource != peer.mTimeSource) ||
723 (mTimeUnc != peer.mTimeUnc) ||
724 (mClockFreqBias != peer.mClockFreqBias) ||
Katz Yamada3eef3d72017-04-27 13:46:09 -0700725 (mClockFreqBiasUnc != peer.mClockFreqBiasUnc) ||
726 (mLeapSeconds != peer.mLeapSeconds) ||
727 (mLeapSecUnc != peer.mLeapSecUnc)) {
Katz Yamada592b3f52017-03-14 11:13:23 -0700728 return false;
729 }
730 return true;
731}
732
733void SystemStatusTimeAndClock::dump()
734{
Katz Yamada3eef3d72017-04-27 13:46:09 -0700735 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 -0700736 mUtcTime.tv_sec, mUtcTime.tv_nsec,
737 mGpsWeek,
738 mGpsTowMs,
739 mTimeValid,
740 mTimeSource,
741 mTimeUnc,
742 mClockFreqBias,
Katz Yamada3eef3d72017-04-27 13:46:09 -0700743 mClockFreqBiasUnc,
744 mLeapSeconds,
745 mLeapSecUnc);
Katz Yamada592b3f52017-03-14 11:13:23 -0700746 return;
747}
748
749/******************************************************************************
750 SystemStatusXoState
751******************************************************************************/
752SystemStatusXoState::SystemStatusXoState(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700753 mXoState(nmea.mXoState)
754{
755}
756
757bool SystemStatusXoState::equals(SystemStatusXoState& peer)
758{
759 if (mXoState != peer.mXoState) {
760 return false;
761 }
762 return true;
763}
764
765void SystemStatusXoState::dump()
766{
767 LOC_LOGV("XoState: u=%ld:%ld x=%d",
768 mUtcTime.tv_sec, mUtcTime.tv_nsec,
769 mXoState);
770 return;
771}
772
773/******************************************************************************
774 SystemStatusRfAndParams
775******************************************************************************/
776SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700777 mPgaGain(nmea.mPgaGain),
778 mGpsBpAmpI(nmea.mGpsBpAmpI),
779 mGpsBpAmpQ(nmea.mGpsBpAmpQ),
780 mAdcI(nmea.mAdcI),
781 mAdcQ(nmea.mAdcQ),
782 mJammerGps(nmea.mJammerGps),
783 mJammerGlo(nmea.mJammerGlo),
784 mJammerBds(nmea.mJammerBds),
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700785 mJammerGal(nmea.mJammerGal),
786 mAgcGps(nmea.mAgcGps),
787 mAgcGlo(nmea.mAgcGlo),
788 mAgcBds(nmea.mAgcBds),
Katz Yamadafe173632017-09-14 15:04:24 -0700789 mAgcGal(nmea.mAgcGal),
790 mGloBpAmpI(nmea.mGloBpAmpI),
791 mGloBpAmpQ(nmea.mGloBpAmpQ),
792 mBdsBpAmpI(nmea.mBdsBpAmpI),
793 mBdsBpAmpQ(nmea.mBdsBpAmpQ),
794 mGalBpAmpI(nmea.mGalBpAmpI),
795 mGalBpAmpQ(nmea.mGalBpAmpQ)
Katz Yamada592b3f52017-03-14 11:13:23 -0700796{
797}
798
799bool SystemStatusRfAndParams::equals(SystemStatusRfAndParams& peer)
800{
801 if ((mPgaGain != peer.mPgaGain) ||
802 (mGpsBpAmpI != peer.mGpsBpAmpI) ||
803 (mGpsBpAmpQ != peer.mGpsBpAmpQ) ||
804 (mAdcI != peer.mAdcI) ||
805 (mAdcQ != peer.mAdcQ) ||
806 (mJammerGps != peer.mJammerGps) ||
807 (mJammerGlo != peer.mJammerGlo) ||
808 (mJammerBds != peer.mJammerBds) ||
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700809 (mJammerGal != peer.mJammerGal) ||
810 (mAgcGps != peer.mAgcGps) ||
811 (mAgcGlo != peer.mAgcGlo) ||
812 (mAgcBds != peer.mAgcBds) ||
Katz Yamadafe173632017-09-14 15:04:24 -0700813 (mAgcGal != peer.mAgcGal) ||
814 (mGloBpAmpI != peer.mGloBpAmpI) ||
815 (mGloBpAmpQ != peer.mGloBpAmpQ) ||
816 (mBdsBpAmpI != peer.mBdsBpAmpI) ||
817 (mBdsBpAmpQ != peer.mBdsBpAmpQ) ||
818 (mGalBpAmpI != peer.mGalBpAmpI) ||
819 (mGalBpAmpQ != peer.mGalBpAmpQ)) {
Katz Yamada592b3f52017-03-14 11:13:23 -0700820 return false;
821 }
822 return true;
823}
824
825void SystemStatusRfAndParams::dump()
826{
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700827 LOC_LOGV("RfAndParams: u=%ld:%ld p=%d bi=%d bq=%d ai=%d aq=%d "
828 "jgp=%d jgl=%d jbd=%d jga=%d "
829 "agp=%lf agl=%lf abd=%lf aga=%lf",
Katz Yamada592b3f52017-03-14 11:13:23 -0700830 mUtcTime.tv_sec, mUtcTime.tv_nsec,
831 mPgaGain,
832 mGpsBpAmpI,
833 mGpsBpAmpQ,
834 mAdcI,
835 mAdcQ,
836 mJammerGps,
837 mJammerGlo,
838 mJammerBds,
Mike Cailean3ad14ba2017-03-22 10:03:19 -0700839 mJammerGal,
840 mAgcGps,
841 mAgcGlo,
842 mAgcBds,
843 mAgcGal);
Katz Yamada592b3f52017-03-14 11:13:23 -0700844 return;
845}
846
847/******************************************************************************
848 SystemStatusErrRecovery
849******************************************************************************/
850SystemStatusErrRecovery::SystemStatusErrRecovery(const SystemStatusPQWM1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700851 mRecErrorRecovery(nmea.mRecErrorRecovery)
852{
853}
854
855bool SystemStatusErrRecovery::equals(SystemStatusErrRecovery& peer)
856{
857 if (mRecErrorRecovery != peer.mRecErrorRecovery) {
858 return false;
859 }
860 return true;
861}
862
863void SystemStatusErrRecovery::dump()
864{
865 LOC_LOGV("ErrRecovery: u=%ld:%ld e=%d",
866 mUtcTime.tv_sec, mUtcTime.tv_nsec,
867 mRecErrorRecovery);
868 return;
869}
870
871/******************************************************************************
872 SystemStatusInjectedPosition
873******************************************************************************/
874SystemStatusInjectedPosition::SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700875 mEpiValidity(nmea.mEpiValidity),
876 mEpiLat(nmea.mEpiLat),
877 mEpiLon(nmea.mEpiLon),
878 mEpiAlt(nmea.mEpiAlt),
879 mEpiHepe(nmea.mEpiHepe),
880 mEpiAltUnc(nmea.mEpiAltUnc),
881 mEpiSrc(nmea.mEpiSrc)
882{
883}
884
885bool SystemStatusInjectedPosition::equals(SystemStatusInjectedPosition& peer)
886{
887 if ((mEpiValidity != peer.mEpiValidity) ||
888 (mEpiLat != peer.mEpiLat) ||
889 (mEpiLon != peer.mEpiLon) ||
890 (mEpiAlt != peer.mEpiAlt) ||
891 (mEpiHepe != peer.mEpiHepe) ||
892 (mEpiAltUnc != peer.mEpiAltUnc) ||
893 (mEpiSrc != peer.mEpiSrc)) {
894 return false;
895 }
896 return true;
897}
898
899void SystemStatusInjectedPosition::dump()
900{
901 LOC_LOGV("InjectedPosition: u=%ld:%ld v=%x la=%f lo=%f al=%f he=%f au=%f es=%d",
902 mUtcTime.tv_sec, mUtcTime.tv_nsec,
903 mEpiValidity,
904 mEpiLat,
905 mEpiLon,
906 mEpiAlt,
907 mEpiHepe,
908 mEpiAltUnc,
909 mEpiSrc);
910 return;
911}
912
913/******************************************************************************
914 SystemStatusBestPosition
915******************************************************************************/
916SystemStatusBestPosition::SystemStatusBestPosition(const SystemStatusPQWP2& nmea) :
Katz Yamada58d74dc2017-06-06 10:04:43 -0700917 mValid(true),
Katz Yamada592b3f52017-03-14 11:13:23 -0700918 mBestLat(nmea.mBestLat),
919 mBestLon(nmea.mBestLon),
920 mBestAlt(nmea.mBestAlt),
921 mBestHepe(nmea.mBestHepe),
922 mBestAltUnc(nmea.mBestAltUnc)
923{
924}
925
926bool SystemStatusBestPosition::equals(SystemStatusBestPosition& peer)
927{
928 if ((mBestLat != peer.mBestLat) ||
929 (mBestLon != peer.mBestLon) ||
930 (mBestAlt != peer.mBestAlt) ||
931 (mBestHepe != peer.mBestHepe) ||
932 (mBestAltUnc != peer.mBestAltUnc)) {
933 return false;
934 }
935 return true;
936}
937
938void SystemStatusBestPosition::dump()
939{
940 LOC_LOGV("BestPosition: u=%ld:%ld la=%f lo=%f al=%f he=%f au=%f",
941 mUtcTime.tv_sec, mUtcTime.tv_nsec,
942 mBestLat,
943 mBestLon,
944 mBestAlt,
945 mBestHepe,
946 mBestAltUnc);
947 return;
948}
949
950/******************************************************************************
951 SystemStatusXtra
952******************************************************************************/
953SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -0700954 mXtraValidMask(nmea.mXtraValidMask),
955 mGpsXtraAge(nmea.mGpsXtraAge),
956 mGloXtraAge(nmea.mGloXtraAge),
957 mBdsXtraAge(nmea.mBdsXtraAge),
958 mGalXtraAge(nmea.mGalXtraAge),
959 mQzssXtraAge(nmea.mQzssXtraAge),
960 mGpsXtraValid(nmea.mGpsXtraValid),
961 mGloXtraValid(nmea.mGloXtraValid),
962 mBdsXtraValid(nmea.mBdsXtraValid),
963 mGalXtraValid(nmea.mGalXtraValid),
964 mQzssXtraValid(nmea.mQzssXtraValid)
965{
966}
967
968bool SystemStatusXtra::equals(SystemStatusXtra& peer)
969{
970 if ((mXtraValidMask != peer.mXtraValidMask) ||
971 (mGpsXtraAge != peer.mGpsXtraAge) ||
972 (mGloXtraAge != peer.mGloXtraAge) ||
973 (mBdsXtraAge != peer.mBdsXtraAge) ||
974 (mGalXtraAge != peer.mGalXtraAge) ||
975 (mQzssXtraAge != peer.mQzssXtraAge) ||
976 (mGpsXtraValid != peer.mGpsXtraValid) ||
977 (mGloXtraValid != peer.mGloXtraValid) ||
978 (mBdsXtraValid != peer.mBdsXtraValid) ||
979 (mGalXtraValid != peer.mGalXtraValid) ||
980 (mQzssXtraValid != peer.mQzssXtraValid)) {
981 return false;
982 }
983 return true;
984}
985
986void SystemStatusXtra::dump()
987{
Baili Feng4c9c7832017-07-03 21:00:31 +0800988 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 -0700989 mUtcTime.tv_sec, mUtcTime.tv_nsec,
990 mXtraValidMask,
991 mGpsXtraAge,
992 mGloXtraAge,
993 mBdsXtraAge,
994 mGalXtraAge,
995 mQzssXtraAge,
996 mGpsXtraValid,
997 mGloXtraValid,
998 mBdsXtraValid,
999 mGalXtraValid,
1000 mQzssXtraValid);
1001 return;
1002}
1003
1004/******************************************************************************
1005 SystemStatusEphemeris
1006******************************************************************************/
1007SystemStatusEphemeris::SystemStatusEphemeris(const SystemStatusPQWP4& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -07001008 mGpsEpheValid(nmea.mGpsEpheValid),
1009 mGloEpheValid(nmea.mGloEpheValid),
1010 mBdsEpheValid(nmea.mBdsEpheValid),
1011 mGalEpheValid(nmea.mGalEpheValid),
1012 mQzssEpheValid(nmea.mQzssEpheValid)
1013{
1014}
1015
1016bool SystemStatusEphemeris::equals(SystemStatusEphemeris& peer)
1017{
1018 if ((mGpsEpheValid != peer.mGpsEpheValid) ||
1019 (mGloEpheValid != peer.mGloEpheValid) ||
1020 (mBdsEpheValid != peer.mBdsEpheValid) ||
1021 (mGalEpheValid != peer.mGalEpheValid) ||
1022 (mQzssEpheValid != peer.mQzssEpheValid)) {
1023 return false;
1024 }
1025 return true;
1026}
1027
1028void SystemStatusEphemeris::dump()
1029{
Baili Feng4c9c7832017-07-03 21:00:31 +08001030 LOC_LOGV("Ephemeris: u=%ld:%ld ev=%x:%x:%" PRIx64 ":%" PRIx64 ":%x",
Katz Yamada592b3f52017-03-14 11:13:23 -07001031 mUtcTime.tv_sec, mUtcTime.tv_nsec,
1032 mGpsEpheValid,
1033 mGloEpheValid,
1034 mBdsEpheValid,
1035 mGalEpheValid,
1036 mQzssEpheValid);
1037 return;
1038}
1039
1040/******************************************************************************
1041 SystemStatusSvHealth
1042******************************************************************************/
1043SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -07001044 mGpsUnknownMask(nmea.mGpsUnknownMask),
1045 mGloUnknownMask(nmea.mGloUnknownMask),
1046 mBdsUnknownMask(nmea.mBdsUnknownMask),
1047 mGalUnknownMask(nmea.mGalUnknownMask),
1048 mQzssUnknownMask(nmea.mQzssUnknownMask),
1049 mGpsGoodMask(nmea.mGpsGoodMask),
1050 mGloGoodMask(nmea.mGloGoodMask),
1051 mBdsGoodMask(nmea.mBdsGoodMask),
1052 mGalGoodMask(nmea.mGalGoodMask),
1053 mQzssGoodMask(nmea.mQzssGoodMask),
1054 mGpsBadMask(nmea.mGpsBadMask),
1055 mGloBadMask(nmea.mGloBadMask),
1056 mBdsBadMask(nmea.mBdsBadMask),
1057 mGalBadMask(nmea.mGalBadMask),
1058 mQzssBadMask(nmea.mQzssBadMask)
1059{
1060}
1061
1062bool SystemStatusSvHealth::equals(SystemStatusSvHealth& peer)
1063{
1064 if ((mGpsUnknownMask != peer.mGpsUnknownMask) ||
1065 (mGloUnknownMask != peer.mGloUnknownMask) ||
1066 (mBdsUnknownMask != peer.mBdsUnknownMask) ||
1067 (mGalUnknownMask != peer.mGalUnknownMask) ||
1068 (mQzssUnknownMask != peer.mQzssUnknownMask) ||
1069 (mGpsGoodMask != peer.mGpsGoodMask) ||
1070 (mGloGoodMask != peer.mGloGoodMask) ||
1071 (mBdsGoodMask != peer.mBdsGoodMask) ||
1072 (mGalGoodMask != peer.mGalGoodMask) ||
1073 (mQzssGoodMask != peer.mQzssGoodMask) ||
1074 (mGpsBadMask != peer.mGpsBadMask) ||
1075 (mGloBadMask != peer.mGloBadMask) ||
1076 (mBdsBadMask != peer.mBdsBadMask) ||
1077 (mGalBadMask != peer.mGalBadMask) ||
1078 (mQzssBadMask != peer.mQzssBadMask)) {
1079 return false;
1080 }
1081 return true;
1082}
1083
1084void SystemStatusSvHealth::dump()
1085{
Baili Feng4c9c7832017-07-03 21:00:31 +08001086 LOC_LOGV("SvHealth: u=%ld:%ld \
1087 u=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \
1088 g=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \
1089 b=%x:%x:%" PRIx64 ":%" PRIx64 ":%x",
Katz Yamada592b3f52017-03-14 11:13:23 -07001090 mUtcTime.tv_sec, mUtcTime.tv_nsec,
1091 mGpsUnknownMask,
1092 mGloUnknownMask,
1093 mBdsUnknownMask,
1094 mGalUnknownMask,
1095 mQzssUnknownMask,
1096 mGpsGoodMask,
1097 mGloGoodMask,
1098 mBdsGoodMask,
1099 mGalGoodMask,
1100 mQzssGoodMask,
1101 mGpsBadMask,
1102 mGloBadMask,
1103 mBdsBadMask,
1104 mGalBadMask,
1105 mQzssBadMask);
1106 return;
1107}
1108
1109/******************************************************************************
1110 SystemStatusPdr
1111******************************************************************************/
1112SystemStatusPdr::SystemStatusPdr(const SystemStatusPQWP6& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -07001113 mFixInfoMask(nmea.mFixInfoMask)
1114{
1115}
1116
1117bool SystemStatusPdr::equals(SystemStatusPdr& peer)
1118{
1119 if (mFixInfoMask != peer.mFixInfoMask) {
1120 return false;
1121 }
1122 return true;
1123}
1124
1125void SystemStatusPdr::dump()
1126{
1127 LOC_LOGV("Pdr: u=%ld:%ld m=%x",
1128 mUtcTime.tv_sec, mUtcTime.tv_nsec,
1129 mFixInfoMask);
1130 return;
1131}
1132
1133/******************************************************************************
Katz Yamada3eef3d72017-04-27 13:46:09 -07001134 SystemStatusNavData
1135******************************************************************************/
1136SystemStatusNavData::SystemStatusNavData(const SystemStatusPQWP7& nmea)
1137{
1138 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
1139 mNav[i] = nmea.mNav[i];
1140 }
1141}
1142
1143bool SystemStatusNavData::equals(SystemStatusNavData& peer)
1144{
1145 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
1146 if ((mNav[i].mType != peer.mNav[i].mType) ||
1147 (mNav[i].mSource != peer.mNav[i].mSource) ||
1148 (mNav[i].mAgeSec != peer.mNav[i].mAgeSec)) {
1149 return false;
1150 }
1151 }
1152 return true;
1153}
1154
1155void SystemStatusNavData::dump()
1156{
1157 LOC_LOGV("NavData: u=%ld:%ld",
1158 mUtcTime.tv_sec, mUtcTime.tv_nsec);
1159 for (uint32_t i=0; i<SV_ALL_NUM; i++) {
1160 LOC_LOGV("i=%d type=%d src=%d age=%d",
1161 i, mNav[i].mType, mNav[i].mSource, mNav[i].mAgeSec);
1162 }
1163 return;
1164}
1165
1166/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -07001167 SystemStatusPositionFailure
1168******************************************************************************/
1169SystemStatusPositionFailure::SystemStatusPositionFailure(const SystemStatusPQWS1& nmea) :
Katz Yamada592b3f52017-03-14 11:13:23 -07001170 mFixInfoMask(nmea.mFixInfoMask),
1171 mHepeLimit(nmea.mHepeLimit)
1172{
1173}
1174
1175bool SystemStatusPositionFailure::equals(SystemStatusPositionFailure& peer)
1176{
1177 if ((mFixInfoMask != peer.mFixInfoMask) ||
1178 (mHepeLimit != peer.mHepeLimit)) {
1179 return false;
1180 }
1181 return true;
1182}
1183
1184void SystemStatusPositionFailure::dump()
1185{
1186 LOC_LOGV("PositionFailure: u=%ld:%ld m=%d h=%d",
1187 mUtcTime.tv_sec, mUtcTime.tv_nsec,
1188 mFixInfoMask,
1189 mHepeLimit);
1190 return;
1191}
1192
1193/******************************************************************************
Katz Yamada4ff6da42017-03-21 17:16:49 -07001194 SystemStatusLocation
1195******************************************************************************/
1196bool SystemStatusLocation::equals(SystemStatusLocation& peer)
1197{
1198 if ((mLocation.gpsLocation.latitude != peer.mLocation.gpsLocation.latitude) ||
1199 (mLocation.gpsLocation.longitude != peer.mLocation.gpsLocation.longitude) ||
1200 (mLocation.gpsLocation.altitude != peer.mLocation.gpsLocation.altitude)) {
1201 return false;
1202 }
1203 return true;
1204}
1205
1206void SystemStatusLocation::dump()
1207{
1208 LOC_LOGV("Location: lat=%f lon=%f alt=%f spd=%f",
1209 mLocation.gpsLocation.latitude,
1210 mLocation.gpsLocation.longitude,
1211 mLocation.gpsLocation.altitude,
1212 mLocation.gpsLocation.speed);
1213 return;
1214}
1215
1216/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -07001217 SystemStatus
1218******************************************************************************/
Harikrishnan Hariharanee2d6652017-08-11 15:13:38 +05301219pthread_mutex_t SystemStatus::mMutexSystemStatus = PTHREAD_MUTEX_INITIALIZER;
1220SystemStatus* SystemStatus::mInstance = NULL;
Katz Yamada592b3f52017-03-14 11:13:23 -07001221
Harikrishnan Hariharanee2d6652017-08-11 15:13:38 +05301222SystemStatus* SystemStatus::getInstance(const MsgTask* msgTask)
Katz Yamada592b3f52017-03-14 11:13:23 -07001223{
Harikrishnan Hariharanee2d6652017-08-11 15:13:38 +05301224 pthread_mutex_lock(&mMutexSystemStatus);
1225
1226 if (!mInstance) {
1227 // Instantiating for the first time. msgTask should not be NULL
1228 if (msgTask == NULL) {
1229 LOC_LOGE("SystemStatus: msgTask is NULL!!");
1230 pthread_mutex_unlock(&mMutexSystemStatus);
1231 return NULL;
1232 }
1233 mInstance = new (nothrow) SystemStatus(msgTask);
1234 LOC_LOGD("SystemStatus::getInstance:%p. Msgtask:%p", mInstance, msgTask);
1235 }
1236
1237 pthread_mutex_unlock(&mMutexSystemStatus);
1238 return mInstance;
1239}
1240
1241void SystemStatus::destroyInstance()
1242{
1243 delete mInstance;
1244 mInstance = NULL;
1245}
1246
1247IOsObserver* SystemStatus::getOsObserver()
1248{
1249 return &mSysStatusObsvr;
1250}
1251
1252SystemStatus::SystemStatus(const MsgTask* msgTask) :
Harikrishnan Hariharanff8b3172017-08-11 17:36:10 +05301253 mSysStatusObsvr(msgTask),
1254 mConnected(false)
Harikrishnan Hariharanee2d6652017-08-11 15:13:38 +05301255{
1256 int result = 0;
1257 ENTRY_LOG ();
Katz Yamada4ff6da42017-03-21 17:16:49 -07001258 mCache.mLocation.clear();
1259
Katz Yamada592b3f52017-03-14 11:13:23 -07001260 mCache.mTimeAndClock.clear();
1261 mCache.mXoState.clear();
1262 mCache.mRfAndParams.clear();
1263 mCache.mErrRecovery.clear();
1264
1265 mCache.mInjectedPosition.clear();
1266 mCache.mBestPosition.clear();
1267 mCache.mXtra.clear();
1268 mCache.mEphemeris.clear();
1269 mCache.mSvHealth.clear();
1270 mCache.mPdr.clear();
Katz Yamada3eef3d72017-04-27 13:46:09 -07001271 mCache.mNavData.clear();
1272
Katz Yamada592b3f52017-03-14 11:13:23 -07001273 mCache.mPositionFailure.clear();
Harikrishnan Hariharanee2d6652017-08-11 15:13:38 +05301274
1275 EXIT_LOG_WITH_ERROR ("%d",result);
Katz Yamada592b3f52017-03-14 11:13:23 -07001276}
1277
1278/******************************************************************************
1279 SystemStatus - M1 functions
1280******************************************************************************/
1281bool SystemStatus::setTimeAndCLock(const SystemStatusPQWM1& nmea)
1282{
1283 SystemStatusTimeAndClock s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001284 if (!mCache.mTimeAndClock.empty() && mCache.mTimeAndClock.back().equals(s)) {
1285 mCache.mTimeAndClock.back().mUtcReported = s.mUtcReported;
1286 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001287 mCache.mTimeAndClock.push_back(s);
1288 if (mCache.mTimeAndClock.size() > maxTimeAndClock) {
1289 mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin());
1290 }
1291 }
1292 return true;
1293}
1294
1295bool SystemStatus::setXoState(const SystemStatusPQWM1& nmea)
1296{
1297 SystemStatusXoState s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001298 if (!mCache.mXoState.empty() && mCache.mXoState.back().equals(s)) {
1299 mCache.mXoState.back().mUtcReported = s.mUtcReported;
1300 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001301 mCache.mXoState.push_back(s);
1302 if (mCache.mXoState.size() > maxXoState) {
1303 mCache.mXoState.erase(mCache.mXoState.begin());
1304 }
1305 }
1306 return true;
1307}
1308
1309bool SystemStatus::setRfAndParams(const SystemStatusPQWM1& nmea)
1310{
1311 SystemStatusRfAndParams s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001312 if (!mCache.mRfAndParams.empty() && mCache.mRfAndParams.back().equals(s)) {
1313 mCache.mRfAndParams.back().mUtcReported = s.mUtcReported;
1314 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001315 mCache.mRfAndParams.push_back(s);
1316 if (mCache.mRfAndParams.size() > maxRfAndParams) {
1317 mCache.mRfAndParams.erase(mCache.mRfAndParams.begin());
1318 }
1319 }
1320 return true;
1321}
1322
1323bool SystemStatus::setErrRecovery(const SystemStatusPQWM1& nmea)
1324{
1325 SystemStatusErrRecovery s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001326 if (!mCache.mErrRecovery.empty() && mCache.mErrRecovery.back().equals(s)) {
1327 mCache.mErrRecovery.back().mUtcReported = s.mUtcReported;
1328 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001329 mCache.mErrRecovery.push_back(s);
1330 if (mCache.mErrRecovery.size() > maxErrRecovery) {
1331 mCache.mErrRecovery.erase(mCache.mErrRecovery.begin());
1332 }
1333 }
1334 return true;
1335}
1336
1337/******************************************************************************
1338 SystemStatus - Px functions
1339******************************************************************************/
1340bool SystemStatus::setInjectedPosition(const SystemStatusPQWP1& nmea)
1341{
1342 SystemStatusInjectedPosition s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001343 if (!mCache.mInjectedPosition.empty() && mCache.mInjectedPosition.back().equals(s)) {
1344 mCache.mInjectedPosition.back().mUtcReported = s.mUtcReported;
1345 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001346 mCache.mInjectedPosition.push_back(s);
1347 if (mCache.mInjectedPosition.size() > maxInjectedPosition) {
1348 mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin());
1349 }
1350 }
1351 return true;
1352}
1353
1354bool SystemStatus::setBestPosition(const SystemStatusPQWP2& nmea)
1355{
1356 SystemStatusBestPosition s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001357 if (!mCache.mBestPosition.empty() && mCache.mBestPosition.back().equals(s)) {
1358 mCache.mBestPosition.back().mUtcReported = s.mUtcReported;
1359 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001360 mCache.mBestPosition.push_back(s);
1361 if (mCache.mBestPosition.size() > maxBestPosition) {
1362 mCache.mBestPosition.erase(mCache.mBestPosition.begin());
1363 }
1364 }
1365 return true;
1366}
1367
1368bool SystemStatus::setXtra(const SystemStatusPQWP3& nmea)
1369{
1370 SystemStatusXtra s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001371 if (!mCache.mXtra.empty() && mCache.mXtra.back().equals(s)) {
1372 mCache.mXtra.back().mUtcReported = s.mUtcReported;
1373 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001374 mCache.mXtra.push_back(s);
1375 if (mCache.mXtra.size() > maxXtra) {
1376 mCache.mXtra.erase(mCache.mXtra.begin());
1377 }
1378 }
1379 return true;
1380}
1381
1382bool SystemStatus::setEphemeris(const SystemStatusPQWP4& nmea)
1383{
1384 SystemStatusEphemeris s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001385 if (!mCache.mEphemeris.empty() && mCache.mEphemeris.back().equals(s)) {
1386 mCache.mEphemeris.back().mUtcReported = s.mUtcReported;
1387 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001388 mCache.mEphemeris.push_back(s);
1389 if (mCache.mEphemeris.size() > maxEphemeris) {
1390 mCache.mEphemeris.erase(mCache.mEphemeris.begin());
1391 }
1392 }
1393 return true;
1394}
1395
1396bool SystemStatus::setSvHealth(const SystemStatusPQWP5& nmea)
1397{
1398 SystemStatusSvHealth s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001399 if (!mCache.mSvHealth.empty() && mCache.mSvHealth.back().equals(s)) {
1400 mCache.mSvHealth.back().mUtcReported = s.mUtcReported;
1401 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001402 mCache.mSvHealth.push_back(s);
1403 if (mCache.mSvHealth.size() > maxSvHealth) {
1404 mCache.mSvHealth.erase(mCache.mSvHealth.begin());
1405 }
1406 }
1407 return true;
1408}
1409
1410bool SystemStatus::setPdr(const SystemStatusPQWP6& nmea)
1411{
1412 SystemStatusPdr s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001413 if (!mCache.mPdr.empty() && mCache.mPdr.back().equals(s)) {
1414 mCache.mPdr.back().mUtcReported = s.mUtcReported;
1415 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001416 mCache.mPdr.push_back(s);
1417 if (mCache.mPdr.size() > maxPdr) {
1418 mCache.mPdr.erase(mCache.mPdr.begin());
1419 }
1420 }
1421 return true;
1422}
1423
Katz Yamada3eef3d72017-04-27 13:46:09 -07001424bool SystemStatus::setNavData(const SystemStatusPQWP7& nmea)
1425{
1426 SystemStatusNavData s(nmea);
1427 if (!mCache.mNavData.empty() && mCache.mNavData.back().equals(s)) {
1428 mCache.mNavData.back().mUtcReported = s.mUtcReported;
1429 } else {
1430 mCache.mNavData.push_back(s);
1431 if (mCache.mNavData.size() > maxNavData) {
1432 mCache.mNavData.erase(mCache.mNavData.begin());
1433 }
1434 }
1435 return true;
1436}
1437
Katz Yamada592b3f52017-03-14 11:13:23 -07001438/******************************************************************************
1439 SystemStatus - Sx functions
1440******************************************************************************/
1441bool SystemStatus::setPositionFailure(const SystemStatusPQWS1& nmea)
1442{
1443 SystemStatusPositionFailure s(nmea);
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001444 if (!mCache.mPositionFailure.empty() && mCache.mPositionFailure.back().equals(s)) {
1445 mCache.mPositionFailure.back().mUtcReported = s.mUtcReported;
1446 } else {
Katz Yamada592b3f52017-03-14 11:13:23 -07001447 mCache.mPositionFailure.push_back(s);
1448 if (mCache.mPositionFailure.size() > maxPositionFailure) {
1449 mCache.mPositionFailure.erase(mCache.mPositionFailure.begin());
1450 }
1451 }
1452 return true;
1453}
1454
1455/******************************************************************************
Harikrishnan Hariharanff8b3172017-08-11 17:36:10 +05301456 SystemStatus - storing dataitems
1457******************************************************************************/
1458bool SystemStatus::setNetworkInfo(IDataItemCore* dataitem)
1459{
Harikrishnan Hariharan40284222017-09-05 17:52:32 +05301460 NetworkInfoDataItemBase* data = reinterpret_cast<NetworkInfoDataItemBase*>(dataitem);
Harikrishnan Hariharanff8b3172017-08-11 17:36:10 +05301461 SystemStatusNetworkInfo s(data->mType,data->mTypeName,data->mSubTypeName,
1462 data->mAvailable,data->mConnected,data->mRoaming);
1463 s.dump();
1464 mConnected = data->mConnected;
1465
1466 if (!mCache.mNetworkInfo.empty() && mCache.mNetworkInfo.back().equals(s)) {
1467 mCache.mNetworkInfo.back().mUtcReported = s.mUtcReported;
1468 } else {
1469 mCache.mNetworkInfo.push_back(s);
1470 if (mCache.mNetworkInfo.size() > maxNetworkInfo) {
1471 mCache.mNetworkInfo.erase(mCache.mNetworkInfo.begin());
1472 }
1473 }
1474 return true;
1475}
1476
1477/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -07001478@brief API to set report data into internal buffer
1479
1480@param[In] data pointer to the NMEA string
1481@param[In] len length of the NMEA string
1482
1483@return true when successfully done
1484******************************************************************************/
1485static uint32_t cnt = 0;
1486static uint32_t cnt_m1 = 0;
1487static uint32_t cnt_p1 = 0;
1488static uint32_t cnt_p2 = 0;
1489static uint32_t cnt_p3 = 0;
1490static uint32_t cnt_p4 = 0;
1491static uint32_t cnt_p5 = 0;
1492static uint32_t cnt_p6 = 0;
Katz Yamada3eef3d72017-04-27 13:46:09 -07001493static uint32_t cnt_p7 = 0;
Katz Yamada592b3f52017-03-14 11:13:23 -07001494static uint32_t cnt_s1 = 0;
1495
1496bool SystemStatus::setNmeaString(const char *data, uint32_t len)
1497{
1498 bool ret = false;
Kevin Tang8b98a562017-03-24 17:39:20 -07001499 if (!loc_nmea_is_debug(data, len)) {
Katz Yamada592b3f52017-03-14 11:13:23 -07001500 return false;
1501 }
1502
1503 char buf[SystemStatusNmeaBase::NMEA_MAXSIZE + 1] = { 0 };
Katz Yamada604d8742017-05-04 14:43:52 -07001504 strlcpy(buf, data, sizeof(buf));
Katz Yamada592b3f52017-03-14 11:13:23 -07001505
1506 pthread_mutex_lock(&mMutexSystemStatus);
1507
1508 // parse the received nmea strings here
1509 if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1510 SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get();
1511 ret = setTimeAndCLock(s);
1512 ret |= setXoState(s);
1513 ret |= setRfAndParams(s);
1514 ret |= setErrRecovery(s);
1515 cnt_m1++;
1516 }
1517 else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1518 ret = setInjectedPosition(SystemStatusPQWP1parser(buf, len).get());
1519 cnt_p1++;
1520 }
1521 else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1522 ret = setBestPosition(SystemStatusPQWP2parser(buf, len).get());
1523 cnt_p2++;
1524 }
1525 else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1526 ret = setXtra(SystemStatusPQWP3parser(buf, len).get());
1527 cnt_p3++;
1528 }
1529 else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1530 ret = setEphemeris(SystemStatusPQWP4parser(buf, len).get());
1531 cnt_p4++;
1532 }
1533 else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1534 ret = setSvHealth(SystemStatusPQWP5parser(buf, len).get());
1535 cnt_p5++;
1536 }
1537 else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1538 ret = setPdr(SystemStatusPQWP6parser(buf, len).get());
1539 cnt_p6++;
1540 }
Katz Yamada3eef3d72017-04-27 13:46:09 -07001541 else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1542 ret = setNavData(SystemStatusPQWP7parser(buf, len).get());
1543 cnt_p7++;
1544 }
Katz Yamada592b3f52017-03-14 11:13:23 -07001545 else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
1546 ret = setPositionFailure(SystemStatusPQWS1parser(buf, len).get());
1547 cnt_s1++;
1548 }
1549 else {
1550 // do nothing
1551 }
1552 cnt++;
Katz Yamada3eef3d72017-04-27 13:46:09 -07001553 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 -07001554 cnt,
1555 cnt_m1,
1556 cnt_p1,
1557 cnt_p2,
1558 cnt_p3,
1559 cnt_p4,
1560 cnt_p5,
1561 cnt_p6,
Katz Yamada3eef3d72017-04-27 13:46:09 -07001562 cnt_p7,
Katz Yamada592b3f52017-03-14 11:13:23 -07001563 cnt_s1);
1564
1565 pthread_mutex_unlock(&mMutexSystemStatus);
1566 return ret;
1567}
1568
1569/******************************************************************************
Katz Yamada4ff6da42017-03-21 17:16:49 -07001570@brief API to set report position data into internal buffer
1571
1572@param[In] UlpLocation
1573
1574@return true when successfully done
1575******************************************************************************/
1576bool SystemStatus::eventPosition(const UlpLocation& location,
1577 const GpsLocationExtended& locationEx)
1578{
Katz Yamadaf7a8f2c2017-04-10 16:16:46 -07001579 SystemStatusLocation s(location, locationEx);
Katz Yamada3eef3d72017-04-27 13:46:09 -07001580 if (!mCache.mLocation.empty() && mCache.mLocation.back().equals(s)) {
1581 mCache.mLocation.back().mUtcReported = s.mUtcReported;
1582 }
1583 else {
Katz Yamada4ff6da42017-03-21 17:16:49 -07001584 mCache.mLocation.push_back(s);
1585 if (mCache.mLocation.size() > maxLocation) {
1586 mCache.mLocation.erase(mCache.mLocation.begin());
1587 }
Katz Yamada4ff6da42017-03-21 17:16:49 -07001588 }
Katz Yamada3eef3d72017-04-27 13:46:09 -07001589 LOC_LOGV("eventPosition - lat=%f lon=%f alt=%f speed=%f",
1590 s.mLocation.gpsLocation.latitude,
1591 s.mLocation.gpsLocation.longitude,
1592 s.mLocation.gpsLocation.altitude,
1593 s.mLocation.gpsLocation.speed);
Katz Yamada4ff6da42017-03-21 17:16:49 -07001594 return true;
1595}
1596
1597/******************************************************************************
Harikrishnan Hariharanff8b3172017-08-11 17:36:10 +05301598@brief API to set report DataItem event into internal buffer
1599
1600@param[In] DataItem
1601
1602@return true when successfully done
1603******************************************************************************/
1604bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem)
1605{
1606 pthread_mutex_lock(&mMutexSystemStatus);
1607 switch(dataitem->getId())
1608 {
1609 case NETWORKINFO_DATA_ITEM_ID:
1610 setNetworkInfo(dataitem);
1611 break;
1612 }
1613 pthread_mutex_unlock(&mMutexSystemStatus);
1614 return true;
1615}
1616
1617/******************************************************************************
Katz Yamada592b3f52017-03-14 11:13:23 -07001618@brief API to get report data into a given buffer
1619
1620@param[In] reference to report buffer
1621@param[In] bool flag to identify latest only or entire buffer
1622
1623@return true when successfully done
1624******************************************************************************/
1625bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) const
1626{
1627 pthread_mutex_lock(&mMutexSystemStatus);
1628
1629 if (isLatestOnly) {
1630 // push back only the latest report and return it
Katz Yamada4ff6da42017-03-21 17:16:49 -07001631 report.mLocation.clear();
1632 if (mCache.mLocation.size() >= 1) {
1633 report.mLocation.push_back(mCache.mLocation.back());
1634 report.mLocation.back().dump();
1635 }
1636
Katz Yamada592b3f52017-03-14 11:13:23 -07001637 report.mTimeAndClock.clear();
1638 if (mCache.mTimeAndClock.size() >= 1) {
1639 report.mTimeAndClock.push_back(mCache.mTimeAndClock.back());
1640 report.mTimeAndClock.back().dump();
1641 }
1642 report.mXoState.clear();
1643 if (mCache.mXoState.size() >= 1) {
1644 report.mXoState.push_back(mCache.mXoState.back());
1645 report.mXoState.back().dump();
1646 }
1647 report.mRfAndParams.clear();
1648 if (mCache.mRfAndParams.size() >= 1) {
1649 report.mRfAndParams.push_back(mCache.mRfAndParams.back());
1650 report.mRfAndParams.back().dump();
1651 }
1652 report.mErrRecovery.clear();
1653 if (mCache.mErrRecovery.size() >= 1) {
1654 report.mErrRecovery.push_back(mCache.mErrRecovery.back());
1655 report.mErrRecovery.back().dump();
1656 }
1657
1658 report.mInjectedPosition.clear();
1659 if (mCache.mInjectedPosition.size() >= 1) {
1660 report.mInjectedPosition.push_back(mCache.mInjectedPosition.back());
1661 report.mInjectedPosition.back().dump();
1662 }
1663 report.mBestPosition.clear();
1664 if (mCache.mBestPosition.size() >= 1) {
1665 report.mBestPosition.push_back(mCache.mBestPosition.back());
1666 report.mBestPosition.back().dump();
1667 }
1668 report.mXtra.clear();
1669 if (mCache.mXtra.size() >= 1) {
1670 report.mXtra.push_back(mCache.mXtra.back());
1671 report.mXtra.back().dump();
1672 }
1673 report.mEphemeris.clear();
1674 if (mCache.mEphemeris.size() >= 1) {
1675 report.mEphemeris.push_back(mCache.mEphemeris.back());
1676 report.mEphemeris.back().dump();
1677 }
1678 report.mSvHealth.clear();
1679 if (mCache.mSvHealth.size() >= 1) {
1680 report.mSvHealth.push_back(mCache.mSvHealth.back());
1681 report.mSvHealth.back().dump();
1682 }
1683 report.mPdr.clear();
1684 if (mCache.mPdr.size() >= 1) {
1685 report.mPdr.push_back(mCache.mPdr.back());
1686 report.mPdr.back().dump();
1687 }
Katz Yamada3eef3d72017-04-27 13:46:09 -07001688 report.mNavData.clear();
1689 if (mCache.mNavData.size() >= 1) {
1690 report.mNavData.push_back(mCache.mNavData.back());
1691 report.mNavData.back().dump();
1692 }
1693
Katz Yamada592b3f52017-03-14 11:13:23 -07001694 report.mPositionFailure.clear();
1695 if (mCache.mPositionFailure.size() >= 1) {
1696 report.mPositionFailure.push_back(mCache.mPositionFailure.back());
1697 report.mPositionFailure.back().dump();
1698 }
1699 }
1700 else {
1701 // copy entire reports and return them
Katz Yamada4ff6da42017-03-21 17:16:49 -07001702 report.mLocation.clear();
1703
Katz Yamada592b3f52017-03-14 11:13:23 -07001704 report.mTimeAndClock.clear();
1705 report.mXoState.clear();
1706 report.mRfAndParams.clear();
1707 report.mErrRecovery.clear();
1708
1709 report.mInjectedPosition.clear();
1710 report.mBestPosition.clear();
1711 report.mXtra.clear();
1712 report.mEphemeris.clear();
1713 report.mSvHealth.clear();
1714 report.mPdr.clear();
Katz Yamada3eef3d72017-04-27 13:46:09 -07001715 report.mNavData.clear();
1716
Katz Yamada592b3f52017-03-14 11:13:23 -07001717 report.mPositionFailure.clear();
1718 report = mCache;
1719 }
1720
1721 pthread_mutex_unlock(&mMutexSystemStatus);
1722 return true;
1723}
1724
Katz Yamada58d74dc2017-06-06 10:04:43 -07001725/******************************************************************************
1726@brief API to set default report data
1727
1728@param[In] none
1729
1730@return true when successfully done
1731******************************************************************************/
1732bool SystemStatus::setDefaultReport(void)
1733{
1734 pthread_mutex_lock(&mMutexSystemStatus);
1735
1736 mCache.mLocation.push_back(SystemStatusLocation());
1737 if (mCache.mLocation.size() > maxLocation) {
1738 mCache.mLocation.erase(mCache.mLocation.begin());
1739 }
1740
1741 mCache.mTimeAndClock.push_back(SystemStatusTimeAndClock());
1742 if (mCache.mTimeAndClock.size() > maxTimeAndClock) {
1743 mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin());
1744 }
1745 mCache.mXoState.push_back(SystemStatusXoState());
1746 if (mCache.mXoState.size() > maxXoState) {
1747 mCache.mXoState.erase(mCache.mXoState.begin());
1748 }
1749 mCache.mRfAndParams.push_back(SystemStatusRfAndParams());
1750 if (mCache.mRfAndParams.size() > maxRfAndParams) {
1751 mCache.mRfAndParams.erase(mCache.mRfAndParams.begin());
1752 }
1753 mCache.mErrRecovery.push_back(SystemStatusErrRecovery());
1754 if (mCache.mErrRecovery.size() > maxErrRecovery) {
1755 mCache.mErrRecovery.erase(mCache.mErrRecovery.begin());
1756 }
1757
1758 mCache.mInjectedPosition.push_back(SystemStatusInjectedPosition());
1759 if (mCache.mInjectedPosition.size() > maxInjectedPosition) {
1760 mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin());
1761 }
1762 mCache.mBestPosition.push_back(SystemStatusBestPosition());
1763 if (mCache.mBestPosition.size() > maxBestPosition) {
1764 mCache.mBestPosition.erase(mCache.mBestPosition.begin());
1765 }
1766 mCache.mXtra.push_back(SystemStatusXtra());
1767 if (mCache.mXtra.size() > maxXtra) {
1768 mCache.mXtra.erase(mCache.mXtra.begin());
1769 }
1770 mCache.mEphemeris.push_back(SystemStatusEphemeris());
1771 if (mCache.mEphemeris.size() > maxEphemeris) {
1772 mCache.mEphemeris.erase(mCache.mEphemeris.begin());
1773 }
1774 mCache.mSvHealth.push_back(SystemStatusSvHealth());
1775 if (mCache.mSvHealth.size() > maxSvHealth) {
1776 mCache.mSvHealth.erase(mCache.mSvHealth.begin());
1777 }
1778 mCache.mPdr.push_back(SystemStatusPdr());
1779 if (mCache.mPdr.size() > maxPdr) {
1780 mCache.mPdr.erase(mCache.mPdr.begin());
1781 }
1782 mCache.mNavData.push_back(SystemStatusNavData());
1783 if (mCache.mNavData.size() > maxNavData) {
1784 mCache.mNavData.erase(mCache.mNavData.begin());
1785 }
1786
1787 mCache.mPositionFailure.push_back(SystemStatusPositionFailure());
1788 if (mCache.mPositionFailure.size() > maxPositionFailure) {
1789 mCache.mPositionFailure.erase(mCache.mPositionFailure.begin());
1790 }
1791
1792 pthread_mutex_unlock(&mMutexSystemStatus);
1793 return true;
1794}
1795
Harikrishnan Hariharanff8b3172017-08-11 17:36:10 +05301796/******************************************************************************
1797@brief API to handle connection status update event from GnssRil
1798
1799@param[In] Connection status
1800
1801@return true when successfully done
1802******************************************************************************/
Kevin Tangfb4bbe52017-09-07 20:15:26 -07001803bool SystemStatus::eventConnectionStatus(bool connected, int8_t type)
Harikrishnan Hariharanff8b3172017-08-11 17:36:10 +05301804{
1805 if (connected != mConnected) {
1806 mConnected = connected;
1807
1808 // send networkinof dataitem to systemstatus observer clients
1809 SystemStatusNetworkInfo s(type, "", "", false, connected, false);
1810 IDataItemCore *networkinfo =
1811 DataItemsFactoryProxy::createNewDataItem(NETWORKINFO_DATA_ITEM_ID);
1812 if (nullptr == networkinfo) {
1813 LOC_LOGE("Unable to create dataitemd");
1814 return false;
1815 }
1816 networkinfo->copy(&s);
1817 list<IDataItemCore*> dl(0);
1818 dl.push_back(networkinfo);
1819 mSysStatusObsvr.notify(dl);
1820 }
1821 return true;
1822}
1823
Katz Yamada592b3f52017-03-14 11:13:23 -07001824} // namespace loc_core
1825