summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/systeccan/systeccanbackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/canbus/systeccan/systeccanbackend.cpp')
-rw-r--r--src/plugins/canbus/systeccan/systeccanbackend.cpp61
1 files changed, 57 insertions, 4 deletions
diff --git a/src/plugins/canbus/systeccan/systeccanbackend.cpp b/src/plugins/canbus/systeccan/systeccanbackend.cpp
index d6942aa..a7de557 100644
--- a/src/plugins/canbus/systeccan/systeccanbackend.cpp
+++ b/src/plugins/canbus/systeccan/systeccanbackend.cpp
@@ -114,7 +114,7 @@ QList<QCanBusDeviceInfo> SystecCanBackend::interfaces()
{
QList<QCanBusDeviceInfo> result;
- ::UcanEnumerateHardware(&ucanEnumCallback, &result, false, 0, ~0, 0, ~0, 0, ~0);
+ ::UcanEnumerateHardware(&ucanEnumCallback, &result, false, 0, quint8(~0), 0, quint32(~0), 0, quint32(~0));
return result;
}
@@ -281,8 +281,8 @@ bool SystecCanBackendPrivate::setupChannel(const QString &interfaceName)
const QRegularExpressionMatch match = re.match(interfaceName);
if (Q_LIKELY(match.hasMatch())) {
- device = match.captured(1).toInt();
- channel = match.captured(2).toInt();
+ device = quint8(match.captured(1).toUShort());
+ channel = quint8(match.captured(2).toUShort());
} else {
q->setError(SystecCanBackend::tr("Invalid interface '%1'.")
.arg(interfaceName), QCanBusDevice::ConnectionError);
@@ -377,7 +377,7 @@ void SystecCanBackendPrivate::startWrite()
::memset(&message, 0, sizeof(message));
message.m_dwID = frame.frameId();
- message.m_bDLC = payload.size();
+ message.m_bDLC = quint8(payload.size());
message.m_bFF = frame.hasExtendedFrameFormat() ? USBCAN_MSG_FF_EXT : USBCAN_MSG_FF_STD;
@@ -454,6 +454,40 @@ bool SystecCanBackendPrivate::verifyBitRate(int bitrate)
return true;
}
+void SystecCanBackendPrivate::resetController()
+{
+ ::UcanResetCan(handle);
+}
+
+QCanBusDevice::CanBusStatus SystecCanBackendPrivate::busStatus()
+{
+ Q_Q(SystecCanBackend);
+
+ tStatusStruct status;
+ ::memset(&status, 0, sizeof(status));
+ const UCANRET result = ::UcanGetStatus(handle, &status);
+
+ if (Q_UNLIKELY(result != USBCAN_SUCCESSFUL)) {
+ qCWarning(QT_CANBUS_PLUGINS_SYSTECCAN, "Can not query CAN bus status.");
+ q->setError(SystecCanBackend::tr("Can not query CAN bus status."), QCanBusDevice::ConfigurationError);
+ return QCanBusDevice::CanBusStatus::Unknown;
+ }
+
+ if (status.m_wCanStatus & USBCAN_CANERR_BUSOFF)
+ return QCanBusDevice::CanBusStatus::BusOff;
+
+ if (status.m_wCanStatus & USBCAN_CANERR_BUSHEAVY)
+ return QCanBusDevice::CanBusStatus::Error;
+
+ if (status.m_wCanStatus & USBCAN_CANERR_BUSLIGHT)
+ return QCanBusDevice::CanBusStatus::Warning;
+
+ if (status.m_wCanStatus == USBCAN_CANERR_OK)
+ return QCanBusDevice::CanBusStatus::Good;
+
+ return QCanBusDevice::CanBusStatus::Unknown;
+}
+
SystecCanBackend::SystecCanBackend(const QString &name, QObject *parent) :
QCanBusDevice(parent),
d_ptr(new SystecCanBackendPrivate(this))
@@ -462,6 +496,12 @@ SystecCanBackend::SystecCanBackend(const QString &name, QObject *parent) :
d->setupChannel(name);
d->setupDefaultConfigurations();
+
+ std::function<void()> f = std::bind(&SystecCanBackend::resetController, this);
+ setResetControllerFunction(f);
+
+ std::function<CanBusStatus()> g = std::bind(&SystecCanBackend::busStatus, this);
+ setCanBusStatusGetter(g);
}
SystecCanBackend::~SystecCanBackend()
@@ -553,4 +593,17 @@ QString SystecCanBackend::interpretErrorFrame(const QCanBusFrame &errorFrame)
return QString();
}
+void SystecCanBackend::resetController()
+{
+ Q_D(SystecCanBackend);
+ d->resetController();
+}
+
+QCanBusDevice::CanBusStatus SystecCanBackend::busStatus()
+{
+ Q_D(SystecCanBackend);
+
+ return d->busStatus();
+}
+
QT_END_NAMESPACE