C
Event Sender: Sending Messages to Applications
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
// This file is part of the Qt Safe Renderer module
import QtQuick
import QtQuick.Dialogs
import Qt.SafeRenderer
Window {
visible: true
width: 600
height: 620
title: qsTr("Event Sender")
id: controller
property int startSpeed: 0
property int maxSpeed: 200
property int stepSize: 1
property int carNumber: 1
property int currentIndex: 0
property var currentItem: clusterDataControl.stringList[currentIndex];
property string clusterIP: "127.0.0.1"
//Icon states
property bool isSpeedTextVisible: true
property bool isTurnLeftVisible: leftSignalButton.blink
property bool isTurnRightVisible: rightSignalButton.blink
property bool isIconLightsVisible: iconLightsButton.pressed
property bool isIconLampVisible: iconLampButton.pressed
property bool isIconTyreVisible: iconTyreButton.pressed
property bool isIconParkingBrakeVisible: iconParkingBrakeButton.pressed
property bool isIconFuelVisible: iconFuelButton.pressed
property bool isIconBatteryVisible: iconBatteryButton.pressed
property bool isIconSeatbeltVisible: iconSeatbeltButton.pressed
property bool isIconCoolantVisible: iconCoolantButton.pressed
property bool connectionState: clusterDataControl.connectionBool
property var iconButtons: {
"turnright" : rightSignalButton,
"turnleft": leftSignalButton,
"iconCoolant": iconCoolantButton,
"iconFuel": iconFuelButton,
"iconParkingBrake": iconParkingBrakeButton,
"iconTyre": iconTyreButton,
"iconBattery": iconBatteryButton,
"iconSeatbelt": iconSeatbeltButton,
"iconLamp": iconLampButton,
"iconLights": iconLightsButton
}
Connections {
target: clusterDataControl
onVehicleSpeedChanged: {
QSafeMessageSender.setText("speedText", clusterDataControl.vehicleSpeed)
}
}
Component.onCompleted: {
if (connectionState === true) {
//Hide icons to make sure icons state matches to button states
QSafeMessageSender.changeState("turnleft", "hidden")
QSafeMessageSender.changeState("turnright", "hidden")
QSafeMessageSender.changeItemVisiblity("iconLights", false)
QSafeMessageSender.changeItemVisiblity("iconLamp", false)
QSafeMessageSender.changeItemVisiblity("iconTyre", false)
QSafeMessageSender.changeItemVisiblity("iconParkingBrake", false)
QSafeMessageSender.changeItemVisiblity("iconFuel", false)
QSafeMessageSender.changeItemVisiblity("iconBattery", false)
QSafeMessageSender.changeItemVisiblity("iconSeatbelt", false)
QSafeMessageSender.changeItemVisiblity("iconCoolant", false)
}
}
onIsTurnLeftVisibleChanged: {
if (isTurnLeftVisible) {
QSafeMessageSender.changeState("turnleft", "visible")
} else {
QSafeMessageSender.changeState("turnleft", "hidden")
}
}
onIsTurnRightVisibleChanged: {
if (isTurnRightVisible) {
QSafeMessageSender.changeState("turnright", "visible")
} else {
QSafeMessageSender.changeState("turnright", "hidden")
}
}
onIsIconLightsVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconLights", isIconLightsVisible)
}
onIsIconLampVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconLamp", isIconLampVisible)
}
onIsIconTyreVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconTyre", isIconTyreVisible)
}
onIsIconParkingBrakeVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconParkingBrake", isIconParkingBrakeVisible)
}
onIsIconFuelVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconFuel", isIconFuelVisible)
}
onIsIconBatteryVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconBattery", isIconBatteryVisible)
}
onIsIconSeatbeltVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconSeatbelt", isIconSeatbeltVisible)
}
onIsIconCoolantVisibleChanged: {
QSafeMessageSender.changeItemVisiblity("iconCoolant", isIconCoolantVisible)
}
function changeConnectionState(newState) {
connectionState(newState)
}
function changeState(icon, state) {
if (iconButtons[icon]) {
iconButtons[icon].pressed = state
} else {
console.warn("Icon not found:", icon)
}
}
function resetSafeIconStates() {
stepSize = 1
currentIndex = 0
startSpeed = 0
timerIconOFF.stop()
timerIconON.stop()
timerDemoON.stop()
clusterDataControl.vehicleSpeed = 0
leftSignalButton.pressed = false
rightSignalButton.pressed = false
iconLightsButton.pressed = false
iconLampButton.pressed = false
iconTyreButton.pressed = false
iconParkingBrakeButton.pressed = false
iconFuelButton.pressed = false
iconBatteryButton.pressed = false
iconSeatbeltButton.pressed = false
iconCoolantButton.pressed = false
}
Rectangle {
id: leftBackgroundRect
anchors {
top: parent.top
left: parent.left
bottom: parent.bottom
}
width: 353
color: "#484950"
anchors.bottomMargin: 0
anchors.leftMargin: 0
anchors.topMargin: 0
Car {
id: car
anchors {
top: parent.top
topMargin: 20
horizontalCenter: parent.horizontalCenter
}
electricCar: carNumber === 0
headLight: clusterDataControl.headLight
leftFrontDoorOpen: clusterDataControl.frontLeftDoorOpen
leftBackDoorOpen: clusterDataControl.rearLeftDoorOpen
rightFrontDoorOpen: clusterDataControl.frontRightDoorOpen
rightBackDoorOpen: clusterDataControl.rearRightDoorOpen
leftBlink: clusterDataControl.leftTurnLight
rightBlink: clusterDataControl.rightTurnLight
}
Button {
id: carID
y: 387
anchors {
horizontalCenter: parent.horizontalCenter
}
width: 240
height: 70
radius: 6
color: "#d6d6d6"
textColor: "#26282a"
textBlinkColor: "#d6d6d6"
blinkColor: "#26282a"
fontPixelSize: 23
text: "Change layout"
anchors.horizontalCenterOffset: 0
onPressedChanged: {
if (pressed) {
clusterDataControl.setCarId(1)
} else {
clusterDataControl.setCarId(2)
}
}
}
Timer {
id: timerIconOFF
interval: 1000 // The interval in milliseconds (10 seconds)
repeat: true // The timer will not repeat after triggering
running: false // The initial state of the timer
// A handler that executes when the timer times out
onTriggered: {
if (controller.currentIndex >= 0 && controller.currentIndex < clusterDataControl.stringList.length) {
var currentItem = clusterDataControl.stringList[controller.currentIndex]
controller.changeState(currentItem, false)
controller.currentIndex--
} else {
controller.currentIndex = 0
timerIconOFF.stop()
timerIconON.start()
}
}
}
Timer {
id: timerIconON
interval: 1000 // The interval in milliseconds (10 seconds)
repeat: true // The timer will not repeat after triggering
running: false // The initial state of the timer
// A handler that executes when the timer times out
onTriggered: {
if (controller.currentIndex >= 0 && controller.currentIndex < clusterDataControl.stringList.length) {
var currentItem = clusterDataControl.stringList[controller.currentIndex]
controller.changeState(currentItem, true)
controller.currentIndex++
} else {
controller.currentIndex = clusterDataControl.stringList.length - 1
timerIconON.stop()
timerIconOFF.start()
}
}
}
Timer {
id: timerDemoON
interval: 50 // The interval in milliseconds (10 seconds)
repeat: true // The timer will not repeat after triggering
running: false // The initial state of the timer
// A handler that executes when the timer times out
onTriggered: {
if (controller.startSpeed >= 0 && controller.startSpeed < controller.maxSpeed) {
clusterDataControl.vehicleSpeed = controller.startSpeed
clusterDataControl.rpm = controller.startSpeed * 40
controller.startSpeed++;
} else if (controller.startSpeed == controller.maxSpeed) {
clusterDataControl.vehicleSpeed = 0
clusterDataControl.rpm = controller.startSpeed
controller.stepSize--;
}
}
}
Button {
id: demoMode
anchors {
top: carID.bottom
topMargin: 15
horizontalCenter: parent.horizontalCenter
}
width: 240
height: 35
radius: 6
color: "#d6d6d6"
textColor: "#26282a"
textBlinkColor: "#d6d6d6"
blinkColor: "#26282a"
fontPixelSize: 14
text: "Demo Mode"
anchors.horizontalCenterOffset: 0
onPressedChanged: {
if (pressed) {
controller.resetSafeIconStates()
timerIconON.start()
timerDemoON.start()
} else {
timerIconON.stop()
timerIconOFF.stop()
timerDemoON.stop()
}
}
}
Connection {
id: connection
y: 322
width: 114
height: 35
anchors {
horizontalCenter: parent.horizontalCenter
}
anchors.horizontalCenterOffset: -37
}
Button {
id: killSwitchButton
y: 556
anchors {
topMargin: 96
horizontalCenter: parent.horizontalCenter
}
width: 188
height: 50
radius: 6
color: "#d6d6d6"
textColor: "#26282a"
textBlinkColor: "#e50000"
blinkColor: "#26282a"
fontPixelSize: 14
text: "Kill Switch"
anchors.horizontalCenterOffset: 0
MouseArea {
id: killSwitchMouseArea
anchors.fill: parent
onClicked: {
if (connectionState === true) {
if (clusterDataControl.crashArg) {
// If Kill Switch is currently "On," turn it "Off"
clusterDataControl.setCrash(false);
} else {
// If Kill Switch is currently "Off," turn it "On"
clusterDataControl.setCrash(true);
}
// Reset buttons states to default
demoMode.pressed = false
carID.pressed = false
}
// Toggle the button state (it will automatically return to normal)
killSwitchButton.toggled = !killSwitchButton.toggled;
}
}
}
Slide {
id: slide
x: 57
y: 233
width: 115
height: 89
}
ButtonHolder {
id: leftSignalButton
x: 388
y: 52
width: 75
height: 50
icon: "qrc:/Icon_TurnLeft_OFF.png"
iconPressed: "qrc:/Icon_TurnLeft_ON.png"
text: "Turn Left"
blinkingEnabled: true
onPressedChanged: {
if (!hazardButton.pressed) {
if (leftSignalButton.pressed && rightSignalButton.pressed) {
rightSignalButton.pressed = false
car.rightBlink = false
}
clusterDataControl.leftTurnLight = leftSignalButton.pressed
car.leftBlink = leftSignalButton.pressed
}
}
mouseEnabled: !hazardButton.pressed
}
ButtonHolder {
id: rightSignalButton
x: 490
y: 52
width: 74
height: 50
icon: "qrc:/Icon_TurnRight_OFF.png"
iconPressed: "qrc:/Icon_TurnRight_ON.png"
text: "Turn Right"
blinkingEnabled: true
onPressedChanged: {
if (!hazardButton.pressed) {
if (rightSignalButton.pressed && leftSignalButton.pressed) {
leftSignalButton.pressed = false
car.leftBlink = false
}
clusterDataControl.rightTurnLight = rightSignalButton.pressed
car.rightBlink = rightSignalButton.pressed
}
}
mouseEnabled: !hazardButton.pressed
}
ButtonHolder {
id: hazardButton
icon: "qrc:/Icon_HazardWarning_OFF.png"
iconPressed: "qrc:/Icon_HazardWarning_ON.png"
text: "Hazard\nWarning"
blinkingEnabled: false
property bool leftPreviousState: false
property bool rightPreviousState: false
x: 389
y: 141
width: 75
height: 50
onPressedChanged: {
clusterDataControl.hazardSignal = hazardButton.pressed
if (hazardButton.pressed) {
if (leftSignalButton.pressed)
hazardButton.leftPreviousState = true
else
leftSignalButton.pressed = true
if (rightSignalButton.pressed)
hazardButton.rightPreviousState = true
else
rightSignalButton.pressed = true
} else {
if (hazardButton.leftPreviousState)
hazardButton.leftPreviousState = false
else
leftSignalButton.pressed = false
if (hazardButton.rightPreviousState)
hazardButton.rightPreviousState = false
else
rightSignalButton.pressed = false
}
car.leftBlink = leftSignalButton.pressed
car.rightBlink = rightSignalButton.pressed
}
}
ButtonHolder {
id: iconLightsButton
x: 388
y: 322
width: 75
height: 50
icon: "qrc:/Icon_LowBeam_OFF.png"
iconPressed: "qrc:/Icon_LowBeam_ON.png"
text: "Low Beam"
onPressedChanged: {
clusterDataControl.headLight = iconLightsButton.pressed
}
}
ButtonHolder {
id: iconLampButton
x: 389
y: 500
width: 75
height: 50
icon: "qrc:/Icon_BulbFailure_OFF.png"
iconPressed: "qrc:/Icon_BulbFailure_ON.png"
text: "Bulb Failure"
}
ButtonHolder {
id: iconTyreButton
x: 389
y: 407
width: 75
height: 50
text: "Tyre\nMalfunction"
icon: "qrc:/Icon_TyreMalfunction_OFF.png"
iconPressed: "qrc:/Icon_TyreMalfunction_ON.png"
}
ButtonHolder {
id: iconParkingBrakeButton
x: 389
y: 234
width: 75
height: 50
icon: "qrc:/Icon_ParkingBrake_OFF.png"
iconPressed: "qrc:/Icon_ParkingBrake_ON.png"
text: "Parking Brake"
onPressedChanged: {
clusterDataControl.brake = iconParkingBrakeButton.pressed
}
}
Row {
id: viewButtons
spacing: 10
enabled: (carNumber == 2 && !demoMode.pressed) || carNumber !== 2
anchors {
horizontalCenter: parent.horizontalCenter
topMargin: 42
}
}
Rectangle {
id: textHolder
x: 42
y: 550
border.color: "black"
width: 260
}
ButtonHolder {
id: iconFuelButton
x: 490
y: 141
width: 74
height: 50
text: "Fuel"
icon: "qrc:/Icon_Fuel_OFF.png"
iconPressed: "qrc:/Icon_Fuel_ON.png"
onPressedChanged: {
if (pressed) {
clusterDataControl.gasLevel = 0
}
else {
clusterDataControl.gasLevel = 67
}
}
}
ButtonHolder {
id: iconBatteryButton
x: 490
y: 234
width: 74
height: 50
text: "Battery"
icon: "qrc:/Icon_Battery_OFF.png"
iconPressed: "qrc:/Icon_Battery_ON.png"
onPressedChanged: {
if (pressed) {
clusterDataControl.batteryPotential = 0
}
else {
clusterDataControl.batteryPotential = 80
}
}
}
ButtonHolder {
id: iconSeatbeltButton
x: 490
y: 322
width: 74
height: 50
text: "Seatbelt"
icon: "qrc:/Icon_SeatBelt_OFF.png"
iconPressed: "qrc:/Icon_SeatBelt_ON.png"
}
ButtonHolder {
id: iconCoolantButton
x: 490
y: 407
width: 74
height: 50
text: "Coolant"
icon: "qrc:/Icon_Coolant_OFF.png"
iconPressed: "qrc:/Icon_Coolant_ON.png"
}
}
}