8#include <QtCore/QDebug>
9#include <QtCore/QPermission>
10#include <QtCore/QCoreApplication>
12#include <emscripten/val.h>
13#include <emscripten/bind.h>
27 Q_ASSERT(!geolocation().isUndefined());
30 m_instanceId = m_dispatcher->registerInfoSourceInstance(
this);
32 successCallback = val::module_property(
"qtGeolocationPositionSuccess").call<val>(
"bind", val::undefined(), m_instanceId);
33 errorCallback = val::module_property(
"qtGeolocationPositionError").call<val>(
"bind", val::undefined(), m_instanceId);
39 return val::global(
"navigator")[
"geolocation"];
55 QGeoPositionInfoSource::setUpdateInterval(msec);
60 if (m_updates_running) {
61 qDebug() <<
"startUpdates() is called, but an update is already running.";
65 if (preferredPositioningMethods() == 0) {
66 m_lastError = QGeoPositionInfoSource::UnknownSourceError;
70 m_updates_running =
true;
71 m_lastError = QGeoPositionInfoSource::NoError;
73 val options = val::object();
74 options.set(
"maximumAge", 0);
76 if (preferredPositioningMethods() & PositioningMethod::SatellitePositioningMethods)
77 options.set(
"enableHighAccuracy",
true);
79 m_handlerId = geolocation().call<val>(
"watchPosition", successCallback, errorCallback, options);
84 geolocation().call<
void>(
"clearWatch", m_handlerId);
85 m_updates_running =
false;
91 emit errorOccurred(UpdateTimeoutError);
95 if (m_singleUpdatePending) {
96 qDebug() <<
"requestUpdate() called while a previous update is still pending. Ignoring.";
100 m_singleUpdatePending =
true;
101 m_lastError = QGeoPositionInfoSource::NoError;
103 val options = val::object();
104 options.set(
"maximumAge", 0);
105 options.set(
"timeout", timeout);
107 if (preferredPositioningMethods() & PositioningMethod::SatellitePositioningMethods)
108 options.set(
"enableHighAccuracy",
true);
110 geolocation().call<
void>(
"getCurrentPosition", successCallback, errorCallback, options);
115 return QGeoPositionInfoSource::AllPositioningMethods;
120 PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
121 QGeoPositionInfoSource::setPreferredPositioningMethods(methods);
122 if (previousPreferredPositioningMethods == preferredPositioningMethods())
125 if (m_updates_running)
126 reconfigureRunningSystem();
137 Q_UNUSED(fromSatellitePositioningMethodsOnly);
138 return m_lastKnownPosition;
143 qDebug() <<
"QGeoPositionInfoSourceWasm::error";
151 QGeoPositionInfo info;
152 info.setTimestamp(QDateTime::fromMSecsSinceEpoch(position[
"timestamp"].as<
double>()));
155 val latitude = coords[
"latitude"];
156 val longitude = coords[
"longitude"];
157 val altitude = coords[
"altitude"];
158 info.setCoordinate(altitude.isNull() ?
159 QGeoCoordinate(latitude.as<
double>(), longitude.as<
double>()) :
160 QGeoCoordinate(latitude.as<
double>(), longitude.as<
double>(), altitude.as<
double>())
163 if (val speed = coords[
"speed"]; !speed.isNull())
164 info.setAttribute(QGeoPositionInfo::GroundSpeed, speed.as<
double>());
165 if (val heading = coords[
"heading"]; !heading.isNull())
166 info.setAttribute(QGeoPositionInfo::Direction, heading.as<
double>());
168 info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, coords[
"accuracy"].as<
double>());
169 if (val altitudeAccuracy = coords[
"altitudeAccuracy"]; !altitudeAccuracy.isNull())
170 info.setAttribute(QGeoPositionInfo::VerticalAccuracy, altitudeAccuracy.as<
double>());
172 m_lastKnownPosition = info;
173 m_singleUpdatePending =
false;
175 emit positionUpdated(info);
180 qDebug() <<
"geolocationError";
181 qDebug() <<
"Handler ID:" << m_handlerId.as<
int>();
183 int code = error[
"code"].as<
int>();
184 QString message = error[
"message"].as<QString>();
186 QGeoPositionInfoSource::Error qtError = QGeoPositionInfoSource::UnknownSourceError;
190 qtError = QGeoPositionInfoSource::AccessError;
193 qtError = QGeoPositionInfoSource::UnknownSourceError;
196 qtError = QGeoPositionInfoSource::UpdateTimeoutError;
200 qDebug() <<
"Message: " << message;
202 m_lastError = qtError;
203 m_singleUpdatePending =
false;
205 emit errorOccurred(qtError);
210 if (!m_updates_running)
220#include "moc_qgeopositioninfosource_wasm_p.cpp"
static QGeoPositionInfoDispatcherWasm * instance()
void unregisterInfoSourceInstance(int instanceId)
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