From 6c177a9bc35efa2ad0b14bb5780b3e61bfb19565 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Tue, 30 Jul 2024 08:25:31 +0200 Subject: [PATCH] Add phase selection widget to charging speed screen --- CMakeLists.txt | 1 + ChargerTabPage.qml | 24 +++++++++++- ChargingSpeedPage.qml | 8 +++- SelectPhaseSwitchModeItem.qml | 61 ++++++++++++++++++++++++++++++ devicesmodel.cpp | 27 +++++++------ i18n/qml_de.ts | 71 ++++++++++++++++++++++++++++++++--- qmldir | 1 + 7 files changed, 174 insertions(+), 19 deletions(-) create mode 100644 SelectPhaseSwitchModeItem.qml diff --git a/CMakeLists.txt b/CMakeLists.txt index c8c89b7..8134163 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,6 +114,7 @@ qt_add_qml_module(evcharger-app SchedulerPage.qml SecurityPage.qml SelectLogicModeItem.qml + SelectPhaseSwitchModeItem.qml SensorsConfigurationPage.qml SetPriceLimitPage.qml SettingsTabPage.qml diff --git a/ChargerTabPage.qml b/ChargerTabPage.qml index 1589774..55f3d10 100644 --- a/ChargerTabPage.qml +++ b/ChargerTabPage.qml @@ -190,10 +190,32 @@ AnimatedStackView { component: "DailyTripPage.qml" } + ApiKeyValueHelper { + id: requestedCurrent + deviceConnection: theDeviceConnection + apiKey: "amp" + } + + ApiKeyValueHelper { + id: phaseSwitchMode + deviceConnection: theDeviceConnection + apiKey: "psm" + } + NavigationItem { iconSource: "material-icons/grid_guides.svg" title: qsTr("Charging speed") - description: qsTr("%0 Ampere & %1-phase").arg(0).arg(0) + description: qsTr("%0 & %1") + .arg(qsTr("%0 Ampere").arg(requestedCurrent.value)) + .arg((function(){ + switch (phaseSwitchMode.value) + { + case 0: return qsTr("Automatic phase selection"); + case 1: return qsTr("1-phase"); + case 2: return qsTr("3-phase"); + case 3: return qsTr("Unknown phase selection (%0)").arg(phaseSwitchMode.value); + } + })()) component: "ChargingSpeedPage.qml" } } diff --git a/ChargingSpeedPage.qml b/ChargingSpeedPage.qml index 7a22441..3fb9eeb 100644 --- a/ChargingSpeedPage.qml +++ b/ChargingSpeedPage.qml @@ -6,8 +6,12 @@ NavigationPage { title: qsTr("Charging Speed") Text { - text: "TODO" + text: "current limits TODO" - Layout.fillHeight: true + Layout.fillWidth: true + } + + SelectPhaseSwitchModeItem { + Layout.fillWidth: true } } diff --git a/SelectPhaseSwitchModeItem.qml b/SelectPhaseSwitchModeItem.qml new file mode 100644 index 0000000..fac88ba --- /dev/null +++ b/SelectPhaseSwitchModeItem.qml @@ -0,0 +1,61 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import EVChargerApp + +WhiteBox { + ColumnLayout { + anchors.fill: parent + + SetValueHelper { + id: valueChanger + deviceConnection: theDeviceConnection + apiKey: "psm" + onResponseChanged: { + automaticButton.checked = Qt.binding(() => automaticButton.selectedMode) + singlePhaseButton.checked = Qt.binding(() => singlePhaseButton.selectedMode) + threePhaseButton.checked = Qt.binding(() => threePhaseButton.selectedMode) + } + } + + Text { + Layout.fillWidth: true + + font.bold: true + text: qsTr("Phase switching") + } + + TabBar { + id: tabBar + + Layout.fillWidth: true + + Component.onCompleted: { + background.color = "#EEEEEE" + background.radius = 5 + } + + TabButton { + id: automaticButton + property bool selectedMode: phaseSwitchMode.value == 0 + checked: selectedMode + text: qsTr("Automatic") + onClicked: valueChanger.setValue(0) + } + TabButton { + id: singlePhaseButton + property bool selectedMode: phaseSwitchMode.value == 1 + checked: selectedMode + text: qsTr("1-Phase") + onClicked: valueChanger.setValue(1) + } + TabButton { + id: threePhaseButton + property bool selectedMode: phaseSwitchMode.value == 2 + checked: selectedMode + text: qsTr("3-Phase") + onClicked: valueChanger.setValue(2) + } + } + } +} diff --git a/devicesmodel.cpp b/devicesmodel.cpp index 7222bf9..44e734f 100644 --- a/devicesmodel.cpp +++ b/devicesmodel.cpp @@ -162,19 +162,18 @@ bool DevicesModel::removeRows(int row, int count, const QModelIndex &parent) void DevicesModel::error(QZeroConf::error_t error) { - qDebug() << "error()" << error; + qDebug() << error; } void DevicesModel::serviceAdded(QZeroConfService service) { - qDebug() << "serviceAdded()" << service->host(); auto txt = service->txt(); auto serialIter = txt.find("serial"); if (serialIter == txt.end()) { - qWarning() << "serial missing" << txt; + qWarning() << service->host() << "serial missing" << txt; return; } auto serial = *serialIter; @@ -182,7 +181,7 @@ void DevicesModel::serviceAdded(QZeroConfService service) auto manufacturerIter = txt.find("manufacturer"); if (manufacturerIter == txt.end()) { - qWarning() << "manufacturer missing" << txt; + qWarning() << service->host() << "manufacturer missing" << txt; return; } auto manufacturer = *manufacturerIter; @@ -190,7 +189,7 @@ void DevicesModel::serviceAdded(QZeroConfService service) auto deviceTypeIter = txt.find("devicetype"); if (deviceTypeIter == txt.end()) { - qWarning() << "devicetype missing" << txt; + qWarning() << service->host() << "devicetype missing" << txt; return; } auto deviceType = *deviceTypeIter; @@ -198,7 +197,7 @@ void DevicesModel::serviceAdded(QZeroConfService service) auto friendlyNameIter = txt.find("friendly_name"); if (friendlyNameIter == txt.end()) { - qWarning() << "friendly_name missing" << txt; + qWarning() << service->host() << "friendly_name missing" << txt; return; } auto friendlyName = *friendlyNameIter; @@ -209,6 +208,8 @@ void DevicesModel::serviceAdded(QZeroConfService service) if (iter == std::end(m_foundDevices)) { + qDebug() << "new device" << service->host() << serial << manufacturer << deviceType << friendlyName; + beginInsertRows({}, m_foundDevices.size(), m_foundDevices.size()); m_foundDevices.emplace_back(FoundDevice { /*.serial{ */ std::move(serial) /*}*/, @@ -224,6 +225,8 @@ void DevicesModel::serviceAdded(QZeroConfService service) } else { + qDebug() << "device already in list" << service->host() << serial << manufacturer << deviceType << friendlyName; + iter->manufacturer = std::move(manufacturer); iter->deviceType = std::move(deviceType); iter->friendlyName = std::move(friendlyName); @@ -243,21 +246,19 @@ void DevicesModel::serviceAdded(QZeroConfService service) void DevicesModel::serviceUpdated(QZeroConfService service) { - qDebug() << "serviceUpdated()" << service->host(); + qDebug() << service->host(); // TODO } void DevicesModel::serviceRemoved(QZeroConfService service) { - qDebug() << "serviceRemoved()" << service->host(); - const auto &txt = service->txt(); auto serialIter = txt.find("serial"); if (serialIter == txt.constEnd()) { - qWarning() << "serial missing" << txt; + qWarning() << service->host() << "serial missing" << txt; return; } auto serial = *serialIter; @@ -268,12 +269,14 @@ void DevicesModel::serviceRemoved(QZeroConfService service) if (iter == std::end(m_foundDevices)) { - qWarning() << "serial not found!" << serial; + qWarning() << service->host() << "serial not found!" << serial; return; } if (!iter->saved) { + qDebug() << "device removed" << service->host() << serial; + const auto row = std::distance(std::begin(m_foundDevices), iter); beginRemoveRows({}, row, row); m_foundDevices.erase(iter); @@ -281,6 +284,8 @@ void DevicesModel::serviceRemoved(QZeroConfService service) } else { + qDebug() << "device kept" << service->host() << serial; + iter->hostName.clear(); iter->ip = {}; const auto index = createIndex(std::distance(std::begin(m_foundDevices), iter), 0); diff --git a/i18n/qml_de.ts b/i18n/qml_de.ts index 9937862..f885b1a 100644 --- a/i18n/qml_de.ts +++ b/i18n/qml_de.ts @@ -393,16 +393,50 @@ %0 km - - + + Charging speed Ladegeschwindigkeit - - + + + %0 & %1 + + + + + + %0 Ampere + + + + + + Automatic phase selection + + + + + + 1-phase + + + + + + 3-phase + + + + + + Unknown phase selection (%0) + + + %0 Ampere & %1-phase - %0 Ampere & %1-phasic + %0 Ampere & %1-phasic Connect the cable to charge your car @@ -2110,6 +2144,33 @@ Energie zur bestimmten Zeit + + SelectPhaseSwitchModeItem + + + + Phase switching + + + + + + Automatic + + + + + + 1-Phase + + + + + + 3-Phase + + + SendMessageHelper diff --git a/qmldir b/qmldir index fe9f1bc..02e7962 100644 --- a/qmldir +++ b/qmldir @@ -64,6 +64,7 @@ EVChargerApp 1.0 SchedulerDayPage.qml EVChargerApp 1.0 SchedulerPage.qml EVChargerApp 1.0 SecurityPage.qml EVChargerApp 1.0 SelectLogicModeItem.qml +EVChargerApp 1.0 SelectPhaseSwitchModeItem.qml EVChargerApp 1.0 SensorsConfigurationPage.qml EVChargerApp 1.0 SetPriceLimitPage.qml EVChargerApp 1.0 SettingsTabPage.qml