Added various improvements

This commit is contained in:
Yury Shuvakin
2024-07-10 17:32:51 +09:00
parent d708fc3499
commit a6a0513186
5 changed files with 134 additions and 60 deletions

View File

@@ -22,9 +22,11 @@
#include <QDebug> #include <QDebug>
#include <QTimer> #include <QTimer>
#include <QSettings> #include <QSettings>
#include <QRandomGenerator>
CanController::CanController(QObject* parent) CanController::CanController(QObject* parent)
: QObject{parent} : QObject{parent}
, lastPackageDateTime_(QDateTime::fromMSecsSinceEpoch(0))
{ {
setupDrivers(); setupDrivers();
setupDefaultParameters(); setupDefaultParameters();
@@ -33,23 +35,26 @@ CanController::CanController(QObject* parent)
connect(backend.getTrace(), &CanTrace::messageEnqueued, this, &CanController::handlePackage); connect(backend.getTrace(), &CanTrace::messageEnqueued, this, &CanController::handlePackage);
QSettings settings("settings.ini", QSettings::IniFormat); QSettings settings("settings.ini", QSettings::IniFormat);
auto sendParametersTimeout = settings.value("sendParametersTimeout", 50).toInt();
const auto sendParametersTimer = new QTimer(this); const auto sendParametersTimer = new QTimer(this);
const auto sendParametersTimeout = settings.value("sendParametersTimeout", 50).toInt();
sendParametersTimer->start(sendParametersTimeout); sendParametersTimer->start(sendParametersTimeout);
connect(sendParametersTimer, &QTimer::timeout, this, &CanController::sendParameters); connect(sendParametersTimer, &QTimer::timeout, this, &CanController::sendParameters);
// auto statusTimer = new QTimer(this); const auto sendVkuClosureTimer = new QTimer(this);
// statusTimer->start(5000); 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] // statusTimer->callOnTimeout([this]
// { // {
// QVariantMap statusMap; // showStatus(QRandomGenerator::global()->generate());
// 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();
// }); // });
QTimer::singleShot(0, this, &CanController::connectCan); QTimer::singleShot(0, this, &CanController::connectCan);
@@ -81,6 +86,8 @@ void CanController::connectCan()
} }
backend.startMeasurement(); backend.startMeasurement();
QTimer::singleShot(150, this, [this]{ updateCanStatus(); });
} }
void CanController::disconnectCan() void CanController::disconnectCan()
@@ -88,21 +95,10 @@ void CanController::disconnectCan()
Backend::instance().stopMeasurement(); Backend::instance().stopMeasurement();
} }
void CanController::vkuClosure() void CanController::switchVkuClosure()
{ {
CanMessage message(0x201); setProperty("isVkuClosed", !isVkuClosed_);
message.setLength(8); sendVkuClosure();
message.setByte(0, 0x01);
auto& backend = Backend::instance();
for (const auto interfaceId: backend.getInterfaceList())
{
auto interface = backend.getInterfaceById(interfaceId);
if (interface)
{
interface->sendMessage(message);
}
}
} }
void CanController::emergencyReset() void CanController::emergencyReset()
@@ -137,7 +133,7 @@ void CanController::sendParameters()
const auto breakingCurrent = breakingCurrent_.toUInt(); const auto breakingCurrent = breakingCurrent_.toUInt();
message.setByte(3, breakingCurrent & 0xFF); message.setByte(3, breakingCurrent & 0xFF);
const auto emergencyDelay = emergencyDelay_.toUInt(); const auto emergencyDelay = qRound(emergencyDelay_.toDouble() * 2.0);
message.setByte(4, emergencyDelay & 0xFF); message.setByte(4, emergencyDelay & 0xFF);
const auto retriesAfterEmergencyBreak = retriesAfterEmergencyBreak_.toUInt(); 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) void CanController::handlePackage(int index)
{ {
lastPackageDateTime_ = QDateTime::currentDateTime();
auto& backend = Backend::instance(); auto& backend = Backend::instance();
auto message = backend.getTrace()->getMessage(index); auto message = backend.getTrace()->getMessage(index);
if (!message) if (!message)
@@ -184,8 +199,8 @@ void CanController::handleCurrentState(const CanMessage* message)
quint16 outputVoltage = (message->getByte(2) << 8) + message->getByte(3); quint16 outputVoltage = (message->getByte(2) << 8) + message->getByte(3);
setProperty("outputVoltage", QString::number(outputVoltage)); setProperty("outputVoltage", QString::number(outputVoltage));
quint8 outputCurrent = message->getByte(4); quint8 inputCurrent = message->getByte(4);
setProperty("outputCurrent", QString::number(outputCurrent)); setProperty("inputCurrent", QString::number(inputCurrent));
qint16 radiatorTemperature = (message->getByte(5) << 8) + message->getByte(6); qint16 radiatorTemperature = (message->getByte(5) << 8) + message->getByte(6);
setProperty("radiatorTemperature", QString::number(radiatorTemperature)); setProperty("radiatorTemperature", QString::number(radiatorTemperature));
@@ -193,22 +208,37 @@ void CanController::handleCurrentState(const CanMessage* message)
void CanController::handleStatus(const CanMessage* message) void CanController::handleStatus(const CanMessage* message)
{ {
QMap<quint8, QString> 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<quint32, QString> statusDescriptionMap =
{ {
{0x00, tr("Reset")}, {0x00, tr("Reset")},
{0x01, tr("No incoming messages via CAN interface")}, {0x01, tr("No incoming messages via CAN interface")},
{0x02, tr("Pause after breaking")},
{0x03, tr("Waiting for a command for closing")}, {0x03, tr("Waiting for a command for closing")},
{0x04, tr("Work via CAN")}, {0x04, tr("Work via CAN")},
{0x05, tr("Work via button signal")}, {0x05, tr("Work via button signal")},
{0x06, tr("Work via CAN or button signal")}, {0x06, tr("Work via CAN or button signal")},
{0x18, tr("Exceeding radiator temperature")},
{0x20, tr("Exceeding input voltage")}, {0x20, tr("Exceeding input voltage")},
{0x22, tr("Exceeding maximum current")}, {0x22, tr("Exceeding maximum current")},
{0x18, tr("Exceeding radiator temperature")}, {0x23, tr("Exceeding switching current")},
{0x02, tr("Pause after breaking")}, {0x25, tr("Voltage 5V is not normal")},
{0x80, tr("Blocking due to emergency")} {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")); auto statusDescription = statusDescriptionMap.value(status, tr("Unknown status"));
QVariantMap statusMap; QVariantMap statusMap;
@@ -221,12 +251,17 @@ void CanController::handleStatus(const CanMessage* message)
statuses_.prepend(statusMap); statuses_.prepend(statusMap);
emit statusesChanged(); emit statusesChanged();
} }
}
quint8 emergencyCounter = message->getByte(1); void CanController::updateCanStatus()
setProperty("emergencyCounter", QString::number(emergencyCounter)); {
auto isConnected = lastPackageDateTime_.msecsTo(QDateTime::currentDateTime()) < 2000;
bool isVkuClosed = (message->getByte(2) & 0x1) == 1; if (isConnected_ != isConnected || isFirstCheck_)
setProperty("isVkuClosed", isVkuClosed); {
isConnected_ = isConnected;
isFirstCheck_ = false;
showStatus(isConnected ? 0x0100 : 0x0200);
}
} }
void CanController::setupDrivers() void CanController::setupDrivers()

View File

@@ -3,6 +3,7 @@
#include <QObject> #include <QObject>
#include <QVariant> #include <QVariant>
#include <QDateTime>
class QQmlEngine; class QQmlEngine;
class QJSEngine; class QJSEngine;
@@ -17,7 +18,7 @@ class CanController : public QObject
Q_PROPERTY(QString radiatorTemperature MEMBER radiatorTemperature_ NOTIFY radiatorTemperatureChanged) Q_PROPERTY(QString radiatorTemperature MEMBER radiatorTemperature_ NOTIFY radiatorTemperatureChanged)
Q_PROPERTY(QString outputVoltage MEMBER outputVoltage_ NOTIFY outputVoltageChanged) Q_PROPERTY(QString outputVoltage MEMBER outputVoltage_ NOTIFY outputVoltageChanged)
Q_PROPERTY(QString emergencyCounter MEMBER emergencyCounter_ NOTIFY emergencyCounterChanged) 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 maximumCurrent MEMBER maximumCurrent_ NOTIFY maximumCurrentChanged)
Q_PROPERTY(QString emergencyDelay MEMBER emergencyDelay_ NOTIFY emergencyDelayChanged) Q_PROPERTY(QString emergencyDelay MEMBER emergencyDelay_ NOTIFY emergencyDelayChanged)
@@ -38,18 +39,19 @@ public slots:
void connectCan(); void connectCan();
void disconnectCan(); void disconnectCan();
void vkuClosure(); void switchVkuClosure();
void emergencyReset(); void emergencyReset();
private slots: private slots:
void sendParameters(); void sendParameters();
void sendVkuClosure();
signals: signals:
void inputVoltageChanged(); void inputVoltageChanged();
void radiatorTemperatureChanged(); void radiatorTemperatureChanged();
void outputVoltageChanged(); void outputVoltageChanged();
void emergencyCounterChanged(); void emergencyCounterChanged();
void outputCurrentChanged(); void inputCurrentChanged();
void maximumCurrentChanged(); void maximumCurrentChanged();
void emergencyDelayChanged(); void emergencyDelayChanged();
@@ -65,16 +67,23 @@ private slots:
void handleCurrentState(const CanMessage* message); void handleCurrentState(const CanMessage* message);
void handleStatus(const CanMessage* message); void handleStatus(const CanMessage* message);
void showStatus(quint32 status);
void updateCanStatus();
private: private:
void setupDrivers(); void setupDrivers();
void setupDefaultParameters(); void setupDefaultParameters();
private: private:
bool isConnected_ = false;
bool isFirstCheck_ = true;
QDateTime lastPackageDateTime_;
QString inputVoltage_; QString inputVoltage_;
QString radiatorTemperature_; QString radiatorTemperature_;
QString outputVoltage_; QString outputVoltage_;
QString emergencyCounter_; QString emergencyCounter_;
QString outputCurrent_; QString inputCurrent_;
QString maximumCurrent_; QString maximumCurrent_;
QString emergencyDelay_; QString emergencyDelay_;
@@ -82,8 +91,9 @@ private:
QString retriesAfterEmergencyBreak_; QString retriesAfterEmergencyBreak_;
QString breakingCurrent_; QString breakingCurrent_;
QVariantList statuses_;
bool isVkuClosed_ = false; bool isVkuClosed_ = false;
QVariantList statuses_;
}; };
#endif // CANCONTROLLER_H #endif // CANCONTROLLER_H

View File

@@ -84,9 +84,9 @@ QuickControls.ApplicationWindow {
} }
Indicator { Indicator {
label: qsTr("Output current") label: qsTr("Input current")
indicator: qsTr("A") indicator: qsTr("A")
value.text: CanController.outputCurrent value.text: CanController.inputCurrent
value.readOnly: true value.readOnly: true
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredWidth: 100 Layout.preferredWidth: 100
@@ -97,7 +97,7 @@ QuickControls.ApplicationWindow {
text: CanController.isVkuClosed ? qsTr("VKU opening") : qsTr("VKU closing") text: CanController.isVkuClosed ? qsTr("VKU opening") : qsTr("VKU closing")
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: Ui.scale(12) Layout.topMargin: Ui.scale(12)
onClicked: CanController.vkuClosure() onClicked: CanController.switchVkuClosure()
} }
} }
@@ -235,6 +235,10 @@ QuickControls.ApplicationWindow {
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
QuickControls.ScrollBar.vertical: QuickControls.ScrollBar {
policy: size > 0 && size < 1 ? QuickControls.ScrollBar.AlwaysOn : QuickControls.ScrollBar.AsNeeded
}
} }
} }

View File

@@ -1,3 +1,4 @@
[General] [General]
bitrate=100000 bitrate=100000
sendParametersTimeout=50 sendParametersTimeout=50
sendVkuClosureTimeout=50

View File

@@ -4,62 +4,82 @@
<context> <context>
<name>CanController</name> <name>CanController</name>
<message> <message>
<location filename="../cpp/CanController.cpp" line="198"/> <location filename="../cpp/CanController.cpp" line="225"/>
<source>Reset</source> <source>Reset</source>
<translation>Сброс</translation> <translation>Сброс</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="199"/> <location filename="../cpp/CanController.cpp" line="226"/>
<source>No incoming messages via CAN interface</source> <source>No incoming messages via CAN interface</source>
<translation>Нет входящих сообщений по CAN</translation> <translation>Нет входящих сообщений по CAN</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="200"/> <location filename="../cpp/CanController.cpp" line="228"/>
<source>Waiting for a command for closing</source> <source>Waiting for a command for closing</source>
<translation>Ожидание команды на замыкание</translation> <translation>Ожидание команды на замыкание</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="201"/> <location filename="../cpp/CanController.cpp" line="229"/>
<source>Work via CAN</source> <source>Work via CAN</source>
<translation>Работа по CAN</translation> <translation>Работа по CAN</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="202"/> <location filename="../cpp/CanController.cpp" line="230"/>
<source>Work via button signal</source> <source>Work via button signal</source>
<translation>Работа по сигналу кнопки</translation> <translation>Работа по сигналу кнопки</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="203"/> <location filename="../cpp/CanController.cpp" line="231"/>
<source>Work via CAN or button signal</source> <source>Work via CAN or button signal</source>
<translation>Работа по CAN или сигналу кнопки</translation> <translation>Работа по CAN или сигналу кнопки</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="204"/> <location filename="../cpp/CanController.cpp" line="233"/>
<source>Exceeding input voltage</source> <source>Exceeding input voltage</source>
<translation>Превышение входного напряжения</translation> <translation>Превышение входного напряжения</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="205"/> <location filename="../cpp/CanController.cpp" line="234"/>
<source>Exceeding maximum current</source> <source>Exceeding maximum current</source>
<translation>Превышение максимального тока</translation> <translation>Превышение максимального тока</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="206"/> <location filename="../cpp/CanController.cpp" line="232"/>
<source>Exceeding radiator temperature</source> <source>Exceeding radiator temperature</source>
<translation>Превышение температуры радиатора</translation> <translation>Превышение температуры радиатора</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="207"/> <location filename="../cpp/CanController.cpp" line="227"/>
<source>Pause after breaking</source> <source>Pause after breaking</source>
<translation>Пауза после размыкания</translation> <translation>Пауза после размыкания</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="208"/> <location filename="../cpp/CanController.cpp" line="235"/>
<source>Exceeding switching current</source>
<translation>Превышение коммутируемого тока</translation>
</message>
<message>
<location filename="../cpp/CanController.cpp" line="236"/>
<source>Voltage 5V is not normal</source>
<translation>Напряжение 5В не в норме</translation>
</message>
<message>
<location filename="../cpp/CanController.cpp" line="237"/>
<source>Blocking due to emergency</source> <source>Blocking due to emergency</source>
<translation>Блокировка по аварии</translation> <translation>Блокировка по аварии</translation>
</message> </message>
<message> <message>
<location filename="../cpp/CanController.cpp" line="212"/> <location filename="../cpp/CanController.cpp" line="238"/>
<source>Can connected</source>
<translation>Can подключен</translation>
</message>
<message>
<location filename="../cpp/CanController.cpp" line="239"/>
<source>Can disconnected</source>
<translation>Can отключен</translation>
</message>
<message>
<location filename="../cpp/CanController.cpp" line="242"/>
<source>Unknown status</source> <source>Unknown status</source>
<translation>Неизвестный статус</translation> <translation>Неизвестный статус</translation>
</message> </message>
@@ -263,9 +283,8 @@
<translation>Счетчик аварий</translation> <translation>Счетчик аварий</translation>
</message> </message>
<message> <message>
<location filename="../qml/main.qml" line="87"/>
<source>Output current</source> <source>Output current</source>
<translation>Выходной ток</translation> <translation type="vanished">Выходной ток</translation>
</message> </message>
<message> <message>
<location filename="../qml/main.qml" line="88"/> <location filename="../qml/main.qml" line="88"/>
@@ -278,15 +297,20 @@
<source>VKU closure</source> <source>VKU closure</source>
<translation type="vanished">Замыкание ВКУ</translation> <translation type="vanished">Замыкание ВКУ</translation>
</message> </message>
<message>
<location filename="../qml/main.qml" line="87"/>
<source>Input current</source>
<translation>Входной ток</translation>
</message>
<message> <message>
<location filename="../qml/main.qml" line="97"/> <location filename="../qml/main.qml" line="97"/>
<source>VKU opening</source> <source>VKU opening</source>
<translation>Замыкание ВКУ</translation> <translation>Размыкание ВКУ</translation>
</message> </message>
<message> <message>
<location filename="../qml/main.qml" line="97"/> <location filename="../qml/main.qml" line="97"/>
<source>VKU closing</source> <source>VKU closing</source>
<translation>Размыкание ВКУ</translation> <translation>Замыкание ВКУ</translation>
</message> </message>
<message> <message>
<location filename="../qml/main.qml" line="118"/> <location filename="../qml/main.qml" line="118"/>