diff options
author | Wei Chen <weic@codeaurora.org> | 2018-10-19 15:52:40 -0700 |
---|---|---|
committer | Wei Chen <weic@codeaurora.org> | 2018-11-27 14:46:25 -0800 |
commit | 730abcc3d4354badb431ec99ca10011b29d5eccd (patch) | |
tree | 8df9c0161a2575237f29192a076bc4bef98402f5 /gnss | |
parent | 9b0abcc59d3ea840c38b131d2c4d1c14028f29e1 (diff) | |
download | gps-730abcc3d4354badb431ec99ca10011b29d5eccd.tar.gz |
GPS NMEA: generate proper nmea during leap second transition
During leap second transition, the hour, minute and seconds
displayed need to be in the format of 23:59:60 to denote
the extra leap second
Change-Id: Ice7c6f934b1251990ba26e2b7e399554a2862eb4
CRs-fixed: 2335188
Diffstat (limited to 'gnss')
-rw-r--r-- | gnss/GnssAdapter.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index fc59c22..6b3e846 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -1920,9 +1920,6 @@ GnssAdapter::updateClientsEventMask() mask |= LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT; updateNmeaMask(mNmeaMask | LOC_NMEA_MASK_DEBUG_V02); } - if (it->second.locationSystemInfoCb != nullptr) { - mask |= LOC_API_ADAPTER_BIT_LOC_SYSTEM_INFO; - } } /* @@ -1952,6 +1949,9 @@ GnssAdapter::updateClientsEventMask() mask |= LOC_API_ADAPTER_BIT_REQUEST_WIFI; } + // need to register for leap second info + // for proper nmea generation + mask |= LOC_API_ADAPTER_BIT_LOC_SYSTEM_INFO; updateEvtMask(mask, LOC_REGISTRATION_MASK_SET); } @@ -3012,7 +3012,8 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation, (LOC_RELIABILITY_NOT_SET == locationExtended.horizontal_reliability)); uint8_t generate_nmea = (reported && status != LOC_SESS_FAILURE && !blank_fix); std::vector<std::string> nmeaArraystr; - loc_nmea_generate_pos(ulpLocation, locationExtended, generate_nmea, nmeaArraystr); + loc_nmea_generate_pos(ulpLocation, locationExtended, mLocSystemInfo, + generate_nmea, nmeaArraystr); stringstream ss; for (auto sentence : nmeaArraystr) { ss << sentence; @@ -3292,7 +3293,22 @@ GnssAdapter::reportLocationSystemInfo(const LocationSystemInfo & locationSystemI // may come at different time if (locationSystemInfo.systemInfoMask & LOCATION_SYS_INFO_LEAP_SECOND) { mLocSystemInfo.systemInfoMask |= LOCATION_SYS_INFO_LEAP_SECOND; - mLocSystemInfo.leapSecondSysInfo = locationSystemInfo.leapSecondSysInfo; + + const LeapSecondSystemInfo &srcLeapSecondSysInfo = locationSystemInfo.leapSecondSysInfo; + LeapSecondSystemInfo &dstLeapSecondSysInfo = mLocSystemInfo.leapSecondSysInfo; + if (srcLeapSecondSysInfo.leapSecondInfoMask & + LEAP_SECOND_SYS_INFO_CURRENT_LEAP_SECONDS_BIT) { + dstLeapSecondSysInfo.leapSecondInfoMask |= + LEAP_SECOND_SYS_INFO_CURRENT_LEAP_SECONDS_BIT; + dstLeapSecondSysInfo.leapSecondCurrent = srcLeapSecondSysInfo.leapSecondCurrent; + } + // once leap second change event is complete, modem may send up event invalidate the leap second + // change info while AP is still processing report during leap second transition + // so, we choose to keep this info around even though it is old + if (srcLeapSecondSysInfo.leapSecondInfoMask & LEAP_SECOND_SYS_INFO_LEAP_SECOND_CHANGE_BIT) { + dstLeapSecondSysInfo.leapSecondInfoMask |= LEAP_SECOND_SYS_INFO_LEAP_SECOND_CHANGE_BIT; + dstLeapSecondSysInfo.leapSecondChangeInfo = srcLeapSecondSysInfo.leapSecondChangeInfo; + } } // we received new info, inform client of the newly received info |