SystemStatus.cpp 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042
  1. /* Copyright (c) 2017-2021, 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. /*
  30. Changes from Qualcomm Innovation Center are provided under the following license:
  31. Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  32. Redistribution and use in source and binary forms, with or without
  33. modification, are permitted (subject to the limitations in the
  34. disclaimer below) provided that the following conditions are met:
  35. * Redistributions of source code must retain the above copyright
  36. notice, this list of conditions and the following disclaimer.
  37. * Redistributions in binary form must reproduce the above
  38. copyright notice, this list of conditions and the following
  39. disclaimer in the documentation and/or other materials provided
  40. with the distribution.
  41. * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
  42. contributors may be used to endorse or promote products derived
  43. from this software without specific prior written permission.
  44. NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
  45. GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
  46. HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
  47. WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  48. MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  49. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  50. ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  51. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  52. GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  53. INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
  54. IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  55. OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  56. IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  57. */
  58. #define LOG_TAG "LocSvc_SystemStatus"
  59. #include <inttypes.h>
  60. #include <string>
  61. #include <stdlib.h>
  62. #include <string.h>
  63. #include <sys/time.h>
  64. #include <pthread.h>
  65. #include <loc_pla.h>
  66. #include <log_util.h>
  67. #include <loc_nmea.h>
  68. #include <DataItemsFactoryProxy.h>
  69. #include <SystemStatus.h>
  70. #include <SystemStatusOsObserver.h>
  71. #include <DataItemConcreteTypes.h>
  72. namespace loc_core
  73. {
  74. /******************************************************************************
  75. SystemStatusNmeaBase - base class for all NMEA parsers
  76. ******************************************************************************/
  77. class SystemStatusNmeaBase
  78. {
  79. protected:
  80. std::vector<std::string> mField;
  81. SystemStatusNmeaBase(const char *str_in, uint32_t len_in)
  82. {
  83. // check size and talker
  84. if (!loc_nmea_is_debug(str_in, len_in)) {
  85. return;
  86. }
  87. std::string parser(str_in);
  88. std::string::size_type index = 0;
  89. // verify checksum field
  90. index = parser.find("*");
  91. if (index == std::string::npos) {
  92. return;
  93. }
  94. parser[index] = ',';
  95. // tokenize parser
  96. while (1) {
  97. std::string str;
  98. index = parser.find(",");
  99. if (index == std::string::npos) {
  100. break;
  101. }
  102. str = parser.substr(0, index);
  103. parser = parser.substr(index + 1);
  104. mField.push_back(str);
  105. }
  106. }
  107. virtual ~SystemStatusNmeaBase() { }
  108. public:
  109. static const uint32_t NMEA_MINSIZE = DEBUG_NMEA_MINSIZE;
  110. static const uint32_t NMEA_MAXSIZE = DEBUG_NMEA_MAXSIZE;
  111. };
  112. /******************************************************************************
  113. SystemStatusPQWM1
  114. ******************************************************************************/
  115. class SystemStatusPQWM1
  116. {
  117. public:
  118. uint16_t mGpsWeek; // x1
  119. uint32_t mGpsTowMs; // x2
  120. uint8_t mTimeValid; // x3
  121. uint8_t mTimeSource; // x4
  122. int32_t mTimeUnc; // x5
  123. int32_t mClockFreqBias; // x6
  124. int32_t mClockFreqBiasUnc; // x7
  125. uint8_t mXoState; // x8
  126. int32_t mPgaGain; // x9
  127. uint32_t mGpsBpAmpI; // xA
  128. uint32_t mGpsBpAmpQ; // xB
  129. uint32_t mAdcI; // xC
  130. uint32_t mAdcQ; // xD
  131. uint32_t mJammerGps; // xE
  132. uint32_t mJammerGlo; // xF
  133. uint32_t mJammerBds; // x10
  134. uint32_t mJammerGal; // x11
  135. uint32_t mRecErrorRecovery; // x12
  136. uint32_t mAgcGps; // x13
  137. uint32_t mAgcGlo; // x14
  138. uint32_t mAgcBds; // x15
  139. uint32_t mAgcGal; // x16
  140. int32_t mLeapSeconds;// x17
  141. int32_t mLeapSecUnc; // x18
  142. uint32_t mGloBpAmpI; // x19
  143. uint32_t mGloBpAmpQ; // x1A
  144. uint32_t mBdsBpAmpI; // x1B
  145. uint32_t mBdsBpAmpQ; // x1C
  146. uint32_t mGalBpAmpI; // x1D
  147. uint32_t mGalBpAmpQ; // x1E
  148. uint64_t mTimeUncNs; // x1F
  149. uint32_t mJammedSignalsMask;
  150. std::vector<GnssJammerData> mJammerData;
  151. SystemStatusPQWM1(const GnssEngineDebugDataInfo& info);
  152. SystemStatusPQWM1() = default;
  153. };
  154. SystemStatusPQWM1::SystemStatusPQWM1(const GnssEngineDebugDataInfo& info) {
  155. mGpsWeek = info.gpsWeek;
  156. mGpsTowMs = info.gpsTowMs;
  157. mTimeValid = info.timeValid;
  158. mTimeSource = info.sourceOfTime;
  159. mTimeUnc = info.clkTimeUnc;
  160. mClockFreqBias = info.clkFreqBias;
  161. mClockFreqBiasUnc = info.clkFreqUnc;
  162. mXoState = info.xoState;
  163. mRecErrorRecovery = info.rcvrErrRecovery;
  164. if (info.jammerData.size() > 0) {
  165. mJammerGps = info.jammerData[GNSS_LOC_SIGNAL_TYPE_GPS_L1CA].jammerInd;
  166. mJammerGlo = info.jammerData[GNSS_LOC_SIGNAL_TYPE_GLONASS_G1].jammerInd;
  167. mJammerBds = info.jammerData[GNSS_LOC_SIGNAL_TYPE_BEIDOU_B1_I].jammerInd;
  168. mJammerGal = info.jammerData[GNSS_LOC_SIGNAL_TYPE_GALILEO_E1_C].jammerInd;
  169. mAgcGps = info.jammerData[GNSS_LOC_SIGNAL_TYPE_GPS_L1CA].agc;
  170. mAgcGlo = info.jammerData[GNSS_LOC_SIGNAL_TYPE_GLONASS_G1].agc;
  171. mAgcBds = info.jammerData[GNSS_LOC_SIGNAL_TYPE_BEIDOU_B1_I].agc;
  172. mAgcGal = info.jammerData[GNSS_LOC_SIGNAL_TYPE_GALILEO_E1_C].agc;
  173. }
  174. mLeapSeconds = info.leapSecondInfo.leapSec;
  175. mLeapSecUnc = info.leapSecondInfo.leapSecUnc;
  176. mTimeUncNs = info.clkTimeUnc * 1000000LL;
  177. mJammedSignalsMask = info.jammedSignalsMask;
  178. mJammerData = std::move(info.jammerData);
  179. }
  180. // parser
  181. class SystemStatusPQWM1parser : public SystemStatusNmeaBase
  182. {
  183. private:
  184. enum
  185. {
  186. eTalker = 0,
  187. eGpsWeek = 1,
  188. eGpsTowMs = 2,
  189. eTimeValid = 3,
  190. eTimeSource = 4,
  191. eTimeUnc = 5,
  192. eClockFreqBias = 6,
  193. eClockFreqBiasUnc = 7,
  194. eXoState = 8,
  195. ePgaGain = 9,
  196. eGpsBpAmpI = 10,
  197. eGpsBpAmpQ = 11,
  198. eAdcI = 12,
  199. eAdcQ = 13,
  200. eJammerGps = 14,
  201. eJammerGlo = 15,
  202. eJammerBds = 16,
  203. eJammerGal = 17,
  204. eRecErrorRecovery = 18,
  205. eAgcGps = 19,
  206. eAgcGlo = 20,
  207. eAgcBds = 21,
  208. eAgcGal = 22,
  209. eMax0 = eAgcGal,
  210. eLeapSeconds = 23,
  211. eLeapSecUnc = 24,
  212. eGloBpAmpI = 25,
  213. eGloBpAmpQ = 26,
  214. eBdsBpAmpI = 27,
  215. eBdsBpAmpQ = 28,
  216. eGalBpAmpI = 29,
  217. eGalBpAmpQ = 30,
  218. eTimeUncNs = 31,
  219. eMax
  220. };
  221. SystemStatusPQWM1 mM1;
  222. public:
  223. inline uint16_t getGpsWeek() { return mM1.mGpsWeek; }
  224. inline uint32_t getGpsTowMs() { return mM1.mGpsTowMs; }
  225. inline uint8_t getTimeValid() { return mM1.mTimeValid; }
  226. inline uint8_t getTimeSource() { return mM1.mTimeSource; }
  227. inline int32_t getTimeUnc() { return mM1.mTimeUnc; }
  228. inline int32_t getClockFreqBias() { return mM1.mClockFreqBias; }
  229. inline int32_t getClockFreqBiasUnc() { return mM1.mClockFreqBiasUnc; }
  230. inline uint8_t getXoState() { return mM1.mXoState;}
  231. inline int32_t getPgaGain() { return mM1.mPgaGain; }
  232. inline uint32_t getGpsBpAmpI() { return mM1.mGpsBpAmpI; }
  233. inline uint32_t getGpsBpAmpQ() { return mM1.mGpsBpAmpQ; }
  234. inline uint32_t getAdcI() { return mM1.mAdcI; }
  235. inline uint32_t getAdcQ() { return mM1.mAdcQ; }
  236. inline uint32_t getJammerGps() { return mM1.mJammerGps; }
  237. inline uint32_t getJammerGlo() { return mM1.mJammerGlo; }
  238. inline uint32_t getJammerBds() { return mM1.mJammerBds; }
  239. inline uint32_t getJammerGal() { return mM1.mJammerGal; }
  240. inline uint32_t getAgcGps() { return mM1.mAgcGps; }
  241. inline uint32_t getAgcGlo() { return mM1.mAgcGlo; }
  242. inline uint32_t getAgcBds() { return mM1.mAgcBds; }
  243. inline uint32_t getAgcGal() { return mM1.mAgcGal; }
  244. inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; }
  245. inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; }
  246. inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; }
  247. inline uint32_t getGloBpAmpI() { return mM1.mGloBpAmpI; }
  248. inline uint32_t getGloBpAmpQ() { return mM1.mGloBpAmpQ; }
  249. inline uint32_t getBdsBpAmpI() { return mM1.mBdsBpAmpI; }
  250. inline uint32_t getBdsBpAmpQ() { return mM1.mBdsBpAmpQ; }
  251. inline uint32_t getGalBpAmpI() { return mM1.mGalBpAmpI; }
  252. inline uint32_t getGalBpAmpQ() { return mM1.mGalBpAmpQ; }
  253. inline uint64_t getTimeUncNs() { return mM1.mTimeUncNs; }
  254. SystemStatusPQWM1parser(const char *str_in, uint32_t len_in)
  255. : SystemStatusNmeaBase(str_in, len_in)
  256. {
  257. memset(&mM1, 0, sizeof(mM1));
  258. if (mField.size() <= eMax0) {
  259. LOC_LOGE("PQWM1parser - invalid size=%zu", mField.size());
  260. mM1.mTimeValid = 0;
  261. return;
  262. }
  263. mM1.mGpsWeek = atoi(mField[eGpsWeek].c_str());
  264. mM1.mGpsTowMs = atoi(mField[eGpsTowMs].c_str());
  265. mM1.mTimeValid = atoi(mField[eTimeValid].c_str());
  266. mM1.mTimeSource = atoi(mField[eTimeSource].c_str());
  267. mM1.mTimeUnc = atoi(mField[eTimeUnc].c_str());
  268. mM1.mClockFreqBias = atoi(mField[eClockFreqBias].c_str());
  269. mM1.mClockFreqBiasUnc = atoi(mField[eClockFreqBiasUnc].c_str());
  270. mM1.mXoState = atoi(mField[eXoState].c_str());
  271. mM1.mPgaGain = atoi(mField[ePgaGain].c_str());
  272. mM1.mGpsBpAmpI = atoi(mField[eGpsBpAmpI].c_str());
  273. mM1.mGpsBpAmpQ = atoi(mField[eGpsBpAmpQ].c_str());
  274. mM1.mAdcI = atoi(mField[eAdcI].c_str());
  275. mM1.mAdcQ = atoi(mField[eAdcQ].c_str());
  276. mM1.mJammerGps = atoi(mField[eJammerGps].c_str());
  277. mM1.mJammerGlo = atoi(mField[eJammerGlo].c_str());
  278. mM1.mJammerBds = atoi(mField[eJammerBds].c_str());
  279. mM1.mJammerGal = atoi(mField[eJammerGal].c_str());
  280. mM1.mRecErrorRecovery = atoi(mField[eRecErrorRecovery].c_str());
  281. // convert agc db scale to 0.01 db
  282. mM1.mAgcGps = (uint32_t)(atof(mField[eAgcGps].c_str()) * 100);
  283. mM1.mAgcGlo = (uint32_t)(atof(mField[eAgcGlo].c_str()) * 100);
  284. mM1.mAgcBds = (uint32_t)(atof(mField[eAgcBds].c_str()) * 100);
  285. mM1.mAgcGal = (uint32_t)(atof(mField[eAgcGal].c_str()) * 100);
  286. if (mField.size() > eLeapSecUnc) {
  287. mM1.mLeapSeconds = atoi(mField[eLeapSeconds].c_str());
  288. mM1.mLeapSecUnc = atoi(mField[eLeapSecUnc].c_str());
  289. }
  290. if (mField.size() > eGalBpAmpQ) {
  291. mM1.mGloBpAmpI = atoi(mField[eGloBpAmpI].c_str());
  292. mM1.mGloBpAmpQ = atoi(mField[eGloBpAmpQ].c_str());
  293. mM1.mBdsBpAmpI = atoi(mField[eBdsBpAmpI].c_str());
  294. mM1.mBdsBpAmpQ = atoi(mField[eBdsBpAmpQ].c_str());
  295. mM1.mGalBpAmpI = atoi(mField[eGalBpAmpI].c_str());
  296. mM1.mGalBpAmpQ = atoi(mField[eGalBpAmpQ].c_str());
  297. }
  298. if (mField.size() > eTimeUncNs) {
  299. mM1.mTimeUncNs = strtoull(mField[eTimeUncNs].c_str(), nullptr, 10);
  300. }
  301. }
  302. inline SystemStatusPQWM1& get() { return mM1;} //getparser
  303. };
  304. /******************************************************************************
  305. SystemStatusPQWP1
  306. ******************************************************************************/
  307. class SystemStatusPQWP1
  308. {
  309. public:
  310. uint8_t mEpiValidity; // x4
  311. float mEpiLat; // x5
  312. float mEpiLon; // x6
  313. float mEpiAlt; // x7
  314. float mEpiHepe; // x8
  315. float mEpiAltUnc; // x9
  316. uint8_t mEpiSrc; // x10
  317. SystemStatusPQWP1() = default;
  318. SystemStatusPQWP1(const GnssEngineDebugDataInfo& info);
  319. };
  320. SystemStatusPQWP1::SystemStatusPQWP1(const GnssEngineDebugDataInfo& info) {
  321. mEpiValidity = info.epiValidity;
  322. mEpiLat = info.epiLat;
  323. mEpiLon = info.epiLon;
  324. mEpiAlt = info.epiAlt;
  325. mEpiHepe = info.epiHepe;
  326. mEpiAltUnc = info.epiAltUnc;
  327. mEpiSrc = info.epiSrc;
  328. }
  329. class SystemStatusPQWP1parser : public SystemStatusNmeaBase
  330. {
  331. private:
  332. enum
  333. {
  334. eTalker = 0,
  335. eUtcTime = 1,
  336. eEpiValidity = 2,
  337. eEpiLat = 3,
  338. eEpiLon = 4,
  339. eEpiAlt = 5,
  340. eEpiHepe = 6,
  341. eEpiAltUnc = 7,
  342. eEpiSrc = 8,
  343. eMax
  344. };
  345. SystemStatusPQWP1 mP1;
  346. public:
  347. inline uint8_t getEpiValidity() { return mP1.mEpiValidity; }
  348. inline float getEpiLat() { return mP1.mEpiLat; }
  349. inline float getEpiLon() { return mP1.mEpiLon; }
  350. inline float getEpiAlt() { return mP1.mEpiAlt; }
  351. inline float getEpiHepe() { return mP1.mEpiHepe; }
  352. inline float getEpiAltUnc() { return mP1.mEpiAltUnc; }
  353. inline uint8_t getEpiSrc() { return mP1.mEpiSrc; }
  354. SystemStatusPQWP1parser(const char *str_in, uint32_t len_in)
  355. : SystemStatusNmeaBase(str_in, len_in)
  356. {
  357. if (mField.size() < eMax) {
  358. return;
  359. }
  360. memset(&mP1, 0, sizeof(mP1));
  361. mP1.mEpiValidity = strtol(mField[eEpiValidity].c_str(), NULL, 16);
  362. mP1.mEpiLat = atof(mField[eEpiLat].c_str());
  363. mP1.mEpiLon = atof(mField[eEpiLon].c_str());
  364. mP1.mEpiAlt = atof(mField[eEpiAlt].c_str());
  365. mP1.mEpiHepe = atoi(mField[eEpiHepe].c_str());
  366. mP1.mEpiAltUnc = atof(mField[eEpiAltUnc].c_str());
  367. mP1.mEpiSrc = atoi(mField[eEpiSrc].c_str());
  368. }
  369. inline SystemStatusPQWP1& get() { return mP1;}
  370. };
  371. /******************************************************************************
  372. SystemStatusPQWP2
  373. ******************************************************************************/
  374. class SystemStatusPQWP2
  375. {
  376. public:
  377. float mBestLat; // x4
  378. float mBestLon; // x5
  379. float mBestAlt; // x6
  380. float mBestHepe; // x7
  381. float mBestAltUnc; // x8
  382. SystemStatusPQWP2() = default;
  383. SystemStatusPQWP2(const GnssEngineDebugDataInfo& info);
  384. };
  385. SystemStatusPQWP2::SystemStatusPQWP2(const GnssEngineDebugDataInfo& info){
  386. mBestLat = info.bestPosLat;
  387. mBestLon = info.bestPosLon;
  388. mBestAlt = info.bestPosAlt;
  389. mBestHepe = info.bestPosHepe;
  390. mBestAltUnc = info.bestPosAltUnc;
  391. }
  392. class SystemStatusPQWP2parser : public SystemStatusNmeaBase
  393. {
  394. private:
  395. enum
  396. {
  397. eTalker = 0,
  398. eUtcTime = 1,
  399. eBestLat = 2,
  400. eBestLon = 3,
  401. eBestAlt = 4,
  402. eBestHepe = 5,
  403. eBestAltUnc = 6,
  404. eMax
  405. };
  406. SystemStatusPQWP2 mP2;
  407. public:
  408. inline float getBestLat() { return mP2.mBestLat; }
  409. inline float getBestLon() { return mP2.mBestLon; }
  410. inline float getBestAlt() { return mP2.mBestAlt; }
  411. inline float getBestHepe() { return mP2.mBestHepe; }
  412. inline float getBestAltUnc() { return mP2.mBestAltUnc; }
  413. SystemStatusPQWP2parser(const char *str_in, uint32_t len_in)
  414. : SystemStatusNmeaBase(str_in, len_in)
  415. {
  416. if (mField.size() < eMax) {
  417. return;
  418. }
  419. memset(&mP2, 0, sizeof(mP2));
  420. mP2.mBestLat = atof(mField[eBestLat].c_str());
  421. mP2.mBestLon = atof(mField[eBestLon].c_str());
  422. mP2.mBestAlt = atof(mField[eBestAlt].c_str());
  423. mP2.mBestHepe = atof(mField[eBestHepe].c_str());
  424. mP2.mBestAltUnc = atof(mField[eBestAltUnc].c_str());
  425. }
  426. inline SystemStatusPQWP2& get() { return mP2;}
  427. };
  428. /******************************************************************************
  429. SystemStatusPQWP3
  430. ******************************************************************************/
  431. class SystemStatusPQWP3
  432. {
  433. public:
  434. uint8_t mXtraValidMask;
  435. uint32_t mGpsXtraAge;
  436. uint32_t mGloXtraAge;
  437. uint32_t mBdsXtraAge;
  438. uint32_t mGalXtraAge;
  439. uint32_t mQzssXtraAge;
  440. uint32_t mNavicXtraAge;
  441. uint32_t mGpsXtraValid;
  442. uint32_t mGloXtraValid;
  443. uint64_t mBdsXtraValid;
  444. uint64_t mGalXtraValid;
  445. uint8_t mQzssXtraValid;
  446. uint32_t mNavicXtraValid;
  447. SystemStatusPQWP3() = default;
  448. SystemStatusPQWP3(const GnssEngineDebugDataInfo& info);
  449. };
  450. SystemStatusPQWP3::SystemStatusPQWP3(const GnssEngineDebugDataInfo& info){
  451. mXtraValidMask = info.xtraValidMask;
  452. mGpsXtraAge = info.gpsXtraAge;
  453. mGloXtraAge = info.gloXtraAge;
  454. mBdsXtraAge = info.bdsXtraAge;
  455. mGalXtraAge = info.galXtraAge;
  456. mQzssXtraAge = info.qzssXtraAge;
  457. mNavicXtraAge = info.navicXtraAge;
  458. mGpsXtraValid = info.gpsXtraMask;
  459. mGloXtraValid = info.gloXtraMask;
  460. mBdsXtraValid = info.gloXtraMask;
  461. mGalXtraValid = info.galXtraMask;
  462. mQzssXtraValid = info.qzssXtraMask;
  463. mNavicXtraValid = info.navicXtraMask;
  464. }
  465. class SystemStatusPQWP3parser : public SystemStatusNmeaBase
  466. {
  467. private:
  468. // todo: update for navic once available
  469. enum
  470. {
  471. eTalker = 0,
  472. eUtcTime = 1,
  473. eXtraValidMask = 2,
  474. eGpsXtraAge = 3,
  475. eGloXtraAge = 4,
  476. eBdsXtraAge = 5,
  477. eGalXtraAge = 6,
  478. eQzssXtraAge = 7,
  479. eGpsXtraValid = 8,
  480. eGloXtraValid = 9,
  481. eBdsXtraValid = 10,
  482. eGalXtraValid = 11,
  483. eQzssXtraValid = 12,
  484. eMax
  485. };
  486. SystemStatusPQWP3 mP3;
  487. public:
  488. inline uint8_t getXtraValid() { return mP3.mXtraValidMask; }
  489. inline uint32_t getGpsXtraAge() { return mP3.mGpsXtraAge; }
  490. inline uint32_t getGloXtraAge() { return mP3.mGloXtraAge; }
  491. inline uint32_t getBdsXtraAge() { return mP3.mBdsXtraAge; }
  492. inline uint32_t getGalXtraAge() { return mP3.mGalXtraAge; }
  493. inline uint32_t getQzssXtraAge() { return mP3.mQzssXtraAge; }
  494. inline uint32_t getNavicXtraAge() { return mP3.mNavicXtraAge; }
  495. inline uint32_t getGpsXtraValid() { return mP3.mGpsXtraValid; }
  496. inline uint32_t getGloXtraValid() { return mP3.mGloXtraValid; }
  497. inline uint64_t getBdsXtraValid() { return mP3.mBdsXtraValid; }
  498. inline uint64_t getGalXtraValid() { return mP3.mGalXtraValid; }
  499. inline uint8_t getQzssXtraValid() { return mP3.mQzssXtraValid; }
  500. inline uint32_t getNavicXtraValid() { return mP3.mNavicXtraValid; }
  501. SystemStatusPQWP3parser(const char *str_in, uint32_t len_in)
  502. : SystemStatusNmeaBase(str_in, len_in)
  503. {
  504. if (mField.size() < eMax) {
  505. return;
  506. }
  507. memset(&mP3, 0, sizeof(mP3));
  508. // todo: update for navic once available
  509. mP3.mXtraValidMask = strtol(mField[eXtraValidMask].c_str(), NULL, 16);
  510. mP3.mGpsXtraAge = atoi(mField[eGpsXtraAge].c_str());
  511. mP3.mGloXtraAge = atoi(mField[eGloXtraAge].c_str());
  512. mP3.mBdsXtraAge = atoi(mField[eBdsXtraAge].c_str());
  513. mP3.mGalXtraAge = atoi(mField[eGalXtraAge].c_str());
  514. mP3.mQzssXtraAge = atoi(mField[eQzssXtraAge].c_str());
  515. mP3.mGpsXtraValid = strtol(mField[eGpsXtraValid].c_str(), NULL, 16);
  516. mP3.mGloXtraValid = strtol(mField[eGloXtraValid].c_str(), NULL, 16);
  517. mP3.mBdsXtraValid = strtol(mField[eBdsXtraValid].c_str(), NULL, 16);
  518. mP3.mGalXtraValid = strtol(mField[eGalXtraValid].c_str(), NULL, 16);
  519. mP3.mQzssXtraValid = strtol(mField[eQzssXtraValid].c_str(), NULL, 16);
  520. }
  521. inline SystemStatusPQWP3& get() { return mP3;}
  522. };
  523. /******************************************************************************
  524. SystemStatusPQWP4
  525. ******************************************************************************/
  526. class SystemStatusPQWP4
  527. {
  528. public:
  529. uint32_t mGpsEpheValid;
  530. uint32_t mGloEpheValid;
  531. uint64_t mBdsEpheValid;
  532. uint64_t mGalEpheValid;
  533. uint8_t mQzssEpheValid;
  534. SystemStatusPQWP4() = default;
  535. SystemStatusPQWP4(const GnssEngineDebugDataInfo& info);
  536. };
  537. SystemStatusPQWP4::SystemStatusPQWP4(const GnssEngineDebugDataInfo& info) {
  538. mGpsEpheValid = info.gpsEphMask;
  539. mGloEpheValid = info.gloEphMask;
  540. mBdsEpheValid = info.bdsEphMask;
  541. mGalEpheValid = info.galEphMask;
  542. mQzssEpheValid = info.qzssEphMask;
  543. }
  544. class SystemStatusPQWP4parser : public SystemStatusNmeaBase
  545. {
  546. private:
  547. enum
  548. {
  549. eTalker = 0,
  550. eUtcTime = 1,
  551. eGpsEpheValid = 2,
  552. eGloEpheValid = 3,
  553. eBdsEpheValid = 4,
  554. eGalEpheValid = 5,
  555. eQzssEpheValid = 6,
  556. eMax
  557. };
  558. SystemStatusPQWP4 mP4;
  559. public:
  560. inline uint32_t getGpsEpheValid() { return mP4.mGpsEpheValid; }
  561. inline uint32_t getGloEpheValid() { return mP4.mGloEpheValid; }
  562. inline uint64_t getBdsEpheValid() { return mP4.mBdsEpheValid; }
  563. inline uint64_t getGalEpheValid() { return mP4.mGalEpheValid; }
  564. inline uint8_t getQzssEpheValid() { return mP4.mQzssEpheValid; }
  565. SystemStatusPQWP4parser(const char *str_in, uint32_t len_in)
  566. : SystemStatusNmeaBase(str_in, len_in)
  567. {
  568. if (mField.size() < eMax) {
  569. return;
  570. }
  571. memset(&mP4, 0, sizeof(mP4));
  572. mP4.mGpsEpheValid = strtol(mField[eGpsEpheValid].c_str(), NULL, 16);
  573. mP4.mGloEpheValid = strtol(mField[eGloEpheValid].c_str(), NULL, 16);
  574. mP4.mBdsEpheValid = strtol(mField[eBdsEpheValid].c_str(), NULL, 16);
  575. mP4.mGalEpheValid = strtol(mField[eGalEpheValid].c_str(), NULL, 16);
  576. mP4.mQzssEpheValid = strtol(mField[eQzssEpheValid].c_str(), NULL, 16);
  577. }
  578. inline SystemStatusPQWP4& get() { return mP4;}
  579. };
  580. /******************************************************************************
  581. SystemStatusPQWP5
  582. ******************************************************************************/
  583. class SystemStatusPQWP5
  584. {
  585. public:
  586. uint32_t mGpsUnknownMask;
  587. uint32_t mGloUnknownMask;
  588. uint64_t mBdsUnknownMask;
  589. uint64_t mGalUnknownMask;
  590. uint8_t mQzssUnknownMask;
  591. uint32_t mNavicUnknownMask;
  592. uint32_t mGpsGoodMask;
  593. uint32_t mGloGoodMask;
  594. uint64_t mBdsGoodMask;
  595. uint64_t mGalGoodMask;
  596. uint8_t mQzssGoodMask;
  597. uint32_t mNavicGoodMask;
  598. uint32_t mGpsBadMask;
  599. uint32_t mGloBadMask;
  600. uint64_t mBdsBadMask;
  601. uint64_t mGalBadMask;
  602. uint8_t mQzssBadMask;
  603. uint32_t mNavicBadMask;
  604. SystemStatusPQWP5() = default;
  605. SystemStatusPQWP5(const GnssEngineDebugDataInfo& info);
  606. };
  607. SystemStatusPQWP5::SystemStatusPQWP5(const GnssEngineDebugDataInfo& info){
  608. mGpsUnknownMask = info.gpsHealthUnknownMask;
  609. mGloUnknownMask = info.gloHealthUnknownMask;
  610. mBdsUnknownMask = info.bdsHealthUnknownMask;
  611. mGalUnknownMask = info.galHealthUnknownMask;
  612. mQzssUnknownMask = info.qzssHealthUnknownMask;
  613. mNavicUnknownMask = info.navicHealthUnknownMask;
  614. mGpsGoodMask = info.gpsHealthGoodMask;
  615. mGloGoodMask = info.gloHealthGoodMask;
  616. mBdsGoodMask = info.bdsHealthGoodMask;
  617. mGalGoodMask = info.galHealthGoodMask;
  618. mQzssGoodMask = info.qzssHealthGoodMask;
  619. mNavicGoodMask = info.navicHealthGoodMask;
  620. mGpsBadMask = info.gpsHealthBadMask;
  621. mGloBadMask = info.gloHealthBadMask;
  622. mBdsBadMask = info.bdsHealthBadMask;
  623. mGalBadMask = info.galHealthBadMask;
  624. mQzssBadMask = info.qzssHealthBadMask;
  625. mNavicBadMask = info.navicHealthBadMask;
  626. }
  627. class SystemStatusPQWP5parser : public SystemStatusNmeaBase
  628. {
  629. private:
  630. // todo: update for navic once available
  631. enum
  632. {
  633. eTalker = 0,
  634. eUtcTime = 1,
  635. eGpsUnknownMask = 2,
  636. eGloUnknownMask = 3,
  637. eBdsUnknownMask = 4,
  638. eGalUnknownMask = 5,
  639. eQzssUnknownMask = 6,
  640. eGpsGoodMask = 7,
  641. eGloGoodMask = 8,
  642. eBdsGoodMask = 9,
  643. eGalGoodMask = 10,
  644. eQzssGoodMask = 11,
  645. eGpsBadMask = 12,
  646. eGloBadMask = 13,
  647. eBdsBadMask = 14,
  648. eGalBadMask = 15,
  649. eQzssBadMask = 16,
  650. eMax
  651. };
  652. SystemStatusPQWP5 mP5;
  653. public:
  654. inline uint32_t getGpsUnknownMask() { return mP5.mGpsUnknownMask; }
  655. inline uint32_t getGloUnknownMask() { return mP5.mGloUnknownMask; }
  656. inline uint64_t getBdsUnknownMask() { return mP5.mBdsUnknownMask; }
  657. inline uint64_t getGalUnknownMask() { return mP5.mGalUnknownMask; }
  658. inline uint8_t getQzssUnknownMask() { return mP5.mQzssUnknownMask; }
  659. inline uint32_t getNavicUnknownMask() { return mP5.mNavicUnknownMask; }
  660. inline uint32_t getGpsGoodMask() { return mP5.mGpsGoodMask; }
  661. inline uint32_t getGloGoodMask() { return mP5.mGloGoodMask; }
  662. inline uint64_t getBdsGoodMask() { return mP5.mBdsGoodMask; }
  663. inline uint64_t getGalGoodMask() { return mP5.mGalGoodMask; }
  664. inline uint8_t getQzssGoodMask() { return mP5.mQzssGoodMask; }
  665. inline uint32_t getNavicGoodMask() { return mP5.mNavicGoodMask; }
  666. inline uint32_t getGpsBadMask() { return mP5.mGpsBadMask; }
  667. inline uint32_t getGloBadMask() { return mP5.mGloBadMask; }
  668. inline uint64_t getBdsBadMask() { return mP5.mBdsBadMask; }
  669. inline uint64_t getGalBadMask() { return mP5.mGalBadMask; }
  670. inline uint8_t getQzssBadMask() { return mP5.mQzssBadMask; }
  671. inline uint32_t getNavicBadMask() { return mP5.mNavicBadMask; }
  672. SystemStatusPQWP5parser(const char *str_in, uint32_t len_in)
  673. : SystemStatusNmeaBase(str_in, len_in)
  674. {
  675. if (mField.size() < eMax) {
  676. return;
  677. }
  678. memset(&mP5, 0, sizeof(mP5));
  679. // todo: update for navic once available
  680. mP5.mGpsUnknownMask = strtol(mField[eGpsUnknownMask].c_str(), NULL, 16);
  681. mP5.mGloUnknownMask = strtol(mField[eGloUnknownMask].c_str(), NULL, 16);
  682. mP5.mBdsUnknownMask = strtol(mField[eBdsUnknownMask].c_str(), NULL, 16);
  683. mP5.mGalUnknownMask = strtol(mField[eGalUnknownMask].c_str(), NULL, 16);
  684. mP5.mQzssUnknownMask = strtol(mField[eQzssUnknownMask].c_str(), NULL, 16);
  685. mP5.mGpsGoodMask = strtol(mField[eGpsGoodMask].c_str(), NULL, 16);
  686. mP5.mGloGoodMask = strtol(mField[eGloGoodMask].c_str(), NULL, 16);
  687. mP5.mBdsGoodMask = strtol(mField[eBdsGoodMask].c_str(), NULL, 16);
  688. mP5.mGalGoodMask = strtol(mField[eGalGoodMask].c_str(), NULL, 16);
  689. mP5.mQzssGoodMask = strtol(mField[eQzssGoodMask].c_str(), NULL, 16);
  690. mP5.mGpsBadMask = strtol(mField[eGpsBadMask].c_str(), NULL, 16);
  691. mP5.mGloBadMask = strtol(mField[eGloBadMask].c_str(), NULL, 16);
  692. mP5.mBdsBadMask = strtol(mField[eBdsBadMask].c_str(), NULL, 16);
  693. mP5.mGalBadMask = strtol(mField[eGalBadMask].c_str(), NULL, 16);
  694. mP5.mQzssBadMask = strtol(mField[eQzssBadMask].c_str(), NULL, 16);
  695. }
  696. inline SystemStatusPQWP5& get() { return mP5;}
  697. };
  698. /******************************************************************************
  699. SystemStatusPQWP6parser
  700. ******************************************************************************/
  701. class SystemStatusPQWP6
  702. {
  703. public:
  704. uint32_t mFixInfoMask;
  705. SystemStatusPQWP6() = default;
  706. inline SystemStatusPQWP6(const GnssEngineDebugDataInfo& info) {
  707. mFixInfoMask = info.fixInfoMask;
  708. }
  709. };
  710. class SystemStatusPQWP6parser : public SystemStatusNmeaBase
  711. {
  712. private:
  713. enum
  714. {
  715. eTalker = 0,
  716. eUtcTime = 1,
  717. eFixInfoMask = 2,
  718. eMax
  719. };
  720. SystemStatusPQWP6 mP6;
  721. public:
  722. inline uint32_t getFixInfoMask() { return mP6.mFixInfoMask; }
  723. SystemStatusPQWP6parser(const char *str_in, uint32_t len_in)
  724. : SystemStatusNmeaBase(str_in, len_in)
  725. {
  726. if (mField.size() < eMax) {
  727. return;
  728. }
  729. memset(&mP6, 0, sizeof(mP6));
  730. mP6.mFixInfoMask = strtol(mField[eFixInfoMask].c_str(), NULL, 16);
  731. }
  732. inline SystemStatusPQWP6& get() { return mP6;}
  733. };
  734. /******************************************************************************
  735. SystemStatusPQWP7parser
  736. ******************************************************************************/
  737. class SystemStatusPQWP7
  738. {
  739. public:
  740. SystemStatusNav mNav[SV_ALL_NUM];
  741. SystemStatusPQWP7() = default;
  742. SystemStatusPQWP7(const GnssEngineDebugDataInfo& gnssEngineDebugDataInfo);
  743. };
  744. SystemStatusPQWP7::SystemStatusPQWP7(const GnssEngineDebugDataInfo& gnssEngineDebugDataInfo) {
  745. memset(mNav, 0, SV_ALL_NUM_MIN * sizeof(SystemStatusNav));
  746. for (int i = 0; i < GNSS_MAX_SV_INFO_LIST_SIZE; i++) {
  747. GnssNavDataInfo navInfo = gnssEngineDebugDataInfo.navData[i];
  748. int offset = 0;
  749. if (0 == navInfo.gnssSvId) continue;
  750. // GPS
  751. if (navInfo.gnssSvId >= GPS_MIN && navInfo.gnssSvId < (GPS_MIN + GPS_NUM)) {
  752. offset = navInfo.gnssSvId - GPS_MIN;
  753. }
  754. // GLO
  755. if (navInfo.gnssSvId >= GLO_MIN && navInfo.gnssSvId < (GLO_MIN + GLO_NUM)) {
  756. offset = GPS_NUM + navInfo.gnssSvId - GLO_MIN;
  757. }
  758. // BDS
  759. if (navInfo.gnssSvId >= BDS_MIN && navInfo.gnssSvId < (BDS_MIN + BDS_NUM)) {
  760. offset = GPS_NUM + GLO_NUM + navInfo.gnssSvId - BDS_MIN;
  761. }
  762. // GAL
  763. if (navInfo.gnssSvId >= GAL_MIN && navInfo.gnssSvId < (GAL_MIN + GAL_NUM)) {
  764. offset = GPS_NUM + GLO_NUM + BDS_NUM + navInfo.gnssSvId - GAL_MIN;
  765. }
  766. // QZSS
  767. if (navInfo.gnssSvId >= QZSS_MIN && navInfo.gnssSvId < (QZSS_MIN + QZSS_NUM)) {
  768. offset = GPS_NUM + GLO_NUM + BDS_NUM + GAL_NUM + navInfo.gnssSvId - QZSS_MIN;
  769. }
  770. //Navic
  771. if (navInfo.gnssSvId >= NAVIC_MIN && navInfo.gnssSvId < (NAVIC_MIN + NAVIC_NUM)) {
  772. offset = GPS_NUM + GLO_NUM + BDS_NUM + GAL_NUM + QZSS_NUM +
  773. navInfo.gnssSvId - NAVIC_MIN;
  774. }
  775. mNav[offset].mType = GnssEphemerisType(navInfo.type);
  776. mNav[offset].mSource = GnssEphemerisSource(navInfo.src);
  777. mNav[offset].mAgeSec = navInfo.age;
  778. }
  779. }
  780. class SystemStatusPQWP7parser : public SystemStatusNmeaBase
  781. {
  782. private:
  783. enum
  784. {
  785. eTalker = 0,
  786. eUtcTime = 1,
  787. eMin = 2 + SV_ALL_NUM_MIN*3,
  788. eMax = 2 + SV_ALL_NUM*3
  789. };
  790. SystemStatusPQWP7 mP7;
  791. public:
  792. SystemStatusPQWP7parser(const char *str_in, uint32_t len_in)
  793. : SystemStatusNmeaBase(str_in, len_in)
  794. {
  795. uint32_t svLimit = SV_ALL_NUM;
  796. if (mField.size() < eMin) {
  797. LOC_LOGE("PQWP7parser - invalid size=%zu", mField.size());
  798. return;
  799. }
  800. if (mField.size() < eMax) {
  801. // Try reducing limit, accounting for possibly missing NAVIC support
  802. svLimit = SV_ALL_NUM_MIN;
  803. }
  804. memset(mP7.mNav, 0, sizeof(mP7.mNav));
  805. for (uint32_t i=0; i<svLimit; i++) {
  806. mP7.mNav[i].mType = GnssEphemerisType(atoi(mField[i*3+2].c_str()));
  807. mP7.mNav[i].mSource = GnssEphemerisSource(atoi(mField[i*3+3].c_str()));
  808. mP7.mNav[i].mAgeSec = atoi(mField[i*3+4].c_str());
  809. }
  810. }
  811. inline SystemStatusPQWP7& get() { return mP7;}
  812. };
  813. /******************************************************************************
  814. SystemStatusPQWS1parser
  815. ******************************************************************************/
  816. class SystemStatusPQWS1
  817. {
  818. public:
  819. uint32_t mFixInfoMask;
  820. uint32_t mHepeLimit;
  821. SystemStatusPQWS1() = default;
  822. inline SystemStatusPQWS1(const GnssEngineDebugDataInfo& info) {
  823. mFixInfoMask = info.fixStatusMask;
  824. mHepeLimit = info.fixHepeLimit;
  825. }
  826. };
  827. class SystemStatusPQWS1parser : public SystemStatusNmeaBase
  828. {
  829. private:
  830. enum
  831. {
  832. eTalker = 0,
  833. eUtcTime = 1,
  834. eFixInfoMask = 2,
  835. eHepeLimit = 3,
  836. eMax
  837. };
  838. SystemStatusPQWS1 mS1;
  839. public:
  840. inline uint16_t getFixInfoMask() { return mS1.mFixInfoMask; }
  841. inline uint32_t getHepeLimit() { return mS1.mHepeLimit; }
  842. SystemStatusPQWS1parser(const char *str_in, uint32_t len_in)
  843. : SystemStatusNmeaBase(str_in, len_in)
  844. {
  845. if (mField.size() < eMax) {
  846. return;
  847. }
  848. memset(&mS1, 0, sizeof(mS1));
  849. mS1.mFixInfoMask = atoi(mField[eFixInfoMask].c_str());
  850. mS1.mHepeLimit = atoi(mField[eHepeLimit].c_str());
  851. }
  852. inline SystemStatusPQWS1& get() { return mS1;}
  853. };
  854. /******************************************************************************
  855. SystemStatusTimeAndClock
  856. ******************************************************************************/
  857. SystemStatusTimeAndClock::SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea) :
  858. mGpsWeek(nmea.mGpsWeek),
  859. mGpsTowMs(nmea.mGpsTowMs),
  860. mTimeValid(nmea.mTimeValid),
  861. mTimeSource(nmea.mTimeSource),
  862. mTimeUnc(nmea.mTimeUnc),
  863. mClockFreqBias(nmea.mClockFreqBias),
  864. mClockFreqBiasUnc(nmea.mClockFreqBiasUnc),
  865. mLeapSeconds(nmea.mLeapSeconds),
  866. mLeapSecUnc(nmea.mLeapSecUnc),
  867. mTimeUncNs(nmea.mTimeUncNs)
  868. {
  869. }
  870. bool SystemStatusTimeAndClock::equals(const SystemStatusItemBase& peer) {
  871. if ((mGpsWeek != ((const SystemStatusTimeAndClock&)peer).mGpsWeek) ||
  872. (mGpsTowMs != ((const SystemStatusTimeAndClock&)peer).mGpsTowMs) ||
  873. (mTimeValid != ((const SystemStatusTimeAndClock&)peer).mTimeValid) ||
  874. (mTimeSource != ((const SystemStatusTimeAndClock&)peer).mTimeSource) ||
  875. (mTimeUnc != ((const SystemStatusTimeAndClock&)peer).mTimeUnc) ||
  876. (mClockFreqBias != ((const SystemStatusTimeAndClock&)peer).mClockFreqBias) ||
  877. (mClockFreqBiasUnc != ((const SystemStatusTimeAndClock&)peer).mClockFreqBiasUnc) ||
  878. (mLeapSeconds != ((const SystemStatusTimeAndClock&)peer).mLeapSeconds) ||
  879. (mLeapSecUnc != ((const SystemStatusTimeAndClock&)peer).mLeapSecUnc) ||
  880. (mTimeUncNs != ((const SystemStatusTimeAndClock&)peer).mTimeUncNs)) {
  881. return false;
  882. }
  883. return true;
  884. }
  885. void SystemStatusTimeAndClock::dump()
  886. {
  887. LOC_LOGV("TimeAndClock: u=%ld:%ld g=%d:%d v=%d ts=%d tu=%d b=%d bu=%d ls=%d lu=%d un=%" PRIu64,
  888. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  889. mGpsWeek,
  890. mGpsTowMs,
  891. mTimeValid,
  892. mTimeSource,
  893. mTimeUnc,
  894. mClockFreqBias,
  895. mClockFreqBiasUnc,
  896. mLeapSeconds,
  897. mLeapSecUnc,
  898. mTimeUncNs);
  899. return;
  900. }
  901. /******************************************************************************
  902. SystemStatusXoState
  903. ******************************************************************************/
  904. SystemStatusXoState::SystemStatusXoState(const SystemStatusPQWM1& nmea) :
  905. mXoState(nmea.mXoState)
  906. {
  907. }
  908. bool SystemStatusXoState::equals(const SystemStatusItemBase& peer) {
  909. if (mXoState != ((const SystemStatusXoState&)peer).mXoState) {
  910. return false;
  911. }
  912. return true;
  913. }
  914. void SystemStatusXoState::dump()
  915. {
  916. LOC_LOGV("XoState: u=%ld:%ld x=%d",
  917. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  918. mXoState);
  919. return;
  920. }
  921. /******************************************************************************
  922. SystemStatusRfAndParams
  923. ******************************************************************************/
  924. SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea) :
  925. mPgaGain(nmea.mPgaGain),
  926. mGpsBpAmpI(nmea.mGpsBpAmpI),
  927. mGpsBpAmpQ(nmea.mGpsBpAmpQ),
  928. mAdcI(nmea.mAdcI),
  929. mAdcQ(nmea.mAdcQ),
  930. mJammerGps(nmea.mJammerGps),
  931. mJammerGlo(nmea.mJammerGlo),
  932. mJammerBds(nmea.mJammerBds),
  933. mJammerGal(nmea.mJammerGal),
  934. mAgcGps(nmea.mAgcGps),
  935. mAgcGlo(nmea.mAgcGlo),
  936. mAgcBds(nmea.mAgcBds),
  937. mAgcGal(nmea.mAgcGal),
  938. mGloBpAmpI(nmea.mGloBpAmpI),
  939. mGloBpAmpQ(nmea.mGloBpAmpQ),
  940. mBdsBpAmpI(nmea.mBdsBpAmpI),
  941. mBdsBpAmpQ(nmea.mBdsBpAmpQ),
  942. mGalBpAmpI(nmea.mGalBpAmpI),
  943. mGalBpAmpQ(nmea.mGalBpAmpQ),
  944. mJammedSignalsMask(nmea.mJammedSignalsMask),
  945. mJammerData(std::move(nmea.mJammerData)) {}
  946. bool SystemStatusRfAndParams::equals(const SystemStatusItemBase& peer) {
  947. if ((mPgaGain != ((const SystemStatusRfAndParams&)peer).mPgaGain) ||
  948. (mGpsBpAmpI != ((const SystemStatusRfAndParams&)peer).mGpsBpAmpI) ||
  949. (mGpsBpAmpQ != ((const SystemStatusRfAndParams&)peer).mGpsBpAmpQ) ||
  950. (mAdcI != ((const SystemStatusRfAndParams&)peer).mAdcI) ||
  951. (mAdcQ != ((const SystemStatusRfAndParams&)peer).mAdcQ) ||
  952. (mJammerGps != ((const SystemStatusRfAndParams&)peer).mJammerGps) ||
  953. (mJammerGlo != ((const SystemStatusRfAndParams&)peer).mJammerGlo) ||
  954. (mJammerBds != ((const SystemStatusRfAndParams&)peer).mJammerBds) ||
  955. (mJammerGal != ((const SystemStatusRfAndParams&)peer).mJammerGal) ||
  956. (mAgcGps != ((const SystemStatusRfAndParams&)peer).mAgcGps) ||
  957. (mAgcGlo != ((const SystemStatusRfAndParams&)peer).mAgcGlo) ||
  958. (mAgcBds != ((const SystemStatusRfAndParams&)peer).mAgcBds) ||
  959. (mAgcGal != ((const SystemStatusRfAndParams&)peer).mAgcGal) ||
  960. (mGloBpAmpI != ((const SystemStatusRfAndParams&)peer).mGloBpAmpI) ||
  961. (mGloBpAmpQ != ((const SystemStatusRfAndParams&)peer).mGloBpAmpQ) ||
  962. (mBdsBpAmpI != ((const SystemStatusRfAndParams&)peer).mBdsBpAmpI) ||
  963. (mBdsBpAmpQ != ((const SystemStatusRfAndParams&)peer).mBdsBpAmpQ) ||
  964. (mGalBpAmpI != ((const SystemStatusRfAndParams&)peer).mGalBpAmpI) ||
  965. (mGalBpAmpQ != ((const SystemStatusRfAndParams&)peer).mGalBpAmpQ) ||
  966. (mJammedSignalsMask != ((const SystemStatusRfAndParams&)peer).mJammedSignalsMask)) {
  967. return false;
  968. }
  969. return true;
  970. }
  971. void SystemStatusRfAndParams::dump()
  972. {
  973. LOC_LOGV("RfAndParams: u=%ld:%ld p=%d bi=%d bq=%d ai=%d aq=%d "
  974. "jgp=%d jgl=%d jbd=%d jga=%d "
  975. "agp=%d agl=%d abd=%d aga=%d",
  976. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  977. mPgaGain,
  978. mGpsBpAmpI,
  979. mGpsBpAmpQ,
  980. mAdcI,
  981. mAdcQ,
  982. mJammerGps,
  983. mJammerGlo,
  984. mJammerBds,
  985. mJammerGal,
  986. mAgcGps,
  987. mAgcGlo,
  988. mAgcBds,
  989. mAgcGal);
  990. return;
  991. }
  992. /******************************************************************************
  993. SystemStatusErrRecovery
  994. ******************************************************************************/
  995. SystemStatusErrRecovery::SystemStatusErrRecovery(const SystemStatusPQWM1& nmea) :
  996. mRecErrorRecovery(nmea.mRecErrorRecovery)
  997. {
  998. }
  999. bool SystemStatusErrRecovery::equals(const SystemStatusItemBase& peer) {
  1000. if (mRecErrorRecovery != ((const SystemStatusErrRecovery&)peer).mRecErrorRecovery) {
  1001. return false;
  1002. }
  1003. return true;
  1004. }
  1005. void SystemStatusErrRecovery::dump()
  1006. {
  1007. LOC_LOGV("ErrRecovery: u=%ld:%ld e=%d",
  1008. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1009. mRecErrorRecovery);
  1010. return;
  1011. }
  1012. /******************************************************************************
  1013. SystemStatusInjectedPosition
  1014. ******************************************************************************/
  1015. SystemStatusInjectedPosition::SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea) :
  1016. mEpiValidity(nmea.mEpiValidity),
  1017. mEpiLat(nmea.mEpiLat),
  1018. mEpiLon(nmea.mEpiLon),
  1019. mEpiAlt(nmea.mEpiAlt),
  1020. mEpiHepe(nmea.mEpiHepe),
  1021. mEpiAltUnc(nmea.mEpiAltUnc),
  1022. mEpiSrc(nmea.mEpiSrc)
  1023. {
  1024. }
  1025. bool SystemStatusInjectedPosition::equals(const SystemStatusItemBase& peer) {
  1026. if ((mEpiValidity != ((const SystemStatusInjectedPosition&)peer).mEpiValidity) ||
  1027. (mEpiLat != ((const SystemStatusInjectedPosition&)peer).mEpiLat) ||
  1028. (mEpiLon != ((const SystemStatusInjectedPosition&)peer).mEpiLon) ||
  1029. (mEpiAlt != ((const SystemStatusInjectedPosition&)peer).mEpiAlt) ||
  1030. (mEpiHepe != ((const SystemStatusInjectedPosition&)peer).mEpiHepe) ||
  1031. (mEpiAltUnc != ((const SystemStatusInjectedPosition&)peer).mEpiAltUnc) ||
  1032. (mEpiSrc != ((const SystemStatusInjectedPosition&)peer).mEpiSrc)) {
  1033. return false;
  1034. }
  1035. return true;
  1036. }
  1037. void SystemStatusInjectedPosition::dump()
  1038. {
  1039. LOC_LOGV("InjectedPosition: u=%ld:%ld v=%x la=%f lo=%f al=%f he=%f au=%f es=%d",
  1040. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1041. mEpiValidity,
  1042. mEpiLat,
  1043. mEpiLon,
  1044. mEpiAlt,
  1045. mEpiHepe,
  1046. mEpiAltUnc,
  1047. mEpiSrc);
  1048. return;
  1049. }
  1050. /******************************************************************************
  1051. SystemStatusBestPosition
  1052. ******************************************************************************/
  1053. SystemStatusBestPosition::SystemStatusBestPosition(const SystemStatusPQWP2& nmea) :
  1054. mValid(true),
  1055. mBestLat(nmea.mBestLat),
  1056. mBestLon(nmea.mBestLon),
  1057. mBestAlt(nmea.mBestAlt),
  1058. mBestHepe(nmea.mBestHepe),
  1059. mBestAltUnc(nmea.mBestAltUnc)
  1060. {
  1061. }
  1062. bool SystemStatusBestPosition::equals(const SystemStatusItemBase& peer) {
  1063. if ((mBestLat != ((const SystemStatusBestPosition&)peer).mBestLat) ||
  1064. (mBestLon != ((const SystemStatusBestPosition&)peer).mBestLon) ||
  1065. (mBestAlt != ((const SystemStatusBestPosition&)peer).mBestAlt) ||
  1066. (mBestHepe != ((const SystemStatusBestPosition&)peer).mBestHepe) ||
  1067. (mBestAltUnc != ((const SystemStatusBestPosition&)peer).mBestAltUnc)) {
  1068. return false;
  1069. }
  1070. return true;
  1071. }
  1072. void SystemStatusBestPosition::dump()
  1073. {
  1074. LOC_LOGV("BestPosition: u=%ld:%ld la=%f lo=%f al=%f he=%f au=%f",
  1075. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1076. mBestLat,
  1077. mBestLon,
  1078. mBestAlt,
  1079. mBestHepe,
  1080. mBestAltUnc);
  1081. return;
  1082. }
  1083. /******************************************************************************
  1084. SystemStatusXtra
  1085. ******************************************************************************/
  1086. SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) :
  1087. mXtraValidMask(nmea.mXtraValidMask),
  1088. mGpsXtraAge(nmea.mGpsXtraAge),
  1089. mGloXtraAge(nmea.mGloXtraAge),
  1090. mBdsXtraAge(nmea.mBdsXtraAge),
  1091. mGalXtraAge(nmea.mGalXtraAge),
  1092. mQzssXtraAge(nmea.mQzssXtraAge),
  1093. mNavicXtraAge(nmea.mNavicXtraAge),
  1094. mGpsXtraValid(nmea.mGpsXtraValid),
  1095. mGloXtraValid(nmea.mGloXtraValid),
  1096. mBdsXtraValid(nmea.mBdsXtraValid),
  1097. mGalXtraValid(nmea.mGalXtraValid),
  1098. mQzssXtraValid(nmea.mQzssXtraValid),
  1099. mNavicXtraValid(nmea.mNavicXtraValid)
  1100. {
  1101. }
  1102. bool SystemStatusXtra::equals(const SystemStatusItemBase& peer) {
  1103. if ((mXtraValidMask != ((const SystemStatusXtra&)peer).mXtraValidMask) ||
  1104. (mGpsXtraAge != ((const SystemStatusXtra&)peer).mGpsXtraAge) ||
  1105. (mGloXtraAge != ((const SystemStatusXtra&)peer).mGloXtraAge) ||
  1106. (mBdsXtraAge != ((const SystemStatusXtra&)peer).mBdsXtraAge) ||
  1107. (mGalXtraAge != ((const SystemStatusXtra&)peer).mGalXtraAge) ||
  1108. (mQzssXtraAge != ((const SystemStatusXtra&)peer).mQzssXtraAge) ||
  1109. (mNavicXtraAge != ((const SystemStatusXtra&)peer).mNavicXtraAge) ||
  1110. (mGpsXtraValid != ((const SystemStatusXtra&)peer).mGpsXtraValid) ||
  1111. (mGloXtraValid != ((const SystemStatusXtra&)peer).mGloXtraValid) ||
  1112. (mBdsXtraValid != ((const SystemStatusXtra&)peer).mBdsXtraValid) ||
  1113. (mGalXtraValid != ((const SystemStatusXtra&)peer).mGalXtraValid) ||
  1114. (mQzssXtraValid != ((const SystemStatusXtra&)peer).mQzssXtraValid) ||
  1115. (mNavicXtraValid != ((const SystemStatusXtra&)peer).mNavicXtraValid)) {
  1116. return false;
  1117. }
  1118. return true;
  1119. }
  1120. void SystemStatusXtra::dump()
  1121. {
  1122. LOC_LOGV("SystemStatusXtra: u=%ld:%ld m=%x a=%d:%d:%d:%d:%d v=%x:%x:%" PRIx64 ":%" PRIx64":%x",
  1123. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1124. mXtraValidMask,
  1125. mGpsXtraAge,
  1126. mGloXtraAge,
  1127. mBdsXtraAge,
  1128. mGalXtraAge,
  1129. mQzssXtraAge,
  1130. mGpsXtraValid,
  1131. mGloXtraValid,
  1132. mBdsXtraValid,
  1133. mGalXtraValid,
  1134. mQzssXtraValid);
  1135. return;
  1136. }
  1137. /******************************************************************************
  1138. SystemStatusEphemeris
  1139. ******************************************************************************/
  1140. SystemStatusEphemeris::SystemStatusEphemeris(const SystemStatusPQWP4& nmea) :
  1141. mGpsEpheValid(nmea.mGpsEpheValid),
  1142. mGloEpheValid(nmea.mGloEpheValid),
  1143. mBdsEpheValid(nmea.mBdsEpheValid),
  1144. mGalEpheValid(nmea.mGalEpheValid),
  1145. mQzssEpheValid(nmea.mQzssEpheValid)
  1146. {
  1147. }
  1148. bool SystemStatusEphemeris::equals(const SystemStatusItemBase& peer) {
  1149. if ((mGpsEpheValid != ((const SystemStatusEphemeris&)peer).mGpsEpheValid) ||
  1150. (mGloEpheValid != ((const SystemStatusEphemeris&)peer).mGloEpheValid) ||
  1151. (mBdsEpheValid != ((const SystemStatusEphemeris&)peer).mBdsEpheValid) ||
  1152. (mGalEpheValid != ((const SystemStatusEphemeris&)peer).mGalEpheValid) ||
  1153. (mQzssEpheValid != ((const SystemStatusEphemeris&)peer).mQzssEpheValid)) {
  1154. return false;
  1155. }
  1156. return true;
  1157. }
  1158. void SystemStatusEphemeris::dump()
  1159. {
  1160. LOC_LOGV("Ephemeris: u=%ld:%ld ev=%x:%x:%" PRIx64 ":%" PRIx64 ":%x",
  1161. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1162. mGpsEpheValid,
  1163. mGloEpheValid,
  1164. mBdsEpheValid,
  1165. mGalEpheValid,
  1166. mQzssEpheValid);
  1167. return;
  1168. }
  1169. /******************************************************************************
  1170. SystemStatusSvHealth
  1171. ******************************************************************************/
  1172. SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) :
  1173. mGpsUnknownMask(nmea.mGpsUnknownMask),
  1174. mGloUnknownMask(nmea.mGloUnknownMask),
  1175. mBdsUnknownMask(nmea.mBdsUnknownMask),
  1176. mGalUnknownMask(nmea.mGalUnknownMask),
  1177. mQzssUnknownMask(nmea.mQzssUnknownMask),
  1178. mNavicUnknownMask(nmea.mNavicUnknownMask),
  1179. mGpsGoodMask(nmea.mGpsGoodMask),
  1180. mGloGoodMask(nmea.mGloGoodMask),
  1181. mBdsGoodMask(nmea.mBdsGoodMask),
  1182. mGalGoodMask(nmea.mGalGoodMask),
  1183. mQzssGoodMask(nmea.mQzssGoodMask),
  1184. mNavicGoodMask(nmea.mNavicGoodMask),
  1185. mGpsBadMask(nmea.mGpsBadMask),
  1186. mGloBadMask(nmea.mGloBadMask),
  1187. mBdsBadMask(nmea.mBdsBadMask),
  1188. mGalBadMask(nmea.mGalBadMask),
  1189. mQzssBadMask(nmea.mQzssBadMask),
  1190. mNavicBadMask(nmea.mNavicBadMask)
  1191. {
  1192. }
  1193. bool SystemStatusSvHealth::equals(const SystemStatusItemBase& peer) {
  1194. if ((mGpsUnknownMask != ((const SystemStatusSvHealth&)peer).mGpsUnknownMask) ||
  1195. (mGloUnknownMask != ((const SystemStatusSvHealth&)peer).mGloUnknownMask) ||
  1196. (mBdsUnknownMask != ((const SystemStatusSvHealth&)peer).mBdsUnknownMask) ||
  1197. (mGalUnknownMask != ((const SystemStatusSvHealth&)peer).mGalUnknownMask) ||
  1198. (mQzssUnknownMask != ((const SystemStatusSvHealth&)peer).mQzssUnknownMask) ||
  1199. (mGpsGoodMask != ((const SystemStatusSvHealth&)peer).mGpsGoodMask) ||
  1200. (mGloGoodMask != ((const SystemStatusSvHealth&)peer).mGloGoodMask) ||
  1201. (mBdsGoodMask != ((const SystemStatusSvHealth&)peer).mBdsGoodMask) ||
  1202. (mGalGoodMask != ((const SystemStatusSvHealth&)peer).mGalGoodMask) ||
  1203. (mQzssGoodMask != ((const SystemStatusSvHealth&)peer).mQzssGoodMask) ||
  1204. (mGpsBadMask != ((const SystemStatusSvHealth&)peer).mGpsBadMask) ||
  1205. (mGloBadMask != ((const SystemStatusSvHealth&)peer).mGloBadMask) ||
  1206. (mBdsBadMask != ((const SystemStatusSvHealth&)peer).mBdsBadMask) ||
  1207. (mGalBadMask != ((const SystemStatusSvHealth&)peer).mGalBadMask) ||
  1208. (mQzssBadMask != ((const SystemStatusSvHealth&)peer).mQzssBadMask)) {
  1209. return false;
  1210. }
  1211. return true;
  1212. }
  1213. void SystemStatusSvHealth::dump()
  1214. {
  1215. LOC_LOGV("SvHealth: u=%ld:%ld \
  1216. u=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \
  1217. g=%x:%x:%" PRIx64 ":%" PRIx64 ":%x \
  1218. b=%x:%x:%" PRIx64 ":%" PRIx64 ":%x",
  1219. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1220. mGpsUnknownMask,
  1221. mGloUnknownMask,
  1222. mBdsUnknownMask,
  1223. mGalUnknownMask,
  1224. mQzssUnknownMask,
  1225. mGpsGoodMask,
  1226. mGloGoodMask,
  1227. mBdsGoodMask,
  1228. mGalGoodMask,
  1229. mQzssGoodMask,
  1230. mGpsBadMask,
  1231. mGloBadMask,
  1232. mBdsBadMask,
  1233. mGalBadMask,
  1234. mQzssBadMask);
  1235. return;
  1236. }
  1237. /******************************************************************************
  1238. SystemStatusPdr
  1239. ******************************************************************************/
  1240. SystemStatusPdr::SystemStatusPdr(const SystemStatusPQWP6& nmea) :
  1241. mFixInfoMask(nmea.mFixInfoMask)
  1242. {
  1243. }
  1244. bool SystemStatusPdr::equals(const SystemStatusItemBase& peer) {
  1245. if (mFixInfoMask != ((const SystemStatusPdr&)peer).mFixInfoMask) {
  1246. return false;
  1247. }
  1248. return true;
  1249. }
  1250. void SystemStatusPdr::dump()
  1251. {
  1252. LOC_LOGV("Pdr: u=%ld:%ld m=%x",
  1253. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1254. mFixInfoMask);
  1255. return;
  1256. }
  1257. /******************************************************************************
  1258. SystemStatusNavData
  1259. ******************************************************************************/
  1260. SystemStatusNavData::SystemStatusNavData(const SystemStatusPQWP7& nmea)
  1261. {
  1262. for (uint32_t i=0; i<SV_ALL_NUM; i++) {
  1263. mNav[i] = nmea.mNav[i];
  1264. }
  1265. }
  1266. bool SystemStatusNavData::equals(const SystemStatusItemBase& peer) {
  1267. for (uint32_t i=0; i<SV_ALL_NUM; i++) {
  1268. if ((mNav[i].mType != ((const SystemStatusNavData&)peer).mNav[i].mType) ||
  1269. (mNav[i].mSource != ((const SystemStatusNavData&)peer).mNav[i].mSource) ||
  1270. (mNav[i].mAgeSec != ((const SystemStatusNavData&)peer).mNav[i].mAgeSec)) {
  1271. return false;
  1272. }
  1273. }
  1274. return true;
  1275. }
  1276. void SystemStatusNavData::dump()
  1277. {
  1278. LOC_LOGV("NavData: u=%ld:%ld",
  1279. mUtcTime.tv_sec, mUtcTime.tv_nsec);
  1280. for (uint32_t i=0; i<SV_ALL_NUM; i++) {
  1281. LOC_LOGV("i=%d type=%d src=%d age=%d",
  1282. i, mNav[i].mType, mNav[i].mSource, mNav[i].mAgeSec);
  1283. }
  1284. return;
  1285. }
  1286. /******************************************************************************
  1287. SystemStatusPositionFailure
  1288. ******************************************************************************/
  1289. SystemStatusPositionFailure::SystemStatusPositionFailure(const SystemStatusPQWS1& nmea) :
  1290. mFixInfoMask(nmea.mFixInfoMask),
  1291. mHepeLimit(nmea.mHepeLimit)
  1292. {
  1293. }
  1294. bool SystemStatusPositionFailure::equals(const SystemStatusItemBase& peer) {
  1295. if ((mFixInfoMask != ((const SystemStatusPositionFailure&)peer).mFixInfoMask) ||
  1296. (mHepeLimit != ((const SystemStatusPositionFailure&)peer).mHepeLimit)) {
  1297. return false;
  1298. }
  1299. return true;
  1300. }
  1301. void SystemStatusPositionFailure::dump()
  1302. {
  1303. LOC_LOGV("PositionFailure: u=%ld:%ld m=%d h=%d",
  1304. mUtcTime.tv_sec, mUtcTime.tv_nsec,
  1305. mFixInfoMask,
  1306. mHepeLimit);
  1307. return;
  1308. }
  1309. /******************************************************************************
  1310. SystemStatusLocation
  1311. ******************************************************************************/
  1312. bool SystemStatusLocation::equals(const SystemStatusItemBase& peer) {
  1313. if ((mLocation.gpsLocation.latitude !=
  1314. ((const SystemStatusLocation&)peer).mLocation.gpsLocation.latitude) ||
  1315. (mLocation.gpsLocation.longitude !=
  1316. ((const SystemStatusLocation&)peer).mLocation.gpsLocation.longitude) ||
  1317. (mLocation.gpsLocation.altitude !=
  1318. ((const SystemStatusLocation&)peer).mLocation.gpsLocation.altitude)) {
  1319. return false;
  1320. }
  1321. return true;
  1322. }
  1323. void SystemStatusLocation::dump()
  1324. {
  1325. LOC_LOGV("Location: lat=%f lon=%f alt=%f spd=%f",
  1326. mLocation.gpsLocation.latitude,
  1327. mLocation.gpsLocation.longitude,
  1328. mLocation.gpsLocation.altitude,
  1329. mLocation.gpsLocation.speed);
  1330. return;
  1331. }
  1332. /******************************************************************************
  1333. SystemStatus
  1334. ******************************************************************************/
  1335. pthread_mutex_t SystemStatus::mMutexSystemStatus = PTHREAD_MUTEX_INITIALIZER;
  1336. SystemStatus* SystemStatus::mInstance = NULL;
  1337. SystemStatus* SystemStatus::getInstance(const MsgTask* msgTask)
  1338. {
  1339. pthread_mutex_lock(&mMutexSystemStatus);
  1340. if (!mInstance) {
  1341. // Instantiating for the first time. msgTask should not be NULL
  1342. if (msgTask == NULL) {
  1343. LOC_LOGE("SystemStatus: msgTask is NULL!!");
  1344. pthread_mutex_unlock(&mMutexSystemStatus);
  1345. return NULL;
  1346. }
  1347. mInstance = new (nothrow) SystemStatus(msgTask);
  1348. LOC_LOGD("SystemStatus::getInstance:%p. Msgtask:%p", mInstance, msgTask);
  1349. }
  1350. pthread_mutex_unlock(&mMutexSystemStatus);
  1351. return mInstance;
  1352. }
  1353. void SystemStatus::destroyInstance()
  1354. {
  1355. delete mInstance;
  1356. mInstance = NULL;
  1357. }
  1358. void SystemStatus::resetNetworkInfo() {
  1359. for (int i=0; i<mCache.mNetworkInfo.size(); ++i) {
  1360. // Reset all the cached NetworkInfo Items as disconnected
  1361. eventConnectionStatus(false, mCache.mNetworkInfo[i].mDataItem.mType,
  1362. mCache.mNetworkInfo[i].mDataItem.mRoaming,
  1363. mCache.mNetworkInfo[i].mDataItem.mNetworkHandle,
  1364. mCache.mNetworkInfo[i].mDataItem.mApn);
  1365. }
  1366. }
  1367. IOsObserver* SystemStatus::getOsObserver()
  1368. {
  1369. return &mSysStatusObsvr;
  1370. }
  1371. SystemStatus::SystemStatus(const MsgTask* msgTask) :
  1372. mSysStatusObsvr(this, msgTask), mTracking(false) {
  1373. int result = 0;
  1374. ENTRY_LOG ();
  1375. mCache.mLocation.clear();
  1376. mCache.mTimeAndClock.clear();
  1377. mCache.mXoState.clear();
  1378. mCache.mRfAndParams.clear();
  1379. mCache.mErrRecovery.clear();
  1380. mCache.mInjectedPosition.clear();
  1381. mCache.mBestPosition.clear();
  1382. mCache.mXtra.clear();
  1383. mCache.mEphemeris.clear();
  1384. mCache.mSvHealth.clear();
  1385. mCache.mPdr.clear();
  1386. mCache.mNavData.clear();
  1387. mCache.mPositionFailure.clear();
  1388. mCache.mAirplaneMode.clear();
  1389. mCache.mENH.clear();
  1390. mCache.mGPSState.clear();
  1391. mCache.mNLPStatus.clear();
  1392. mCache.mWifiHardwareState.clear();
  1393. mCache.mNetworkInfo.clear();
  1394. mCache.mRilServiceInfo.clear();
  1395. mCache.mRilCellInfo.clear();
  1396. mCache.mServiceStatus.clear();
  1397. mCache.mModel.clear();
  1398. mCache.mManufacturer.clear();
  1399. mCache.mAssistedGps.clear();
  1400. mCache.mScreenState.clear();
  1401. mCache.mPowerConnectState.clear();
  1402. mCache.mTimeZoneChange.clear();
  1403. mCache.mTimeChange.clear();
  1404. mCache.mWifiSupplicantStatus.clear();
  1405. mCache.mShutdownState.clear();
  1406. mCache.mTac.clear();
  1407. mCache.mMccMnc.clear();
  1408. mCache.mBtDeviceScanDetail.clear();
  1409. mCache.mBtLeDeviceScanDetail.clear();
  1410. EXIT_LOG_WITH_ERROR ("%d",result);
  1411. }
  1412. /******************************************************************************
  1413. SystemStatus - storing dataitems
  1414. ******************************************************************************/
  1415. template <typename TYPE_REPORT, typename TYPE_ITEM>
  1416. bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s)
  1417. {
  1418. if (s.ignore()) {
  1419. return false;
  1420. }
  1421. if (!report.empty() && report.back().equals(static_cast<TYPE_ITEM&>(s.collate(report.back())))) {
  1422. // there is no change - just update reported timestamp
  1423. report.back().mUtcReported = s.mUtcReported;
  1424. return false;
  1425. }
  1426. // first event or updated
  1427. report.push_back(s);
  1428. if (report.size() > s.maxItem) {
  1429. report.erase(report.begin());
  1430. }
  1431. return true;
  1432. }
  1433. template <typename TYPE_REPORT, typename TYPE_ITEM>
  1434. void SystemStatus::setDefaultIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s)
  1435. {
  1436. report.push_back(s);
  1437. if (report.size() > s.maxItem) {
  1438. report.erase(report.begin());
  1439. }
  1440. }
  1441. template <typename TYPE_REPORT, typename TYPE_ITEM>
  1442. void SystemStatus::getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) const
  1443. {
  1444. reportout.clear();
  1445. if (c.size() >= 1) {
  1446. reportout.push_back(c.back());
  1447. reportout.back().dump();
  1448. }
  1449. }
  1450. /******************************************************************************
  1451. @brief API to set report data into internal buffer
  1452. @param[In] data pointer to the NMEA string
  1453. @param[In] len length of the NMEA string
  1454. @return true when the NMEA is consumed by the method.
  1455. ******************************************************************************/
  1456. bool SystemStatus::setNmeaString(const char *data, uint32_t len)
  1457. {
  1458. if (!loc_nmea_is_debug(data, len)) {
  1459. return false;
  1460. }
  1461. char buf[SystemStatusNmeaBase::NMEA_MAXSIZE + 1] = { 0 };
  1462. strlcpy(buf, data, sizeof(buf));
  1463. pthread_mutex_lock(&mMutexSystemStatus);
  1464. // parse the received nmea strings here
  1465. if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1466. SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get();
  1467. setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s));
  1468. setIteminReport(mCache.mXoState, SystemStatusXoState(s));
  1469. setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s));
  1470. setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s));
  1471. }
  1472. else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1473. setIteminReport(mCache.mInjectedPosition,
  1474. SystemStatusInjectedPosition(SystemStatusPQWP1parser(buf, len).get()));
  1475. }
  1476. else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1477. setIteminReport(mCache.mBestPosition,
  1478. SystemStatusBestPosition(SystemStatusPQWP2parser(buf, len).get()));
  1479. }
  1480. else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1481. setIteminReport(mCache.mXtra,
  1482. SystemStatusXtra(SystemStatusPQWP3parser(buf, len).get()));
  1483. }
  1484. else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1485. setIteminReport(mCache.mEphemeris,
  1486. SystemStatusEphemeris(SystemStatusPQWP4parser(buf, len).get()));
  1487. }
  1488. else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1489. setIteminReport(mCache.mSvHealth,
  1490. SystemStatusSvHealth(SystemStatusPQWP5parser(buf, len).get()));
  1491. }
  1492. else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1493. setIteminReport(mCache.mPdr,
  1494. SystemStatusPdr(SystemStatusPQWP6parser(buf, len).get()));
  1495. }
  1496. else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1497. setIteminReport(mCache.mNavData,
  1498. SystemStatusNavData(SystemStatusPQWP7parser(buf, len).get()));
  1499. }
  1500. else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
  1501. setIteminReport(mCache.mPositionFailure,
  1502. SystemStatusPositionFailure(SystemStatusPQWS1parser(buf, len).get()));
  1503. }
  1504. else {
  1505. // do nothing
  1506. }
  1507. pthread_mutex_unlock(&mMutexSystemStatus);
  1508. return true;
  1509. }
  1510. void SystemStatus::setEngineDebugDataInfo(const GnssEngineDebugDataInfo& gnssEngineDebugDataInfo) {
  1511. pthread_mutex_lock(&mMutexSystemStatus);
  1512. LOC_LOGd("setEngine data");
  1513. SystemStatusPQWM1 s(gnssEngineDebugDataInfo);
  1514. setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s));
  1515. setIteminReport(mCache.mXoState, SystemStatusXoState(s));
  1516. setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s));
  1517. setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s));
  1518. setIteminReport(mCache.mInjectedPosition,
  1519. SystemStatusInjectedPosition(SystemStatusPQWP1(gnssEngineDebugDataInfo)));
  1520. setIteminReport(mCache.mBestPosition,
  1521. SystemStatusBestPosition(SystemStatusPQWP2(gnssEngineDebugDataInfo)));
  1522. setIteminReport(mCache.mXtra,
  1523. SystemStatusXtra(SystemStatusPQWP3(gnssEngineDebugDataInfo)));
  1524. setIteminReport(mCache.mEphemeris,
  1525. SystemStatusEphemeris(SystemStatusPQWP4(gnssEngineDebugDataInfo)));
  1526. setIteminReport(mCache.mSvHealth,
  1527. SystemStatusSvHealth(SystemStatusPQWP5(gnssEngineDebugDataInfo)));
  1528. setIteminReport(mCache.mPdr,
  1529. SystemStatusPdr(SystemStatusPQWP6(gnssEngineDebugDataInfo)));
  1530. setIteminReport(mCache.mNavData,
  1531. SystemStatusNavData(SystemStatusPQWP7(gnssEngineDebugDataInfo)));
  1532. setIteminReport(mCache.mPositionFailure,
  1533. SystemStatusPositionFailure(SystemStatusPQWS1(gnssEngineDebugDataInfo)));
  1534. pthread_mutex_unlock(&mMutexSystemStatus);
  1535. }
  1536. /******************************************************************************
  1537. @brief API to set report position data into internal buffer
  1538. @param[In] UlpLocation
  1539. @return true when successfully done
  1540. ******************************************************************************/
  1541. bool SystemStatus::eventPosition(const UlpLocation& location,
  1542. const GpsLocationExtended& locationEx)
  1543. {
  1544. bool ret = false;
  1545. pthread_mutex_lock(&mMutexSystemStatus);
  1546. ret = setIteminReport(mCache.mLocation, SystemStatusLocation(location, locationEx));
  1547. LOC_LOGV("eventPosition - lat=%f lon=%f alt=%f speed=%f",
  1548. location.gpsLocation.latitude,
  1549. location.gpsLocation.longitude,
  1550. location.gpsLocation.altitude,
  1551. location.gpsLocation.speed);
  1552. pthread_mutex_unlock(&mMutexSystemStatus);
  1553. return ret;
  1554. }
  1555. /******************************************************************************
  1556. @brief API to set report DataItem event into internal buffer
  1557. @param[In] DataItem
  1558. @return true when info is updatated
  1559. ******************************************************************************/
  1560. bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem)
  1561. {
  1562. bool ret = false;
  1563. pthread_mutex_lock(&mMutexSystemStatus);
  1564. switch(dataitem->getId())
  1565. {
  1566. case AIRPLANEMODE_DATA_ITEM_ID:
  1567. ret = setIteminReport(mCache.mAirplaneMode,
  1568. SystemStatusAirplaneMode(*(static_cast<AirplaneModeDataItem*>(dataitem))));
  1569. break;
  1570. case ENH_DATA_ITEM_ID:
  1571. ret = setIteminReport(mCache.mENH,
  1572. SystemStatusENH(*(static_cast<ENHDataItem*>(dataitem))));
  1573. break;
  1574. case GPSSTATE_DATA_ITEM_ID:
  1575. ret = setIteminReport(mCache.mGPSState,
  1576. SystemStatusGpsState(*(static_cast<GPSStateDataItem*>(dataitem))));
  1577. break;
  1578. case NLPSTATUS_DATA_ITEM_ID:
  1579. ret = setIteminReport(mCache.mNLPStatus,
  1580. SystemStatusNLPStatus(*(static_cast<NLPStatusDataItem*>(dataitem))));
  1581. break;
  1582. case WIFIHARDWARESTATE_DATA_ITEM_ID:
  1583. ret = setIteminReport(mCache.mWifiHardwareState, SystemStatusWifiHardwareState(
  1584. *(static_cast<WifiHardwareStateDataItem*>(dataitem))));
  1585. break;
  1586. case NETWORKINFO_DATA_ITEM_ID:
  1587. ret = setIteminReport(mCache.mNetworkInfo,
  1588. SystemStatusNetworkInfo(*(static_cast<NetworkInfoDataItem*>(dataitem))));
  1589. // Update latest mAllTypes/mAllNetworkHandles of original obj to notify clients
  1590. if (ret) {
  1591. (static_cast<NetworkInfoDataItem*>(dataitem))->mAllTypes =
  1592. mCache.mNetworkInfo.back().mDataItem.mAllTypes;
  1593. memcpy((static_cast<NetworkInfoDataItem*>(dataitem))->mAllNetworkHandles,
  1594. mCache.mNetworkInfo.back().mDataItem.mAllNetworkHandles, sizeof((
  1595. static_cast<NetworkInfoDataItem*>(dataitem))->mAllNetworkHandles));
  1596. }
  1597. break;
  1598. case RILSERVICEINFO_DATA_ITEM_ID:
  1599. ret = setIteminReport(mCache.mRilServiceInfo,
  1600. SystemStatusServiceInfo(*(static_cast<RilServiceInfoDataItem*>(dataitem))));
  1601. break;
  1602. case RILCELLINFO_DATA_ITEM_ID:
  1603. ret = setIteminReport(mCache.mRilCellInfo,
  1604. SystemStatusRilCellInfo(*(static_cast<RilCellInfoDataItem*>(dataitem))));
  1605. break;
  1606. case SERVICESTATUS_DATA_ITEM_ID:
  1607. ret = setIteminReport(mCache.mServiceStatus,
  1608. SystemStatusServiceStatus(*(static_cast<ServiceStatusDataItem*>(dataitem))));
  1609. break;
  1610. case MODEL_DATA_ITEM_ID:
  1611. ret = setIteminReport(mCache.mModel,
  1612. SystemStatusModel(*(static_cast<ModelDataItem*>(dataitem))));
  1613. break;
  1614. case MANUFACTURER_DATA_ITEM_ID:
  1615. ret = setIteminReport(mCache.mManufacturer,
  1616. SystemStatusManufacturer(*(static_cast<ManufacturerDataItem*>(dataitem))));
  1617. break;
  1618. case IN_EMERGENCY_CALL_DATA_ITEM_ID:
  1619. ret = setIteminReport(mCache.mInEmergencyCall,
  1620. SystemStatusInEmergencyCall(
  1621. *(static_cast<InEmergencyCallDataItem*>(dataitem))));
  1622. break;
  1623. case ASSISTED_GPS_DATA_ITEM_ID:
  1624. ret = setIteminReport(mCache.mAssistedGps,
  1625. SystemStatusAssistedGps(*(static_cast<AssistedGpsDataItem*>(dataitem))));
  1626. break;
  1627. case SCREEN_STATE_DATA_ITEM_ID:
  1628. ret = setIteminReport(mCache.mScreenState,
  1629. SystemStatusScreenState(*(static_cast<ScreenStateDataItem*>(dataitem))));
  1630. break;
  1631. case POWER_CONNECTED_STATE_DATA_ITEM_ID:
  1632. ret = setIteminReport(mCache.mPowerConnectState, SystemStatusPowerConnectState(
  1633. *(static_cast<PowerConnectStateDataItem*>(dataitem))));
  1634. break;
  1635. case TIMEZONE_CHANGE_DATA_ITEM_ID:
  1636. ret = setIteminReport(mCache.mTimeZoneChange,
  1637. SystemStatusTimeZoneChange(*(static_cast<TimeZoneChangeDataItem*>(dataitem))));
  1638. break;
  1639. case TIME_CHANGE_DATA_ITEM_ID:
  1640. ret = setIteminReport(mCache.mTimeChange,
  1641. SystemStatusTimeChange(*(static_cast<TimeChangeDataItem*>(dataitem))));
  1642. break;
  1643. case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID:
  1644. ret = setIteminReport(mCache.mWifiSupplicantStatus, SystemStatusWifiSupplicantStatus(
  1645. *(static_cast<WifiSupplicantStatusDataItem*>(dataitem))));
  1646. break;
  1647. case SHUTDOWN_STATE_DATA_ITEM_ID:
  1648. ret = setIteminReport(mCache.mShutdownState,
  1649. SystemStatusShutdownState(*(static_cast<ShutdownStateDataItem*>(dataitem))));
  1650. break;
  1651. case TAC_DATA_ITEM_ID:
  1652. ret = setIteminReport(mCache.mTac,
  1653. SystemStatusTac(*(static_cast<TacDataItem*>(dataitem))));
  1654. break;
  1655. case MCCMNC_DATA_ITEM_ID:
  1656. ret = setIteminReport(mCache.mMccMnc,
  1657. SystemStatusMccMnc(*(static_cast<MccmncDataItem*>(dataitem))));
  1658. break;
  1659. case BTLE_SCAN_DATA_ITEM_ID:
  1660. ret = setIteminReport(mCache.mBtDeviceScanDetail, SystemStatusBtDeviceScanDetail(
  1661. *(static_cast<BtDeviceScanDetailsDataItem*>(dataitem))));
  1662. break;
  1663. case BT_SCAN_DATA_ITEM_ID:
  1664. ret = setIteminReport(mCache.mBtLeDeviceScanDetail, SystemStatusBtleDeviceScanDetail(
  1665. *(static_cast<BtLeDeviceScanDetailsDataItem*>(dataitem))));
  1666. break;
  1667. default:
  1668. break;
  1669. }
  1670. pthread_mutex_unlock(&mMutexSystemStatus);
  1671. LOC_LOGv("DataItemId: %d, whether to record dateitem in cache: %d", dataitem->getId(), ret);
  1672. return ret;
  1673. }
  1674. /******************************************************************************
  1675. @brief API to get report data into a given buffer
  1676. @param[In] reference to report buffer
  1677. @param[In] bool flag to identify latest only or entire buffer
  1678. @return true when successfully done
  1679. ******************************************************************************/
  1680. bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly,
  1681. bool inSessionOnly) const {
  1682. pthread_mutex_lock(&mMutexSystemStatus);
  1683. if (inSessionOnly && !mTracking) {
  1684. pthread_mutex_unlock(&mMutexSystemStatus);
  1685. return true;
  1686. }
  1687. if (isLatestOnly) {
  1688. // push back only the latest report and return it
  1689. getIteminReport(report.mLocation, mCache.mLocation);
  1690. getIteminReport(report.mTimeAndClock, mCache.mTimeAndClock);
  1691. getIteminReport(report.mXoState, mCache.mXoState);
  1692. getIteminReport(report.mRfAndParams, mCache.mRfAndParams);
  1693. getIteminReport(report.mErrRecovery, mCache.mErrRecovery);
  1694. getIteminReport(report.mInjectedPosition, mCache.mInjectedPosition);
  1695. getIteminReport(report.mBestPosition, mCache.mBestPosition);
  1696. getIteminReport(report.mXtra, mCache.mXtra);
  1697. getIteminReport(report.mEphemeris, mCache.mEphemeris);
  1698. getIteminReport(report.mSvHealth, mCache.mSvHealth);
  1699. getIteminReport(report.mPdr, mCache.mPdr);
  1700. getIteminReport(report.mNavData, mCache.mNavData);
  1701. getIteminReport(report.mPositionFailure, mCache.mPositionFailure);
  1702. getIteminReport(report.mAirplaneMode, mCache.mAirplaneMode);
  1703. getIteminReport(report.mENH, mCache.mENH);
  1704. getIteminReport(report.mGPSState, mCache.mGPSState);
  1705. getIteminReport(report.mNLPStatus, mCache.mNLPStatus);
  1706. getIteminReport(report.mWifiHardwareState, mCache.mWifiHardwareState);
  1707. getIteminReport(report.mNetworkInfo, mCache.mNetworkInfo);
  1708. getIteminReport(report.mRilServiceInfo, mCache.mRilServiceInfo);
  1709. getIteminReport(report.mRilCellInfo, mCache.mRilCellInfo);
  1710. getIteminReport(report.mServiceStatus, mCache.mServiceStatus);
  1711. getIteminReport(report.mModel, mCache.mModel);
  1712. getIteminReport(report.mManufacturer, mCache.mManufacturer);
  1713. getIteminReport(report.mAssistedGps, mCache.mAssistedGps);
  1714. getIteminReport(report.mScreenState, mCache.mScreenState);
  1715. getIteminReport(report.mPowerConnectState, mCache.mPowerConnectState);
  1716. getIteminReport(report.mTimeZoneChange, mCache.mTimeZoneChange);
  1717. getIteminReport(report.mTimeChange, mCache.mTimeChange);
  1718. getIteminReport(report.mWifiSupplicantStatus, mCache.mWifiSupplicantStatus);
  1719. getIteminReport(report.mShutdownState, mCache.mShutdownState);
  1720. getIteminReport(report.mTac, mCache.mTac);
  1721. getIteminReport(report.mMccMnc, mCache.mMccMnc);
  1722. getIteminReport(report.mBtDeviceScanDetail, mCache.mBtDeviceScanDetail);
  1723. getIteminReport(report.mBtLeDeviceScanDetail, mCache.mBtLeDeviceScanDetail);
  1724. }
  1725. else {
  1726. // copy entire reports and return them
  1727. report.mLocation.clear();
  1728. report.mTimeAndClock.clear();
  1729. report.mXoState.clear();
  1730. report.mRfAndParams.clear();
  1731. report.mErrRecovery.clear();
  1732. report.mInjectedPosition.clear();
  1733. report.mBestPosition.clear();
  1734. report.mXtra.clear();
  1735. report.mEphemeris.clear();
  1736. report.mSvHealth.clear();
  1737. report.mPdr.clear();
  1738. report.mNavData.clear();
  1739. report.mPositionFailure.clear();
  1740. report.mAirplaneMode.clear();
  1741. report.mENH.clear();
  1742. report.mGPSState.clear();
  1743. report.mNLPStatus.clear();
  1744. report.mWifiHardwareState.clear();
  1745. report.mNetworkInfo.clear();
  1746. report.mRilServiceInfo.clear();
  1747. report.mRilCellInfo.clear();
  1748. report.mServiceStatus.clear();
  1749. report.mModel.clear();
  1750. report.mManufacturer.clear();
  1751. report.mAssistedGps.clear();
  1752. report.mScreenState.clear();
  1753. report.mPowerConnectState.clear();
  1754. report.mTimeZoneChange.clear();
  1755. report.mTimeChange.clear();
  1756. report.mWifiSupplicantStatus.clear();
  1757. report.mShutdownState.clear();
  1758. report.mTac.clear();
  1759. report.mMccMnc.clear();
  1760. report.mBtDeviceScanDetail.clear();
  1761. report.mBtLeDeviceScanDetail.clear();
  1762. report = mCache;
  1763. }
  1764. pthread_mutex_unlock(&mMutexSystemStatus);
  1765. return true;
  1766. }
  1767. /******************************************************************************
  1768. @brief API to set default report data
  1769. @param[In] none
  1770. @return true when successfully done
  1771. ******************************************************************************/
  1772. bool SystemStatus::setDefaultGnssEngineStates(void)
  1773. {
  1774. pthread_mutex_lock(&mMutexSystemStatus);
  1775. setDefaultIteminReport(mCache.mLocation, SystemStatusLocation());
  1776. setDefaultIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock());
  1777. setDefaultIteminReport(mCache.mXoState, SystemStatusXoState());
  1778. setDefaultIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams());
  1779. setDefaultIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery());
  1780. setDefaultIteminReport(mCache.mInjectedPosition, SystemStatusInjectedPosition());
  1781. setDefaultIteminReport(mCache.mBestPosition, SystemStatusBestPosition());
  1782. setDefaultIteminReport(mCache.mXtra, SystemStatusXtra());
  1783. setDefaultIteminReport(mCache.mEphemeris, SystemStatusEphemeris());
  1784. setDefaultIteminReport(mCache.mSvHealth, SystemStatusSvHealth());
  1785. setDefaultIteminReport(mCache.mPdr, SystemStatusPdr());
  1786. setDefaultIteminReport(mCache.mNavData, SystemStatusNavData());
  1787. setDefaultIteminReport(mCache.mPositionFailure, SystemStatusPositionFailure());
  1788. pthread_mutex_unlock(&mMutexSystemStatus);
  1789. return true;
  1790. }
  1791. /******************************************************************************
  1792. @brief API to handle connection status update event from GnssRil
  1793. @param[In] Connection status
  1794. @return true when successfully done
  1795. ******************************************************************************/
  1796. bool SystemStatus::eventConnectionStatus(bool connected, int8_t type,
  1797. bool roaming, NetworkHandle networkHandle,
  1798. string& apn)
  1799. {
  1800. // send networkinof dataitem to systemstatus observer clients
  1801. SystemStatusNetworkInfo s(type, "", "", connected, roaming,
  1802. (uint64_t) networkHandle, apn);
  1803. mSysStatusObsvr.notify({&s.mDataItem});
  1804. return true;
  1805. }
  1806. /******************************************************************************
  1807. @brief API to update power connect state
  1808. @param[In] power connect status
  1809. @return true when successfully done
  1810. ******************************************************************************/
  1811. bool SystemStatus::updatePowerConnectState(bool charging)
  1812. {
  1813. SystemStatusPowerConnectState s(charging);
  1814. mSysStatusObsvr.notify({&s.mDataItem});
  1815. return true;
  1816. }
  1817. /******************************************************************************
  1818. @brief API to update ENH
  1819. @param[In] user consent
  1820. @return true when successfully done
  1821. ******************************************************************************/
  1822. bool SystemStatus::eventOptInStatus(bool userConsent)
  1823. {
  1824. SystemStatusENH s(userConsent, ENHDataItem::FIELD_CONSENT);
  1825. mSysStatusObsvr.notify({&s.mDataItem});
  1826. return true;
  1827. }
  1828. /******************************************************************************
  1829. @brief API to update Region
  1830. @param[In] region
  1831. @return true when successfully done
  1832. ******************************************************************************/
  1833. bool SystemStatus::eventRegionStatus(bool region)
  1834. {
  1835. SystemStatusENH s(region, ENHDataItem::FIELD_REGION);
  1836. mSysStatusObsvr.notify({&s.mDataItem});
  1837. return true;
  1838. }
  1839. /******************************************************************************
  1840. @brief API to notify emergency call
  1841. @param[In] is emergency call
  1842. @return true when successfully done
  1843. ******************************************************************************/
  1844. bool SystemStatus::eventInEmergencyCall(bool isEmergency)
  1845. {
  1846. SystemStatusInEmergencyCall s(isEmergency);
  1847. mSysStatusObsvr.notify({&s.mDataItem});
  1848. return true;
  1849. }
  1850. /******************************************************************************
  1851. @brief API to update engine tracking state
  1852. ******************************************************************************/
  1853. void SystemStatus::setTracking(bool tracking) {
  1854. pthread_mutex_lock(&mMutexSystemStatus);
  1855. mTracking = tracking;
  1856. pthread_mutex_unlock(&mMutexSystemStatus);
  1857. }
  1858. } // namespace loc_core