From bb375f9972f33851b95e5618a2db8debaf767c20 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Thu, 19 May 2016 09:52:19 +0200 Subject: [PATCH] Add climate state machine. This does not actually contribute much to the application itself, it's mainly to demonstrate state machine tooling. Change-Id: Ib83db6d9f4712a0a4302eab4d7ec2e13346d82af Reviewed-by: Dominik Holland --- modules/service/climate/ClimateService.qml | 5 + .../service/climate/ClimateStateMachine.qml | 170 ++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 modules/service/climate/ClimateStateMachine.qml diff --git a/modules/service/climate/ClimateService.qml b/modules/service/climate/ClimateService.qml index 320c3a3..e60ed8a 100644 --- a/modules/service/climate/ClimateService.qml +++ b/modules/service/climate/ClimateService.qml @@ -119,6 +119,11 @@ QtObject { property int ventilationLevels: 7 // 6 + off (0) onVentilationChanged: climateControl.fanSpeedLevel.value = ventilation + property QtObject stateMachine: ClimateStateMachine { + climateControl: root.climateControl + doorsOpen: eco.enabled // TODO use QtIVI doors/window state for this eventually + } + function calculateUnitValue(value) { // Defualt value is the celsius return (SettingsService.unitSystem === "metric") ? value : (Math.round(value * 1.8 + 32)) diff --git a/modules/service/climate/ClimateStateMachine.qml b/modules/service/climate/ClimateStateMachine.qml new file mode 100644 index 0000000..2c521bd --- /dev/null +++ b/modules/service/climate/ClimateStateMachine.qml @@ -0,0 +1,170 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Neptune IVI UI. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQml.StateMachine 1.0 as DSM +import QtIVIVehicleFunctions 1.0 + +QtObject { + id: root + property ClimateControl climateControl + property bool doorsOpen: false + + property QtObject stateMachine: DSM.StateMachine { + id: climateStateMachine + running: true + initialState: runningState + + DSM.State { + childMode: DSM.State.ParallelStates + id: runningState + + DSM.State { + id: suspendable + initialState: doorsClosedState + + DSM.State { + id: doorsClosedState + childMode: DSM.State.ParallelStates + + DSM.State { + id: airConditionState + initialState: climateControl.airConditioning.value ? airConditionOn : airConditionOff + + DSM.State { + id: airConditionOff + onEntered: climateControl.airConditioning.value = false + DSM.SignalTransition { + targetState: airConditionOn + signal: climateControl.airConditioning.valueChanged + guard: climateControl.airConditioning.value + } + } + + DSM.State { + id: airConditionOn + onEntered: { + climateControl.airConditioning.value = true + steeringWheelHeat.enabled = false + } + DSM.SignalTransition { + targetState: airConditionOff + signal: climateControl.airConditioning.valueChanged + guard: !climateControl.airConditioning.value + } + } + } // airConditionState + + DSM.State { + id: airRecirculationState + initialState: climateControl.recirculation.value ? airRecirculationOn : airRecirculationOff + + DSM.State { + id: airRecirculationOff + onEntered: climateControl.recirculationMode.value = ClimateControl.RecirculationOff + DSM.SignalTransition { + targetState: airRecirculationOn + signal: climateControl.recirculationMode.valueChanged + guard: climateControl.recirculationMode.value == ClimateControl.RecirculationOn + } + } + + DSM.State { + id: airRecirculationOn + onEntered: { + climateControl.recirculationMode.value = ClimateControl.RecirculationOn + } + DSM.SignalTransition { + targetState: airRecirculationOff + signal: climateControl.recirculationMode.valueChanged + guard: climateControl.recirculationMode.value == ClimateControl.RecirculationOff + } + } + } // airRecirculationState + + DSM.HistoryState { + id: historyState + defaultState: doorsClosedState + historyType: DSM.HistoryState.DeepHistory + } + + DSM.SignalTransition { + targetState: suspended + signal: doorsOpenChanged + guard: doorsOpen + } + } // door closed state + + DSM.State { + id: suspended + onEntered: { + climateControl.airConditioning.value = false + climateControl.recirculationMode.value = ClimateControl.RecirculationOff + } + DSM.SignalTransition { + targetState: historyState + signal: doorsOpenChanged + guard: !doorsOpen + } + } + + } // suspendable state + + DSM.State { + id: steeringWheelHeatState + initialState: (climateControl.steeringWheelHeater.value >= 5) ? steeringWheelHeatOn : steeringWheelHeatOff + + DSM.State { + id: steeringWheelHeatOff + onEntered: climateControl.steeringWheelHeater.value = 0 + DSM.SignalTransition { + targetState: steeringWheelHeatOn + signal: climateControl.steeringWheelHeater.valueChanged + guard: climateControl.steeringWheelHeater.value >= 5 + } + } + + DSM.State { + id: steeringWheelHeatOn + onEntered: { + climateControl.steeringWheelHeater.value = 10 + climateControl.airConditioning.value = false + } + DSM.SignalTransition { + targetState: steeringWheelHeatOff + signal: climateControl.steeringWheelHeater.valueChanged + guard: climateControl.steeringWheelHeater.value < 5 + } + } + } + } // running state + } +}