summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/CMakeLists.txt39
-rw-r--r--app/ValueSource.qml77
-rw-r--r--app/main.cpp87
3 files changed, 110 insertions, 93 deletions
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index e99daa7..d78eed6 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -1,5 +1,5 @@
###########################################################################
-# Copyright 2018,2019 Konsulko Group
+# Copyright 2018,2019,2022 Konsulko Group
#
# Author: Scott Murray <scott.murray@konsulko.com>
#
@@ -16,12 +16,18 @@
# limitations under the License.
###########################################################################
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_AUTORCC ON)
+project(cluster-dashboard VERSION 2.0.0 LANGUAGES CXX)
+
+if(CMAKE_VERSION VERSION_LESS "3.7.0")
+ set(CMAKE_INCLUDE_CURRENT_DIR ON)
+endif()
+set(OE_QMAKE_PATH_EXTERNAL_HOST_BINS $ENV{OE_QMAKE_PATH_HOST_BINS})
+
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
-set(OE_QMAKE_PATH_EXTERNAL_HOST_BINS $ENV{OE_QMAKE_PATH_HOST_BINS})
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
find_package(Qt5 COMPONENTS Core Gui QuickControls2 QuickWidgets REQUIRED)
find_package(Qt5Gui ${QT_MIN_VERSION} CONFIG REQUIRED Private)
@@ -30,8 +36,6 @@ find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
qt5_add_resources(RESOURCES cluster-gauges.qrc images/images.qrc)
-PROJECT_TARGET_ADD(cluster-gauges)
-
add_custom_command(
OUTPUT agl-shell-client-protocol.h
COMMAND ${WAYLAND_SCANNER_EXECUTABLE} client-header
@@ -56,36 +60,29 @@ add_custom_command(
DEPENDS ${CMAKE_SOURCE_DIR}/app/protocol/agl-shell.xml
)
-add_executable(${TARGET_NAME}
+add_executable(${PROJECT_NAME}
main.cpp
agl-shell-protocol.c
agl-shell-client-protocol.h
${RESOURCES}
)
-pkg_check_modules(QTAPPFW REQUIRED qtappfw-signal-composer)
pkg_check_modules(GLIB REQUIRED glib-2.0)
pkg_check_modules(WAYLAND_CLIENT REQUIRED wayland-client)
+pkg_check_modules(QTAPPFW_VEHICLE_SIGNALS REQUIRED qtappfw-vehicle-signals)
include_directories(
include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})
- ${QTAPPFW_INCLUDE_DIRS}
+ ${QTAPPFW_VEHICLE_SIGNALS_INCLUDE_DIRS}
${GLIB_INCLUDE_DIRS}
)
-set_target_properties(${TARGET_NAME} PROPERTIES
- LABELS "EXECUTABLE"
- PREFIX ""
- COMPILE_FLAGS "${QTAPPFW_FLAGS} ${GLIB_FLAGS} ${EXTRAS_CFLAGS} -DFOR_AFB_BINDING"
- LINK_FLAGS "${BINDINGS_LINK_FLAG}"
- LINK_LIBRARIES "${EXTRAS_LIBRARIES}"
- OUTPUT_NAME "${TARGET_NAME}"
-)
-
-target_link_libraries(${TARGET_NAME}
+target_link_libraries(${PROJECT_NAME}
Qt5::QuickControls2
Qt5::QuickWidgets
- ${QTAPPFW_LIBRARIES}
+ ${QTAPPFW_VEHICLE_SIGNALS_LIBRARIES}
${GLIB_LDFLAGS}
${WAYLAND_CLIENT_LIBRARIES}
)
+
+install(TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/app/ValueSource.qml b/app/ValueSource.qml
index 80ef95c..511a2a1 100644
--- a/app/ValueSource.qml
+++ b/app/ValueSource.qml
@@ -53,7 +53,7 @@ import QtQuick 2.2
Item {
id: valueSource
property real kph: 0
- property bool mphDisplay: true
+ property bool mphDisplay: false
property real speedScaling: mphDisplay == true ? 0.621504 : 1.0
property real rpm: 1
property real fuel: 0.85
@@ -96,46 +96,81 @@ Item {
return Math.random() > 0.5 ? Qt.LeftArrow : Qt.RightArrow;
}
+ Component.onCompleted : {
+ if(!runAnimation) {
+ VehicleSignals.connect()
+ }
+ }
+
Connections {
- target: SignalComposer
+ target: VehicleSignals
+
+ onConnected: {
+ VehicleSignals.authorize()
+ }
+
+ onAuthorized: {
+ VehicleSignals.subscribe("Vehicle.Speed")
+ VehicleSignals.subscribe("Vehicle.Powertrain.CombustionEngine.Speed")
+ VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.CruiseEnable")
+ VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.CruiseSet")
+ VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.CruiseResume")
+ VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.CruiseCancel")
+ VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.LaneDepartureWarning")
+ VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.Info")
+ VehicleSignals.get("Vehicle.Cabin.Infotainment.HMI.DistanceUnit")
+ VehicleSignals.subscribe("Vehicle.Cabin.Infotainment.HMI.DistanceUnit")
+ }
- onSignalEvent: {
- if (uid === "event.vehicle.speed") {
- var speed_tmp = parseFloat(value)
- if(units == "mph") {
- speed_tmp *= 1.609
+ onGetSuccessResponse: {
+ //console.log("response path = " + path + ", value = " + value)
+ if (path === "Vehicle.Cabin.Infotainment.HMI.DistanceUnit") {
+ if (value === "km") {
+ valueSource.mphDisplay = false
+ } else if (value === "mi") {
+ valueSource.mphDisplay = true
}
+ }
+ }
+
+ onSignalNotification: {
+ //console.log("signal path = " + path + ", value = " + value)
+ if (path === "Vehicle.Speed") {
+ // units are always km/h
+ // Checking Vehicle.Cabin.Infotainment.HMI.DistanceUnit for the
+ // display unit would likely be a worthwhile enhancement.
if(!runAnimation) {
- valueSource.kph = speed_tmp
+ valueSource.kph = parseFloat(value)
}
- }
- else if (uid === "event.engine.speed") {
+ } else if (path === "Vehicle.Powertrain.CombustionEngine.Speed") {
if(!runAnimation) {
valueSource.rpm = parseFloat(value) / 1000
}
- }
- else if (uid === "event.cruise.enable" && value === "true") {
+ } else if (path === "Vehicle.Cabin.SteeringWheel.Switches.CruiseEnable" && value === "true") {
if(valueSource.cruiseEnabled) {
valueSource.cruiseEnabled = false
valueSource.cruiseSet = false
} else {
valueSource.cruiseEnabled = true
}
- }
- else if ((uid === "event.cruise.set" || uid === "event.cruise.resume") &&
- value === "true") {
+ } else if ((path === "Vehicle.Cabin.SteeringWheel.Switches.CruiseSet" ||
+ path === "Vehicle.Cabin.SteeringWheel.Switches.CruiseResume") &&
+ value == "true") {
if(valueSource.cruiseEnabled) {
valueSource.cruiseSet = true
}
- }
- else if (uid === "event.cruise.cancel" && value === "true") {
+ } else if (path === "Vehicle.Cabin.SteeringWheel.Switches.CruiseCancel" && value === "true") {
valueSource.cruiseSet = false
- }
- else if (uid === "event.lane_departure_warning.enable" && value === "true") {
+ } else if (path === "Vehicle.Cabin.SteeringWheel.Switches.LaneDepartureWarning" && value === "true") {
valueSource.laneDepartureWarnEnabled = !valueSource.laneDepartureWarnEnabled
- }
- else if (uid === "event.info" && value === "true") {
+ } else if (path === "Vehicle.Cabin.SteeringWheel.Switches.Info" && value === "true") {
valueSource.displayNumericSpeeds = !valueSource.displayNumericSpeeds
+ } else if (path === "Vehicle.Cabin.Infotainment.HMI.DistanceUnit") {
+ if (value === "km") {
+ valueSource.mphDisplay = false
+ } else if (value === "mi") {
+ valueSource.mphDisplay = true
+ }
}
}
}
diff --git a/app/main.cpp b/app/main.cpp
index 3c460d5..44a2892 100644
--- a/app/main.cpp
+++ b/app/main.cpp
@@ -32,10 +32,11 @@
#include <QDebug>
#include <QScreen>
-#include <signalcomposer.h>
#include <wayland-client.h>
#include "agl-shell-client-protocol.h"
+#include <vehiclesignals.h>
+
// Global indicating whether canned animation should run
bool runAnimation = true;
@@ -46,7 +47,7 @@ global_add(void *data, struct wl_registry *reg, uint32_t name,
struct agl_shell **shell = static_cast<struct agl_shell **>(data);
if (strcmp(interface, agl_shell_interface.name) == 0) {
*shell = static_cast<struct agl_shell *>(wl_registry_bind(reg,
- name, &agl_shell_interface, version)
+ name, &agl_shell_interface, 1)
);
}
}
@@ -141,10 +142,22 @@ create_component(QPlatformNativeInterface *native, QQmlComponent *comp,
return getWlSurface(native, win);
}
+static QScreen *find_screen(const char *screen_name)
+{
+ QList<QScreen *> screens = qApp->screens();
+ QString name(screen_name);
+
+ for (QScreen *screen : screens) {
+ if (name == screen->name())
+ return screen;
+ }
+
+ return nullptr;
+}
int main(int argc, char *argv[])
{
- QString myname = QString("cluster-gauges");
+ QString myname = QString("cluster-dashboard");
struct agl_shell *agl_shell;
struct wl_output *output;
@@ -162,63 +175,35 @@ int main(int argc, char *argv[])
std::shared_ptr<struct agl_shell> shell{agl_shell, agl_shell_destroy};
- screen = qApp->primaryScreen();
+ const char *screen_name = getenv("DASHBOARD_START_SCREEN");
+ if (screen_name)
+ screen = find_screen(screen_name);
+ else
+ screen = qApp->primaryScreen();
output = getWlOutput(native, screen);
- QCommandLineParser parser;
- parser.addPositionalArgument("port", app.translate("main", "port for binding"));
- parser.addPositionalArgument("secret", app.translate("main", "secret for binding"));
- parser.addHelpOption();
- parser.addVersionOption();
- parser.process(app);
-
- QStringList positionalArguments = parser.positionalArguments();
+ read_config();
QQmlApplicationEngine engine;
QQmlContext *context = engine.rootContext();
+ context->setContextProperty("runAnimation", runAnimation);
- if (positionalArguments.length() == 2) {
- int port = positionalArguments.takeFirst().toInt();
- QString secret = positionalArguments.takeFirst();
-
- QUrl bindingAddress;
- QUrlQuery query;
+ VehicleSignalsConfig vsConfig(myname);
+ context->setContextProperty("VehicleSignals", new VehicleSignals(vsConfig));
- struct wl_surface *bg;
+ QQmlComponent bg_comp(&engine, QUrl("qrc:/cluster-gauges.qml"));
+ qDebug() << bg_comp.errors();
+ struct wl_surface *bg = create_component(native, &bg_comp, screen, &qobj_bg);
- bindingAddress.setScheme(QStringLiteral("ws"));
- bindingAddress.setHost(QStringLiteral("localhost"));
- bindingAddress.setPort(port);
- bindingAddress.setPath(QStringLiteral("/api"));
+ // set the surface as the background
+ agl_shell_set_background(agl_shell, bg, output);
- query.addQueryItem(QStringLiteral("token"), secret);
- bindingAddress.setQuery(query);
-
- read_config();
-
- context->setContextProperty(QStringLiteral("bindingAddress"),
- bindingAddress);
-
- context->setContextProperty("SignalComposer",
- new SignalComposer(bindingAddress,
- context));
- context->setContextProperty("runAnimation", runAnimation);
-
- QQmlComponent bg_comp(&engine, QUrl("qrc:/cluster-gauges.qml"));
- qDebug() << bg_comp.errors();
-
- bg = create_component(native, &bg_comp, screen, &qobj_bg);
-
- // set the surface as the background
- agl_shell_set_background(agl_shell, bg, output);
-
- // instruct the compositor it can display after Qt has a chance
- // to load everything
- QTimer::singleShot(500, [agl_shell](){
- qDebug() << "agl_shell ready!";
- agl_shell_ready(agl_shell);
- });
- }
+ // instruct the compositor it can display after Qt has a chance
+ // to load everything
+ QTimer::singleShot(500, [agl_shell](){
+ qDebug() << "agl_shell ready!";
+ agl_shell_ready(agl_shell);
+ });
return app.exec();
}