summaryrefslogtreecommitdiffstats
path: root/navigation/navigation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'navigation/navigation.cpp')
-rw-r--r--navigation/navigation.cpp128
1 files changed, 125 insertions, 3 deletions
diff --git a/navigation/navigation.cpp b/navigation/navigation.cpp
index 6116637..e33772a 100644
--- a/navigation/navigation.cpp
+++ b/navigation/navigation.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019-2021 Konsulko Group
+ * Copyright (C) 2019-2022 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,37 +17,159 @@
#include <QDebug>
#include "navigation.h"
+#include "vehiclesignals.h"
+Navigation::Navigation(VehicleSignals *vs, QObject * parent) :
+ QObject(parent),
+ m_vs(vs),
+ m_connected(false)
-Navigation::Navigation (QObject * parent) :
- QObject(parent)
{
+ QObject::connect(m_vs, &VehicleSignals::connected, this, &Navigation::onConnected);
+ QObject::connect(m_vs, &VehicleSignals::authorized, this, &Navigation::onAuthorized);
+ QObject::connect(m_vs, &VehicleSignals::disconnected, this, &Navigation::onDisconnected);
+
+ if (m_vs)
+ m_vs->connect();
}
Navigation::~Navigation()
{
+ delete m_vs;
}
void Navigation::sendWaypoint(double lat, double lon)
{
+ if (!(m_vs && m_connected))
+ return;
+
+ // The original implementation resulted in at least 9 decimal places
+ // making it through to the clients, so explicitly format for 9. In
+ // practice going from the QString default 6 to 9 does make a difference
+ // with respect to smoothness in the position-based map rotations done
+ // in tbtnavi.
+ m_vs->set("Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Latitude", QString::number(lat, 'f', 9));
+ m_vs->set("Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Longitude", QString::number(lon, 'f', 9));
}
void Navigation::broadcastPosition(double lat, double lon, double drc, double dst)
{
+ if (!(m_vs && m_connected))
+ return;
+
+ m_vs->set("Vehicle.CurrentLocation.Latitude", QString::number(lat, 'f', 9));
+ m_vs->set("Vehicle.CurrentLocation.Longitude", QString::number(lon, 'f', 9));
+ m_vs->set("Vehicle.CurrentLocation.Heading", QString::number(drc, 'f', 9));
+
+ // NOTES:
+ // - This signal is an AGL addition, it may make sense to engage with the
+ // VSS specification upstream to discuss an addition along these lines.
+ // - The signal makes more sense in kilometers wrt VSS expectations, so
+ // conversion from meters happens here for now to avoid changing the
+ // existing clients. This may be worth revisiting down the road.
+ m_vs->set("Vehicle.Cabin.Infotainment.Navigation.ElapsedDistance", QString::number(dst / 1000, 'f', 9));
}
void Navigation::broadcastRouteInfo(double lat, double lon, double route_lat, double route_lon)
{
+ if (!(m_vs && m_connected))
+ return;
+
+ m_vs->set("Vehicle.CurrentLocation.Latitude", QString::number(lat, 'f', 9));
+ m_vs->set("Vehicle.CurrentLocation.Longitude", QString::number(lon, 'f', 9));
+
+ m_vs->set("Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Latitude", QString::number(route_lat, 'f', 9));
+ m_vs->set("Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Longitude", QString::number(route_lon, 'f', 9));
}
void Navigation::broadcastStatus(QString state)
{
+ if (!(m_vs && m_connected))
+ return;
+
+ m_vs->set("Vehicle.Cabin.Infotainment.Navigation.State", state);
}
void Navigation::onConnected()
{
+ if (!m_vs)
+ return;
+
+ m_vs->authorize();
+}
+
+void Navigation::onAuthorized()
+{
+ if (!m_vs)
+ return;
+
+ m_connected = true;
+
+ QObject::connect(m_vs, &VehicleSignals::signalNotification, this, &Navigation::onSignalNotification);
+
+ // NOTE: This signal is another AGL addition where it is possible
+ // upstream may be open to adding it to VSS.
+ m_vs->subscribe("Vehicle.Cabin.Infotainment.Navigation.State");
+ m_vs->subscribe("Vehicle.CurrentLocation.Latitude");
+ m_vs->subscribe("Vehicle.CurrentLocation.Longitude");
+ m_vs->subscribe("Vehicle.CurrentLocation.Heading");
+ m_vs->subscribe("Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Latitude");
+ m_vs->subscribe("Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Longitude");
+ m_vs->subscribe("Vehicle.Cabin.Infotainment.Navigation.ElapsedDistance");
}
void Navigation::onDisconnected()
{
+ QObject::disconnect(m_vs, &VehicleSignals::signalNotification, this, &Navigation::onSignalNotification);
+
+ m_connected = false;
+}
+
+void Navigation::onSignalNotification(QString path, QString value, QString timestamp)
+{
+ // NOTE: Since all the known AGL users of the VSS signals are users of
+ // this API, we know that updates occur in certain sequences and
+ // can leverage this to roll up for emitting the existing events.
+ // This is the path of least effort with respect to changing
+ // the existing clients, but it may make sense down the road to
+ // either switch them to using VehicleSignals directly or having
+ // a more granular signal scheme that maps more directly onto
+ // VSS.
+ if (path == "Vehicle.Cabin.Infotainment.Navigation.State") {
+ QVariantMap event;
+ event["state"] = value;
+ emit statusEvent(event);
+ } else if (path == "Vehicle.CurrentLocation.Latitude") {
+ m_latitude = value.toDouble();
+ } else if (path == "Vehicle.CurrentLocation.Longitude") {
+ m_longitude = value.toDouble();
+ } else if (path == "Vehicle.CurrentLocation.Heading") {
+ m_heading = value.toDouble();
+ } else if (path == "Vehicle.Cabin.Infotainment.Navigation.ElapsedDistance") {
+ m_distance = value.toDouble();
+ QVariantMap event;
+ event["position"] = "car";
+ event["latitude"] = m_latitude;
+ event["longitude"] = m_longitude;
+ event["direction"] = m_heading;
+ event["distance"] = m_distance * 1000;
+ emit positionEvent(event);
+ } else if (path == "Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Latitude") {
+ m_dest_latitude = value.toDouble();
+ } else if (path == "Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Longitude") {
+ m_dest_longitude = value.toDouble();
+ QVariantMap event;
+ event["position"] = "route";
+ event["latitude"] = m_latitude;
+ event["longitude"] = m_longitude;
+ event["route_latitude"] = m_dest_latitude;
+ event["route_longitude"] = m_dest_longitude;
+ emit positionEvent(event);
+
+ // NOTE: Potentially could emit a waypointsEvent here, but
+ // nothing in the demo currently requires it, so do
+ // not bother for now. If something like Alexa is
+ // added it or some other replacement / rework will
+ // be required.
+ }
}