7#include <QtCore/QDebug>
8#include <QtCore/QPermission>
9#include <QtCore/QCoreApplication>
11#include <emscripten/val.h>
12#include <emscripten/bind.h>
26 Q_ASSERT(!geolocation().isUndefined());
29 m_instanceId = m_dispatcher->registerInfoSourceInstance(
this);
31 successCallback = val::module_property(
"qtGeolocationPositionSuccess").call<val>(
"bind", val::undefined(), m_instanceId);
32 errorCallback = val::module_property(
"qtGeolocationPositionError").call<val>(
"bind", val::undefined(), m_instanceId);
38 return val::global(
"navigator")[
"geolocation"];
44 m_dispatcher->unregisterInfoSourceInstance(m_instanceId);
54 QGeoPositionInfoSource::setUpdateInterval(msec);
59 if (m_updates_running) {
60 qDebug() <<
"startUpdates() is called, but an update is already running.";
64 if (preferredPositioningMethods() == 0) {
65 m_lastError = QGeoPositionInfoSource::UnknownSourceError;
69 m_updates_running =
true;
70 m_lastError = QGeoPositionInfoSource::NoError;
72 val options = val::object();
73 options.set(
"maximumAge", 0);
75 if (preferredPositioningMethods() & PositioningMethod::SatellitePositioningMethods)
76 options.set(
"enableHighAccuracy",
true);
78 m_handlerId = geolocation().call<val>(
"watchPosition", successCallback, errorCallback, options);
83 geolocation().call<
void>(
"clearWatch", m_handlerId);
84 m_updates_running =
false;
90 emit errorOccurred(UpdateTimeoutError);
94 if (m_singleUpdatePending) {
95 qDebug() <<
"requestUpdate() called while a previous update is still pending. Ignoring.";
99 m_singleUpdatePending =
true;
100 m_lastError = QGeoPositionInfoSource::NoError;
102 val options = val::object();
103 options.set(
"maximumAge", 0);
104 options.set(
"timeout", timeout);
106 if (preferredPositioningMethods() & PositioningMethod::SatellitePositioningMethods)
107 options.set(
"enableHighAccuracy",
true);
109 geolocation().call<
void>(
"getCurrentPosition", successCallback, errorCallback, options);
114 return QGeoPositionInfoSource::AllPositioningMethods;
119 PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
120 QGeoPositionInfoSource::setPreferredPositioningMethods(methods);
121 if (previousPreferredPositioningMethods == preferredPositioningMethods())
124 if (m_updates_running)
125 reconfigureRunningSystem();
136 Q_UNUSED(fromSatellitePositioningMethodsOnly);
137 return m_lastKnownPosition;
142 qDebug() <<
"QGeoPositionInfoSourceWasm::error";
150 QGeoPositionInfo info;
151 info.setTimestamp(QDateTime::fromMSecsSinceEpoch(position[
"timestamp"].as<
double>()));
154 val latitude = coords[
"latitude"];
155 val longitude = coords[
"longitude"];
156 val altitude = coords[
"altitude"];
157 info.setCoordinate(altitude.isNull() ?
158 QGeoCoordinate(latitude.as<
double>(), longitude.as<
double>()) :
159 QGeoCoordinate(latitude.as<
double>(), longitude.as<
double>(), altitude.as<
double>())
162 if (val speed = coords[
"speed"]; !speed.isNull())
163 info.setAttribute(QGeoPositionInfo::GroundSpeed, speed.as<
double>());
164 if (val heading = coords[
"heading"]; !heading.isNull())
165 info.setAttribute(QGeoPositionInfo::Direction, heading.as<
double>());
167 info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, coords[
"accuracy"].as<
double>());
168 if (val altitudeAccuracy = coords[
"altitudeAccuracy"]; !altitudeAccuracy.isNull())
169 info.setAttribute(QGeoPositionInfo::VerticalAccuracy, altitudeAccuracy.as<
double>());
171 m_lastKnownPosition = info;
172 m_singleUpdatePending =
false;
174 emit positionUpdated(info);
179 qDebug() <<
"geolocationError";
180 qDebug() <<
"Handler ID:" << m_handlerId.as<
int>();
182 int code = error[
"code"].as<
int>();
183 QString message = error[
"message"].as<QString>();
185 QGeoPositionInfoSource::Error qtError = QGeoPositionInfoSource::UnknownSourceError;
189 qtError = QGeoPositionInfoSource::AccessError;
192 qtError = QGeoPositionInfoSource::UnknownSourceError;
195 qtError = QGeoPositionInfoSource::UpdateTimeoutError;
199 qDebug() <<
"Message: " << message;
201 m_lastError = qtError;
202 m_singleUpdatePending =
false;
204 emit errorOccurred(qtError);
209 if (!m_updates_running)
219#include "moc_qgeopositioninfosource_wasm_p.cpp"
static QGeoPositionInfoDispatcherWasm * instance()
void stopUpdates() override
void geolocationError(GeolocationPositionError error)
Error error() const override
Returns the type of error that last occurred.
void setPreferredPositioningMethods(PositioningMethods methods) override
~QGeoPositionInfoSourceWasm()
void requestUpdate(int timeout=0) override
PositioningMethods supportedPositioningMethods() const override
Returns the positioning methods available to this source.
void geolocationSuccess(GeolocationPosition position)
void setUpdateInterval(int msec) override
int minimumUpdateInterval() const override
QGeoPositionInfoSourceWasm(QObject *parent=0)
QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly=false) const override
Returns an update containing the last known position, or a null update if none is available.
Combined button and popup list for selecting options.
QT_BEGIN_NAMESPACE typedef emscripten::val GeolocationCoordinates
emscripten::val Geolocation
emscripten::val GeolocationPositionError
emscripten::val GeolocationPosition