Added various improvements
This commit is contained in:
@@ -22,9 +22,11 @@
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
#include <QSettings>
|
||||
#include <QRandomGenerator>
|
||||
|
||||
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<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")},
|
||||
{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()
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <QObject>
|
||||
#include <QVariant>
|
||||
#include <QDateTime>
|
||||
|
||||
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
|
||||
|
||||
10
qml/main.qml
10
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
[General]
|
||||
bitrate=100000
|
||||
sendParametersTimeout=50
|
||||
sendVkuClosureTimeout=50
|
||||
|
||||
@@ -4,62 +4,82 @@
|
||||
<context>
|
||||
<name>CanController</name>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="198"/>
|
||||
<location filename="../cpp/CanController.cpp" line="225"/>
|
||||
<source>Reset</source>
|
||||
<translation>Сброс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="199"/>
|
||||
<location filename="../cpp/CanController.cpp" line="226"/>
|
||||
<source>No incoming messages via CAN interface</source>
|
||||
<translation>Нет входящих сообщений по CAN</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="200"/>
|
||||
<location filename="../cpp/CanController.cpp" line="228"/>
|
||||
<source>Waiting for a command for closing</source>
|
||||
<translation>Ожидание команды на замыкание</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="201"/>
|
||||
<location filename="../cpp/CanController.cpp" line="229"/>
|
||||
<source>Work via CAN</source>
|
||||
<translation>Работа по CAN</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="202"/>
|
||||
<location filename="../cpp/CanController.cpp" line="230"/>
|
||||
<source>Work via button signal</source>
|
||||
<translation>Работа по сигналу кнопки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="203"/>
|
||||
<location filename="../cpp/CanController.cpp" line="231"/>
|
||||
<source>Work via CAN or button signal</source>
|
||||
<translation>Работа по CAN или сигналу кнопки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="204"/>
|
||||
<location filename="../cpp/CanController.cpp" line="233"/>
|
||||
<source>Exceeding input voltage</source>
|
||||
<translation>Превышение входного напряжения</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="205"/>
|
||||
<location filename="../cpp/CanController.cpp" line="234"/>
|
||||
<source>Exceeding maximum current</source>
|
||||
<translation>Превышение максимального тока</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="206"/>
|
||||
<location filename="../cpp/CanController.cpp" line="232"/>
|
||||
<source>Exceeding radiator temperature</source>
|
||||
<translation>Превышение температуры радиатора</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cpp/CanController.cpp" line="207"/>
|
||||
<location filename="../cpp/CanController.cpp" line="227"/>
|
||||
<source>Pause after breaking</source>
|
||||
<translation>Пауза после размыкания</translation>
|
||||
</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>
|
||||
<translation>Блокировка по аварии</translation>
|
||||
</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>
|
||||
<translation>Неизвестный статус</translation>
|
||||
</message>
|
||||
@@ -263,9 +283,8 @@
|
||||
<translation>Счетчик аварий</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../qml/main.qml" line="87"/>
|
||||
<source>Output current</source>
|
||||
<translation>Выходной ток</translation>
|
||||
<translation type="vanished">Выходной ток</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../qml/main.qml" line="88"/>
|
||||
@@ -278,15 +297,20 @@
|
||||
<source>VKU closure</source>
|
||||
<translation type="vanished">Замыкание ВКУ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../qml/main.qml" line="87"/>
|
||||
<source>Input current</source>
|
||||
<translation>Входной ток</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../qml/main.qml" line="97"/>
|
||||
<source>VKU opening</source>
|
||||
<translation>Замыкание ВКУ</translation>
|
||||
<translation>Размыкание ВКУ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../qml/main.qml" line="97"/>
|
||||
<source>VKU closing</source>
|
||||
<translation>Размыкание ВКУ</translation>
|
||||
<translation>Замыкание ВКУ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../qml/main.qml" line="118"/>
|
||||
|
||||
Reference in New Issue
Block a user