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 <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()

View File

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