summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Wolff <oliver.wolff@qt.io>2018-11-26 15:04:05 +0100
committerOliver Wolff <oliver.wolff@qt.io>2018-11-28 06:36:24 +0000
commit9307404d2dcb0b53d0dfcad6c28677cc2aba4a12 (patch)
tree82553e1cb7c74b6ed3b85aea101de5153758c61d
parent25493cbb07f8cbc6c6d12cfc575a71875be06692 (diff)
downloadqtlocation-9307404d2dcb0b53d0dfcad6c28677cc2aba4a12.tar.gz
winrt: Implement minimumUpdateInterval
According to MSDN GeoLocator's default ReportInterval is 1 second or as frequent as the hardware can support – whichever is shorter. By using that functionality we can support minimumUpdateInterval "properly". Change-Id: Id54197babeec04c8fc0a309930b192e36d9138f8 Reviewed-by: Miguel Costa <miguel.costa@qt.io>
-rw-r--r--src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp
index fa537af7..139a6b3d 100644
--- a/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp
+++ b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp
@@ -114,6 +114,7 @@ public:
EventRegistrationToken positionToken;
QMutex mutex;
bool updatesOngoing;
+ int minimumUpdateInterval;
PositionStatus nativeStatus() const;
};
@@ -168,8 +169,11 @@ int QGeoPositionInfoSourceWinRT::init()
&d->locator);
RETURN_HR_IF_FAILED("Could not initialize native location services.");
- hr = d->locator->put_ReportInterval(1000);
- RETURN_HR_IF_FAILED("Could not initialize report interval.");
+ UINT32 interval;
+ hr = d->locator->get_ReportInterval(&interval);
+ RETURN_HR_IF_FAILED("Could not retrieve report interval.");
+ d->minimumUpdateInterval = static_cast<int>(interval);
+ setUpdateInterval(d->minimumUpdateInterval);
return hr;
});
@@ -189,7 +193,6 @@ int QGeoPositionInfoSourceWinRT::init()
d->positionToken.value = 0;
d->periodicTimer.setSingleShot(true);
- d->periodicTimer.setInterval(minimumUpdateInterval());
connect(&d->periodicTimer, &QTimer::timeout, this, &QGeoPositionInfoSourceWinRT::virtualPositionUpdate);
d->singleUpdateTimer.setSingleShot(true);
@@ -258,11 +261,9 @@ void QGeoPositionInfoSourceWinRT::setUpdateInterval(int msec)
{
qCDebug(lcPositioningWinRT) << __FUNCTION__ << msec;
Q_D(QGeoPositionInfoSourceWinRT);
- if (msec == 0)
- msec = minimumUpdateInterval();
-
- // If msec is 0 we send updates as data becomes available, otherwise we force msec to be equal
- // to or larger than the minimum update interval.
+ // minimumUpdateInterval is initialized to the lowest possible update interval in init().
+ // Passing 0 will cause an error on Windows 10.
+ // See https://docs.microsoft.com/en-us/uwp/api/windows.devices.geolocation.geolocator.reportinterval
if (msec != 0 && msec < minimumUpdateInterval())
msec = minimumUpdateInterval();
@@ -271,7 +272,7 @@ void QGeoPositionInfoSourceWinRT::setUpdateInterval(int msec)
if (needsRestart)
stopHandler();
- HRESULT hr = d->locator->put_ReportInterval(msec);
+ HRESULT hr = d->locator->put_ReportInterval(static_cast<UINT32>(msec));
if (FAILED(hr)) {
setError(QGeoPositionInfoSource::UnknownSourceError);
qErrnoWarning(hr, "Failed to set update interval");
@@ -288,9 +289,8 @@ void QGeoPositionInfoSourceWinRT::setUpdateInterval(int msec)
int QGeoPositionInfoSourceWinRT::minimumUpdateInterval() const
{
- // We use one second to reduce potential timer events
- // in case the platform itself stops reporting
- return 1000;
+ Q_D(const QGeoPositionInfoSourceWinRT);
+ return d->minimumUpdateInterval;
}
void QGeoPositionInfoSourceWinRT::startUpdates()