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
|
||||
|
||||
Reference in New Issue
Block a user