Add phase selection widget to charging speed screen

This commit is contained in:
2024-07-30 08:25:31 +02:00
parent 82e1252094
commit 6c177a9bc3
7 changed files with 174 additions and 19 deletions

View File

@@ -114,6 +114,7 @@ qt_add_qml_module(evcharger-app
SchedulerPage.qml SchedulerPage.qml
SecurityPage.qml SecurityPage.qml
SelectLogicModeItem.qml SelectLogicModeItem.qml
SelectPhaseSwitchModeItem.qml
SensorsConfigurationPage.qml SensorsConfigurationPage.qml
SetPriceLimitPage.qml SetPriceLimitPage.qml
SettingsTabPage.qml SettingsTabPage.qml

View File

@@ -190,10 +190,32 @@ AnimatedStackView {
component: "DailyTripPage.qml" component: "DailyTripPage.qml"
} }
ApiKeyValueHelper {
id: requestedCurrent
deviceConnection: theDeviceConnection
apiKey: "amp"
}
ApiKeyValueHelper {
id: phaseSwitchMode
deviceConnection: theDeviceConnection
apiKey: "psm"
}
NavigationItem { NavigationItem {
iconSource: "material-icons/grid_guides.svg" iconSource: "material-icons/grid_guides.svg"
title: qsTr("Charging speed") 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" component: "ChargingSpeedPage.qml"
} }
} }

View File

@@ -6,8 +6,12 @@ NavigationPage {
title: qsTr("Charging Speed") title: qsTr("Charging Speed")
Text { Text {
text: "TODO" text: "current limits TODO"
Layout.fillHeight: true Layout.fillWidth: true
}
SelectPhaseSwitchModeItem {
Layout.fillWidth: true
} }
} }

View File

@@ -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)
}
}
}
}

View File

@@ -162,19 +162,18 @@ bool DevicesModel::removeRows(int row, int count, const QModelIndex &parent)
void DevicesModel::error(QZeroConf::error_t error) void DevicesModel::error(QZeroConf::error_t error)
{ {
qDebug() << "error()" << error; qDebug() << error;
} }
void DevicesModel::serviceAdded(QZeroConfService service) void DevicesModel::serviceAdded(QZeroConfService service)
{ {
qDebug() << "serviceAdded()" << service->host();
auto txt = service->txt(); auto txt = service->txt();
auto serialIter = txt.find("serial"); auto serialIter = txt.find("serial");
if (serialIter == txt.end()) if (serialIter == txt.end())
{ {
qWarning() << "serial missing" << txt; qWarning() << service->host() << "serial missing" << txt;
return; return;
} }
auto serial = *serialIter; auto serial = *serialIter;
@@ -182,7 +181,7 @@ void DevicesModel::serviceAdded(QZeroConfService service)
auto manufacturerIter = txt.find("manufacturer"); auto manufacturerIter = txt.find("manufacturer");
if (manufacturerIter == txt.end()) if (manufacturerIter == txt.end())
{ {
qWarning() << "manufacturer missing" << txt; qWarning() << service->host() << "manufacturer missing" << txt;
return; return;
} }
auto manufacturer = *manufacturerIter; auto manufacturer = *manufacturerIter;
@@ -190,7 +189,7 @@ void DevicesModel::serviceAdded(QZeroConfService service)
auto deviceTypeIter = txt.find("devicetype"); auto deviceTypeIter = txt.find("devicetype");
if (deviceTypeIter == txt.end()) if (deviceTypeIter == txt.end())
{ {
qWarning() << "devicetype missing" << txt; qWarning() << service->host() << "devicetype missing" << txt;
return; return;
} }
auto deviceType = *deviceTypeIter; auto deviceType = *deviceTypeIter;
@@ -198,7 +197,7 @@ void DevicesModel::serviceAdded(QZeroConfService service)
auto friendlyNameIter = txt.find("friendly_name"); auto friendlyNameIter = txt.find("friendly_name");
if (friendlyNameIter == txt.end()) if (friendlyNameIter == txt.end())
{ {
qWarning() << "friendly_name missing" << txt; qWarning() << service->host() << "friendly_name missing" << txt;
return; return;
} }
auto friendlyName = *friendlyNameIter; auto friendlyName = *friendlyNameIter;
@@ -209,6 +208,8 @@ void DevicesModel::serviceAdded(QZeroConfService service)
if (iter == std::end(m_foundDevices)) if (iter == std::end(m_foundDevices))
{ {
qDebug() << "new device" << service->host() << serial << manufacturer << deviceType << friendlyName;
beginInsertRows({}, m_foundDevices.size(), m_foundDevices.size()); beginInsertRows({}, m_foundDevices.size(), m_foundDevices.size());
m_foundDevices.emplace_back(FoundDevice { m_foundDevices.emplace_back(FoundDevice {
/*.serial{ */ std::move(serial) /*}*/, /*.serial{ */ std::move(serial) /*}*/,
@@ -224,6 +225,8 @@ void DevicesModel::serviceAdded(QZeroConfService service)
} }
else else
{ {
qDebug() << "device already in list" << service->host() << serial << manufacturer << deviceType << friendlyName;
iter->manufacturer = std::move(manufacturer); iter->manufacturer = std::move(manufacturer);
iter->deviceType = std::move(deviceType); iter->deviceType = std::move(deviceType);
iter->friendlyName = std::move(friendlyName); iter->friendlyName = std::move(friendlyName);
@@ -243,21 +246,19 @@ void DevicesModel::serviceAdded(QZeroConfService service)
void DevicesModel::serviceUpdated(QZeroConfService service) void DevicesModel::serviceUpdated(QZeroConfService service)
{ {
qDebug() << "serviceUpdated()" << service->host(); qDebug() << service->host();
// TODO // TODO
} }
void DevicesModel::serviceRemoved(QZeroConfService service) void DevicesModel::serviceRemoved(QZeroConfService service)
{ {
qDebug() << "serviceRemoved()" << service->host();
const auto &txt = service->txt(); const auto &txt = service->txt();
auto serialIter = txt.find("serial"); auto serialIter = txt.find("serial");
if (serialIter == txt.constEnd()) if (serialIter == txt.constEnd())
{ {
qWarning() << "serial missing" << txt; qWarning() << service->host() << "serial missing" << txt;
return; return;
} }
auto serial = *serialIter; auto serial = *serialIter;
@@ -268,12 +269,14 @@ void DevicesModel::serviceRemoved(QZeroConfService service)
if (iter == std::end(m_foundDevices)) if (iter == std::end(m_foundDevices))
{ {
qWarning() << "serial not found!" << serial; qWarning() << service->host() << "serial not found!" << serial;
return; return;
} }
if (!iter->saved) if (!iter->saved)
{ {
qDebug() << "device removed" << service->host() << serial;
const auto row = std::distance(std::begin(m_foundDevices), iter); const auto row = std::distance(std::begin(m_foundDevices), iter);
beginRemoveRows({}, row, row); beginRemoveRows({}, row, row);
m_foundDevices.erase(iter); m_foundDevices.erase(iter);
@@ -281,6 +284,8 @@ void DevicesModel::serviceRemoved(QZeroConfService service)
} }
else else
{ {
qDebug() << "device kept" << service->host() << serial;
iter->hostName.clear(); iter->hostName.clear();
iter->ip = {}; iter->ip = {};
const auto index = createIndex(std::distance(std::begin(m_foundDevices), iter), 0); const auto index = createIndex(std::distance(std::begin(m_foundDevices), iter), 0);

View File

@@ -393,16 +393,50 @@
<translation>%0 km</translation> <translation>%0 km</translation>
</message> </message>
<message> <message>
<location filename="../ChargerTabPage.qml" line="195"/> <location filename="../ChargerTabPage.qml" line="207"/>
<location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="195"/> <location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="207"/>
<source>Charging speed</source> <source>Charging speed</source>
<translation>Ladegeschwindigkeit</translation> <translation>Ladegeschwindigkeit</translation>
</message> </message>
<message> <message>
<location filename="../ChargerTabPage.qml" line="196"/> <location filename="../ChargerTabPage.qml" line="208"/>
<location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="196"/> <location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="208"/>
<source>%0 &amp; %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ChargerTabPage.qml" line="209"/>
<location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="209"/>
<source>%0 Ampere</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ChargerTabPage.qml" line="213"/>
<location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="213"/>
<source>Automatic phase selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ChargerTabPage.qml" line="214"/>
<location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="214"/>
<source>1-phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ChargerTabPage.qml" line="215"/>
<location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="215"/>
<source>3-phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ChargerTabPage.qml" line="216"/>
<location filename="../build/Desktop-Debug/EVChargerApp/ChargerTabPage.qml" line="216"/>
<source>Unknown phase selection (%0)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%0 Ampere &amp; %1-phase</source> <source>%0 Ampere &amp; %1-phase</source>
<translation>%0 Ampere &amp; %1-phasic</translation> <translation type="vanished">%0 Ampere &amp; %1-phasic</translation>
</message> </message>
<message> <message>
<source>Connect the cable to charge your car</source> <source>Connect the cable to charge your car</source>
@@ -2110,6 +2144,33 @@
<translation>Energie zur bestimmten Zeit</translation> <translation>Energie zur bestimmten Zeit</translation>
</message> </message>
</context> </context>
<context>
<name>SelectPhaseSwitchModeItem</name>
<message>
<location filename="../SelectPhaseSwitchModeItem.qml" line="25"/>
<location filename="../build/Desktop-Debug/EVChargerApp/SelectPhaseSwitchModeItem.qml" line="25"/>
<source>Phase switching</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SelectPhaseSwitchModeItem.qml" line="42"/>
<location filename="../build/Desktop-Debug/EVChargerApp/SelectPhaseSwitchModeItem.qml" line="42"/>
<source>Automatic</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SelectPhaseSwitchModeItem.qml" line="49"/>
<location filename="../build/Desktop-Debug/EVChargerApp/SelectPhaseSwitchModeItem.qml" line="49"/>
<source>1-Phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SelectPhaseSwitchModeItem.qml" line="56"/>
<location filename="../build/Desktop-Debug/EVChargerApp/SelectPhaseSwitchModeItem.qml" line="56"/>
<source>3-Phase</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>SendMessageHelper</name> <name>SendMessageHelper</name>
<message> <message>

1
qmldir
View File

@@ -64,6 +64,7 @@ EVChargerApp 1.0 SchedulerDayPage.qml
EVChargerApp 1.0 SchedulerPage.qml EVChargerApp 1.0 SchedulerPage.qml
EVChargerApp 1.0 SecurityPage.qml EVChargerApp 1.0 SecurityPage.qml
EVChargerApp 1.0 SelectLogicModeItem.qml EVChargerApp 1.0 SelectLogicModeItem.qml
EVChargerApp 1.0 SelectPhaseSwitchModeItem.qml
EVChargerApp 1.0 SensorsConfigurationPage.qml EVChargerApp 1.0 SensorsConfigurationPage.qml
EVChargerApp 1.0 SetPriceLimitPage.qml EVChargerApp 1.0 SetPriceLimitPage.qml
EVChargerApp 1.0 SettingsTabPage.qml EVChargerApp 1.0 SettingsTabPage.qml