summaryrefslogtreecommitdiff
path: root/gnss
diff options
context:
space:
mode:
authorWei Chen <weic@codeaurora.org>2018-10-19 15:52:40 -0700
committerWei Chen <weic@codeaurora.org>2018-11-27 14:46:25 -0800
commit730abcc3d4354badb431ec99ca10011b29d5eccd (patch)
tree8df9c0161a2575237f29192a076bc4bef98402f5 /gnss
parent9b0abcc59d3ea840c38b131d2c4d1c14028f29e1 (diff)
downloadgps-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.cpp26
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