From a6a0513186c3f1ffe03bf75e9d956b04a7345fe2 Mon Sep 17 00:00:00 2001 From: Yury Shuvakin Date: Wed, 10 Jul 2024 17:32:51 +0900 Subject: [PATCH] Added various improvements --- cpp/CanController.cpp | 107 ++++++++++++++++++++----------- cpp/CanController.h | 20 ++++-- qml/main.qml | 10 ++- settings.ini | 1 + translations/VkuMonitor_ru_RU.ts | 56 +++++++++++----- 5 files changed, 134 insertions(+), 60 deletions(-) diff --git a/cpp/CanController.cpp b/cpp/CanController.cpp index 85f33c6..c9e287e 100644 --- a/cpp/CanController.cpp +++ b/cpp/CanController.cpp @@ -22,9 +22,11 @@ #include #include #include +#include CanController::CanController(QObject* parent) : QObject{parent} + , lastPackageDateTime_(QDateTime::fromMSecsSinceEpoch(0)) { setupDrivers(); setupDefaultParameters(); @@ -33,23 +35,26 @@ CanController::CanController(QObject* parent) connect(backend.getTrace(), &CanTrace::messageEnqueued, this, &CanController::handlePackage); QSettings settings("settings.ini", QSettings::IniFormat); - auto sendParametersTimeout = settings.value("sendParametersTimeout", 50).toInt(); const auto sendParametersTimer = new QTimer(this); + const auto sendParametersTimeout = settings.value("sendParametersTimeout", 50).toInt(); sendParametersTimer->start(sendParametersTimeout); connect(sendParametersTimer, &QTimer::timeout, this, &CanController::sendParameters); - // auto statusTimer = new QTimer(this); - // statusTimer->start(5000); + const auto sendVkuClosureTimer = new QTimer(this); + const auto sendVkuClosureTimeout = settings.value("sendVkuClosureTimeout", 50).toInt(); + sendVkuClosureTimer->start(sendVkuClosureTimeout); + connect(sendVkuClosureTimer, &QTimer::timeout, this, &CanController::sendVkuClosure); + const auto updateCanStatusTimer = new QTimer(this); + updateCanStatusTimer->start(1000); + connect(updateCanStatusTimer, &QTimer::timeout, this, &CanController::updateCanStatus); + + // auto statusTimer = new QTimer(this); + // statusTimer->start(1000); // statusTimer->callOnTimeout([this] // { - // QVariantMap statusMap; - // statusMap.insert("time", QDateTime::currentDateTime().toString()); - // statusMap.insert("status", "0x" + QString::number(0xff, 16).toUpper().rightJustified(2, '0')); - // statusMap.insert("description", "asdfasdfasdf"); - // statuses_.prepend(statusMap); - // emit statusesChanged(); + // showStatus(QRandomGenerator::global()->generate()); // }); QTimer::singleShot(0, this, &CanController::connectCan); @@ -81,6 +86,8 @@ void CanController::connectCan() } backend.startMeasurement(); + + QTimer::singleShot(150, this, [this]{ updateCanStatus(); }); } void CanController::disconnectCan() @@ -88,21 +95,10 @@ void CanController::disconnectCan() Backend::instance().stopMeasurement(); } -void CanController::vkuClosure() +void CanController::switchVkuClosure() { - CanMessage message(0x201); - message.setLength(8); - message.setByte(0, 0x01); - - auto& backend = Backend::instance(); - for (const auto interfaceId: backend.getInterfaceList()) - { - auto interface = backend.getInterfaceById(interfaceId); - if (interface) - { - interface->sendMessage(message); - } - } + setProperty("isVkuClosed", !isVkuClosed_); + sendVkuClosure(); } void CanController::emergencyReset() @@ -137,7 +133,7 @@ void CanController::sendParameters() const auto breakingCurrent = breakingCurrent_.toUInt(); message.setByte(3, breakingCurrent & 0xFF); - const auto emergencyDelay = emergencyDelay_.toUInt(); + const auto emergencyDelay = qRound(emergencyDelay_.toDouble() * 2.0); message.setByte(4, emergencyDelay & 0xFF); const auto retriesAfterEmergencyBreak = retriesAfterEmergencyBreak_.toUInt(); @@ -156,8 +152,27 @@ void CanController::sendParameters() } } +void CanController::sendVkuClosure() +{ + CanMessage message(0x201); + message.setLength(8); + message.setByte(0, isVkuClosed_ ? 0x01 : 0x00); + + auto& backend = Backend::instance(); + for (const auto interfaceId: backend.getInterfaceList()) + { + auto interface = backend.getInterfaceById(interfaceId); + if (interface) + { + interface->sendMessage(message); + } + } +} + void CanController::handlePackage(int index) { + lastPackageDateTime_ = QDateTime::currentDateTime(); + auto& backend = Backend::instance(); auto message = backend.getTrace()->getMessage(index); if (!message) @@ -184,8 +199,8 @@ void CanController::handleCurrentState(const CanMessage* message) quint16 outputVoltage = (message->getByte(2) << 8) + message->getByte(3); setProperty("outputVoltage", QString::number(outputVoltage)); - quint8 outputCurrent = message->getByte(4); - setProperty("outputCurrent", QString::number(outputCurrent)); + quint8 inputCurrent = message->getByte(4); + setProperty("inputCurrent", QString::number(inputCurrent)); qint16 radiatorTemperature = (message->getByte(5) << 8) + message->getByte(6); setProperty("radiatorTemperature", QString::number(radiatorTemperature)); @@ -193,22 +208,37 @@ void CanController::handleCurrentState(const CanMessage* message) void CanController::handleStatus(const CanMessage* message) { - QMap statusDescriptionMap = + quint8 status = message->getByte(0); + showStatus(status); + + quint8 emergencyCounter = message->getByte(1); + setProperty("emergencyCounter", QString::number(emergencyCounter)); + + // bool isVkuClosed = (message->getByte(2) & 0x1) == 1; + // setProperty("isVkuClosed", isVkuClosed); +} + +void CanController::showStatus(quint32 status) +{ + QMap statusDescriptionMap = { {0x00, tr("Reset")}, {0x01, tr("No incoming messages via CAN interface")}, + {0x02, tr("Pause after breaking")}, {0x03, tr("Waiting for a command for closing")}, {0x04, tr("Work via CAN")}, {0x05, tr("Work via button signal")}, {0x06, tr("Work via CAN or button signal")}, + {0x18, tr("Exceeding radiator temperature")}, {0x20, tr("Exceeding input voltage")}, {0x22, tr("Exceeding maximum current")}, - {0x18, tr("Exceeding radiator temperature")}, - {0x02, tr("Pause after breaking")}, - {0x80, tr("Blocking due to emergency")} + {0x23, tr("Exceeding switching current")}, + {0x25, tr("Voltage 5V is not normal")}, + {0x80, tr("Blocking due to emergency")}, + {0x0100, tr("Can connected")}, + {0x0200, tr("Can disconnected")}, }; - quint8 status = message->getByte(0); auto statusDescription = statusDescriptionMap.value(status, tr("Unknown status")); QVariantMap statusMap; @@ -221,12 +251,17 @@ void CanController::handleStatus(const CanMessage* message) statuses_.prepend(statusMap); emit statusesChanged(); } +} - quint8 emergencyCounter = message->getByte(1); - setProperty("emergencyCounter", QString::number(emergencyCounter)); - - bool isVkuClosed = (message->getByte(2) & 0x1) == 1; - setProperty("isVkuClosed", isVkuClosed); +void CanController::updateCanStatus() +{ + auto isConnected = lastPackageDateTime_.msecsTo(QDateTime::currentDateTime()) < 2000; + if (isConnected_ != isConnected || isFirstCheck_) + { + isConnected_ = isConnected; + isFirstCheck_ = false; + showStatus(isConnected ? 0x0100 : 0x0200); + } } void CanController::setupDrivers() diff --git a/cpp/CanController.h b/cpp/CanController.h index 2a7296d..e37a731 100644 --- a/cpp/CanController.h +++ b/cpp/CanController.h @@ -3,6 +3,7 @@ #include #include +#include class QQmlEngine; class QJSEngine; @@ -17,7 +18,7 @@ class CanController : public QObject Q_PROPERTY(QString radiatorTemperature MEMBER radiatorTemperature_ NOTIFY radiatorTemperatureChanged) Q_PROPERTY(QString outputVoltage MEMBER outputVoltage_ NOTIFY outputVoltageChanged) Q_PROPERTY(QString emergencyCounter MEMBER emergencyCounter_ NOTIFY emergencyCounterChanged) - Q_PROPERTY(QString outputCurrent MEMBER outputCurrent_ NOTIFY outputCurrentChanged) + Q_PROPERTY(QString inputCurrent MEMBER inputCurrent_ NOTIFY inputCurrentChanged) Q_PROPERTY(QString maximumCurrent MEMBER maximumCurrent_ NOTIFY maximumCurrentChanged) Q_PROPERTY(QString emergencyDelay MEMBER emergencyDelay_ NOTIFY emergencyDelayChanged) @@ -38,18 +39,19 @@ public slots: void connectCan(); void disconnectCan(); - void vkuClosure(); + void switchVkuClosure(); void emergencyReset(); private slots: void sendParameters(); + void sendVkuClosure(); signals: void inputVoltageChanged(); void radiatorTemperatureChanged(); void outputVoltageChanged(); void emergencyCounterChanged(); - void outputCurrentChanged(); + void inputCurrentChanged(); void maximumCurrentChanged(); void emergencyDelayChanged(); @@ -65,16 +67,23 @@ private slots: void handleCurrentState(const CanMessage* message); void handleStatus(const CanMessage* message); + void showStatus(quint32 status); + void updateCanStatus(); + private: void setupDrivers(); void setupDefaultParameters(); private: + bool isConnected_ = false; + bool isFirstCheck_ = true; + QDateTime lastPackageDateTime_; + QString inputVoltage_; QString radiatorTemperature_; QString outputVoltage_; QString emergencyCounter_; - QString outputCurrent_; + QString inputCurrent_; QString maximumCurrent_; QString emergencyDelay_; @@ -82,8 +91,9 @@ private: QString retriesAfterEmergencyBreak_; QString breakingCurrent_; - QVariantList statuses_; bool isVkuClosed_ = false; + + QVariantList statuses_; }; #endif // CANCONTROLLER_H diff --git a/qml/main.qml b/qml/main.qml index f621c23..54936e5 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -84,9 +84,9 @@ QuickControls.ApplicationWindow { } Indicator { - label: qsTr("Output current") + label: qsTr("Input current") indicator: qsTr("A") - value.text: CanController.outputCurrent + value.text: CanController.inputCurrent value.readOnly: true Layout.fillWidth: true Layout.preferredWidth: 100 @@ -97,7 +97,7 @@ QuickControls.ApplicationWindow { text: CanController.isVkuClosed ? qsTr("VKU opening") : qsTr("VKU closing") Layout.fillWidth: true Layout.topMargin: Ui.scale(12) - onClicked: CanController.vkuClosure() + onClicked: CanController.switchVkuClosure() } } @@ -235,6 +235,10 @@ QuickControls.ApplicationWindow { Layout.fillWidth: true } } + + QuickControls.ScrollBar.vertical: QuickControls.ScrollBar { + policy: size > 0 && size < 1 ? QuickControls.ScrollBar.AlwaysOn : QuickControls.ScrollBar.AsNeeded + } } } diff --git a/settings.ini b/settings.ini index 7d76363..c4025fa 100644 --- a/settings.ini +++ b/settings.ini @@ -1,3 +1,4 @@ [General] bitrate=100000 sendParametersTimeout=50 +sendVkuClosureTimeout=50 diff --git a/translations/VkuMonitor_ru_RU.ts b/translations/VkuMonitor_ru_RU.ts index 3f8c1b3..a7b1690 100644 --- a/translations/VkuMonitor_ru_RU.ts +++ b/translations/VkuMonitor_ru_RU.ts @@ -4,62 +4,82 @@ CanController - + Reset Сброс - + No incoming messages via CAN interface Нет входящих сообщений по CAN - + Waiting for a command for closing Ожидание команды на замыкание - + Work via CAN Работа по CAN - + Work via button signal Работа по сигналу кнопки - + Work via CAN or button signal Работа по CAN или сигналу кнопки - + Exceeding input voltage Превышение входного напряжения - + Exceeding maximum current Превышение максимального тока - + Exceeding radiator temperature Превышение температуры радиатора - + Pause after breaking Пауза после размыкания - + + Exceeding switching current + Превышение коммутируемого тока + + + + Voltage 5V is not normal + Напряжение 5В не в норме + + + Blocking due to emergency Блокировка по аварии - + + Can connected + Can подключен + + + + Can disconnected + Can отключен + + + Unknown status Неизвестный статус @@ -263,9 +283,8 @@ Счетчик аварий - Output current - Выходной ток + Выходной ток @@ -278,15 +297,20 @@ VKU closure Замыкание ВКУ + + + Input current + Входной ток + VKU opening - Замыкание ВКУ + Размыкание ВКУ VKU closing - Размыкание ВКУ + Замыкание ВКУ