diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/CMakeLists.txt | 39 | ||||
-rw-r--r-- | app/ValueSource.qml | 77 | ||||
-rw-r--r-- | app/main.cpp | 87 |
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(); } |